{"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":"def rle_encode_less_memory(img):\n    #the image should be transposed\n    pixels = img.T.flatten()\n    \n    # This simplified method requires first and last pixel to be zero\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    \n    return ' '.join(str(x) for x in runs)","metadata":{"execution":{"iopub.status.busy":"2022-09-14T03:23:30.328485Z","iopub.execute_input":"2022-09-14T03:23:30.329326Z","iopub.status.idle":"2022-09-14T03:23:30.358559Z","shell.execute_reply.started":"2022-09-14T03:23:30.329234Z","shell.execute_reply":"2022-09-14T03:23:30.357541Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import sys\nsys.path.append('/kaggle/input/timm-pytorch-image-models/pytorch-image-models-master/')\n!pip install -qq /kaggle/input/mmdetection/einops-0.4.1-py3-none-any.whl","metadata":{"execution":{"iopub.status.busy":"2022-09-14T03:23:30.360258Z","iopub.execute_input":"2022-09-14T03:23:30.360707Z","iopub.status.idle":"2022-09-14T03:24:03.051593Z","shell.execute_reply.started":"2022-09-14T03:23:30.360664Z","shell.execute_reply":"2022-09-14T03:24:03.050232Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# ! pip install segmentation-models-pytorch\n\nfrom skimage import io, filters, transform \nimport tifffile as tiff\nimport albumentations as A\n \nimport os\nimport cv2\nimport numpy as np\nimport pandas as pd\n\nimport torch\nimport torch.nn as nn\nimport torch.nn.functional as F\n","metadata":{"papermill":{"duration":13.182907,"end_time":"2022-07-12T04:01:53.673664","exception":false,"start_time":"2022-07-12T04:01:40.490757","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-09-14T03:24:03.055450Z","iopub.execute_input":"2022-09-14T03:24:03.055877Z","iopub.status.idle":"2022-09-14T03:24:07.167129Z","shell.execute_reply.started":"2022-09-14T03:24:03.055841Z","shell.execute_reply":"2022-09-14T03:24:07.166021Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class config:\n    IMAGE_SIZE = 1024\n    TRAIN_BATCH_SIZE = 2\n    VALID_BATCH_SIZE = 2*TRAIN_BATCH_SIZE\n    EPOCHS = 15\n    DEVICE = \"cuda\"\n    OUTPUT = \"/hubmap/\"\n    MODEL_PATH = \"../input/all-segformers/all-segformers/segformer-b5-finetuned-cityscapes-1024-1024\"\n    FOLDS = 5\n    LR = 1e-3\n    ","metadata":{"execution":{"iopub.status.busy":"2022-09-14T03:24:07.170204Z","iopub.execute_input":"2022-09-14T03:24:07.171840Z","iopub.status.idle":"2022-09-14T03:24:07.179401Z","shell.execute_reply.started":"2022-09-14T03:24:07.171791Z","shell.execute_reply":"2022-09-14T03:24:07.178275Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class HubDataset(torch.utils.data.Dataset):\n    def __init__(self,image_path, augmentations=None):\n        self.image_path = image_path\n        self.augmentations = augmentations\n        \n    def __len__(self):\n        return len(self.image_path)\n    \n    def __getitem__(self,item):\n        \n        image = tiff.imread(self.image_path[item])\n\n        \n        image = image.astype(np.float32)/255\n        image = cv2.resize(image, dsize=(config.IMAGE_SIZE, config.IMAGE_SIZE),interpolation=cv2.INTER_LINEAR)\n        \n#         if self.augmentations is not None:\n#             augmented = self.augmentations(image=image, mask=mask)\n#             image = augmented[\"image\"]\n#             mask = augmented[\"mask\"]    \n        image = np.transpose(image, (2, 0, 1)).astype(np.float32)\n\n        return {\n            \"image\": torch.tensor(image, dtype=torch.float),\n        }","metadata":{"papermill":{"duration":0.017041,"end_time":"2022-07-12T04:01:53.717711","exception":false,"start_time":"2022-07-12T04:01:53.70067","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-09-14T03:24:07.181391Z","iopub.execute_input":"2022-09-14T03:24:07.182113Z","iopub.status.idle":"2022-09-14T03:24:07.192831Z","shell.execute_reply.started":"2022-09-14T03:24:07.182076Z","shell.execute_reply":"2022-09-14T03:24:07.191571Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import torch\nimport torch.nn as nn\n\n@torch.no_grad()    \ndef infer(model,valid_loader,device):\n    model.eval()\n    \n    masks = []\n    for data in valid_loader:\n        inputs = data['image']\n        \n        inputs = inputs.to(device, dtype=torch.float)\n\n        output = model(inputs,)\n        output = torch.sigmoid(output)\n        \n        output = output.detach().cpu().numpy()\n        masks.append(output)\n    return masks","metadata":{"execution":{"iopub.status.busy":"2022-09-14T03:24:07.194277Z","iopub.execute_input":"2022-09-14T03:24:07.195288Z","iopub.status.idle":"2022-09-14T03:24:07.203934Z","shell.execute_reply.started":"2022-09-14T03:24:07.195249Z","shell.execute_reply":"2022-09-14T03:24:07.202864Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import sys\nsys.path.append('/kaggle/input/hubmap-coat/')\n\nfrom coat import *\nfrom daformer import *\nfrom helper import *","metadata":{"execution":{"iopub.status.busy":"2022-09-14T03:24:07.205337Z","iopub.execute_input":"2022-09-14T03:24:07.205921Z","iopub.status.idle":"2022-09-14T03:24:09.277130Z","shell.execute_reply.started":"2022-09-14T03:24:07.205881Z","shell.execute_reply":"2022-09-14T03:24:09.275627Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import torch\nimport torch.nn as nn\nimport timm\n\nclass MixUpSample(nn.Module):\n    def __init__(self, scale_factor=4):\n        super().__init__()\n        self.mixing = nn.Parameter(torch.tensor(0.5))\n        self.scale_factor = scale_factor\n\n    def forward(self, x):\n        x = self.mixing * F.interpolate(\n            x, scale_factor=self.scale_factor, mode=\"bilinear\", align_corners=False\n        ) + (1 - self.mixing) * F.interpolate(\n            x, scale_factor=self.scale_factor, mode=\"nearest\"\n        )\n        return x\n    \nclass Net(nn.Module):\n    \n    def __init__(self,\n                 encoder=coat_lite_medium,\n                 decoder=daformer_conv3x3,\n                 encoder_cfg={},\n                 decoder_cfg={},\n                 ):\n        \n        super(Net, self).__init__()\n        decoder_dim = decoder_cfg.get('decoder_dim', 320)\n\n        self.encoder = encoder\n\n        self.rgb = RGB()\n\n        encoder_dim = self.encoder.embed_dims\n        # [64, 128, 320, 512]\n\n        self.decoder = decoder(\n            encoder_dim=encoder_dim,\n            decoder_dim=decoder_dim,\n        )\n#         self.logit = nn.Sequential(\n#             nn.Conv2d(decoder_dim, 1, kernel_size=1),\n#             nn.Upsample(scale_factor = 4, mode='bilinear', align_corners=False),\n#         )\n        self.logit = nn.Conv2d(decoder_dim, 1, kernel_size=1)\n        self.mixup = MixUpSample()\n    def forward(self, x):\n\n        x = self.rgb(x)\n\n        B, C, H, W = x.shape\n        encoder = self.encoder(x)\n\n        last, decoder = self.decoder(encoder)\n        logits = self.logit(last)\n        \n        upsampled_logits = self.mixup(logits)\n        \n        return upsampled_logits","metadata":{"execution":{"iopub.status.busy":"2022-09-14T03:24:09.279315Z","iopub.execute_input":"2022-09-14T03:24:09.279899Z","iopub.status.idle":"2022-09-14T03:24:09.297765Z","shell.execute_reply.started":"2022-09-14T03:24:09.279861Z","shell.execute_reply":"2022-09-14T03:24:09.296640Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"### encoder\nclass coat_parallel_small_plus1 (CoaT):\n    def __init__(self, **kwargs):\n        super(coat_parallel_small_plus1, self).__init__(\n            patch_size=4,\n            embed_dims=[152, 320, 320, 320, 320],\n            serial_depths=[2, 2, 2, 2, 2],\n            parallel_depth=6,\n            num_heads=8,\n            mlp_ratios=[4, 4, 4, 4, 4],\n            pretrain ='coat_small_7479cf9b.pth',\n            **kwargs)\n","metadata":{"execution":{"iopub.status.busy":"2022-09-14T03:24:09.299366Z","iopub.execute_input":"2022-09-14T03:24:09.299771Z","iopub.status.idle":"2022-09-14T03:24:09.324018Z","shell.execute_reply.started":"2022-09-14T03:24:09.299697Z","shell.execute_reply":"2022-09-14T03:24:09.323035Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def HubmapModel():\n    encoder = coat_lite_medium()\n    checkpoint = '../input/hubmap-coat-medium/coat_lite_medium_384x384_f9129688.pth'\n    checkpoint = torch.load(checkpoint, map_location=lambda storage, loc: storage)\n    state_dict = checkpoint['model']\n    encoder.load_state_dict(state_dict,strict=False)\n    \n    net = Net(encoder=encoder).cuda()\n    \n    return net","metadata":{"execution":{"iopub.status.busy":"2022-09-14T03:24:09.329106Z","iopub.execute_input":"2022-09-14T03:24:09.329361Z","iopub.status.idle":"2022-09-14T03:24:09.337961Z","shell.execute_reply.started":"2022-09-14T03:24:09.329337Z","shell.execute_reply":"2022-09-14T03:24:09.337043Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## MAIN","metadata":{}},{"cell_type":"code","source":"df = pd.read_csv(\"../input/hubmap-organ-segmentation/test.csv\")","metadata":{"execution":{"iopub.status.busy":"2022-09-14T03:24:09.339282Z","iopub.execute_input":"2022-09-14T03:24:09.339703Z","iopub.status.idle":"2022-09-14T03:24:09.357834Z","shell.execute_reply.started":"2022-09-14T03:24:09.339667Z","shell.execute_reply":"2022-09-14T03:24:09.357000Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model_paths = [\n#               \"../input/hubmap-coat-lite-medium/model-0.pth\",\n#               \"../input/hubmap-coat-lite-medium/model-1.pth\",\n#               \"../input/hubmap-coat-lite-medium/model-2.pth\",\n#               \"../input/hubmap-coat-lite-medium/model-3.pth\",\n              \"../input/hubmap-coat-lite-medium/model-4.pth\", \n              ]","metadata":{"execution":{"iopub.status.busy":"2022-09-14T03:24:09.360630Z","iopub.execute_input":"2022-09-14T03:24:09.361204Z","iopub.status.idle":"2022-09-14T03:24:09.365580Z","shell.execute_reply.started":"2022-09-14T03:24:09.361170Z","shell.execute_reply":"2022-09-14T03:24:09.364554Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"rle_list = []\nfor idx,row in df.iterrows():\n\n    ###\n    model = HubmapModel()\n    model.to(\"cuda\")\n    \n    \n\n    \n    df_valid  = row\n    valid_ids = df_valid.id\n\n    valid_images = [os.path.join(\"../input/hubmap-organ-segmentation/test_images\",str(valid_ids) + \".tiff\")]\n\n    valid_dataset = HubDataset(image_path=valid_images)\n    valid_loader = torch.utils.data.DataLoader(valid_dataset,batch_size=config.VALID_BATCH_SIZE,shuffle=False,pin_memory=True) \n    \n    mask = np.zeros((config.IMAGE_SIZE, config.IMAGE_SIZE))\n    \n    for path in model_paths:\n        \n        model.load_state_dict(torch.load(path))\n        masks_output = infer(model=model,valid_loader=valid_loader,device=config.DEVICE)\n\n        mask += masks_output[0][0].reshape(masks_output[0][0].shape[1],masks_output[0][0].shape[2])\n        \n    mask = mask/len(model_paths)\n\n    mask = transform.resize(mask, (df_valid.img_height, df_valid.img_width))\n\n    threshold = filters.threshold_mean(mask) ##  isodata, otsu, li, mean, yen, minimum\n    mask = mask > threshold\n    mask = mask.astype(np.int8)\n    \n    print(mask.shape)\n    io.imshow(mask)\n    ###\n    rle_list.append(rle_encode_less_memory(mask))","metadata":{"execution":{"iopub.status.busy":"2022-09-14T03:24:09.367058Z","iopub.execute_input":"2022-09-14T03:24:09.367395Z","iopub.status.idle":"2022-09-14T03:24:37.100581Z","shell.execute_reply.started":"2022-09-14T03:24:09.367362Z","shell.execute_reply":"2022-09-14T03:24:37.099465Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(threshold)","metadata":{"execution":{"iopub.status.busy":"2022-09-14T03:24:37.101973Z","iopub.execute_input":"2022-09-14T03:24:37.102447Z","iopub.status.idle":"2022-09-14T03:24:37.110152Z","shell.execute_reply.started":"2022-09-14T03:24:37.102401Z","shell.execute_reply":"2022-09-14T03:24:37.109182Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission = pd.read_csv(\"../input/hubmap-organ-segmentation/sample_submission.csv\")","metadata":{"execution":{"iopub.status.busy":"2022-09-14T03:24:37.111578Z","iopub.execute_input":"2022-09-14T03:24:37.111917Z","iopub.status.idle":"2022-09-14T03:24:37.126813Z","shell.execute_reply.started":"2022-09-14T03:24:37.111872Z","shell.execute_reply":"2022-09-14T03:24:37.125865Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission[\"rle\"] = rle_list\nsubmission.to_csv(\"submission.csv\", index=False)","metadata":{"execution":{"iopub.status.busy":"2022-09-14T03:24:37.128474Z","iopub.execute_input":"2022-09-14T03:24:37.128847Z","iopub.status.idle":"2022-09-14T03:24:37.138302Z","shell.execute_reply.started":"2022-09-14T03:24:37.128812Z","shell.execute_reply":"2022-09-14T03:24:37.137105Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission.head()","metadata":{"execution":{"iopub.status.busy":"2022-09-14T03:24:37.140472Z","iopub.execute_input":"2022-09-14T03:24:37.140933Z","iopub.status.idle":"2022-09-14T03:24:37.153651Z","shell.execute_reply.started":"2022-09-14T03:24:37.140884Z","shell.execute_reply":"2022-09-14T03:24:37.152634Z"},"trusted":true},"execution_count":null,"outputs":[]}]}