{"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":"from __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\n\nimport copy\nimport logging\nimport math\n\nfrom os.path import join as pjoin\n\nimport torch\nimport torch.nn as nn\nimport numpy as np\n\nfrom torch.nn import CrossEntropyLoss, Dropout, Softmax, Linear, Conv2d, LayerNorm\nfrom torch.nn.modules.utils import _pair\nfrom scipy import ndimage\n\nimport cv2\nfrom PIL import Image\nimport torch\nimport torch.nn as nn\nfrom torch.utils.data import Dataset, DataLoader\nfrom torchvision import transforms as T\nimport torchvision\nimport torch.nn.functional as F\nfrom torch.autograd import Variable\nimport cv2\na=cv2.imread(\"/kaggle/input/rgb-masks/coloured_segmentation_map/0030fd0e6378.png\")\na.shape\n","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-07-07T07:36:40.856842Z","iopub.execute_input":"2023-07-07T07:36:40.857297Z","iopub.status.idle":"2023-07-07T07:36:44.899239Z","shell.execute_reply.started":"2023-07-07T07:36:40.857256Z","shell.execute_reply":"2023-07-07T07:36:44.898290Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import random\nclass CellSegmentation(Dataset):\n    \n    def __init__(self, img_path, mask_path, X,rsize=512, transform=None):\n        self.img_path = img_path\n        self.X=X\n        self.mask_path = mask_path\n        self.rsize=rsize\n        self.transform=transform\n        \n    def __len__(self):\n        return len(self.X)\n    \n    def __getitem__(self, idx):\n        img = cv2.imread(self.img_path + self.X[idx] + '.png')\n        img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)\n        img=cv2.resize(img,(self.rsize,self.rsize), interpolation = cv2.INTER_NEAREST)\n        shp=img.shape\n        mask = cv2.imread(self.mask_path + self.X[idx] + '.png')\n        mask = cv2.resize(mask,(self.rsize,self.rsize), interpolation = cv2.INTER_NEAREST)\n        if self.transform is not None:\n            aug = self.transform(img, mask)\n            img = Image.fromarray(aug[0])\n            mask = aug[1]\n        \n        if self.transform is None:\n            img = Image.fromarray(img)\n            \n        idx=np.where(mask>0)[-1][0]\n        background=(mask[:,:,idx]==0).astype(int)\n        mask_final=np.zeros((4,shp[0],shp[1]))\n        mask_final[0,:,:]=background\n        mask_final[idx+1,:,:]=(mask[:,:,idx]>0).astype(int)\n        mask_final=mask_final.transpose(1,2,0)\n        mask_final = torch.from_numpy(np.where(mask_final>0)[-1])\n        mask_final=mask_final.reshape((self.rsize,self.rsize))\n        \n        \n        return torch.tensor(np.array(img)/255).permute(2,0,1), mask_final\n","metadata":{"execution":{"iopub.status.busy":"2023-07-07T07:36:44.904275Z","iopub.execute_input":"2023-07-07T07:36:44.906913Z","iopub.status.idle":"2023-07-07T07:36:44.925695Z","shell.execute_reply.started":"2023-07-07T07:36:44.906878Z","shell.execute_reply":"2023-07-07T07:36:44.923840Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\ndf=pd.read_csv(\"/kaggle/input/sartorius-cell-instance-segmentation/train.csv\")\na=np.load(\"/kaggle/input/validation-02/validation_0.2.npy\",allow_pickle=True).item()\nvalidation_ids=list(a['shsy5y'])+list(a['cort'])+list(a['astro'])\nvalid=df.loc[df['id'].isin(validation_ids)].reset_index(drop=True)\ndf=df.loc[~df['id'].isin(validation_ids)].reset_index(drop=True)\ndf.shape\n","metadata":{"execution":{"iopub.status.busy":"2023-07-07T07:37:12.154435Z","iopub.execute_input":"2023-07-07T07:37:12.154815Z","iopub.status.idle":"2023-07-07T07:37:12.826381Z","shell.execute_reply.started":"2023-07-07T07:37:12.154782Z","shell.execute_reply":"2023-07-07T07:37:12.825438Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class VerticalFlip:\n    def __init__(self, prob):\n        self.prob = prob\n\n    def __call__(self, image, target):\n        if random.random() < self.prob:\n            height, width = image.shape[-2:]\n            image = image[:,::-1,:]\n#             bbox = target[\"boxes\"]\n#             bbox[:, [1, 3]] = height - bbox[:, [3, 1]]\n#             target[\"boxes\"] = bbox\n            target = target[:,::-1,:]\n        return image, target\n\nclass HorizontalFlip:\n    def __init__(self, prob):\n        self.prob = prob\n\n    def __call__(self, image, target):\n        if random.random() < self.prob:\n            height, width = image.shape[-2:]\n            image = image[::-1,:,:]\n#             bbox = target[\"boxes\"]\n#             bbox[:, [0, 2]] = width - bbox[:, [2, 0]]\n#             target[\"boxes\"] = bbox\n            target = target[::-1,:,:]\n        return image, target\n\nclass Normalize:\n    def __call__(self, image, target):\n        image = F.normalize(image, RESNET_MEAN, RESNET_STD)\n        return image, target\n\nclass ToTensor:\n    def __call__(self, image, target):\n        image = F.to_tensor(image)\n        return image, target\n    \nclass Compose:\n    def __init__(self, transforms):\n        self.transforms = transforms\n\n    def __call__(self, image, target):\n        for t in self.transforms:\n            image, target = t(image, target)\n        return image, target\ndef get_transform(train):\n    transforms = []\n    \n    # Data augmentation for train\n    if train: \n        transforms.append(HorizontalFlip(0.5))\n        transforms.append(VerticalFlip(0.5))\n\n    return Compose(transforms)\n\ntrain_dataset=CellSegmentation(\"/kaggle/input/sartorius-cell-instance-segmentation/train/\"\n        ,\"/kaggle/input/rgb-masks/coloured_segmentation_map/\"\n        ,df['id'].unique(), transform=get_transform(train=True))\n\nvalidion_dataset=CellSegmentation(\"/kaggle/input/sartorius-cell-instance-segmentation/train/\"\n        ,\"/kaggle/input/rgb-masks/coloured_segmentation_map/\"\n        ,valid['id'].unique())\nfrom sklearn.preprocessing import LabelEncoder\nle=LabelEncoder()\ndf['id_int']=le.fit_transform(df['id'])\nfrom collections import Counter\nCounter(df['cell_type'])\nCounter({'shsy5y': 42464, 'cort': 8598, 'astro': 8480})\n\nfrom torch.utils.data import DataLoader\ntrain_dataloader = DataLoader(train_dataset, batch_size=5, shuffle=True)\nvalid_dataloader = DataLoader(validion_dataset, batch_size=1, shuffle=True)\nfrom torchvision.models.segmentation import deeplabv3_mobilenet_v3_large\nmodel=deeplabv3_mobilenet_v3_large(weights='DEFAULT')\n","metadata":{"execution":{"iopub.status.busy":"2023-07-07T07:37:12.828316Z","iopub.execute_input":"2023-07-07T07:37:12.828672Z","iopub.status.idle":"2023-07-07T07:37:17.950981Z","shell.execute_reply.started":"2023-07-07T07:37:12.828637Z","shell.execute_reply":"2023-07-07T07:37:17.949889Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.classifier[4] = nn.Conv2d(256, 4, kernel_size=(1, 1), stride=(1, 1))\nmodel.aux_classifier[4] = nn.Conv2d(10, 4, kernel_size=(1, 1), stride=(1, 1))\nmodel.load_state_dict(torch.load(\"/kaggle/input/bce-deeplabv3/last.pth\"))\nmodel=model.double()","metadata":{"execution":{"iopub.status.busy":"2023-07-07T07:37:17.952964Z","iopub.execute_input":"2023-07-07T07:37:17.953394Z","iopub.status.idle":"2023-07-07T07:37:21.673957Z","shell.execute_reply.started":"2023-07-07T07:37:17.953361Z","shell.execute_reply":"2023-07-07T07:37:21.672549Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tqdm import tqdm\nfrom matplotlib import pyplot as plt\npreds=[]\nvalid_loss=[]\ndevice='cuda'\nmodel=model.to(device)\nmodel.eval()\ncce=torch.nn.CrossEntropyLoss(weight=torch.tensor([5,5,5,1]).double())\nfor batch in tqdm(valid_dataloader):\n    inp,ground_truth_masks = batch\n    outputs = model(inp.to(device))\n    predicted_masks = outputs['out'].squeeze(1)\n    predicted_masks=predicted_masks.to(\"cpu\")\n    loss = cce(predicted_masks, ground_truth_masks)\n    valid_loss.append(loss.detach().cpu())\n    predicted_masks=predicted_masks.detach().cpu().numpy()\n    preds.append(predicted_masks)\n    fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(5, 3))\n    axes[0].imshow(np.argmax(predicted_masks,1)[0])\n    axes[1].imshow(ground_truth_masks[0])\n    plt.show()","metadata":{"execution":{"iopub.status.busy":"2023-07-07T07:37:21.678822Z","iopub.execute_input":"2023-07-07T07:37:21.679136Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import numpy as np\nfrom matplotlib import pyplot as plt\nplt.plot(np.load(\"/kaggle/input/bce-deeplabv3/miou_batch.npy\"))","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.plot(np.load(\"/kaggle/input/bce-deeplabv3/validation_loss.npy\"))","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.plot(np.load(\"/kaggle/input/bce-deeplabv3/pixel_accuracy_valid.npy\"))","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}