{"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"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":45867,"databundleVersionId":6924515,"sourceType":"competition"},{"sourceId":65833,"databundleVersionId":7245759,"sourceType":"competition"},{"sourceId":34686,"sourceType":"datasetVersion","datasetId":27201}],"dockerImageVersionId":30301,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"## **Multiclass Semantic Segmentation (Pytorch)**","metadata":{"_uuid":"9926bf52-a32a-4460-962e-97f3e2c61682","_cell_guid":"a1e9bfce-9b57-417d-b406-6c0d67b86ba2","trusted":true}},{"cell_type":"markdown","source":"<div style=\"color:white;\n           display:fill;\n           border-radius:5px;\n           background-color:#5642C5;\n           font-size:140%;\n           font-family:Verdana;\n           letter-spacing:0.5px;\">\n\n<p style=\"padding: 10px;\n              color:white;\n          text-align: center;\">  Please upvote if you learned from it.\n</p>\n</div>","metadata":{}},{"cell_type":"markdown","source":"## Import","metadata":{"_uuid":"9121774b-11eb-4cb3-90df-88bb533881d3","_cell_guid":"7f5a0285-46a7-43c8-aaea-7b71a0a4082e","trusted":true}},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport os\nfrom torch.utils.data import Dataset\nimport torch\nfrom PIL import Image\nimport matplotlib.pyplot as plt\nfrom albumentations.pytorch import ToTensorV2\nimport albumentations as A","metadata":{"_uuid":"630d6021-0626-485e-aeb2-2cbfcf756e5e","_cell_guid":"fde6413c-10d9-4913-9a40-34e7fd46d614","collapsed":false,"jupyter":{"outputs_hidden":false},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import torch.nn as nn\nfrom torch.optim import Adam\nfrom tqdm import tqdm","metadata":{"_uuid":"0958659d-9b9e-45b6-becc-c363ea6f957e","_cell_guid":"305e1c53-78cb-4715-87f1-92d87172a6a0","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2022-11-11T12:53:19.262485Z","iopub.execute_input":"2022-11-11T12:53:19.262835Z","iopub.status.idle":"2022-11-11T12:53:19.271948Z","shell.execute_reply.started":"2022-11-11T12:53:19.262805Z","shell.execute_reply":"2022-11-11T12:53:19.27086Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Dataset","metadata":{"_uuid":"910a1cec-a3fe-4e16-ab9f-3c0ec3f83884","_cell_guid":"56ab38ee-58cb-4df3-8b60-9334f31ad71f","trusted":true}},{"cell_type":"code","source":"class LyftUdacity(Dataset):\n    def __init__(self, img_dir,transform = None):\n        self.transforms = transform\n        image_paths = [i + '/CameraRGB' for i in img_dir]\n        seg_paths = [i + '/CameraSeg' for i in img_dir]\n        self.images, self.masks = [],[]\n        for i in image_paths:\n            imgs = os.listdir(i)\n            self.images.extend([i + '/' + img for img in imgs])\n        for i in seg_paths:\n            masks = os.listdir(i)\n            self.masks.extend([i + '/' + mask for mask in masks])\n    def __len__(self):\n        return len(self.images)\n    def __getitem__(self,index):\n        img = np.array(Image.open(self.images[index]))\n        mask = np.array(Image.open(self.masks[index]))\n        if self.transforms is not None:\n            aug = self.transforms(image =img, mask = mask)\n            img = aug['image']\n            mask = aug['mask']\n            mask = torch.max(mask, dim = 2)[0]\n        return img,mask","metadata":{"_uuid":"11c86fbb-3edb-47f5-8bf5-03939724f0c0","_cell_guid":"bb093d69-f7b7-4faf-a3b6-d1842a8c4119","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2022-11-11T12:53:19.273487Z","iopub.execute_input":"2022-11-11T12:53:19.273858Z","iopub.status.idle":"2022-11-11T12:53:19.28834Z","shell.execute_reply.started":"2022-11-11T12:53:19.273828Z","shell.execute_reply":"2022-11-11T12:53:19.286973Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data_dir = ['../input/lyft-udacity-challenge/data' + i + '/data' + i for i in ['A','B','C','D','E']]\nDATA_ROOT = '/kaggle/input/lyft-udacity-challenge/'","metadata":{"_uuid":"03a0d585-6511-49ab-a8d0-0d3bf496224e","_cell_guid":"e47d7187-9b9b-40c0-b319-934269645f2c","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2022-11-11T12:53:19.28997Z","iopub.execute_input":"2022-11-11T12:53:19.290486Z","iopub.status.idle":"2022-11-11T12:53:19.298908Z","shell.execute_reply.started":"2022-11-11T12:53:19.290443Z","shell.execute_reply":"2022-11-11T12:53:19.297706Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def get_images(image_dir, transform = None, batch_size=1, shuffle=True, pin_memory=True):\n        data = LyftUdacity(image_dir, transform =t1)\n        train_size = int(0.8* data.__len__())\n        test_size = data.__len__() - train_size\n        train_dataset, test_dataset =  torch.utils.data.random_split(data, [train_size, test_size])\n        train_batch = torch.utils.data.DataLoader(train_dataset, batch_size=batch_size,shuffle=shuffle, pin_memory=pin_memory)\n        test_batch = torch.utils.data.DataLoader(test_dataset, batch_size = batch_size, shuffle=shuffle, pin_memory=pin_memory)\n        return train_batch, test_batch","metadata":{"_uuid":"1e45c1ab-9ee8-4e2b-a88c-27ebb6071942","_cell_guid":"9407bde8-2446-457c-aefb-d8e7adc0e600","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2022-11-11T12:53:19.302995Z","iopub.execute_input":"2022-11-11T12:53:19.303412Z","iopub.status.idle":"2022-11-11T12:53:19.311626Z","shell.execute_reply.started":"2022-11-11T12:53:19.303377Z","shell.execute_reply":"2022-11-11T12:53:19.310322Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Transforms","metadata":{"_uuid":"1c561cd0-2662-42da-9f7c-279ed2866fe0","_cell_guid":"5a14aaac-8a4e-427f-8802-845118ad734c","trusted":true}},{"cell_type":"code","source":"t1 = A.Compose([\n    A.Resize(160,240),\n    A.augmentations.transforms.Normalize(mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5)),\n    ToTensorV2()\n])","metadata":{"_uuid":"321911aa-95ca-416e-a7fb-c446b1e076c6","_cell_guid":"7c3d4f43-486e-42a6-a5a8-2674353f9265","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2022-11-11T12:53:19.312971Z","iopub.execute_input":"2022-11-11T12:53:19.313538Z","iopub.status.idle":"2022-11-11T12:53:19.326582Z","shell.execute_reply.started":"2022-11-11T12:53:19.313495Z","shell.execute_reply":"2022-11-11T12:53:19.325458Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_batch,test_batch = get_images(data_dir, transform=t1, batch_size = 8)","metadata":{"_uuid":"aa31ddaa-7b2f-4967-a4b1-b308041f99d3","_cell_guid":"2500e2b4-981c-42d6-8fde-b6063b2aa0a8","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2022-11-11T12:53:19.328136Z","iopub.execute_input":"2022-11-11T12:53:19.328487Z","iopub.status.idle":"2022-11-11T12:53:19.359281Z","shell.execute_reply.started":"2022-11-11T12:53:19.328452Z","shell.execute_reply":"2022-11-11T12:53:19.358245Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for img,mask in train_batch:\n    img1 = np.transpose(img[0,:,:,:],(1,2,0))\n    mask1 = np.array(mask[0,:,:])\n    img2 = np.transpose(img[1,:,:,:],(1,2,0))\n    mask2 = np.array(mask[1,:,:])\n    img3 = np.transpose(img[2,:,:,:],(1,2,0))\n    mask3 = np.array(mask[2,:,:])\n    img4 = np.transpose(img[3,:,:,:],(1,2,0))\n    mask4 = np.array(mask[3,:,:])\n    fig, ax = plt.subplots(4,2, figsize=(18, 18))\n    ax[0][0].imshow(img1)\n    ax[0][1].imshow(mask1)\n    ax[1][0].imshow(img2)\n    ax[1][1].imshow(mask2)\n    ax[2][0].imshow(img3)\n    ax[2][1].imshow(mask3)\n    ax[3][0].imshow(img4)\n    ax[3][1].imshow(mask4)\n    break","metadata":{"_uuid":"bfe54bb4-b3fc-4e82-b3e0-5ed4c6abd12c","_cell_guid":"3d6879a6-f852-48c9-a710-8737599f5bbf","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2022-11-11T12:53:19.361032Z","iopub.execute_input":"2022-11-11T12:53:19.361701Z","iopub.status.idle":"2022-11-11T12:53:21.242038Z","shell.execute_reply.started":"2022-11-11T12:53:19.361635Z","shell.execute_reply":"2022-11-11T12:53:21.240862Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Original labels\nlabels = ['Unlabeled','Building','Fence','Other',\n          'Pedestrian', 'Pole', 'Roadline', 'Road',\n          'Sidewalk', 'Vegetation', 'Car','Wall',\n          'Traffic sign']","metadata":{"_uuid":"84b24e72-1a3e-43df-b141-9d91118b1e0a","_cell_guid":"6d304940-c7dc-44d9-aaa7-09a5b5d804e9","collapsed":false,"scrolled":true,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2022-11-11T12:53:21.243555Z","iopub.execute_input":"2022-11-11T12:53:21.243959Z","iopub.status.idle":"2022-11-11T12:53:21.250743Z","shell.execute_reply.started":"2022-11-11T12:53:21.243924Z","shell.execute_reply":"2022-11-11T12:53:21.249563Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(img1.shape)\nplt.imshow(img1[...,0])\nimg11 = img1[...,0]\nprint(img11.shape)","metadata":{"execution":{"iopub.status.busy":"2022-11-11T12:53:21.252403Z","iopub.execute_input":"2022-11-11T12:53:21.252854Z","iopub.status.idle":"2022-11-11T12:53:21.525038Z","shell.execute_reply.started":"2022-11-11T12:53:21.252809Z","shell.execute_reply":"2022-11-11T12:53:21.523982Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"np.unique(mask1*255)","metadata":{"execution":{"iopub.status.busy":"2022-11-11T12:53:21.526428Z","iopub.execute_input":"2022-11-11T12:53:21.52681Z","iopub.status.idle":"2022-11-11T12:53:21.533491Z","shell.execute_reply.started":"2022-11-11T12:53:21.526777Z","shell.execute_reply":"2022-11-11T12:53:21.53266Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Albumentations","metadata":{}},{"cell_type":"code","source":"from albumentations.pytorch import ToTensorV2\nimport albumentations as A\nfrom albumentations import(\nHorizontalFlip, VerticalFlip, IAAPerspective, ShiftScaleRotate, CLAHE, RandomRotate90, ToGray, Transpose, ShiftScaleRotate, Blur, OpticalDistortion, GridDistortion, HueSaturationValue, IAAAdditiveGaussianNoise, GaussNoise, MotionBlur, MedianBlur, IAAPiecewiseAffine, RandomResizedCrop, IAASharpen, IAAEmboss, RandomBrightnessContrast, Flip, OneOf, Compose, Normalize, Cutout, CoarseDropout, ShiftScaleRotate, CenterCrop, Resize\n)\n\nt1 = A.Compose([\n    A.Resize(256, 256),\n    #ToGray(p = 0.3),\n    ShiftScaleRotate(p = 0.5),\n    HorizontalFlip(),\n    # RandomBrightnessContrast(p=0.2),\n    A.augmentations.transforms.Normalize(mean = (0.5, 0.5, 0.5), std = (0.5, 0.5, 0.5)),\n    ToTensorV2()\n])","metadata":{"execution":{"iopub.status.busy":"2022-11-11T12:53:21.534812Z","iopub.execute_input":"2022-11-11T12:53:21.535302Z","iopub.status.idle":"2022-11-11T12:53:21.544716Z","shell.execute_reply.started":"2022-11-11T12:53:21.535271Z","shell.execute_reply":"2022-11-11T12:53:21.543459Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for i in range(13):\n    mask = plt.imread(DATA_ROOT + 'dataA/dataA/CameraSeg/02_00_000.png') * 255\n    plt.imshow(mask)\n    mask = np.where(mask == i, 255, 0)\n    mask=mask[:,:,0]\n    plt.title(f'class:{i} {labels[i]}')\n    plt.imshow(mask)\n    plt.show()","metadata":{"execution":{"iopub.status.busy":"2022-11-11T12:53:21.545889Z","iopub.execute_input":"2022-11-11T12:53:21.546391Z","iopub.status.idle":"2022-11-11T12:53:26.498309Z","shell.execute_reply.started":"2022-11-11T12:53:21.546359Z","shell.execute_reply":"2022-11-11T12:53:26.496917Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Generate list of images\ncameraRGB = []\ncameraSeg = []\n\nfor root, dirs, files in os.walk(DATA_ROOT):\n    for name in files:\n        f = os.path.join(root, name)\n        if 'CameraRGB' in f:\n            cameraRGB.append(f)\n        elif 'CameraSeg' in f:\n            cameraSeg.append(f)\n        else:\n            break","metadata":{"execution":{"iopub.status.busy":"2022-11-11T12:53:26.501946Z","iopub.execute_input":"2022-11-11T12:53:26.502412Z","iopub.status.idle":"2022-11-11T12:53:26.609161Z","shell.execute_reply.started":"2022-11-11T12:53:26.502377Z","shell.execute_reply":"2022-11-11T12:53:26.607759Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Generate Pandas dataframe for images and Masks\ndf = pd.DataFrame({'cameraRGB': cameraRGB, 'cameraSeg': cameraSeg})\ndf.sort_values(by = 'cameraRGB', inplace = True)\ndf.reset_index(drop=True, inplace=True)\ndf.head(5)","metadata":{"execution":{"iopub.status.busy":"2022-11-11T12:53:26.610784Z","iopub.execute_input":"2022-11-11T12:53:26.611151Z","iopub.status.idle":"2022-11-11T12:53:26.646723Z","shell.execute_reply.started":"2022-11-11T12:53:26.611114Z","shell.execute_reply":"2022-11-11T12:53:26.645589Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<div style=\"color:white;\n           display:fill;\n           border-radius:5px;\n           background-color:#5642C5;\n           font-size:140%;\n           font-family:Verdana;\n           letter-spacing:0.5px;\">\n\n<p style=\"padding: 10px;\n              color:white;\n          text-align: center;\">  Please upvote if you learned from it.\n</p>\n</div>","metadata":{}}]}