Last active
May 22, 2023 21:31
-
-
Save st235/9c39f4e7b8d15b701024dda3d4cfa989 to your computer and use it in GitHub Desktop.
HSE Question 10
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "code", | |
"execution_count": 1, | |
"id": "86e5d061", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"import torch\n", | |
"import os\n", | |
"import glob\n", | |
"import os\n", | |
"\n", | |
"import cv2\n", | |
"import numpy as np\n", | |
"import matplotlib.pyplot as plt\n", | |
"import torch\n", | |
"from torch.nn import functional as F\n", | |
"from PIL import Image\n", | |
"from torch.utils import data\n", | |
"import albumentations as Al\n", | |
"from torch.utils.data import DataLoader\n", | |
"from torch.utils.data import Dataset as BaseDataset\n", | |
"from albumentations.pytorch.transforms import ToTensorV2\n", | |
"from PIL import Image\n", | |
"import random\n", | |
"import segmentation_models_pytorch as smp\n", | |
"from segmentation_models_pytorch.utils import base\n", | |
"from torch.optim.lr_scheduler import *\n", | |
"from tqdm import tqdm\n", | |
"from torch.nn.functional import sigmoid" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 142, | |
"id": "0f628923", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"class Segmentation_dataset():\n", | |
" def __init__(self,\n", | |
" imgs_path,\n", | |
" mask_path,\n", | |
" size=(512,512),\n", | |
" show = False, \n", | |
" img = 'jpg',\n", | |
" mask = '_mask.gif'):\n", | |
" \n", | |
" self.imgs_path = imgs_path\n", | |
" self.mask_path = mask_path\n", | |
" self.size = size\n", | |
" self.show = show\n", | |
" self.img = img\n", | |
" self.mask = mask\n", | |
" self.data = []\n", | |
" \n", | |
" self.load_imgs(self.imgs_path,self.mask_path)\n", | |
" \n", | |
" self.transform_norm = Al.Compose([Al.Normalize(),ToTensorV2() ])\n", | |
" \n", | |
" self.transform = Al.Compose([Al.Resize(width=self.size[0],\n", | |
" height=self.size[1])])\n", | |
" \n", | |
" def load_imgs(self,imgs_path,mask_path):\n", | |
" for path in glob.glob(imgs_path + f'*.{self.img}'):\n", | |
" bn = os.path.basename(path)[:-4]\n", | |
" mask_path = self.mask_path +bn +f'{self.mask}'\n", | |
" \n", | |
" if os.path.exists(mask_path):\n", | |
" self.data.append({'img_path':path,\n", | |
" 'mask_path':mask_path})\n", | |
" \n", | |
" def __len__(self):\n", | |
" return len(self.data)\n", | |
" \n", | |
" \n", | |
" def augs(self,img,mask):\n", | |
" \n", | |
" train_transform = self.transform(image=img, mask=mask)\n", | |
" transformed_image = train_transform[\"image\"]\n", | |
" transformed_mask = train_transform[\"mask\"]\n", | |
" \n", | |
" if self.show:\n", | |
" return transformed_image,transformed_mask\n", | |
" \n", | |
" norm_transform = self.transform_norm(image=transformed_image)\n", | |
" transformed_image = norm_transform[\"image\"] \n", | |
" \n", | |
" transform_mask= torch.tensor(transformed_mask,dtype=torch.float)\n", | |
" transform_mask = torch.unsqueeze(transform_mask,dim=0)\n", | |
" \n", | |
" return transformed_image,transform_mask\n", | |
" \n", | |
" def __getitem__(self, index):\n", | |
" \n", | |
" img_path = self.data[index]['img_path']\n", | |
" mask_path = self.data[index]['mask_path']\n", | |
" \n", | |
" img = Image.open(img_path)\n", | |
" mask = Image.open(mask_path)\n", | |
" \n", | |
" img = np.array(img,dtype = np.uint8)\n", | |
" img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)\n", | |
" mask = np.array(mask,dtype = np.uint8)\n", | |
" \n", | |
" transform_img,transform_mask = self.augs(img,mask) \n", | |
"\n", | |
" return transform_img,transform_mask\n", | |
" " | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 143, | |
"id": "3922905e", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"validation_dataset = Segmentation_dataset(imgs_path = '/semantic_segmentation/val_imgs/',\n", | |
" mask_path = '/semantic_segmentation/val_mask/',show=False, size=(224, 224))" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 144, | |
"id": "463824aa", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"Unet(\n", | |
" (encoder): ResNetEncoder(\n", | |
" (conv1): Conv2d(3, 64, kernel_size=(7, 7), stride=(2, 2), padding=(3, 3), bias=False)\n", | |
" (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", | |
" (relu): ReLU(inplace=True)\n", | |
" (maxpool): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)\n", | |
" (layer1): Sequential(\n", | |
" (0): BasicBlock(\n", | |
" (conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", | |
" (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", | |
" (relu): ReLU(inplace=True)\n", | |
" (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", | |
" (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", | |
" )\n", | |
" (1): BasicBlock(\n", | |
" (conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", | |
" (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", | |
" (relu): ReLU(inplace=True)\n", | |
" (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", | |
" (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", | |
" )\n", | |
" )\n", | |
" (layer2): Sequential(\n", | |
" (0): BasicBlock(\n", | |
" (conv1): Conv2d(64, 128, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n", | |
" (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", | |
" (relu): ReLU(inplace=True)\n", | |
" (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", | |
" (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", | |
" (downsample): Sequential(\n", | |
" (0): Conv2d(64, 128, kernel_size=(1, 1), stride=(2, 2), bias=False)\n", | |
" (1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", | |
" )\n", | |
" )\n", | |
" (1): BasicBlock(\n", | |
" (conv1): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", | |
" (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", | |
" (relu): ReLU(inplace=True)\n", | |
" (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", | |
" (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", | |
" )\n", | |
" )\n", | |
" (layer3): Sequential(\n", | |
" (0): BasicBlock(\n", | |
" (conv1): Conv2d(128, 256, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n", | |
" (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", | |
" (relu): ReLU(inplace=True)\n", | |
" (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", | |
" (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", | |
" (downsample): Sequential(\n", | |
" (0): Conv2d(128, 256, kernel_size=(1, 1), stride=(2, 2), bias=False)\n", | |
" (1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", | |
" )\n", | |
" )\n", | |
" (1): BasicBlock(\n", | |
" (conv1): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", | |
" (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", | |
" (relu): ReLU(inplace=True)\n", | |
" (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", | |
" (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", | |
" )\n", | |
" )\n", | |
" (layer4): Sequential(\n", | |
" (0): BasicBlock(\n", | |
" (conv1): Conv2d(256, 512, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n", | |
" (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", | |
" (relu): ReLU(inplace=True)\n", | |
" (conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", | |
" (bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", | |
" (downsample): Sequential(\n", | |
" (0): Conv2d(256, 512, kernel_size=(1, 1), stride=(2, 2), bias=False)\n", | |
" (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", | |
" )\n", | |
" )\n", | |
" (1): BasicBlock(\n", | |
" (conv1): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", | |
" (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", | |
" (relu): ReLU(inplace=True)\n", | |
" (conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", | |
" (bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", | |
" )\n", | |
" )\n", | |
" )\n", | |
" (decoder): UnetDecoder(\n", | |
" (center): Identity()\n", | |
" (blocks): ModuleList(\n", | |
" (0): DecoderBlock(\n", | |
" (conv1): Conv2dReLU(\n", | |
" (0): Conv2d(768, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", | |
" (1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", | |
" (2): ReLU(inplace=True)\n", | |
" )\n", | |
" (attention1): Attention(\n", | |
" (attention): Identity()\n", | |
" )\n", | |
" (conv2): Conv2dReLU(\n", | |
" (0): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", | |
" (1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", | |
" (2): ReLU(inplace=True)\n", | |
" )\n", | |
" (attention2): Attention(\n", | |
" (attention): Identity()\n", | |
" )\n", | |
" )\n", | |
" (1): DecoderBlock(\n", | |
" (conv1): Conv2dReLU(\n", | |
" (0): Conv2d(384, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", | |
" (1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", | |
" (2): ReLU(inplace=True)\n", | |
" )\n", | |
" (attention1): Attention(\n", | |
" (attention): Identity()\n", | |
" )\n", | |
" (conv2): Conv2dReLU(\n", | |
" (0): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", | |
" (1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", | |
" (2): ReLU(inplace=True)\n", | |
" )\n", | |
" (attention2): Attention(\n", | |
" (attention): Identity()\n", | |
" )\n", | |
" )\n", | |
" (2): DecoderBlock(\n", | |
" (conv1): Conv2dReLU(\n", | |
" (0): Conv2d(192, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", | |
" (1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", | |
" (2): ReLU(inplace=True)\n", | |
" )\n", | |
" (attention1): Attention(\n", | |
" (attention): Identity()\n", | |
" )\n", | |
" (conv2): Conv2dReLU(\n", | |
" (0): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", | |
" (1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", | |
" (2): ReLU(inplace=True)\n", | |
" )\n", | |
" (attention2): Attention(\n", | |
" (attention): Identity()\n", | |
" )\n", | |
" )\n", | |
" (3): DecoderBlock(\n", | |
" (conv1): Conv2dReLU(\n", | |
" (0): Conv2d(128, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", | |
" (1): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", | |
" (2): ReLU(inplace=True)\n", | |
" )\n", | |
" (attention1): Attention(\n", | |
" (attention): Identity()\n", | |
" )\n", | |
" (conv2): Conv2dReLU(\n", | |
" (0): Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", | |
" (1): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", | |
" (2): ReLU(inplace=True)\n", | |
" )\n", | |
" (attention2): Attention(\n", | |
" (attention): Identity()\n", | |
" )\n", | |
" )\n", | |
" (4): DecoderBlock(\n", | |
" (conv1): Conv2dReLU(\n", | |
" (0): Conv2d(32, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", | |
" (1): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", | |
" (2): ReLU(inplace=True)\n", | |
" )\n", | |
" (attention1): Attention(\n", | |
" (attention): Identity()\n", | |
" )\n", | |
" (conv2): Conv2dReLU(\n", | |
" (0): Conv2d(16, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", | |
" (1): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", | |
" (2): ReLU(inplace=True)\n", | |
" )\n", | |
" (attention2): Attention(\n", | |
" (attention): Identity()\n", | |
" )\n", | |
" )\n", | |
" )\n", | |
" )\n", | |
" (segmentation_head): SegmentationHead(\n", | |
" (0): Conv2d(16, 1, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n", | |
" (1): Identity()\n", | |
" (2): Activation(\n", | |
" (activation): Identity()\n", | |
" )\n", | |
" )\n", | |
")" | |
] | |
}, | |
"execution_count": 144, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"ENCODER = 'resnet18'\n", | |
"ENCODER_WEIGHTS = 'imagenet'\n", | |
"\n", | |
"DEVICE = 'cpu'\n", | |
"\n", | |
"model = smp.Unet(\n", | |
" encoder_name=ENCODER,\n", | |
" encoder_weights=ENCODER_WEIGHTS,\n", | |
" classes=1,\n", | |
" activation=None,\n", | |
")\n", | |
"model.to(DEVICE)\n", | |
"\n", | |
"model.load_state_dict(torch.load('/semantic_segmentation/pretrain_models/model_unet_resnet18.pth', map_location=torch.device('cpu')))\n", | |
"model.eval()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 145, | |
"id": "952f0127", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"valid_loader = DataLoader(validation_dataset, batch_size=1, shuffle=False, num_workers=0)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 146, | |
"id": "607fa79d", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"metrics = [smp.utils.metrics.IoU(threshold=0.5)]" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 147, | |
"id": "6b5de62b", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stderr", | |
"output_type": "stream", | |
"text": [ | |
"100%|███████████████████████████████████████████| 15/15 [00:03<00:00, 4.60it/s]\n" | |
] | |
} | |
], | |
"source": [ | |
"ious = []\n", | |
"\n", | |
"for img, mask in tqdm(valid_loader):\n", | |
" img, mask = img.to('cpu'), mask.to('cpu') \n", | |
" out = model(img)\n", | |
" mask = torch.squeeze(mask, dim=1)\n", | |
" out = torch.squeeze(out, dim=1) \n", | |
" out = torch.sigmoid(out)\n", | |
" \n", | |
" metric_value_val = metrics[0](mask, out).cpu().detach().numpy()\n", | |
" ious.append(metric_value_val)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 148, | |
"id": "ff8afa36", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"[array(0.9816653, dtype=float32),\n", | |
" array(0.9807698, dtype=float32),\n", | |
" array(0.9824133, dtype=float32),\n", | |
" array(0.9802631, dtype=float32),\n", | |
" array(0.9821047, dtype=float32),\n", | |
" array(0.9808246, dtype=float32),\n", | |
" array(0.9816749, dtype=float32),\n", | |
" array(0.982649, dtype=float32),\n", | |
" array(0.979672, dtype=float32),\n", | |
" array(0.9837074, dtype=float32),\n", | |
" array(0.98542327, dtype=float32),\n", | |
" array(0.98311174, dtype=float32),\n", | |
" array(0.9838708, dtype=float32),\n", | |
" array(0.9847818, dtype=float32),\n", | |
" array(0.9822773, dtype=float32)]" | |
] | |
}, | |
"execution_count": 148, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"ious" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 149, | |
"id": "fdfbd2e4", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"0.98234725" | |
] | |
}, | |
"execution_count": 149, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"np.mean(ious) " | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"id": "84e17eeb", | |
"metadata": {}, | |
"outputs": [], | |
"source": [] | |
} | |
], | |
"metadata": { | |
"kernelspec": { | |
"display_name": "Python 3 (ipykernel)", | |
"language": "python", | |
"name": "python3" | |
}, | |
"language_info": { | |
"codemirror_mode": { | |
"name": "ipython", | |
"version": 3 | |
}, | |
"file_extension": ".py", | |
"mimetype": "text/x-python", | |
"name": "python", | |
"nbconvert_exporter": "python", | |
"pygments_lexer": "ipython3", | |
"version": "3.9.13" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 5 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment