{"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":"### Begin with mmsegmentation🥳\n* Simple baseline for training\n* Look forward to your upvote if it helps!🤗","metadata":{}},{"cell_type":"code","source":"!pip install ../input/openmmlab-essential-repositories/openmmlab-repos/src/torch-1.10.0+cu111-cp37-cp37m-linux_x86_64.whl\n!pip install ../input/openmmlab-essential-repositories/openmmlab-repos/src/torchvision-0.11.0+cu111-cp37-cp37m-linux_x86_64.whl\n!pip install ../input/mmcv1371/mmcv_full-1.5.0-cp37-cp37m-manylinux1_x86_64.whl\n!pip install ../input/mmcv1371/mmcls-0.21.0-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-08-29T10:51:08.259384Z","iopub.execute_input":"2022-08-29T10:51:08.259712Z","iopub.status.idle":"2022-08-29T10:53:55.006832Z","shell.execute_reply.started":"2022-08-29T10:51:08.259638Z","shell.execute_reply":"2022-08-29T10:53:55.005617Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!mkdir -p ./mmseg_data/images\n!mkdir -p ./mmseg_data/labels\n!mkdir -p ./mmseg_data/splits","metadata":{"execution":{"iopub.status.busy":"2022-08-29T10:53:55.010268Z","iopub.execute_input":"2022-08-29T10:53:55.010642Z","iopub.status.idle":"2022-08-29T10:53:57.93491Z","shell.execute_reply.started":"2022-08-29T10:53:55.010609Z","shell.execute_reply":"2022-08-29T10:53:57.933553Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Thanks for [THE DEVASTATOR](https://www.kaggle.com/thedevastator) 's great work of data preprocessing!\n* [Dataset (512 x 512)](https://www.kaggle.com/datasets/thedevastator/hubmap-2022-512x512/)\n\n* [Dataset (256 x 256)](https://www.kaggle.com/datasets/thedevastator/hubmap-2022-256x256/)\n\n* [Dataset (128 x 128)](https://www.kaggle.com/datasets/thedevastator/hubmap-2022-128x128/settings)\n\nHere I used 256X256 data.","metadata":{}},{"cell_type":"code","source":"!cp -r /kaggle/input/mmsegmentation256x256/train/* /kaggle/working/mmseg_data/images/\n!cp -r /kaggle/input/mmsegmentation256x256/masks/* /kaggle/working/mmseg_data/labels/","metadata":{"execution":{"iopub.status.busy":"2022-08-29T10:53:57.936707Z","iopub.execute_input":"2022-08-29T10:53:57.937409Z","iopub.status.idle":"2022-08-29T10:54:22.047336Z","shell.execute_reply.started":"2022-08-29T10:53:57.937363Z","shell.execute_reply":"2022-08-29T10:54:22.045978Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from glob import glob\nimport numpy as np\nimport cv2\nimport os\nimport shutil\nfrom sklearn.model_selection import StratifiedKFold\nFold = 5\nall_mask_files = glob(\"./mmseg_data/labels/*\")\nmasks = []\nnum_wo_mask = np.zeros(Fold)\nnum_w_mask = np.zeros(Fold)\nfor i in range(len(all_mask_files)):\n    mask = cv2.imread(all_mask_files[i])\n    if mask.sum()==0:\n        masks.append(0)\n    else:\n        masks.append(1)\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        if masks[i]==0:\n            num_wo_mask[fold]+=1\n        else:\n            num_w_mask[fold]+=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_wo_mask)\nprint(num_w_mask)","metadata":{"execution":{"iopub.status.busy":"2022-08-29T10:54:22.049204Z","iopub.execute_input":"2022-08-29T10:54:22.049599Z","iopub.status.idle":"2022-08-29T10:54:24.668925Z","shell.execute_reply.started":"2022-08-29T10:54:22.049558Z","shell.execute_reply":"2022-08-29T10:54:24.667878Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"* Newest version of mmsegmentation.","metadata":{}},{"cell_type":"code","source":"!zip  /kaggle/working/splits.zip /kaggle/working/mmseg_data/splits/*","metadata":{"execution":{"iopub.status.busy":"2022-08-29T10:54:24.671556Z","iopub.execute_input":"2022-08-29T10:54:24.67227Z","iopub.status.idle":"2022-08-29T10:54:25.704658Z","shell.execute_reply.started":"2022-08-29T10:54:24.672226Z","shell.execute_reply":"2022-08-29T10:54:25.703446Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!cp -r ../input/mmsegunknown /kaggle/working/mmsegmentation && cd /kaggle/working/mmsegmentation && pip install -e . && cd ..","metadata":{"execution":{"iopub.status.busy":"2022-08-29T10:54:25.706604Z","iopub.execute_input":"2022-08-29T10:54:25.709106Z","iopub.status.idle":"2022-08-29T10:54:42.602244Z","shell.execute_reply.started":"2022-08-29T10:54:25.70906Z","shell.execute_reply":"2022-08-29T10:54:42.600999Z"},"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\n# norm_cfg = dict(type='BN', requires_grad=True)\nbackbone_norm_cfg = dict(type='LN', requires_grad=True)\n\n# dataset settings\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        init_cfg=dict(type='Pretrained', checkpoint=checkpoint),\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.1,\n        attn_drop_rate=0.1,\n        drop_path_rate=0.1),\n    decode_head=dict(\n        type='SegformerHead',\n        in_channels=[64, 128, 320, 512],\n        in_index=[0, 1, 2, 3],\n        channels=512,\n        dropout_ratio=0.1,\n        num_classes=6,\n        norm_cfg=norm_cfg,\n        align_corners=False,\n        loss_decode=[\n            dict(\n                type='CrossEntropyLoss', loss_name='loss_ce', loss_weight=1.0),\n            dict(type='DiceLoss', loss_name='loss_dice', loss_weight=3.0)\n        ]),\n    # model training and testing settings\n    train_cfg=dict(),\n    test_cfg=dict(mode='whole'))\n\n# dataset settings\ndataset_type = 'CustomDataset'\ndata_root = '/kaggle/working/mmseg_data/'\n# classes = ['background', 'tissues']\n# palette = [[0, 0, 0], [255, 0, 0]]\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]]\n# img_norm_cfg = dict(mean=[196.869, 190.186, 194.802], std=[63.01, 66.765, 65.745], to_rgb=True)\nimg_norm_cfg = dict(mean=[128, 128, 128], std=[64, 64, 64], to_rgb=True)\nsize = 768\n\n# albumentations \nalbu = [\n        dict(type=\"HorizontalFlip\"),\n        dict(type=\"VerticalFlip\"),\n#         dict(type='RandomRotate90'),\n        dict(type='ShiftScaleRotate', shift_limit=0.0625, scale_limit=0.2, rotate_limit=15, p=0.9),\n        dict(type='OneOf',\n             transforms=[\n                dict(type='OpticalDistortion', p=0.5),\n                dict(type='GridDistortion', p=0.5),\n                dict(type='PiecewiseAffine', p=0.5)\n            ], p=0.5),\n        dict(type='OneOf',\n             transforms=[\n                dict(type='HueSaturationValue'),\n                dict(type='CLAHE', clip_limit=2),\n                dict(type='RandomBrightnessContrast')\n        ], p=0.5),\n    ]\ncrop_size = (768, 768)\ntrain_pipeline = [\n    dict(type='LoadImageFromFile'),\n    dict(type='LoadAnnotations'),\n    dict(type='Resize', img_scale=[(640, 640), (768, 768)], keep_ratio=False),\n    dict(type='Albu', transforms=albu),\n    dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.5),\n    dict(type='RandomFlip', prob=0.5, direction='vertical'),\n#     dict(type='RandomCutOut', prob=0.5, n_holes=8, cutout_ratio=(0.2, 0.4)),\n#     dict(type='RandomFlip', prob=0.5, direction='horizontal'),\n    dict(type='AdjustGamma'),\n    dict(type='RandomRotate', prob=0.5, degree=30),\n    dict(type='PhotoMetricDistortion'),\n    dict(type='Normalize', **img_norm_cfg),\n    dict(type='Pad', size=crop_size, pad_val=0, seg_pad_val=255),\n    dict(type='DefaultFormatBundle'),\n    dict(type='Collect', keys=['img', 'gt_semantic_seg']),\n]\n# size = 768\ntest_pipeline = [\n    dict(type='LoadImageFromFile'),\n    dict(\n        type='MultiScaleFlipAug',\n        img_scale=(size, size),\n        img_ratios=[0.8, 1.0, 1.2],\n        flip=True,\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_divisor=32, 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=2,\n    workers_per_gpu=2,\n    train=dict(\n        type=dataset_type,\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_2.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='images',\n        ann_dir='labels',\n        img_suffix=\".png\",\n        seg_map_suffix='.png',\n        split=\"./splits/valid_2.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='images',\n        ann_dir='labels',\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=1000,\n    hooks=[\n        dict(type='TextLoggerHook', by_epoch=False),\n    ])\n# yapf:enable\ndist_params = dict(backend='nccl')\nlog_level = 'INFO'\n# load_from = '/kaggle/input/mmseg-train-mit/seg_model_output/iter_5000.pth'\nload_from = None\nresume_from = None\nworkflow = [('train', 1)]\ncudnn_benchmark = True\n\ntotal_iters = 10000\n# optimizer\noptimizer = dict(\n    type='AdamW',\n    lr=6e-5,\n    betas=(0.9, 0.999),\n    weight_decay=0.05,\n    paramwise_cfg=dict(custom_keys=dict(head=dict(lr_mult=10.0)))\n)\noptimizer_config = dict(type='Fp16OptimizerHook', loss_scale='dynamic')\nlr_config = dict(\n    policy='poly',\n    warmup='linear',\n    warmup_iters=1000,\n    warmup_ratio=1e-8,\n    power=1.0,\n    min_lr=0.0,\n    by_epoch=False)\n# lr_config = dict(\n#     policy='CosineAnnealing',\n#     by_epoch=False,\n#     warmup='linear',\n#     warmup_iters=500,\n#     warmup_ratio=0.001,\n#     min_lr=1e-08)\n# runtime settings\nfind_unused_parameters = True\nrunner = dict(type='IterBasedRunner', max_iters=total_iters)\ncheckpoint_config = dict(by_epoch=False, interval=1000, save_optimizer=False)\nevaluation = dict(by_epoch=False, interval=1000, metric='mDice', pre_eval=True)\nfp16 = dict()\nwork_dir = './seg_model_output/'\n\nEOT","metadata":{"execution":{"iopub.status.busy":"2022-08-29T10:54:42.604597Z","iopub.execute_input":"2022-08-29T10:54:42.60498Z","iopub.status.idle":"2022-08-29T10:54:42.673448Z","shell.execute_reply.started":"2022-08-29T10:54:42.604941Z","shell.execute_reply":"2022-08-29T10:54:42.671974Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### Train with api","metadata":{}},{"cell_type":"code","source":"!python /kaggle/working/mmsegmentation/tools/train.py /kaggle/working/config.py","metadata":{"execution":{"iopub.status.busy":"2022-08-29T10:54:42.675632Z","iopub.execute_input":"2022-08-29T10:54:42.676168Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"shutil.rmtree('/kaggle/working/mmsegmentation')\nshutil.rmtree('/kaggle/working/mmseg_data')\n# only remains configs and trained models","metadata":{},"execution_count":null,"outputs":[]}]}