{"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":"nvidiaTeslaT4","dataSources":[{"sourceId":6927,"databundleVersionId":45059,"sourceType":"competition"}],"dockerImageVersionId":30747,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-08-16T07:31:54.848172Z","iopub.execute_input":"2024-08-16T07:31:54.849126Z","iopub.status.idle":"2024-08-16T07:31:54.857883Z","shell.execute_reply.started":"2024-08-16T07:31:54.849085Z","shell.execute_reply":"2024-08-16T07:31:54.856989Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Шаг 1: Установка и загрузка датасета","metadata":{}},{"cell_type":"code","source":"!pip install opencv-python","metadata":{"execution":{"iopub.status.busy":"2024-08-16T07:31:54.859764Z","iopub.execute_input":"2024-08-16T07:31:54.860141Z","iopub.status.idle":"2024-08-16T07:32:08.016343Z","shell.execute_reply.started":"2024-08-16T07:31:54.860114Z","shell.execute_reply":"2024-08-16T07:32:08.015455Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\nimport zipfile\nimport cv2\nimport numpy as np\nimport tensorflow as tf\nfrom tensorflow.keras.preprocessing.image import img_to_array, load_img","metadata":{"execution":{"iopub.status.busy":"2024-08-16T07:32:08.017651Z","iopub.execute_input":"2024-08-16T07:32:08.017946Z","iopub.status.idle":"2024-08-16T07:32:19.529803Z","shell.execute_reply.started":"2024-08-16T07:32:08.017920Z","shell.execute_reply":"2024-08-16T07:32:19.528820Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Пути к архивам\ntrain_zip = '/kaggle/input/carvana-image-masking-challenge/train.zip'\nmasks_zip = '/kaggle/input/carvana-image-masking-challenge/train_masks.zip'\n\n# Создание директории для распаковки\ntrain_dir = '/kaggle/working/train/'\nmasks_dir = '/kaggle/working/train_masks/'\n\n# Распаковка архива с изображениями\nwith zipfile.ZipFile(train_zip, 'r') as zip_ref:\n    zip_ref.extractall(train_dir)\n\n# Распаковка архива с масками\nwith zipfile.ZipFile(masks_zip, 'r') as zip_ref:\n    zip_ref.extractall(masks_dir)","metadata":{"execution":{"iopub.status.busy":"2024-08-16T07:32:19.532234Z","iopub.execute_input":"2024-08-16T07:32:19.533208Z","iopub.status.idle":"2024-08-16T07:32:28.103971Z","shell.execute_reply.started":"2024-08-16T07:32:19.533170Z","shell.execute_reply":"2024-08-16T07:32:28.102992Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Шаг 2: Подготовка данных","metadata":{}},{"cell_type":"code","source":"def load_data(image_dir, mask_dir, img_size=(256, 256)):\n    images = []\n    masks = []\n    \n    # Перебираем все файлы в директории изображений\n    for filename in os.listdir(image_dir):\n        if filename.endswith('.jpg'):  # Убедитесь, что обрабатываются только изображения\n            img_path = os.path.join(image_dir, filename)\n            mask_filename = filename.replace('.jpg', '_mask.gif')  # Формат имени файла маски\n            mask_path = os.path.join(mask_dir, mask_filename)\n\n            # Проверяем, существует ли маска для данного изображения\n            if os.path.exists(mask_path):\n                img = load_img(img_path, target_size=img_size)\n                img = img_to_array(img)\n                images.append(img)\n\n                mask = load_img(mask_path, color_mode=\"grayscale\", target_size=img_size)\n                mask = img_to_array(mask)\n                masks.append(mask)\n\n    images = np.array(images, dtype=\"float\") / 255.0\n    masks = np.array(masks, dtype=\"float\") / 255.0\n    masks = (masks > 0).astype(np.float32)  # Бинаризация масок\n    return images, masks\n\n# Указание на поддиректории с изображениями и масками\ntrain_dir = '/kaggle/working/train/train'\nmasks_dir = '/kaggle/working/train_masks/train_masks'\n\n# Загрузка данных\nimages, masks = load_data(train_dir, masks_dir)\nprint(f\"Loaded {len(images)} images and {len(masks)} masks.\")\n","metadata":{"execution":{"iopub.status.busy":"2024-08-16T07:32:28.105088Z","iopub.execute_input":"2024-08-16T07:32:28.105369Z","iopub.status.idle":"2024-08-16T07:34:11.829176Z","shell.execute_reply.started":"2024-08-16T07:32:28.105344Z","shell.execute_reply":"2024-08-16T07:34:11.828222Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Шаг 3: Построение модели U-Net","metadata":{}},{"cell_type":"code","source":"from tensorflow.keras import layers, Model\n\ndef unet_model(input_size=(256, 256, 3)):\n    inputs = tf.keras.Input(input_size)\n\n    c1 = layers.Conv2D(64, (3, 3), activation='relu', padding='same')(inputs)\n    c1 = layers.Conv2D(64, (3, 3), activation='relu', padding='same')(c1)\n    p1 = layers.MaxPooling2D((2, 2))(c1)\n\n    c2 = layers.Conv2D(128, (3, 3), activation='relu', padding='same')(p1)\n    c2 = layers.Conv2D(128, (3, 3), activation='relu', padding='same')(c2)\n    p2 = layers.MaxPooling2D((2, 2))(c2)\n\n    c3 = layers.Conv2D(256, (3, 3), activation='relu', padding='same')(p2)\n    c3 = layers.Conv2D(256, (3, 3), activation='relu', padding='same')(c3)\n    p3 = layers.MaxPooling2D((2, 2))(c3)\n\n    c4 = layers.Conv2D(512, (3, 3), activation='relu', padding='same')(p3)\n    c4 = layers.Conv2D(512, (3, 3), activation='relu', padding='same')(c4)\n    p4 = layers.MaxPooling2D((2, 2))(c4)\n\n    c5 = layers.Conv2D(1024, (3, 3), activation='relu', padding='same')(p4)\n    c5 = layers.Conv2D(1024, (3, 3), activation='relu', padding='same')(c5)\n\n    u6 = layers.Conv2DTranspose(512, (2, 2), strides=(2, 2), padding='same')(c5)\n    u6 = layers.concatenate([u6, c4])\n    c6 = layers.Conv2D(512, (3, 3), activation='relu', padding='same')(u6)\n    c6 = layers.Conv2D(512, (3, 3), activation='relu', padding='same')(c6)\n\n    u7 = layers.Conv2DTranspose(256, (2, 2), strides=(2, 2), padding='same')(c6)\n    u7 = layers.concatenate([u7, c3])\n    c7 = layers.Conv2D(256, (3, 3), activation='relu', padding='same')(u7)\n    c7 = layers.Conv2D(256, (3, 3), activation='relu', padding='same')(c7)\n\n    u8 = layers.Conv2DTranspose(128, (2, 2), strides=(2, 2), padding='same')(c7)\n    u8 = layers.concatenate([u8, c2])\n    c8 = layers.Conv2D(128, (3, 3), activation='relu', padding='same')(u8)\n    c8 = layers.Conv2D(128, (3, 3), activation='relu', padding='same')(c8)\n\n    u9 = layers.Conv2DTranspose(64, (2, 2), strides=(2, 2), padding='same')(c8)\n    u9 = layers.concatenate([u9, c1])\n    c9 = layers.Conv2D(64, (3, 3), activation='relu', padding='same')(u9)\n    c9 = layers.Conv2D(64, (3, 3), activation='relu', padding='same')(c9)\n\n    outputs = layers.Conv2D(1, (1, 1), activation='sigmoid')(c9)\n\n    model = Model(inputs=[inputs], outputs=[outputs])\n    model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])\n    \n    return model\n\nmodel = unet_model()\nmodel.summary()\n","metadata":{"execution":{"iopub.status.busy":"2024-08-16T07:34:11.830422Z","iopub.execute_input":"2024-08-16T07:34:11.830740Z","iopub.status.idle":"2024-08-16T07:34:12.586604Z","shell.execute_reply.started":"2024-08-16T07:34:11.830716Z","shell.execute_reply":"2024-08-16T07:34:12.585765Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Шаг 4: Обучение модели","metadata":{}},{"cell_type":"code","source":"history = model.fit(images, masks, validation_split=0.1, epochs=10, batch_size=8)","metadata":{"execution":{"iopub.status.busy":"2024-08-16T07:34:12.587798Z","iopub.execute_input":"2024-08-16T07:34:12.588133Z","iopub.status.idle":"2024-08-16T08:16:58.288087Z","shell.execute_reply.started":"2024-08-16T07:34:12.588102Z","shell.execute_reply":"2024-08-16T08:16:58.287077Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Шаг 5: Оценка модели","metadata":{}},{"cell_type":"code","source":"import matplotlib.pyplot as plt\n\n# Пример предсказания\npreds = model.predict(images[:5])\n\n# Отображение результата\nplt.figure(figsize=(20, 10))\nfor i in range(5):\n    plt.subplot(3, 5, i + 1)\n    plt.imshow(images[i])\n    plt.title(\"Input Image\")\n\n    plt.subplot(3, 5, i + 6)\n    plt.imshow(masks[i].squeeze(), cmap='gray')\n    plt.title(\"True Mask\")\n\n    plt.subplot(3, 5, i + 11)\n    plt.imshow(preds[i].squeeze(), cmap='gray')\n    plt.title(\"Predicted Mask\")\n\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2024-08-16T08:16:58.289756Z","iopub.execute_input":"2024-08-16T08:16:58.290076Z","iopub.status.idle":"2024-08-16T08:17:01.802392Z","shell.execute_reply.started":"2024-08-16T08:16:58.290050Z","shell.execute_reply":"2024-08-16T08:17:01.801507Z"},"trusted":true},"execution_count":null,"outputs":[]}]}