{"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":"markdown","source":"# **Install MMDetection and MMDetection-Compatible Torch**","metadata":{}},{"cell_type":"code","source":"!pip install '/kaggle/input/pytorch-170-cuda-toolkit-110221/torch-1.7.0+cu110-cp37-cp37m-linux_x86_64.whl' --no-deps\n!pip install '/kaggle/input/pytorch-170-cuda-toolkit-110221/torchvision-0.8.1+cu110-cp37-cp37m-linux_x86_64.whl' --no-deps\n!pip install '/kaggle/input/pytorch-170-cuda-toolkit-110221/torchaudio-0.7.0-cp37-cp37m-linux_x86_64.whl' --no-deps","metadata":{"execution":{"iopub.status.busy":"2022-05-30T13:20:21.638719Z","iopub.execute_input":"2022-05-30T13:20:21.639369Z","iopub.status.idle":"2022-05-30T13:22:22.004459Z","shell.execute_reply.started":"2022-05-30T13:20:21.63925Z","shell.execute_reply":"2022-05-30T13:22:22.003594Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!pip install '/kaggle/input/mmdetectionv2140/addict-2.4.0-py3-none-any.whl' --no-deps\n!pip install '/kaggle/input/mmdetectionv2140/yapf-0.31.0-py2.py3-none-any.whl' --no-deps\n!pip install '/kaggle/input/mmdetectionv2140/terminal-0.4.0-py3-none-any.whl' --no-deps\n!pip install '/kaggle/input/mmdetectionv2140/terminaltables-3.1.0-py3-none-any.whl' --no-deps\n!pip install '/kaggle/input/mmdetectionv2140/mmcv_full-1_3_8-cu110-torch1_7_0/mmcv_full-1.3.8-cp37-cp37m-manylinux1_x86_64.whl' --no-deps\n!pip install '/kaggle/input/mmdetectionv2140/pycocotools-2.0.2/pycocotools-2.0.2' --no-deps\n!pip install '/kaggle/input/mmdetectionv2140/mmpycocotools-12.0.3/mmpycocotools-12.0.3' --no-deps\n\n!rm -rf mmdetection\n\n!cp -r /kaggle/input/mmdetectionv2140/mmdetection-2.14.0 /kaggle/working/\n!mv /kaggle/working/mmdetection-2.14.0 /kaggle/working/mmdetection\n%cd /kaggle/working/mmdetection\n!pip install -e .","metadata":{"execution":{"iopub.status.busy":"2022-05-30T13:22:22.006502Z","iopub.execute_input":"2022-05-30T13:22:22.006713Z","iopub.status.idle":"2022-05-30T13:25:53.913955Z","shell.execute_reply.started":"2022-05-30T13:22:22.006688Z","shell.execute_reply":"2022-05-30T13:25:53.913006Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# **Import Libraries** ","metadata":{}},{"cell_type":"code","source":"import torch\nimport torch.nn as nn\nimport torchvision.transforms as transforms\nimport torch.nn.functional as F\nimport sklearn\nimport torchvision\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.preprocessing import LabelEncoder\nimport numpy as np\nimport pandas as pd\nimport os\nimport matplotlib.pyplot as plt\nimport PIL\nimport json\nfrom PIL import Image, ImageEnhance\nimport albumentations as A\nimport mmdet\nimport mmcv\nfrom albumentations.pytorch import ToTensorV2\nimport seaborn as sns\nimport glob\nfrom pathlib import Path\nimport pycocotools\nfrom pycocotools import mask\nimport numpy.random\nimport random\nimport cv2\nimport re\nfrom mmdet.datasets import build_dataset\nfrom mmdet.models import build_detector\nfrom mmdet.apis import train_detector\nfrom mmdet.apis import inference_detector, init_detector, show_result_pyplot, set_random_seed\nimport multiprocessing as mp","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2022-05-30T13:44:03.27066Z","iopub.execute_input":"2022-05-30T13:44:03.270935Z","iopub.status.idle":"2022-05-30T13:44:03.279103Z","shell.execute_reply.started":"2022-05-30T13:44:03.270904Z","shell.execute_reply":"2022-05-30T13:44:03.278307Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%cd ..","metadata":{"execution":{"iopub.status.busy":"2022-05-30T13:26:15.727628Z","iopub.execute_input":"2022-05-30T13:26:15.727867Z","iopub.status.idle":"2022-05-30T13:26:15.733716Z","shell.execute_reply.started":"2022-05-30T13:26:15.727831Z","shell.execute_reply":"2022-05-30T13:26:15.73285Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%writefile labels.txt\nCartilage","metadata":{"execution":{"iopub.status.busy":"2022-05-30T13:26:15.734962Z","iopub.execute_input":"2022-05-30T13:26:15.735362Z","iopub.status.idle":"2022-05-30T13:26:15.74582Z","shell.execute_reply.started":"2022-05-30T13:26:15.735325Z","shell.execute_reply":"2022-05-30T13:26:15.745026Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# **Model Config**","metadata":{}},{"cell_type":"code","source":"%cd ../input/coco-split-github","metadata":{"execution":{"iopub.status.busy":"2022-05-30T13:49:40.036747Z","iopub.execute_input":"2022-05-30T13:49:40.037026Z","iopub.status.idle":"2022-05-30T13:49:50.766898Z","shell.execute_reply.started":"2022-05-30T13:49:40.036991Z","shell.execute_reply":"2022-05-30T13:49:50.766034Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!pip install -r requirements.txt","metadata":{"execution":{"iopub.status.busy":"2022-05-30T13:49:53.104507Z","iopub.execute_input":"2022-05-30T13:49:53.104848Z","iopub.status.idle":"2022-05-30T13:50:29.39307Z","shell.execute_reply.started":"2022-05-30T13:49:53.104801Z","shell.execute_reply":"2022-05-30T13:50:29.392213Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!python cocosplit.py -s 0.8 /kaggle/input/ear-mouse-coco-json/train_dataset.json /kaggle/working/train.json /kaggle/working/test.json","metadata":{"execution":{"iopub.status.busy":"2022-05-30T14:02:03.440747Z","iopub.execute_input":"2022-05-30T14:02:03.441059Z","iopub.status.idle":"2022-05-30T14:02:04.627867Z","shell.execute_reply.started":"2022-05-30T14:02:03.441026Z","shell.execute_reply":"2022-05-30T14:02:04.62694Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%cd ../../working","metadata":{"execution":{"iopub.status.busy":"2022-05-30T14:25:20.19593Z","iopub.execute_input":"2022-05-30T14:25:20.196673Z","iopub.status.idle":"2022-05-30T14:25:20.204012Z","shell.execute_reply.started":"2022-05-30T14:25:20.196635Z","shell.execute_reply":"2022-05-30T14:25:20.203274Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from mmcv import Config\ncfg = Config.fromfile('/kaggle/working/mmdetection/configs/cascade_rcnn/cascade_mask_rcnn_r50_fpn_20e_coco.py')\nprint(cfg.pretty_text)","metadata":{"execution":{"iopub.status.busy":"2022-05-30T14:30:37.367779Z","iopub.execute_input":"2022-05-30T14:30:37.368115Z","iopub.status.idle":"2022-05-30T14:30:38.080222Z","shell.execute_reply.started":"2022-05-30T14:30:37.368076Z","shell.execute_reply":"2022-05-30T14:30:38.079338Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"cfg.dataset_type = 'CocoDataset'\ncfg.classes = ('Cartilage',)\ncfg.data_root = '/kaggle/working'\n\nfor head in cfg.model.roi_head.bbox_head:\n    head.num_classes = 1\n    \ncfg.model.roi_head.mask_head.num_classes=1\n\ncfg.data.test.type = 'CocoDataset'\ncfg.data.test.classes = cfg.classes\ncfg.data.test.data_root = '/kaggle/working'\ncfg.data.test.ann_file = 'test.json'\ncfg.data.test.img_prefix = '../input/mouse-ear-coco-images/images'\n\ncfg.data.train.type = 'CocoDataset'\ncfg.data.train.data_root = '/kaggle/working'\ncfg.data.train.ann_file = 'train.json'\ncfg.data.train.img_prefix = '../input/mouse-ear-coco-images/images'\ncfg.data.train.classes = cfg.classes\n\ncfg.data.val.type = 'CocoDataset'\ncfg.data.val.data_root = '/kaggle/working'\ncfg.data.val.ann_file = 'test.json'\ncfg.data.val.img_prefix = '../input/mouse-ear-coco-images/images'\ncfg.data.val.classes = cfg.classes\n\nalbu_train_transforms = [\n    dict(type='ShiftScaleRotate', shift_limit=0.0625,\n         scale_limit=0.15, rotate_limit=15, p=0.4),\n    dict(type='RandomBrightnessContrast', brightness_limit=0.2,\n         contrast_limit=0.2, p=0.5),\n#     dict(type='IAAAffine', shear=(-10.0, 10.0), p=0.4),\n#     dict(type='CLAHE', p=0.5),\n    dict(\n        type=\"OneOf\",\n        transforms=[\n            dict(type=\"GaussianBlur\", p=1.0, blur_limit=7),\n            dict(type=\"MedianBlur\", p=1.0, blur_limit=7),\n        ],\n        p=0.4,\n    ),\n]\n\ncfg.train_pipeline = [\n    dict(type='LoadImageFromFile'),\n    dict(type='LoadAnnotations', with_bbox=True, with_mask=True),\n#     dict(type='Resize', img_scale=[(440, 596), (480, 650), (520, 704), (580, 785), (620, 839)], multiscale_mode='value', keep_ratio=True),\n#     dict(type='Resize', img_scale=[(880, 1192), (960, 130), (1040, 1408), (1160, 1570), (1240, 1678)], multiscale_mode='value', keep_ratio=True),\n    dict(type='Resize', img_scale=[(1333, 800), (1690, 960)]),\n#     dict(type='Resize', img_scale=(1333, 800)),\n    \n    \n\n    dict(type='RandomFlip', flip_ratio=0.5),\n\n    dict(\n        type='Albu',\n        transforms=albu_train_transforms,\n        bbox_params=dict(\n        type='BboxParams',\n        format='pascal_voc',\n        label_fields=['gt_labels'],\n        min_visibility=0.0,\n        filter_lost_elements=True),\n        keymap=dict(img='image', gt_bboxes='bboxes', gt_masks='masks'),\n        update_pad_shape=False,\n        skip_img_without_anno=True),\n    dict(\n        type='Normalize',\n        mean=[123.675, 116.28, 103.53],\n        std=[58.395, 57.12, 57.375],\n        to_rgb=True),\n    dict(type='Pad', size_divisor=32),\n    dict(type='DefaultFormatBundle'), \n    dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_masks', 'gt_labels'])\n]\n\ncfg.val_pipeline = [\n    dict(type='LoadImageFromFile'),\n    dict(\n        type='MultiScaleFlipAug',\n#         img_scale=[(880, 1192), (960, 130), (1040, 1408), (1160, 1570), (1240, 1678)],\n        img_scale = [(1333, 800), (1690, 960)],\n#         img_scale=(1333, 800),\n#         img_scale = (520, 704),\n        flip=False,\n        transforms=[\n            dict(type='Resize', keep_ratio=True),\n            dict(type='RandomFlip'),\n            dict(\n                type='Normalize',\n                mean=[123.675, 116.28, 103.53],\n                std=[58.395, 57.12, 57.375],\n                to_rgb=True),\n            dict(type='Pad', size_divisor=32),\n            dict(type='ImageToTensor', keys=['img']),\n            dict(type='Collect', keys=['img'])\n        ])\n]\n\n\ncfg.test_pipeline = [\n    dict(type='LoadImageFromFile'),\n    dict(\n        type='MultiScaleFlipAug',\n        img_scale=[(1333, 800), (1690, 960)],\n#         img_scale=(1333, 800),\n        \n#         img_scale = (520, 704),\n        flip=False,\n        transforms=[\n            dict(type='Resize', keep_ratio=True),\n            dict(type='RandomFlip'),\n            dict(\n                type='Normalize',\n                mean=[123.675, 116.28, 103.53],\n                std=[58.395, 57.12, 57.375],\n                to_rgb=True),\n            dict(type='Pad', size_divisor=32),\n            dict(type='ImageToTensor', keys=['img']),\n            dict(type='Collect', keys=['img'])\n        ])\n]\n\ncfg.data.train.pipeline = cfg.train_pipeline\ncfg.data.val.pipeline = cfg.val_pipeline\n# cfg.data.test.pipeline = cfg.test_pipeline\n\n\ncfg.load_from = '/kaggle/input/cascade-mask-rcnn-r50/cascade_mask_rcnn_r50_fpn_20e_coco_bbox_mAP-0.419__segm_mAP-0.365_20200504_174711-4af8e66e.pth'\n\ncfg.work_dir = '/kaggle/working/model_output'\n\ncfg.optimizer.lr = 0.02 / 8\ncfg.lr_config = dict(\n    policy='CosineAnnealing', \n    by_epoch=False,\n    warmup='linear', \n    warmup_iters=68, \n    warmup_ratio=0.001,\n    min_lr=1e-07)\n\ncfg.data.samples_per_gpu = 2\ncfg.data.workers_per_gpu = mp.cpu_count()\n\ncfg.evaluation.metric = 'segm'\ncfg.evaluation.interval = 1\n\ncfg.checkpoint_config.interval = 1\ncfg.runner.max_epochs = 12\ncfg.log_config.interval = 10\n\ncfg.seed = 69420\nset_random_seed(0, deterministic=False)\ncfg.gpu_ids = range(1)\ncfg.fp16 = dict(loss_scale=512.0)\nmeta = dict()\nmeta['config'] = cfg.pretty_text\n\nprint(f'Config:\\n{cfg.pretty_text}')","metadata":{"execution":{"iopub.status.busy":"2022-05-30T14:30:38.082151Z","iopub.execute_input":"2022-05-30T14:30:38.082601Z","iopub.status.idle":"2022-05-30T14:30:39.836713Z","shell.execute_reply.started":"2022-05-30T14:30:38.082559Z","shell.execute_reply":"2022-05-30T14:30:39.835977Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# **Training**","metadata":{}},{"cell_type":"code","source":"datasets = [build_dataset(cfg.data.train)]\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(os.path.abspath(cfg.work_dir))\ntrain_detector(model, datasets, cfg, distributed=False, validate=True, meta=meta)","metadata":{"execution":{"iopub.status.busy":"2022-05-30T14:10:18.826751Z","iopub.execute_input":"2022-05-30T14:10:18.827475Z","iopub.status.idle":"2022-05-30T14:14:46.528377Z","shell.execute_reply.started":"2022-05-30T14:10:18.82743Z","shell.execute_reply":"2022-05-30T14:14:46.527416Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import json\nwith open('/kaggle/working/test.json') as f:\n    test_data = json.load(f)\nprint(test_data)","metadata":{"execution":{"iopub.status.busy":"2022-05-30T14:24:54.478827Z","iopub.execute_input":"2022-05-30T14:24:54.479391Z","iopub.status.idle":"2022-05-30T14:24:54.486562Z","shell.execute_reply.started":"2022-05-30T14:24:54.479352Z","shell.execute_reply":"2022-05-30T14:24:54.4857Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_image_paths = []\nfor image in test_data['images']:\n    test_image_paths.append(image['file_name'])\nprint(test_image_paths)","metadata":{"execution":{"iopub.status.busy":"2022-05-30T14:26:35.974921Z","iopub.execute_input":"2022-05-30T14:26:35.97564Z","iopub.status.idle":"2022-05-30T14:26:35.982033Z","shell.execute_reply.started":"2022-05-30T14:26:35.975602Z","shell.execute_reply":"2022-05-30T14:26:35.981175Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = init_detector(cfg, './model_output/epoch_12.pth')\nfor file in test_image_paths:\n    img = mmcv.imread('../input/mouse-ear-coco-images/images/' + file)\n    result = inference_detector(model, img)\n    show_result_pyplot(model, img, result)","metadata":{"execution":{"iopub.status.busy":"2022-05-30T14:30:43.869014Z","iopub.execute_input":"2022-05-30T14:30:43.869766Z","iopub.status.idle":"2022-05-30T14:31:04.734712Z","shell.execute_reply.started":"2022-05-30T14:30:43.869729Z","shell.execute_reply":"2022-05-30T14:31:04.733883Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}