{"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":"import sys\nsys.path.append('../input/timm-pytorch-image-models/pytorch-image-models-master')\nsys.path.append(\"../input/segmentation-models-pytorch/segmentation_models.pytorch-0.2.1\")\nsys.path.append(\"../input/pretrainedmodels/pretrainedmodels-0.7.4\")\nsys.path.append(\"../input/efficientnet-pytorch/EfficientNet-PyTorch-master\")\n\n!pip install ../input/mmdetection/addict-2.4.0-py3-none-any.whl > /dev/null\n!pip install ../input/mmdetection/yapf-0.31.0-py2.py3-none-any.whl > /dev/null\n!pip install ../input/mmdetection/terminaltables-3.1.0-py3-none-any.whl > /dev/null\n!pip install ../input/mmdetection/einops* > /dev/null\n!pip install ../input/mmdetection/mmcv_full-1.3.17-cp37-cp37m-linux_x86_64.whl > /dev/null","metadata":{"_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","papermill":{"duration":48.622822,"end_time":"2022-06-17T10:35:40.266256","exception":false,"start_time":"2022-06-17T10:34:51.643434","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-07-09T16:01:09.484366Z","iopub.execute_input":"2022-07-09T16:01:09.484908Z","iopub.status.idle":"2022-07-09T16:03:49.813863Z","shell.execute_reply.started":"2022-07-09T16:01:09.484783Z","shell.execute_reply":"2022-07-09T16:03:49.812777Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!cp -r /kaggle/input/mmseg-from-carno/UWGIT_mmsegmentation /kaggle/working/","metadata":{"execution":{"iopub.status.busy":"2022-07-09T16:03:49.816563Z","iopub.execute_input":"2022-07-09T16:03:49.816889Z","iopub.status.idle":"2022-07-09T16:03:56.035898Z","shell.execute_reply.started":"2022-07-09T16:03:49.816845Z","shell.execute_reply":"2022-07-09T16:03:56.034741Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!cd ./UWGIT_mmsegmentation && pip install -e .","metadata":{"papermill":{"duration":13.563486,"end_time":"2022-06-17T10:35:53.858347","exception":false,"start_time":"2022-06-17T10:35:40.294861","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-07-09T16:03:56.041258Z","iopub.execute_input":"2022-07-09T16:03:56.042476Z","iopub.status.idle":"2022-07-09T16:04:30.496263Z","shell.execute_reply.started":"2022-07-09T16:03:56.042414Z","shell.execute_reply":"2022-07-09T16:04:30.495203Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\nimport glob\nimport numpy as np\nimport pandas as pd\n\nimport cv2\nfrom PIL import Image\nfrom tqdm.auto import tqdm","metadata":{"papermill":{"duration":0.282256,"end_time":"2022-06-17T10:35:54.209282","exception":false,"start_time":"2022-06-17T10:35:53.927026","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-07-09T16:04:30.499294Z","iopub.execute_input":"2022-07-09T16:04:30.499635Z","iopub.status.idle":"2022-07-09T16:04:30.827580Z","shell.execute_reply.started":"2022-07-09T16:04:30.499594Z","shell.execute_reply":"2022-07-09T16:04:30.826755Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%bash\n\ncat <<EOT >> /kaggle/working/config.py\nnum_classes = 3\n\n# model settings\ncheckpoint = 'https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/segformer/mit_b4_20220624-d588d980.pth'\nnorm_cfg = dict(type='SyncBN', requires_grad=True)\nmodel = dict(\n    type='EncoderDecoder',\n    pretrained=None,\n    backbone=dict(\n        type='MixVisionTransformer',\n        in_channels=3,\n        embed_dims=64,\n        num_stages=4,\n        num_layers=[3, 8, 27, 3],\n        num_heads=[1, 2, 5, 8],\n        patch_sizes=[7, 3, 3, 3],\n        sr_ratios=[8, 4, 2, 1],\n        out_indices=(0, 1, 2, 3),\n        mlp_ratio=4,\n        qkv_bias=True,\n        drop_rate=0.0,\n        attn_drop_rate=0.0,\n        drop_path_rate=0.1,\n        pretrained=checkpoint),\n    decode_head=dict(\n        type='SegformerHead',\n        in_channels=[64, 128, 320, 512],\n        in_index=[0, 1, 2, 3],\n        channels=256,\n        dropout_ratio=0.1,\n        num_classes=3,\n        norm_cfg=norm_cfg,\n        align_corners=False,\n        loss_decode=dict(type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0)),\n    # model training and testing settings\n    train_cfg=dict(),\n    test_cfg=dict(mode=\"whole\", multi_label=True))\n\n# dataset settings\ndataset_type = 'CustomDataset'\ndata_root = '../mmseg_train/'\nclasses = ['large_bowel', 'small_bowel', 'stomach']\npalette = [[0,0,0], [128,128,128], [255,255,255]]\nimg_norm_cfg = dict(mean=[0,0,0], std=[1,1,1], to_rgb=True)\nsize = (360,360)\nalbu_train_transforms = [\n    dict(type='RandomBrightnessContrast', p=0.5),\n]\ntrain_pipeline = [\n    dict(type='LoadImageFromFile', to_float32=True, color_type='unchanged', max_value='max'),\n    dict(type='LoadAnnotations'),\n    dict(type='Resize', img_scale=size, keep_ratio=True),\n    dict(type='RandomRotate',prob=0.5, degree=15, pad_val=0, seg_pad_val=255),\n    dict(type='RandomFlip', prob=0.5, direction='horizontal'),\n    dict(type='Albu', transforms=albu_train_transforms),\n    dict(type='Normalize', **img_norm_cfg),\n    dict(type='Pad', size=size, pad_val=0, seg_pad_val=255),\n    dict(type='DefaultFormatBundle'),\n    dict(type='Collect', keys=['img', 'gt_semantic_seg']),\n]\ntest_pipeline = [\n    dict(type='LoadImageFromFile', to_float32=True, color_type='unchanged', max_value='max'),\n    dict(\n        type='MultiScaleFlipAug',\n        img_scale=size,\n        flip=False,\n        transforms=[\n            dict(type='Resize', keep_ratio=True),\n            dict(type='RandomFlip'),\n            dict(type='Normalize', **img_norm_cfg),\n            dict(type='Pad', size=size, pad_val=0, seg_pad_val=255),\n            dict(type='ImageToTensor', keys=['img']),\n            dict(type='Collect', keys=['img']),\n        ])\n]\ndata = dict(\n    samples_per_gpu=8,\n    workers_per_gpu=4,\n    train=dict(\n        type=dataset_type,\n        multi_label=True,\n        data_root=data_root,\n        img_dir='images',\n        ann_dir='labels',\n        img_suffix=\".png\",\n        seg_map_suffix='.png',\n        split=\"splits/fold_0.txt\",\n        classes=classes,\n        palette=palette,\n        pipeline=train_pipeline),\n    val=dict(\n        type=dataset_type,\n        multi_label=True,\n        data_root=data_root,\n        img_dir='images',\n        ann_dir='labels',\n        img_suffix=\".png\",\n        seg_map_suffix='.png',\n        split=\"splits/holdout_0.txt\",\n        classes=classes,\n        palette=palette,\n        pipeline=test_pipeline),\n    test=dict(\n        type=dataset_type,\n        multi_label=True,\n        data_root=data_root,\n        img_dir='images',\n        ann_dir='labels',\n        img_suffix=\".png\",\n        seg_map_suffix='.png',\n        split=\"splits/holdout_0.txt\",\n        classes=classes,\n        palette=palette,\n        pipeline=test_pipeline))\n\n# yapf:disable\nlog_config = dict(\n    interval=50,\n    hooks=[\n        dict(type='CustomizedTextLoggerHook', by_epoch=False),\n    ])\n# yapf:enable\ndist_params = dict(backend='nccl')\nlog_level = 'INFO'\nload_from = None\nresume_from = None\nworkflow = [('train', 1)]\ncudnn_benchmark = True\n\ntotal_iters = 40\n# optimizer\noptimizer = dict(type='AdamW', lr=1e-3, betas=(0.9, 0.999), weight_decay=0.05)\noptimizer_config = dict(type='Fp16OptimizerHook', loss_scale='dynamic')\n# learning policy\nlr_config = dict(policy='poly',\n                 warmup='linear',\n                 warmup_iters=500,\n                 warmup_ratio=1e-6,\n                 power=1.0, min_lr=0.0, by_epoch=False)\n# runtime settings\nfind_unused_parameters=True\nrunner = dict(type='IterBasedRunner', max_iters=int(total_iters * 1000))\ncheckpoint_config = dict(by_epoch=False, interval=int(total_iters * 1000), save_optimizer=False)\nevaluation = dict(by_epoch=False, interval=min(5000, int(total_iters * 1000)), metric=['imDice', 'mDice'], pre_eval=True)\nfp16 = dict()\n\nwork_dir = f'./work_dirs/tract/baseline'\nEOT","metadata":{"papermill":{"duration":0.059197,"end_time":"2022-06-17T10:46:51.000234","exception":false,"start_time":"2022-06-17T10:46:50.941037","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-07-09T16:04:30.829051Z","iopub.execute_input":"2022-07-09T16:04:30.829313Z","iopub.status.idle":"2022-07-09T16:04:30.861549Z","shell.execute_reply.started":"2022-07-09T16:04:30.829279Z","shell.execute_reply":"2022-07-09T16:04:30.860369Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# reinstall for inner bash usage\n# !cp -r ../input/segmentation-models-pytorch/segmentation_models.pytorch-0.2.1 ./ && cd segmentation_models.pytorch-0.2.1  && pip install -e .\n# !cp -r ../input/timm-pytorch-image-models/pytorch-image-models-master ./ && cd pytorch-image-models-master  && pip install -e .","metadata":{"papermill":{"duration":29.445573,"end_time":"2022-06-17T10:47:20.470724","exception":false,"start_time":"2022-06-17T10:46:51.025151","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-07-09T16:04:30.863645Z","iopub.execute_input":"2022-07-09T16:04:30.863963Z","iopub.status.idle":"2022-07-09T16:04:30.868498Z","shell.execute_reply.started":"2022-07-09T16:04:30.863921Z","shell.execute_reply":"2022-07-09T16:04:30.867471Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 5. Inferencing\n\n## 5.1 Load trained models","metadata":{"papermill":{"duration":0.058541,"end_time":"2022-06-17T10:55:03.450119","exception":false,"start_time":"2022-06-17T10:55:03.391578","status":"completed"},"tags":[]}},{"cell_type":"code","source":"import sys\nsys.path.append('/kaggle/working/UWGIT_mmsegmentation/')\nfrom mmseg.apis import init_segmentor, inference_segmentor\nfrom mmcv.utils import config\n\ncfgs = [\n    \"/kaggle/input/swin-transformer-config/Swin_transformer.py\",\n    \"/kaggle/input/swin-transformer-config/Swin_transformer.py\",\n]\n\nckpts = [\n    \"../input/swin-largenet/large_net.pth\",\n    \"../input/uw-swin-lr/swin_large_upper/last_fold2.pth\",\n]\n\nmodels = []\nfor cfg, ckpt in zip(cfgs, ckpts):\n    cfg = config.Config.fromfile(cfg)\n    model = init_segmentor(cfg, ckpt)\n    models.append(model)","metadata":{"papermill":{"duration":18.327512,"end_time":"2022-06-17T10:55:21.840364","exception":false,"start_time":"2022-06-17T10:55:03.512852","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-07-09T16:04:30.870623Z","iopub.execute_input":"2022-07-09T16:04:30.871219Z","iopub.status.idle":"2022-07-09T16:05:13.425798Z","shell.execute_reply.started":"2022-07-09T16:04:30.871181Z","shell.execute_reply":"2022-07-09T16:05:13.424691Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 5.2 Make test submission csv","metadata":{"papermill":{"duration":0.050413,"end_time":"2022-06-17T10:55:21.942268","exception":false,"start_time":"2022-06-17T10:55:21.891855","status":"completed"},"tags":[]}},{"cell_type":"code","source":"import os\nimport cv2\nimport numpy as np\nimport pandas as pd\nimport glob\nfrom tqdm.auto import tqdm\nfrom scipy.ndimage import binary_closing, binary_opening, measurements\n\ndef rle_encode(img):\n    pixels = img.flatten()\n    pixels = np.concatenate([[0], pixels, [0]])\n    runs = np.where(pixels[1:] != pixels[:-1])[0] + 1\n    runs[1::2] -= runs[::2]\n    return ' '.join(str(x) for x in runs)\n\nclasses = ['large_bowel', 'small_bowel', 'stomach']\ndata_dir = \"../input/uw-madison-gi-tract-image-segmentation/\"\ntest_dir = os.path.join(data_dir, \"test\")\nsub = pd.read_csv(os.path.join(data_dir, \"sample_submission.csv\"))\ntest_images = glob.glob(os.path.join(test_dir, \"**\", \"*.png\"), recursive = True)\n\nif len(test_images) == 0:\n    test_dir = os.path.join(data_dir, \"train\")\n    sub = pd.read_csv(os.path.join(data_dir, \"train.csv\"))[[\"id\", \"class\"]].iloc[800*3:1200 * 3]\n    sub[\"predicted\"] = \"\"\n    test_images = glob.glob(os.path.join(test_dir, \"**\", \"*.png\"), recursive = True)\n    \nid2img = {_.rsplit(\"/\", 4)[2] + \"_\" + \"_\".join(_.rsplit(\"/\", 4)[4].split(\"_\")[:2]): _ for _ in test_images}\nsub[\"file_name\"] = sub.id.map(id2img)\nsub[\"days\"] = sub.id.apply(lambda x: \"_\".join(x.split(\"_\")[:2]))\nfname2index = {f + c: i for f, c, i in zip(sub.file_name, sub[\"class\"], sub.index)}\nsub.tail(10)","metadata":{"papermill":{"duration":3.468874,"end_time":"2022-06-17T10:55:25.461978","exception":false,"start_time":"2022-06-17T10:55:21.993104","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-07-09T16:05:13.428237Z","iopub.execute_input":"2022-07-09T16:05:13.428585Z","iopub.status.idle":"2022-07-09T16:05:18.752436Z","shell.execute_reply.started":"2022-07-09T16:05:13.428541Z","shell.execute_reply":"2022-07-09T16:05:18.751643Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 5.3 Start Inferencing","metadata":{"papermill":{"duration":0.050269,"end_time":"2022-06-17T10:55:25.562914","exception":false,"start_time":"2022-06-17T10:55:25.512645","status":"completed"},"tags":[]}},{"cell_type":"code","source":"subs = []\nT = [0.65, 0.47, 0.45]\nfor day, group in tqdm(sub.groupby(\"days\")):\n    imgs = []\n    for file_name in group.file_name.unique():\n        img = cv2.imread(file_name, cv2.IMREAD_ANYDEPTH)\n        old_size = img.shape[:2]\n        \n        s = int(os.path.basename(file_name).split(\"_\")[1])\n        file_names = [file_name.replace(f\"slice_{s:04d}\", f\"slice_{s + i:04d}\") for i in range(-2, 3, 2)]\n        file_names = [_ for _ in file_names if os.path.exists(_)]\n        imgs = [cv2.imread(file_names[0], cv2.IMREAD_ANYDEPTH)] + [img] + [cv2.imread(file_names[-1], cv2.IMREAD_ANYDEPTH)]\n        \n        new_img = np.stack(imgs, -1)\n        if old_size == (310,360):\n            new_img = np.pad(new_img,((25,25),(0,0),(0,0)))\n        new_img = new_img.astype(np.float32) / new_img.max()\n        res = [inference_segmentor(model, new_img)[0] for model in models]\n        res = sum(res) / len(res)\n        for j in range(3):\n            res[j] = res[j]>T[j]\n        res = res.astype(np.uint8)\n        res = np.transpose(res, (1,2,0))\n        if old_size == (310,360):\n            res = res[25:335,:,:]\n        for j in range(3):\n            rle = rle_encode(res[...,j])\n            index = fname2index[file_name + classes[j]]\n            sub.loc[index, \"predicted\"] = rle","metadata":{"papermill":{"duration":4.514964,"end_time":"2022-06-17T10:55:30.128359","exception":false,"start_time":"2022-06-17T10:55:25.613395","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-07-09T16:05:18.754151Z","iopub.execute_input":"2022-07-09T16:05:18.754724Z","iopub.status.idle":"2022-07-09T16:06:06.953170Z","shell.execute_reply.started":"2022-07-09T16:05:18.754683Z","shell.execute_reply":"2022-07-09T16:06:06.952395Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"* clear outputs","metadata":{}},{"cell_type":"code","source":"!rm -rf /kaggle/working/","metadata":{"execution":{"iopub.status.busy":"2022-07-09T16:06:06.955952Z","iopub.execute_input":"2022-07-09T16:06:06.956809Z","iopub.status.idle":"2022-07-09T16:06:07.791220Z","shell.execute_reply.started":"2022-07-09T16:06:06.956763Z","shell.execute_reply":"2022-07-09T16:06:07.790134Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 5.4 Format submission","metadata":{"papermill":{"duration":0.051663,"end_time":"2022-06-17T10:55:30.233492","exception":false,"start_time":"2022-06-17T10:55:30.181829","status":"completed"},"tags":[]}},{"cell_type":"code","source":"sub = sub[[\"id\", \"class\", \"predicted\"]]\nsub.to_csv(\"submission.csv\", index = False)\nsub","metadata":{"papermill":{"duration":0.071834,"end_time":"2022-06-17T10:55:30.357799","exception":false,"start_time":"2022-06-17T10:55:30.285965","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-07-09T16:06:07.792942Z","iopub.execute_input":"2022-07-09T16:06:07.793572Z","iopub.status.idle":"2022-07-09T16:06:07.831884Z","shell.execute_reply.started":"2022-07-09T16:06:07.793526Z","shell.execute_reply":"2022-07-09T16:06:07.830873Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}