{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":8899,"databundleVersionId":46091,"sourceType":"competition"}],"dockerImageVersionId":30664,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# !unzip -l /kaggle/input/cvpr-2018-autonomous-driving/train_label.zip","metadata":{"execution":{"iopub.status.busy":"2024-03-21T14:55:08.331425Z","iopub.execute_input":"2024-03-21T14:55:08.332283Z","iopub.status.idle":"2024-03-21T14:55:08.336041Z","shell.execute_reply.started":"2024-03-21T14:55:08.33225Z","shell.execute_reply":"2024-03-21T14:55:08.33502Z"},"trusted":true},"outputs":[],"execution_count":2},{"cell_type":"code","source":"import warnings\nwarnings.filterwarnings(\"ignore\")","metadata":{"execution":{"iopub.status.busy":"2024-03-22T07:30:11.616736Z","iopub.execute_input":"2024-03-22T07:30:11.617723Z","iopub.status.idle":"2024-03-22T07:30:11.622672Z","shell.execute_reply.started":"2024-03-22T07:30:11.617685Z","shell.execute_reply":"2024-03-22T07:30:11.621309Z"},"trusted":true},"outputs":[],"execution_count":11},{"cell_type":"code","source":"from PIL import Image\nimport numpy as np\nimport zipfile\nimport matplotlib.pyplot as plt\nimport pandas as pd\nimport cv2","metadata":{"execution":{"iopub.status.busy":"2024-03-22T07:30:15.332233Z","iopub.execute_input":"2024-03-22T07:30:15.332633Z","iopub.status.idle":"2024-03-22T07:30:15.33827Z","shell.execute_reply.started":"2024-03-22T07:30:15.332601Z","shell.execute_reply":"2024-03-22T07:30:15.336997Z"},"trusted":true},"outputs":[],"execution_count":12},{"cell_type":"code","source":"import torch\n\n\ndevice = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\ndevice","metadata":{"execution":{"iopub.status.busy":"2024-03-22T07:30:18.311724Z","iopub.execute_input":"2024-03-22T07:30:18.312655Z","iopub.status.idle":"2024-03-22T07:30:18.320455Z","shell.execute_reply.started":"2024-03-22T07:30:18.312619Z","shell.execute_reply":"2024-03-22T07:30:18.319336Z"},"trusted":true},"outputs":[{"execution_count":13,"output_type":"execute_result","data":{"text/plain":"device(type='cuda')"},"metadata":{}}],"execution_count":13},{"cell_type":"markdown","source":"# Работа с данными","metadata":{}},{"cell_type":"code","source":"X_PATH = '/kaggle/input/cvpr-2018-autonomous-driving/train_color.zip'\nY_PATH = '/kaggle/input/cvpr-2018-autonomous-driving/train_label.zip'\nXY_PATH = '/kaggle/input/cvpr-2018-autonomous-driving/train_video_list.zip'","metadata":{"execution":{"iopub.status.busy":"2024-03-22T07:30:20.9205Z","iopub.execute_input":"2024-03-22T07:30:20.921393Z","iopub.status.idle":"2024-03-22T07:30:20.925356Z","shell.execute_reply.started":"2024-03-22T07:30:20.921362Z","shell.execute_reply":"2024-03-22T07:30:20.924409Z"},"trusted":true},"outputs":[],"execution_count":14},{"cell_type":"code","source":"l = []\nwith zipfile.ZipFile(XY_PATH, 'r') as zip_file:\n    XY_PATH_LIST = zip_file.namelist()\n    for file_path in XY_PATH_LIST:\n        data = pd.read_csv(zip_file.open(file_path), sep=\"\t\", header=None)\n        data.columns = ['X_path', 'y_path']\n        l.append(data)\n        \ndf_info = pd.concat(l)","metadata":{"execution":{"iopub.status.busy":"2024-03-22T07:30:23.677998Z","iopub.execute_input":"2024-03-22T07:30:23.678371Z","iopub.status.idle":"2024-03-22T07:30:23.879148Z","shell.execute_reply.started":"2024-03-22T07:30:23.67834Z","shell.execute_reply":"2024-03-22T07:30:23.878311Z"},"trusted":true},"outputs":[],"execution_count":15},{"cell_type":"code","source":"# df_info.set_index('X_path', inplace=True)\ndf_info","metadata":{"execution":{"iopub.status.busy":"2024-03-22T07:30:26.849278Z","iopub.execute_input":"2024-03-22T07:30:26.849695Z","iopub.status.idle":"2024-03-22T07:30:26.864257Z","shell.execute_reply.started":"2024-03-22T07:30:26.849666Z","shell.execute_reply":"2024-03-22T07:30:26.863083Z"},"trusted":true},"outputs":[{"execution_count":16,"output_type":"execute_result","data":{"text/plain":"                                                 X_path  \\\n0     road01_ins\\ColorImage\\Record087\\Camera 5\\17090...   \n1     road01_ins\\ColorImage\\Record087\\Camera 5\\17090...   \n2     road01_ins\\ColorImage\\Record087\\Camera 5\\17090...   \n3     road01_ins\\ColorImage\\Record087\\Camera 5\\17090...   \n4     road01_ins\\ColorImage\\Record087\\Camera 5\\17090...   \n...                                                 ...   \n1418  road01_ins\\ColorImage\\Record086\\Camera 5\\17090...   \n1419  road01_ins\\ColorImage\\Record086\\Camera 5\\17090...   \n1420  road01_ins\\ColorImage\\Record086\\Camera 5\\17090...   \n1421  road01_ins\\ColorImage\\Record086\\Camera 5\\17090...   \n1422  road01_ins\\ColorImage\\Record086\\Camera 5\\17090...   \n\n                                                 y_path  \n0     road01_ins\\Label\\Record087\\Camera 5\\170908_082...  \n1     road01_ins\\Label\\Record087\\Camera 5\\170908_082...  \n2     road01_ins\\Label\\Record087\\Camera 5\\170908_082...  \n3     road01_ins\\Label\\Record087\\Camera 5\\170908_082...  \n4     road01_ins\\Label\\Record087\\Camera 5\\170908_082...  \n...                                                 ...  \n1418  road01_ins\\Label\\Record086\\Camera 5\\170908_082...  \n1419  road01_ins\\Label\\Record086\\Camera 5\\170908_082...  \n1420  road01_ins\\Label\\Record086\\Camera 5\\170908_082...  \n1421  road01_ins\\Label\\Record086\\Camera 5\\170908_082...  \n1422  road01_ins\\Label\\Record086\\Camera 5\\170908_082...  \n\n[42369 rows x 2 columns]","text/html":"<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>X_path</th>\n      <th>y_path</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>road01_ins\\ColorImage\\Record087\\Camera 5\\17090...</td>\n      <td>road01_ins\\Label\\Record087\\Camera 5\\170908_082...</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>road01_ins\\ColorImage\\Record087\\Camera 5\\17090...</td>\n      <td>road01_ins\\Label\\Record087\\Camera 5\\170908_082...</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>road01_ins\\ColorImage\\Record087\\Camera 5\\17090...</td>\n      <td>road01_ins\\Label\\Record087\\Camera 5\\170908_082...</td>\n    </tr>\n    <tr>\n      <th>3</th>\n      <td>road01_ins\\ColorImage\\Record087\\Camera 5\\17090...</td>\n      <td>road01_ins\\Label\\Record087\\Camera 5\\170908_082...</td>\n    </tr>\n    <tr>\n      <th>4</th>\n      <td>road01_ins\\ColorImage\\Record087\\Camera 5\\17090...</td>\n      <td>road01_ins\\Label\\Record087\\Camera 5\\170908_082...</td>\n    </tr>\n    <tr>\n      <th>...</th>\n      <td>...</td>\n      <td>...</td>\n    </tr>\n    <tr>\n      <th>1418</th>\n      <td>road01_ins\\ColorImage\\Record086\\Camera 5\\17090...</td>\n      <td>road01_ins\\Label\\Record086\\Camera 5\\170908_082...</td>\n    </tr>\n    <tr>\n      <th>1419</th>\n      <td>road01_ins\\ColorImage\\Record086\\Camera 5\\17090...</td>\n      <td>road01_ins\\Label\\Record086\\Camera 5\\170908_082...</td>\n    </tr>\n    <tr>\n      <th>1420</th>\n      <td>road01_ins\\ColorImage\\Record086\\Camera 5\\17090...</td>\n      <td>road01_ins\\Label\\Record086\\Camera 5\\170908_082...</td>\n    </tr>\n    <tr>\n      <th>1421</th>\n      <td>road01_ins\\ColorImage\\Record086\\Camera 5\\17090...</td>\n      <td>road01_ins\\Label\\Record086\\Camera 5\\170908_082...</td>\n    </tr>\n    <tr>\n      <th>1422</th>\n      <td>road01_ins\\ColorImage\\Record086\\Camera 5\\17090...</td>\n      <td>road01_ins\\Label\\Record086\\Camera 5\\170908_082...</td>\n    </tr>\n  </tbody>\n</table>\n<p>42369 rows × 2 columns</p>\n</div>"},"metadata":{}}],"execution_count":16},{"cell_type":"code","source":"df_info['X_path'] = df_info['X_path'].apply(lambda x: 'train_color/' + x[41:])\ndf_info['y_path'] = df_info['y_path'].apply(lambda x: 'train_label/' + x[36:])\ndf_info.set_index('X_path', inplace=True)\ndf_info","metadata":{"execution":{"iopub.status.busy":"2024-03-22T07:30:29.867007Z","iopub.execute_input":"2024-03-22T07:30:29.867724Z","iopub.status.idle":"2024-03-22T07:30:29.925129Z","shell.execute_reply.started":"2024-03-22T07:30:29.867675Z","shell.execute_reply":"2024-03-22T07:30:29.924149Z"},"trusted":true},"outputs":[{"execution_count":17,"output_type":"execute_result","data":{"text/plain":"                                                                                      y_path\nX_path                                                                                      \ntrain_color/170908_082144379_Camera_5.jpg  train_label/170908_082144379_Camera_5_instance...\ntrain_color/170908_082144507_Camera_5.jpg  train_label/170908_082144507_Camera_5_instance...\ntrain_color/170908_082144635_Camera_5.jpg  train_label/170908_082144635_Camera_5_instance...\ntrain_color/170908_082144763_Camera_5.jpg  train_label/170908_082144763_Camera_5_instance...\ntrain_color/170908_082144891_Camera_5.jpg  train_label/170908_082144891_Camera_5_instance...\n...                                                                                      ...\ntrain_color/170908_082053053_Camera_5.jpg  train_label/170908_082053053_Camera_5_instance...\ntrain_color/170908_082053181_Camera_5.jpg  train_label/170908_082053181_Camera_5_instance...\ntrain_color/170908_082053309_Camera_5.jpg  train_label/170908_082053309_Camera_5_instance...\ntrain_color/170908_082053437_Camera_5.jpg  train_label/170908_082053437_Camera_5_instance...\ntrain_color/170908_082053565_Camera_5.jpg  train_label/170908_082053565_Camera_5_instance...\n\n[42369 rows x 1 columns]","text/html":"<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>y_path</th>\n    </tr>\n    <tr>\n      <th>X_path</th>\n      <th></th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>train_color/170908_082144379_Camera_5.jpg</th>\n      <td>train_label/170908_082144379_Camera_5_instance...</td>\n    </tr>\n    <tr>\n      <th>train_color/170908_082144507_Camera_5.jpg</th>\n      <td>train_label/170908_082144507_Camera_5_instance...</td>\n    </tr>\n    <tr>\n      <th>train_color/170908_082144635_Camera_5.jpg</th>\n      <td>train_label/170908_082144635_Camera_5_instance...</td>\n    </tr>\n    <tr>\n      <th>train_color/170908_082144763_Camera_5.jpg</th>\n      <td>train_label/170908_082144763_Camera_5_instance...</td>\n    </tr>\n    <tr>\n      <th>train_color/170908_082144891_Camera_5.jpg</th>\n      <td>train_label/170908_082144891_Camera_5_instance...</td>\n    </tr>\n    <tr>\n      <th>...</th>\n      <td>...</td>\n    </tr>\n    <tr>\n      <th>train_color/170908_082053053_Camera_5.jpg</th>\n      <td>train_label/170908_082053053_Camera_5_instance...</td>\n    </tr>\n    <tr>\n      <th>train_color/170908_082053181_Camera_5.jpg</th>\n      <td>train_label/170908_082053181_Camera_5_instance...</td>\n    </tr>\n    <tr>\n      <th>train_color/170908_082053309_Camera_5.jpg</th>\n      <td>train_label/170908_082053309_Camera_5_instance...</td>\n    </tr>\n    <tr>\n      <th>train_color/170908_082053437_Camera_5.jpg</th>\n      <td>train_label/170908_082053437_Camera_5_instance...</td>\n    </tr>\n    <tr>\n      <th>train_color/170908_082053565_Camera_5.jpg</th>\n      <td>train_label/170908_082053565_Camera_5_instance...</td>\n    </tr>\n  </tbody>\n</table>\n<p>42369 rows × 1 columns</p>\n</div>"},"metadata":{}}],"execution_count":17},{"cell_type":"code","source":"with zipfile.ZipFile(X_PATH, 'r') as zip_file:\n   test_x = zip_file.namelist()[1010]\n\ntest_y = df_info.loc[test_x]['y_path']","metadata":{"execution":{"iopub.status.busy":"2024-03-22T07:30:33.472675Z","iopub.execute_input":"2024-03-22T07:30:33.473048Z","iopub.status.idle":"2024-03-22T07:30:34.121252Z","shell.execute_reply.started":"2024-03-22T07:30:33.473017Z","shell.execute_reply":"2024-03-22T07:30:34.120212Z"},"trusted":true},"outputs":[],"execution_count":18},{"cell_type":"code","source":"with zipfile.ZipFile(X_PATH, 'r') as zip_file:\n    img = Image.open(zip_file.open(test_x))\n    plt.imshow(img);","metadata":{"execution":{"iopub.status.busy":"2024-03-22T07:30:59.880883Z","iopub.execute_input":"2024-03-22T07:30:59.881249Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"with zipfile.ZipFile(Y_PATH, 'r') as zip_file:\n    img = Image.open(zip_file.open(test_y))\n    img = np.asarray(img) // 1000\n    plt.imshow(img, cmap='gray');","metadata":{"execution":{"iopub.status.busy":"2024-03-22T07:30:44.052176Z","iopub.execute_input":"2024-03-22T07:30:44.05282Z","iopub.status.idle":"2024-03-22T07:30:45.713852Z","shell.execute_reply.started":"2024-03-22T07:30:44.052787Z","shell.execute_reply":"2024-03-22T07:30:45.712843Z"},"trusted":true},"outputs":[{"output_type":"display_data","data":{"text/plain":"<Figure size 640x480 with 1 Axes>","image/png":"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"},"metadata":{}}],"execution_count":20},{"cell_type":"markdown","source":"___________","metadata":{}},{"cell_type":"markdown","source":"car, 33 -> 1\n\nmotorcycle, 34 -> 2\n\nbicycle, 35 -> 3\n\npedestrian, 36 -> 4\n\ntruck, 38 -> 5\n\nbus, 39 -> 6\n\ntricycle, 40 -> 7","metadata":{}},{"cell_type":"code","source":"ignore_index = 255\nold_labels = [ignore_index, 33, 34, 35, 36, 38, 39, 40]\nN_CLASSES = len(old_labels)\n\nlabels = range(N_CLASSES)\n\nrule = dict(zip(old_labels, labels))\nrule","metadata":{"execution":{"iopub.status.busy":"2024-03-21T14:55:16.200039Z","iopub.execute_input":"2024-03-21T14:55:16.200339Z","iopub.status.idle":"2024-03-21T14:55:16.207636Z","shell.execute_reply.started":"2024-03-21T14:55:16.200309Z","shell.execute_reply":"2024-03-21T14:55:16.206844Z"},"trusted":true},"outputs":[{"execution_count":13,"output_type":"execute_result","data":{"text/plain":"{255: 0, 33: 1, 34: 2, 35: 3, 36: 4, 38: 5, 39: 6, 40: 7}"},"metadata":{}}],"execution_count":13},{"cell_type":"code","source":"rule = {\n    33: 1,\n    34: 2,\n    ...\n}","metadata":{"execution":{"iopub.status.busy":"2024-03-21T14:55:16.208902Z","iopub.execute_input":"2024-03-21T14:55:16.209184Z","iopub.status.idle":"2024-03-21T14:55:16.217061Z","shell.execute_reply.started":"2024-03-21T14:55:16.209159Z","shell.execute_reply":"2024-03-21T14:55:16.216192Z"},"trusted":true},"outputs":[],"execution_count":14},{"cell_type":"code","source":"old2new = np.vectorize(lambda value: rule.get(value, 0))","metadata":{"execution":{"iopub.status.busy":"2024-03-21T14:55:16.222226Z","iopub.execute_input":"2024-03-21T14:55:16.222518Z","iopub.status.idle":"2024-03-21T14:55:16.227018Z","shell.execute_reply.started":"2024-03-21T14:55:16.222495Z","shell.execute_reply":"2024-03-21T14:55:16.226191Z"},"trusted":true},"outputs":[],"execution_count":15},{"cell_type":"code","source":"colors = [   \n    [  0,   0,   0],\n    [128,  64, 128],\n    [244,  35, 232],\n    [ 70,  70,  70],\n    [102, 102, 156],\n    [190, 153, 153],\n    [153, 153, 153],\n    [250, 170,  30],\n]","metadata":{"execution":{"iopub.status.busy":"2024-03-21T14:55:16.228045Z","iopub.execute_input":"2024-03-21T14:55:16.228302Z","iopub.status.idle":"2024-03-21T14:55:16.236533Z","shell.execute_reply.started":"2024-03-21T14:55:16.228279Z","shell.execute_reply":"2024-03-21T14:55:16.235631Z"},"trusted":true},"outputs":[],"execution_count":16},{"cell_type":"code","source":"import torch\nfrom torch.utils.data import Dataset\nfrom torchvision import datasets\nfrom torchvision.transforms import ToTensor","metadata":{"execution":{"iopub.status.busy":"2024-03-21T14:55:16.237627Z","iopub.execute_input":"2024-03-21T14:55:16.238087Z","iopub.status.idle":"2024-03-21T14:55:19.034104Z","shell.execute_reply.started":"2024-03-21T14:55:16.238055Z","shell.execute_reply":"2024-03-21T14:55:19.033134Z"},"trusted":true},"outputs":[],"execution_count":17},{"cell_type":"code","source":"zip_image = zipfile.ZipFile(X_PATH, 'r')\nzip_mask = zipfile.ZipFile(Y_PATH, 'r')","metadata":{"execution":{"iopub.status.busy":"2024-03-21T14:55:19.035327Z","iopub.execute_input":"2024-03-21T14:55:19.035923Z","iopub.status.idle":"2024-03-21T14:55:20.012931Z","shell.execute_reply.started":"2024-03-21T14:55:19.035897Z","shell.execute_reply":"2024-03-21T14:55:20.012076Z"},"trusted":true},"outputs":[],"execution_count":18},{"cell_type":"code","source":"zip_image.filename","metadata":{"execution":{"iopub.status.busy":"2024-03-21T14:55:20.014088Z","iopub.execute_input":"2024-03-21T14:55:20.014387Z","iopub.status.idle":"2024-03-21T14:55:20.02022Z","shell.execute_reply.started":"2024-03-21T14:55:20.014362Z","shell.execute_reply":"2024-03-21T14:55:20.019301Z"},"trusted":true},"outputs":[{"execution_count":19,"output_type":"execute_result","data":{"text/plain":"'/kaggle/input/cvpr-2018-autonomous-driving/train_color.zip'"},"metadata":{}}],"execution_count":19},{"cell_type":"code","source":"class CityDataset(Dataset):\n    def __init__(self, zip_image: zipfile.ZipFile, zip_mask: zipfile.ZipFile, n_samples: int, image2mask: pd.DataFrame, label_transform, transform=None):\n        self.zip_image = zip_image\n        self.zip_mask = zip_mask\n        \n        self.image_directory_list = zip_image.namelist()[1:n_samples]\n        \n        self.n_samples = n_samples\n        \n        self.image2mask = image2mask\n        self.label_transform = label_transform\n        self.transform = transform\n        \n    def __len__(self):\n        return self.n_samples - 1\n    \n    def __getitem__(self, idx):\n        image_path = self.image_directory_list[idx]\n        mask_path = self.image2mask.loc[image_path]['y_path']\n        \n        image = np.asarray(Image.open(self.zip_image.open(image_path)))\n            \n        mask = self.label_transform(np.asarray(Image.open(self.zip_mask.open(mask_path))) // 1000)\n            \n        image = image.astype(np.float32) / 255.0\n        \n        if self.transform is not None:\n            transformed = self.transform(image=image, mask=mask)\n            image = transformed[\"image\"]\n            mask = transformed[\"mask\"]\n\n        return image, mask","metadata":{"execution":{"iopub.status.busy":"2024-03-21T14:55:20.021366Z","iopub.execute_input":"2024-03-21T14:55:20.021673Z","iopub.status.idle":"2024-03-21T14:55:20.036353Z","shell.execute_reply.started":"2024-03-21T14:55:20.021631Z","shell.execute_reply":"2024-03-21T14:55:20.035523Z"},"trusted":true},"outputs":[],"execution_count":20},{"cell_type":"code","source":"import albumentations as A\nfrom albumentations.pytorch import ToTensorV2\n\n\ntrain_transform = A.Compose(\n    [\n        A.RandomCrop(832, 1408),\n        A.ShiftScaleRotate(shift_limit=0.05, scale_limit=0.05, rotate_limit=15, p=0.5),\n        ToTensorV2(),\n    ]\n)\n\nval_transform = A.Compose(\n    [\n        A.CenterCrop(832, 1408),\n        ToTensorV2(),\n    ]\n)","metadata":{"execution":{"iopub.status.busy":"2024-03-21T14:55:20.037585Z","iopub.execute_input":"2024-03-21T14:55:20.037883Z","iopub.status.idle":"2024-03-21T14:55:21.016379Z","shell.execute_reply.started":"2024-03-21T14:55:20.03786Z","shell.execute_reply":"2024-03-21T14:55:21.015418Z"},"trusted":true},"outputs":[],"execution_count":21},{"cell_type":"code","source":"ds_train = CityDataset(zip_image, zip_mask, 1000, df_info, old2new, train_transform)","metadata":{"execution":{"iopub.status.busy":"2024-03-21T14:55:21.017573Z","iopub.execute_input":"2024-03-21T14:55:21.018033Z","iopub.status.idle":"2024-03-21T14:55:21.026147Z","shell.execute_reply.started":"2024-03-21T14:55:21.018006Z","shell.execute_reply":"2024-03-21T14:55:21.025022Z"},"trusted":true},"outputs":[],"execution_count":22},{"cell_type":"code","source":"from torch.utils.data import DataLoader\n\n\ntrain_dataloader = DataLoader(ds_train, batch_size=3)","metadata":{"execution":{"iopub.status.busy":"2024-03-21T14:55:21.027353Z","iopub.execute_input":"2024-03-21T14:55:21.027682Z","iopub.status.idle":"2024-03-21T14:55:21.036399Z","shell.execute_reply.started":"2024-03-21T14:55:21.027651Z","shell.execute_reply":"2024-03-21T14:55:21.035526Z"},"trusted":true},"outputs":[],"execution_count":23},{"cell_type":"markdown","source":"# Модель","metadata":{}},{"cell_type":"code","source":"import cv2\nimport matplotlib.pyplot as plt\nimport numpy as np\nimport os\nimport copy\nfrom tqdm import tqdm\n\nimport albumentations as A\nfrom albumentations.pytorch import ToTensorV2\n\nimport torch\nimport torch.nn as nn\nimport torch.nn.functional as F","metadata":{"execution":{"iopub.status.busy":"2024-03-21T14:55:30.499781Z","iopub.execute_input":"2024-03-21T14:55:30.500166Z","iopub.status.idle":"2024-03-21T14:55:30.506227Z","shell.execute_reply.started":"2024-03-21T14:55:30.500132Z","shell.execute_reply":"2024-03-21T14:55:30.505135Z"},"trusted":true},"outputs":[],"execution_count":25},{"cell_type":"code","source":"class CNA(nn.Module):\n    def __init__(self, in_nc, out_nc, stride=1):\n        super().__init__()\n        \n        self.conv = nn.Conv2d(in_nc, out_nc, 3, stride=stride, padding=1, bias=False)\n        self.norm = nn.BatchNorm2d(out_nc)\n        self.act = nn.GELU()\n    \n    def forward(self, x):\n        out = self.conv(x)\n        out = self.norm(out)\n        out = self.act(out)\n        \n        return out","metadata":{"execution":{"iopub.status.busy":"2024-03-21T14:55:30.507529Z","iopub.execute_input":"2024-03-21T14:55:30.507872Z","iopub.status.idle":"2024-03-21T14:55:30.52264Z","shell.execute_reply.started":"2024-03-21T14:55:30.507837Z","shell.execute_reply":"2024-03-21T14:55:30.521839Z"},"trusted":true},"outputs":[],"execution_count":26},{"cell_type":"code","source":"class UnetBlock(nn.Module):\n    def __init__(self, in_nc, inner_nc, out_nc, inner_block=None):\n        super().__init__()\n        \n        self.conv1 = CNA(in_nc, inner_nc, stride=2)\n        self.conv2 = CNA(inner_nc, inner_nc)\n        self.inner_block = inner_block\n        self.conv3 = CNA(inner_nc, inner_nc)\n        self.conv_cat = nn.Conv2d(inner_nc + in_nc, out_nc, 3, padding=1)\n        \n    def forward(self, x):\n        _,_,h,w = x.shape\n        \n        inner = self.conv1(x)\n        inner = self.conv2(inner)\n        #print(inner.shape)\n        if self.inner_block is not None:\n            inner = self.inner_block(inner)\n        inner = self.conv3(inner)\n        \n        inner = F.upsample(inner, size=(h, w), mode='bilinear')\n        inner = torch.cat((x, inner), axis=1)\n        out = self.conv_cat(inner)\n        \n        return out","metadata":{"execution":{"iopub.status.busy":"2024-03-21T14:55:30.523773Z","iopub.execute_input":"2024-03-21T14:55:30.524123Z","iopub.status.idle":"2024-03-21T14:55:30.533165Z","shell.execute_reply.started":"2024-03-21T14:55:30.524098Z","shell.execute_reply":"2024-03-21T14:55:30.532338Z"},"trusted":true},"outputs":[],"execution_count":27},{"cell_type":"code","source":"class Unet(nn.Module):\n    def __init__(self, in_nc=1, nc=32, out_nc=1, num_downs=6):\n        super().__init__()\n        \n        self.cna1 = CNA(in_nc, nc)\n        self.cna2 = CNA(nc, nc)\n        \n        unet_block = None\n        for i in range(num_downs-3):\n            unet_block = UnetBlock(8*nc, 8*nc, 8*nc, unet_block)\n        unet_block = UnetBlock(4*nc, 8*nc, 4*nc, unet_block)\n        unet_block = UnetBlock(2*nc, 4*nc, 2*nc, unet_block)\n        self.unet_block = UnetBlock(nc, 2*nc, nc, unet_block)\n        \n        self.cna3 = CNA(nc, nc)\n        \n        self.conv_last = nn.Conv2d(nc, out_nc, 3, padding=1)\n\n    def forward(self, x):\n        out = self.cna1(x)\n        out = self.cna2(out)\n        out = self.unet_block(out)\n        out = self.cna3(out)\n        out = self.conv_last(out)\n        \n        return out","metadata":{"execution":{"iopub.status.busy":"2024-03-21T14:55:30.534166Z","iopub.execute_input":"2024-03-21T14:55:30.53449Z","iopub.status.idle":"2024-03-21T14:55:30.543341Z","shell.execute_reply.started":"2024-03-21T14:55:30.534467Z","shell.execute_reply":"2024-03-21T14:55:30.542416Z"},"trusted":true},"outputs":[],"execution_count":28},{"cell_type":"code","source":"model = Unet(in_nc=3, nc=16, out_nc=2, num_downs=2).to(device)","metadata":{"execution":{"iopub.status.busy":"2024-03-21T14:55:30.54432Z","iopub.execute_input":"2024-03-21T14:55:30.544619Z","iopub.status.idle":"2024-03-21T14:55:30.58427Z","shell.execute_reply.started":"2024-03-21T14:55:30.544572Z","shell.execute_reply":"2024-03-21T14:55:30.583578Z"},"trusted":true},"outputs":[],"execution_count":29},{"cell_type":"code","source":"# model = nn.DataParallel(model, device_ids=[0, 1]).to(device)","metadata":{"execution":{"iopub.status.busy":"2024-03-21T14:55:30.5853Z","iopub.execute_input":"2024-03-21T14:55:30.585581Z","iopub.status.idle":"2024-03-21T14:55:30.589446Z","shell.execute_reply.started":"2024-03-21T14:55:30.585551Z","shell.execute_reply":"2024-03-21T14:55:30.588484Z"},"trusted":true},"outputs":[],"execution_count":30},{"cell_type":"code","source":"optimizer = torch.optim.Adam(model.parameters(), lr=0.001)\nloss_function = nn.CrossEntropyLoss()\nscheduler = torch.optim.lr_scheduler.ExponentialLR(optimizer, gamma=0.9)","metadata":{"execution":{"iopub.status.busy":"2024-03-21T14:55:30.590503Z","iopub.execute_input":"2024-03-21T14:55:30.590782Z","iopub.status.idle":"2024-03-21T14:55:30.599175Z","shell.execute_reply.started":"2024-03-21T14:55:30.59076Z","shell.execute_reply":"2024-03-21T14:55:30.598452Z"},"trusted":true},"outputs":[],"execution_count":31},{"cell_type":"code","source":"epochs = 4\nhistory_loss = []\nfor epoch in range(epochs):\n    loss_val = 0\n    for img, mask in (tqdm(train_dataloader)):\n        img = img.to(device)\n        mask = mask.to(device)\n        optimizer.zero_grad()\n        \n        pred = model(img)\n        loss = loss_function(pred, mask.to(torch.int64))\n\n        loss.backward()\n        loss_val += loss.item()\n\n        optimizer.step()\n    \n    scheduler.step()\n    epoch_loss = loss_val/len(train_dataloader)\n    history_loss.append(epoch_loss)\n    print(f'{epoch_loss}\\t lr: {scheduler.get_last_lr()}')","metadata":{"execution":{"iopub.status.busy":"2024-03-21T14:55:30.600418Z","iopub.execute_input":"2024-03-21T14:55:30.600742Z"},"trusted":true},"outputs":[{"name":"stderr","text":"100%|██████████| 333/333 [50:09<00:00,  9.04s/it]\n","output_type":"stream"},{"name":"stdout","text":"0.07117840142881458\t lr: [0.0009000000000000001]\n","output_type":"stream"},{"name":"stderr","text":"100%|██████████| 333/333 [49:29<00:00,  8.92s/it]\n","output_type":"stream"},{"name":"stdout","text":"0.05704106703574011\t lr: [0.0008100000000000001]\n","output_type":"stream"},{"name":"stderr","text":"100%|██████████| 333/333 [49:03<00:00,  8.84s/it]\n","output_type":"stream"},{"name":"stdout","text":"0.05837062368023995\t lr: [0.000729]\n","output_type":"stream"},{"name":"stderr","text":"  9%|▉         | 30/333 [04:24<44:09,  8.74s/it]","output_type":"stream"}],"execution_count":null},{"cell_type":"code","source":"model","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"torch.save(model.state_dict(), 'model.mp4')","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"with torch.no_grad():\n    pred = model()","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"aa = a.softmax(1).argmax(1)","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}