{"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":"### Multi-class segmentation with mmsegmentation🥳\n\n#### Related dataset & notebook:\n* [Creat multi-class dataset  (notebook)](https://www.kaggle.com/code/w3579628328/6-classes-dataset-for-mmsegmentation)\n* [256x256  (dataset)](https://www.kaggle.com/datasets/w3579628328/mmsegmentation256x256)\n* [512x512  (dataset)](https://www.kaggle.com/datasets/w3579628328/mmsegmentation512x512)\n\n#### Related baseline for training:\n* [Binary sementation with mmsegmentation](https://www.kaggle.com/code/w3579628328/mmsegmentation-trainning)\n\n#### Look forward to your upvote again🤗🤗🤗","metadata":{}},{"cell_type":"code","source":"!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\n!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","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2022-07-27T18:19:17.319219Z","iopub.execute_input":"2022-07-27T18:19:17.319677Z","iopub.status.idle":"2022-07-27T18:20:31.332328Z","shell.execute_reply.started":"2022-07-27T18:19:17.319644Z","shell.execute_reply":"2022-07-27T18:20:31.330541Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!mkdir -p ./mmseg_data/splits","metadata":{"execution":{"iopub.status.busy":"2022-07-27T18:20:31.335741Z","iopub.execute_input":"2022-07-27T18:20:31.336301Z","iopub.status.idle":"2022-07-27T18:20:32.088056Z","shell.execute_reply.started":"2022-07-27T18:20:31.336250Z","shell.execute_reply":"2022-07-27T18:20:32.086431Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"##### Start with 256x256 data","metadata":{}},{"cell_type":"code","source":"!cp -r /kaggle/input/mmsegmentation256x256/* /kaggle/working/mmseg_data/","metadata":{"execution":{"iopub.status.busy":"2022-07-27T18:20:32.090311Z","iopub.execute_input":"2022-07-27T18:20:32.090787Z","iopub.status.idle":"2022-07-27T18:21:06.394886Z","shell.execute_reply.started":"2022-07-27T18:20:32.090739Z","shell.execute_reply":"2022-07-27T18:21:06.393016Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from glob import glob\nimport numpy as np\nimport cv2\nimport os\nfrom sklearn.model_selection import StratifiedKFold\n\nFold = 10\nall_mask_files = glob(\"./mmseg_data/masks/*\")\nmasks = []\nnum_mask = np.zeros((6,Fold))\n\nfor i in range(len(all_mask_files)):\n    mask = cv2.imread(all_mask_files[i])\n    masks.append(mask.max())\n\nsplit = list(StratifiedKFold(n_splits=Fold, shuffle=True, random_state=2022).split(all_mask_files, masks))\nfor fold, (train_idx, valid_idx) in enumerate(split):\n    for i in valid_idx:\n        num_mask[masks[i]]+=1\n    with open(f\"./mmseg_data/splits/fold_{fold}.txt\", \"w\") as f:\n        for idx in train_idx:\n            f.write(os.path.basename(all_mask_files[idx])[:-4] + \"\\n\")\n    with open(f\"./mmseg_data/splits/valid_{fold}.txt\", \"w\") as f:\n        for idx in valid_idx:\n            f.write(os.path.basename(all_mask_files[idx])[:-4] + \"\\n\")\nprint(num_mask)","metadata":{"execution":{"iopub.status.busy":"2022-07-27T18:21:14.818668Z","iopub.execute_input":"2022-07-27T18:21:14.819219Z","iopub.status.idle":"2022-07-27T18:21:17.483017Z","shell.execute_reply.started":"2022-07-27T18:21:14.819133Z","shell.execute_reply":"2022-07-27T18:21:17.481641Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"* Newest version of mmsegmentation.","metadata":{}},{"cell_type":"code","source":"!cp -r ../input/mmsegm/mmsegmentation-master /kaggle/working/ && cd /kaggle/working/mmsegmentation-master && pip install -e . && cd ..","metadata":{"execution":{"iopub.status.busy":"2022-07-27T18:22:34.798416Z","iopub.execute_input":"2022-07-27T18:22:34.799203Z","iopub.status.idle":"2022-07-27T18:22:57.105470Z","shell.execute_reply.started":"2022-07-27T18:22:34.799137Z","shell.execute_reply":"2022-07-27T18:22:57.103810Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"* Larger backbone and more iters may lead to better score!","metadata":{}},{"cell_type":"code","source":"%%bash\n\ncat <<EOT >> /kaggle/working/config.py\n\nnorm_cfg = dict(type='SyncBN', requires_grad=True)\nmodel = dict(\n    type='EncoderDecoder',\n    pretrained=None,\n    backbone=dict(\n        type='UNet',\n        in_channels=3,\n        base_channels=64,\n        num_stages=5,\n        strides=(1, 1, 1, 1, 1),\n        enc_num_convs=(2, 2, 2, 2, 2),\n        dec_num_convs=(2, 2, 2, 2),\n        downsamples=(True, True, True, True),\n        enc_dilations=(1, 1, 1, 1, 1),\n        dec_dilations=(1, 1, 1, 1),\n        with_cp=False,\n        conv_cfg=None,\n        norm_cfg=norm_cfg,\n        act_cfg=dict(type='ReLU'),\n        upsample_cfg=dict(type='InterpConv'),\n        norm_eval=False),\n    decode_head=dict(\n        type='FCNHead',\n        in_channels=64,\n        in_index=4,\n        channels=64,\n        num_convs=1,\n        concat_input=False,\n        dropout_ratio=0.1,\n        num_classes=6,\n        norm_cfg=norm_cfg,\n        align_corners=False,\n        loss_decode=dict(\n            type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)),\n    auxiliary_head=dict(\n        type='FCNHead',\n        in_channels=128,\n        in_index=3,\n        channels=64,\n        num_convs=1,\n        concat_input=False,\n        dropout_ratio=0.1,\n        num_classes=6,\n        norm_cfg=norm_cfg,\n        align_corners=False,\n        loss_decode=dict(\n            type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)),\n    train_cfg=dict(),\n    test_cfg=dict(mode='whole'))\n\n# dataset settings\ndataset_type = 'CustomDataset'\ndata_root = '/kaggle/working/mmseg_data/'\nclasses = ['background', 'kidney', 'prostate', 'largeintestine', 'spleen', 'lung']\npalette = [[0,0,0], [255,0,0], [0,255,0], [0,0,255], [255,255,0], [255,0,255]]\nimg_norm_cfg = dict(mean=[196.869, 190.186, 194.802], std=[63.010, 66.765, 65.745], to_rgb=True)\nsize = 256\n\ntrain_pipeline = [\n    dict(type='LoadImageFromFile'),\n    dict(type='LoadAnnotations'),\n    dict(type='Resize', img_scale=(size, size), keep_ratio=True),\n    dict(type='RandomFlip', prob=0.5, direction='horizontal'),\n    dict(type='Normalize', **img_norm_cfg),\n    dict(type='Pad', size=(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'),\n    dict(\n        type='MultiScaleFlipAug',\n        img_scale=(size, 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, 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        data_root=data_root,\n        img_dir='train',\n        ann_dir='masks',\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        data_root=data_root,\n        img_dir='train',\n        ann_dir='masks',\n        img_suffix=\".png\",\n        seg_map_suffix='.png',\n        split=\"splits/valid_0.txt\",\n        classes=classes,\n        palette=palette,\n        pipeline=test_pipeline),\n    test=dict(\n        type=dataset_type,\n        data_root=data_root,\n        test_mode=True,\n        img_dir='train',\n        ann_dir='masks',\n        img_suffix=\".png\",\n        seg_map_suffix='.png',\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='TextLoggerHook', 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 = 5000\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 = total_iters)\ncheckpoint_config = dict(by_epoch=False, interval=-1, save_optimizer=False)\nevaluation = dict(by_epoch=False, interval=500, metric='mDice', pre_eval=True)\nfp16 = dict()\nwork_dir = './baseline'\nEOT","metadata":{"execution":{"iopub.status.busy":"2022-07-27T18:21:28.489076Z","iopub.execute_input":"2022-07-27T18:21:28.489566Z","iopub.status.idle":"2022-07-27T18:21:28.525101Z","shell.execute_reply.started":"2022-07-27T18:21:28.489533Z","shell.execute_reply":"2022-07-27T18:21:28.523234Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### Train with api","metadata":{}},{"cell_type":"code","source":"!python /kaggle/working/mmsegmentation-master/tools/train.py /kaggle/working/config.py","metadata":{"execution":{"iopub.status.busy":"2022-07-27T18:23:37.718817Z","iopub.execute_input":"2022-07-27T18:23:37.719360Z","iopub.status.idle":"2022-07-27T18:59:28.655566Z","shell.execute_reply.started":"2022-07-27T18:23:37.719321Z","shell.execute_reply":"2022-07-27T18:59:28.654006Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"* #### I haven't done any experiments yet😅. Mmsegmentation is quite powerfull, I believe you guys will get a nice score with proper hyperparameter and modification.\n\n\n* #### I'll share an submission kernel later🤗","metadata":{}}]}