{"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":"## <center></center>\n# <div style=\"color:white;display:fill;border-radius:5px;background-color:#75B7BF;letter-spacing:0.1px;overflow:hidden\"><p style=\"padding:20px;color:white;overflow:hidden;margin:0;font-size:100%;text-align:center\">👋🏼 Inference notebook may be late, but it will never be absent!</p></div>\n","metadata":{}},{"cell_type":"markdown","source":"#### I've got a score of 0.78 on LB by the same notebook yesterday.\n\n* Single fold out of 5 folds\n* No external data\n* No post process(even no specific threshold for each class)\n* LB: 0.78 Local: 0.818\n\n#### What have I done?\n\n* Tiles with large size\n* Multi-class segmentation\n* Large model with some modifications\n* Kind of good training strategy \n---","metadata":{}},{"cell_type":"markdown","source":"### *My related works*\n\n1. Data-Prepareing\n> [Multi-class dataset  (notebook)](https://www.kaggle.com/code/w3579628328/6-classes-dataset-for-mmsegmentation)\n2. Dataset (already created)\n* > [256x256  (dataset)](https://www.kaggle.com/datasets/w3579628328/mmsegmentation256x256)\n* > [512x512  (dataset)](https://www.kaggle.com/datasets/w3579628328/mmsegmentation512x512)\n3. Training (Multi-class)\n> [Multi-class training with mmsegmentation](https://www.kaggle.com/code/w3579628328/multi-class-mmsegmentation-training)\n4. Training (Single-class)\n> [Binary class training with mmsegmentation](https://www.kaggle.com/code/w3579628328/mmsegmentation-trainning)\n\n\n#### enjoy🤗🤗🤗\n---","metadata":{}},{"cell_type":"markdown","source":"#### Dependents\n","metadata":{"papermill":{"duration":0.00991,"end_time":"2021-03-12T06:33:14.88117","exception":false,"start_time":"2021-03-12T06:33:14.87126","status":"completed"},"tags":[]}},{"cell_type":"code","source":"!pip install ../input/mmdetection/addict-2.4.0-py3-none-any.whl\n!pip install ../input/mmdetection/yapf-0.31.0-py2.py3-none-any.whl\n!pip install ../input/mmdetection/terminaltables-3.1.0-py3-none-any.whl\n!pip install ../input/mmdetection/einops-0.4.1-py3-none-any.whl\n!pip install ../input/mmsegmentation/mmcv-full/mmcv_full-1.5.3-cp37-cp37m-linux_x86_64.whl\n!pip install ../input/openmmlab-essential-repositories/openmmlab-repos/src/mmcls-0.23.1-py2.py3-none-any.whl","metadata":{"_kg_hide-input":false,"_kg_hide-output":true,"execution":{"iopub.status.busy":"2022-09-29T02:21:09.052069Z","iopub.execute_input":"2022-09-29T02:21:09.052443Z","iopub.status.idle":"2022-09-29T02:24:09.619423Z","shell.execute_reply.started":"2022-09-29T02:21:09.052352Z","shell.execute_reply":"2022-09-29T02:24:09.618213Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!cp -r ../input/mmsegm/mmsegmentation-master /kaggle/working/ && cd /kaggle/working/mmsegmentation-master && pip install -e . && cd ..","metadata":{"_kg_hide-output":true,"execution":{"iopub.status.busy":"2022-09-29T02:24:09.621620Z","iopub.execute_input":"2022-09-29T02:24:09.622233Z","iopub.status.idle":"2022-09-29T02:24:45.399196Z","shell.execute_reply.started":"2022-09-29T02:24:09.622192Z","shell.execute_reply":"2022-09-29T02:24:45.398030Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### Import librarys","metadata":{}},{"cell_type":"code","source":"import cv2\nimport numpy as np\nimport pandas as pd\nimport os\nfrom glob import glob\nfrom tqdm.notebook import tqdm\nimport sys\nimport gc\nsys.path.append('./mmsegmentation-master')\nfrom mmseg.apis import init_segmentor, inference_segmentor\nfrom mmcv.utils import config","metadata":{"_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","_kg_hide-input":false,"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","papermill":{"duration":3.066435,"end_time":"2021-03-12T06:33:17.956368","exception":false,"start_time":"2021-03-12T06:33:14.889933","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-09-29T02:24:45.400921Z","iopub.execute_input":"2022-09-29T02:24:45.401497Z","iopub.status.idle":"2022-09-29T02:24:49.717803Z","shell.execute_reply.started":"2022-09-29T02:24:45.401466Z","shell.execute_reply":"2022-09-29T02:24:49.716674Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### mask -> rle","metadata":{"papermill":{"duration":0.008314,"end_time":"2021-03-12T06:33:18.008555","exception":false,"start_time":"2021-03-12T06:33:18.000241","status":"completed"},"tags":[]}},{"cell_type":"code","source":"def rle_encode_less_memory(img):\n    pixels = img.T.flatten()\n    pixels[0] = 0\n    pixels[-1] = 0\n    runs = np.where(pixels[1:] != pixels[:-1])[0] + 2\n    runs[1::2] -= runs[::2]\n    return ' '.join(str(x) for x in runs)","metadata":{"_kg_hide-input":false,"papermill":{"duration":0.026676,"end_time":"2021-03-12T06:33:18.043775","exception":false,"start_time":"2021-03-12T06:33:18.017099","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-09-29T02:24:49.721385Z","iopub.execute_input":"2022-09-29T02:24:49.722366Z","iopub.status.idle":"2022-09-29T02:24:49.730985Z","shell.execute_reply.started":"2022-09-29T02:24:49.722318Z","shell.execute_reply":"2022-09-29T02:24:49.729310Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!ls ../input/multi-class-mmsegmentation-training/config.py","metadata":{"execution":{"iopub.status.busy":"2022-09-29T02:24:49.734816Z","iopub.execute_input":"2022-09-29T02:24:49.736223Z","iopub.status.idle":"2022-09-29T02:24:50.681308Z","shell.execute_reply.started":"2022-09-29T02:24:49.736176Z","shell.execute_reply":"2022-09-29T02:24:50.680095Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### Load Models","metadata":{}},{"cell_type":"code","source":"configs = [\n    \"../input/swin-768-stain/swin.py\",\n#     './my_config.py',\n#     '../input/swintrnasformer512/my_config.py',\n#     '../input/multi-class-mmsegmentation-training/config.py',\n#     \"../input/orisize-segformer/my_config.py\",\n]\nckpts = [\n    \"../input/swin-768-stain/best_mDice_iter_41000.pth\",\n#     \"../input/orisize-segformer/best_mDice_iter_19000.pth\",\n#     \"../input/orisize-segformer/best_mDice_iter_2000.pth\",\n#     '../input/swintrnasformer512/best_mDice_iter_5000.pth',\n#     '../input/multi-class-mmsegmentation-training/baseline/best_mDice_iter_5000.pth'\n]\n\n\n# ori_size = 1280\n# crop_size= 256\n# stride_size= 256\n\ncfg = config.Config.fromfile(configs[0])\n# cfg.model.test_cfg={'mode': 'whole'}\n\n# del cfg[\"model\"][\"train_cfg\"]\n# del cfg[\"model\"][\"test_cfg\"]\n# cfg.train_cfg={}\n# cfg.test_cfg = dict(mode=\"slide\", crop_size=(crop_size,crop_size),stride=(stride_size,stride_size))\n# cfg.test_cfg = {'mode': 'whole'}\n# print(cfg.model)\n\n# img_norm_cfg=dict(mean=[196.869, 190.186, 194.802], std=[63.010, 66.765, 65.745], to_rgb=True)\n# cfg.data.test.pipeline = [\n#     dict(type='LoadImageFromFile'),\n#     dict(\n#         type='MultiScaleFlipAug',\n#         img_scale=(ori_size,ori_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='ImageToTensor', keys=['img']),\n#             dict(type='Collect', keys=['img']),\n#         ])\n# ]\n\n\n\n\nDATA = '../input/hubmap-organ-segmentation/test_images/'\ndf_sample = pd.read_csv('../input/hubmap-organ-segmentation/sample_submission.csv').set_index('id')\n\nmodels = []\n# for idx,(cfg, ckpt) in enumerate(zip(configs, ckpts)):\n#     cfg = config.Config.fromfile(cfg)\n#     model = init_segmentor(cfg, ckpt, device='cuda:0')\n#     models.append(model)\n\nfor ckpt in ckpts:\n    model = init_segmentor(cfg, ckpt, device='cuda:0')\n    models.append(model)","metadata":{"execution":{"iopub.status.busy":"2022-09-29T02:35:35.432681Z","iopub.execute_input":"2022-09-29T02:35:35.433376Z","iopub.status.idle":"2022-09-29T02:35:37.565361Z","shell.execute_reply.started":"2022-09-29T02:35:35.433337Z","shell.execute_reply":"2022-09-29T02:35:37.564386Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\n","metadata":{"execution":{"iopub.status.busy":"2022-09-29T02:31:30.566278Z","iopub.execute_input":"2022-09-29T02:31:30.566658Z","iopub.status.idle":"2022-09-29T02:31:30.588719Z","shell.execute_reply.started":"2022-09-29T02:31:30.566607Z","shell.execute_reply":"2022-09-29T02:31:30.587305Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"'''\nTo ensemble models, you need to do some modifications with \n\"../input/mmsegm/mmsegmentation-master/mmseg/models/segmentors/encoder_decoder.py\"\n'''\nnames,preds = [],[]\nimgs, pd_mks = [],[]\ndebug = len(df_sample)<2\nfor idx,row in tqdm(df_sample.iterrows(),total=len(df_sample)):\n# for idx,row in [(\"10044.tiff\",\"../input/hubmap-organ-segmentation/train_images/20955.tiff\")]:\n    im_  = cv2.imread(os.path.join(DATA,str(idx)+'.tiff'))\n    \n    \n#     im_  = img/img.max()\n#     im_ = cv2.imread(row)\n#     im_ = im_[1500:,1500:]\n    pred = inference_segmentor(models[0], im_)[0]\n    pred = (pred>0).astype(np.uint8)\n    rle = rle_encode_less_memory(pred)\n    names.append(str(idx))\n    preds.append(rle)\n    if debug:\n        imgs.append(im_)\n        pd_mks.append(pred)\n#     del img, pred, rle, idx, row\n    gc.collect()\nif debug:\n    import matplotlib.pyplot as plt\n    for img, mask in zip(imgs, pd_mks):\n        plt.figure(figsize=(12, 7))\n        plt.subplot(1, 3, 1); plt.imshow(img); plt.axis('OFF'); plt.title('image')\n        plt.subplot(1, 3, 2); plt.imshow(mask*255); plt.axis('OFF'); plt.title('mask')\n        plt.subplot(1, 3, 3); plt.imshow(img); plt.imshow(mask*2, alpha=0.4); plt.axis('OFF'); plt.title('overlay')\n        plt.tight_layout()\n        plt.show()","metadata":{"execution":{"iopub.status.busy":"2022-09-29T02:35:43.275702Z","iopub.execute_input":"2022-09-29T02:35:43.276405Z","iopub.status.idle":"2022-09-29T02:35:51.173208Z","shell.execute_reply.started":"2022-09-29T02:35:43.276368Z","shell.execute_reply":"2022-09-29T02:35:51.172331Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!rm -rf /kaggle/working/*","metadata":{"execution":{"iopub.status.busy":"2022-09-29T02:24:50.749146Z","iopub.status.idle":"2022-09-29T02:24:50.749752Z","shell.execute_reply.started":"2022-09-29T02:24:50.749379Z","shell.execute_reply":"2022-09-29T02:24:50.749402Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df = pd.DataFrame({'id':names,'rle':preds})\ndf.to_csv('submission.csv',index=False)\ndf.head()","metadata":{"papermill":{"duration":0.419953,"end_time":"2021-03-12T06:44:11.262501","exception":false,"start_time":"2021-03-12T06:44:10.842548","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-09-29T02:24:50.753201Z","iopub.status.idle":"2022-09-29T02:24:50.753733Z","shell.execute_reply.started":"2022-09-29T02:24:50.753435Z","shell.execute_reply":"2022-09-29T02:24:50.753461Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"papermill":{"duration":0.010126,"end_time":"2021-03-12T06:44:11.283196","exception":false,"start_time":"2021-03-12T06:44:11.27307","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]}]}