{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"!pip install mmcv-full==1.3.8 -f https://download.openmmlab.com/mmcv/dist/cu110/torch1.7.0/index.html\n!rm -rf mmdetection\n!git clone https://github.com/open-mmlab/mmdetection.git\n!cd mmdetection && pip install -e .\n\n!pip install Pillow==7.0.0","metadata":{"execution":{"iopub.status.busy":"2021-07-22T15:08:49.793314Z","iopub.execute_input":"2021-07-22T15:08:49.793682Z","iopub.status.idle":"2021-07-22T15:09:44.782251Z","shell.execute_reply.started":"2021-07-22T15:08:49.793603Z","shell.execute_reply":"2021-07-22T15:09:44.781274Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import sys\nsys.path.insert(0, \"./mmdetection\")\n\nimport mmdet\nimport mmdet.core\nfrom mmdet.apis import init_detector, inference_detector\nimport mmcv","metadata":{"execution":{"iopub.status.busy":"2021-07-22T15:09:44.785905Z","iopub.execute_input":"2021-07-22T15:09:44.786182Z","iopub.status.idle":"2021-07-22T15:10:00.888786Z","shell.execute_reply.started":"2021-07-22T15:09:44.786153Z","shell.execute_reply":"2021-07-22T15:10:00.887887Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from mmdet.core.bbox import demodata","metadata":{"execution":{"iopub.status.busy":"2021-07-22T15:10:54.056374Z","iopub.execute_input":"2021-07-22T15:10:54.056721Z","iopub.status.idle":"2021-07-22T15:10:54.062924Z","shell.execute_reply.started":"2021-07-22T15:10:54.056687Z","shell.execute_reply":"2021-07-22T15:10:54.061634Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import pandas as pd","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"level_df = pd.read_csv('../input/siim-covid19-detection/train_image_level.csv')\nlevel_df","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"anno_df = pd.DataFrame(columns = [[ 'image_id','bbox_name', 'bbox']])\nanno_df","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"bbox_names = []\nbboxes = []\n\nimage_len = level_df.shape[0]\n\nfor i in range(image_len):\n    image_id = level_df.loc[i,'id'].split('_')[0]\n    boxes = level_df.loc[i,'label'].split()\n    bbox_name = []\n    bbox = []\n    sum = []\n    if boxes[0] == 'none':\n        anno_df.loc[i] = [image_id, 'NaN', 'NaN']\n        continue\n    else:\n        for j in range(int(len(boxes)/6)):\n            label = boxes[j*6+0]\n            x1 = boxes[j*6+2]\n            y1 = boxes[j*6+3]\n            x2 = boxes[j*6+4]\n            y2 = boxes[j*6+5]\n\n            bbox_name.append(label)\n            bbox.append([float(x1), float(y1), float(x2), float(y2)])\n    sum.append(image_id)\n    sum.append(bbox_name)\n    sum.append(bbox)\n    anno_df.loc[i] = sum\nanno_df","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.model_selection import train_test_split\n\ntrain_df, val_df = train_test_split(level_df, test_size=0.1,random_state=2021)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"val_df","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!mkdir /kaggle/working/siim","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df['id'].to_csv('/kaggle/working/siim/train.txt', sep=' ', header=False, index=False)\nval_df['id'].to_csv('/kaggle/working/siim/val.txt', sep=' ', header=False, index=False)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!cp -R '../input/second/image' '/kaggle/working/siim/image'","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"ls /kaggle/working/siim\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!echo 'val list #####'; cat /kaggle/working/siim/val.txt","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import copy\nimport os.path as osp\n\nimport mmcv\nimport numpy as np\nimport cv2\n\nfrom mmdet.datasets.builder import DATASETS\nfrom mmdet.datasets.custom import CustomDataset\n\n@DATASETS.register_module(force=True)\nclass CovDataset_imsi(CustomDataset):\n    CLASSES = ['opacity']\n    def __init__(self, data_root, ann_file, img_prefix):\n        self.data_root = data_root #/kaggle/working/siim\n        self.ann_file = osp.join(data_root, ann_file) #train.txt\n        self.img_prefix = osp.join(data_root, img_prefix) #image\n\n        self.data_infos = self.load_annotations(self.ann_file)\n\n    def load_annotations(self, ann_file):\n        cat2label = {k:i for i, k in enumerate(self.CLASSES)}\n        image_list = mmcv.list_from_file(self.ann_file)\n\n        data_infos = []\n\n        for image_id in image_list:\n\n            filename = '{0:}/{1:}.png'.format(self.img_prefix, image_id)\n            image = cv2.imread(filename)\n            height, width = image.shape[:2]\n\n            data_info = {'filename': str(image_id)+'.png',\n                      'width': width, 'height': height}\n            df_list = anno_df.values.tolist()\n            bbox_names = df_list[i][1]\n            bboxes = df_list[i][2]\n\n            gt_bboxes = []\n            gt_labels = []\n            gt_bboxes_ignore = []\n            gt_labels_ignore = []\n\n\n            for bbox_name, bbox in zip(bbox_names, bboxes):\n                if bbox_name in cat2label:\n                    gt_bboxes.append(bbox)\n                    gt_labels.append(cat2label[bbox_name])\n                else:\n                    gt_bboxes_ignore.append(bbox)\n                    gt_labels_ignore.append(-1)\n\n\n            data_anno = {\n            'bboxes': np.array(gt_bboxes, dtype=np.float32).reshape(-1, 4),\n            'labels': np.array(gt_labels, dtype=np.long),\n            'bboxes_ignore': np.array(gt_bboxes_ignore, dtype=np.float32).reshape(-1, 4),\n            'labels_ignore': np.array(gt_labels_ignore, dtype=np.long)\n            }\n\n\n            data_info.update(ann=data_anno)\n            data_infos.append(data_info)\n        return data_infos\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data = CovDataset_imsi(data_root='/kaggle/working/siim', ann_file='train.txt', img_prefix='image')\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data.data_infos[1]","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"@DATASETS.register_module(force=True)\nclass CovDataset(CustomDataset):\n    CLASSES = ['opacity']\n\n    def load_annotations(self, ann_file):\n        cat2label = {k:i for i, k in enumerate(self.CLASSES)}\n        image_list = mmcv.list_from_file(self.ann_file)\n\n        data_infos = []\n\n        for image_id in image_list:\n\n            filename = '{0:}/{1:}.png'.format(self.img_prefix, image_id)\n            image = cv2.imread(filename)\n            height, width = image.shape[:2]\n\n            data_info = {'filename': str(image_id)+'.png',\n                      'width': width, 'height': height}\n            df_list = anno_df.values.tolist()\n            bbox_names = df_list[i][1]\n            bboxes = df_list[i][2]\n\n            gt_bboxes = []\n            gt_labels = []\n            gt_bboxes_ignore = []\n            gt_labels_ignore = []\n\n\n            for bbox_name, bbox in zip(bbox_names, bboxes):\n                if bbox_name in cat2label:\n                    gt_bboxes.append(bbox)\n                    gt_labels.append(cat2label[bbox_name])\n                else:\n                    gt_bboxes_ignore.append(bbox)\n                    gt_labels_ignore.append(-1)\n\n\n            data_anno = {\n            'bboxes': np.array(gt_bboxes, dtype=np.float32).reshape(-1, 4),\n            'labels': np.array(gt_labels, dtype=np.long),\n            'bboxes_ignore': np.array(gt_bboxes_ignore, dtype=np.float32).reshape(-1, 4),\n            'labels_ignore': np.array(gt_labels_ignore, dtype=np.long)\n            }\n\n\n            data_info.update(ann=data_anno)\n            data_infos.append(data_info)\n        return data_infos\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"config_file = '/kaggle/working/mmdetection/configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py'\ncheckpoint_file = '/kaggle/working/mmdetection/checkpoints/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth'","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!cd mmdetection; mkdir checkpoints\n!wget -O /kaggle/working/mmdetection/checkpoints/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth \\\nhttp://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_1x_coco/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from mmcv import Config\n\ncfg = Config.fromfile(config_file)\nprint(cfg.pretty_text)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!mkdir /kaggle/working/siim_work_dir","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from mmdet.apis import set_random_seed\n\ncfg.dataset_type = 'CovDataset'\ncfg.data_root = '/kaggle/working/siim/'\n\ncfg.data.train.type = 'CovDataset'\ncfg.data.train.data_root = '/kaggle/working/siim/'\ncfg.data.train.ann_file = 'train.txt'\ncfg.data.train.img_prefix = 'image'\n\ncfg.data.val.type = 'CovDataset'\ncfg.data.val.data_root = '/kaggle/working/siim/'\ncfg.data.val.ann_file = 'val.txt'         \ncfg.data.val.img_prefix = 'image'\n\ncfg.model.roi_head.bbox_head.num_classes = 1\ncfg.load_from = 'checkpoints/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth'\n\ncfg.work_dir = '/kaggle/working/siim_work_dir'\n\ncfg.optimizer.lr = 0.02 / 8 #8개 cpu로 돌렸던 것을 1개의 gpu로 돌리니까 나눠주는 것이다.\ncfg.lr_config.warmup = None\ncfg.log_config.interval = 5\n\ncfg.runner.max_epochs = 1\n\n\ncfg.evaluation.metric = 'mAP'\ncfg.evaluation.interval = 5\ncfg.checkpoint_config.interval = 5\n\ncfg.data.samples_per_gpu = 4\n\n\ncfg.seed = 0\nset_random_seed(0, deterministic=False)\ncfg.gpu_ids = range(1)\ncfg.lr_config.policy='step'\n\nprint(f'Config:\\n{cfg.pretty_text}')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from mmdet.datasets import build_dataset\nfrom mmdet.models import build_detector\nfrom mmdet.apis import train_detector\n\n# train용 Dataset 생성. \n\ndatasets = [build_dataset(cfg.data.train)]","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"datasets","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%cd mmdetection\n\nmodel = build_detector(cfg.model, train_cfg=cfg.get('train_cfg'), test_cfg=cfg.get('test_cfg'))\nmodel.CLASSES = datasets[0].CLASSES\n\nmmcv.mkdir_or_exist(osp.abspath(cfg.work_dir))\ntrain_detector(model, datasets, cfg, distributed=False, validate=True)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from mmdet.apis import show_result_pyplot\n\ncheckpoint_file = '/kaggle/working/siim_work_dir/epoch_1.pth'\n\n# checkpoint 저장된 model 파일을 이용하여 모델을 생성, 이때 Config는 위에서 update된 config 사용. \nmodel_ckpt = init_detector(cfg, checkpoint_file, device='cuda:0')\n# BGR Image 사용 \nimg = cv2.imread('../input/second/image/000c3a3f293f_image.png')\nmodel_ckpt.cfg = cfg\n\nresult = inference_detector(model_ckpt, img)\nshow_result_pyplot(model_ckpt, img, result, score_thr=0.3)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}