From 58fd7e7f6e6b47a4f3af17379208de33fc9abd49 Mon Sep 17 00:00:00 2001
From: sruthids28 <111908784+sruthids28@users.noreply.github.com>
Date: Tue, 24 Sep 2024 00:51:10 +0530
Subject: [PATCH] Created using Colab
---
resnet.ipynb | 884 +++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 884 insertions(+)
create mode 100644 resnet.ipynb
diff --git a/resnet.ipynb b/resnet.ipynb
new file mode 100644
index 0000000000000..e5025e7939c48
--- /dev/null
+++ b/resnet.ipynb
@@ -0,0 +1,884 @@
+{
+ "nbformat": 4,
+ "nbformat_minor": 0,
+ "metadata": {
+ "colab": {
+ "provenance": [],
+ "authorship_tag": "ABX9TyOYRpXlvi91s3kwavgLA/8o",
+ "include_colab_link": true
+ },
+ "kernelspec": {
+ "name": "python3",
+ "display_name": "Python 3"
+ },
+ "language_info": {
+ "name": "python"
+ }
+ },
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "view-in-github",
+ "colab_type": "text"
+ },
+ "source": [
+ ""
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 21,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "PFidbMfZos31",
+ "outputId": "aab669b6-2849-4b66-b0d6-c3e9fb3e80b8"
+ },
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "Drive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount(\"/content/drive\", force_remount=True).\n"
+ ]
+ }
+ ],
+ "source": [
+ "from google.colab import drive\n",
+ "drive.mount('/content/drive')\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "import os\n",
+ "import numpy as np\n",
+ "import tensorflow as tf\n",
+ "from glob import glob\n",
+ "from sklearn.model_selection import train_test_split\n",
+ "from tensorflow.keras.callbacks import ModelCheckpoint, ReduceLROnPlateau, CSVLogger, TensorBoard, EarlyStopping\n",
+ "from tensorflow.keras.optimizers import Adam\n",
+ "from tensorflow.keras import Model, layers\n",
+ "\n",
+ "# Constants\n",
+ "H, W = 128, 128 # Adjust these dimensions as necessary\n",
+ "BATCH_SIZE = 8\n",
+ "LEARNING_RATE = 1e-4\n",
+ "NUM_EPOCHS = 5\n",
+ "DATASET_PATH = \"/content/drive/MyDrive/ISIC2018/\"\n",
+ "MODEL_PATH = \"/content/drive/MyDrive/ISIC2018/files1/resunet_model.keras\"\n",
+ "CSV_PATH = \"/content/drive/MyDrive/ISIC2018/files1/data.csv\"\n",
+ "\n",
+ "# Create directory for files if it doesn't exist\n",
+ "def create_dir(path):\n",
+ " if not os.path.exists(path):\n",
+ " os.makedirs(path)\n",
+ "\n",
+ "# Load data function\n",
+ "def load_data(path, split=0.2):\n",
+ " images = sorted(glob(os.path.join(path, \"*.jpg\")))\n",
+ "\n",
+ " if len(images) == 0:\n",
+ " raise ValueError(\"No images found in the provided dataset path.\")\n",
+ "\n",
+ " # Create dummy masks with appropriate shape (assuming binary masks)\n",
+ " masks = [np.zeros((H, W, 1), dtype=np.float32) for _ in range(len(images))]\n",
+ "\n",
+ " # Split the dataset into training, validation, and test sets\n",
+ " train_x, valid_x = train_test_split(images, test_size=split)\n",
+ " train_y, valid_y = train_test_split(masks, test_size=split)\n",
+ "\n",
+ " test_split_size = max(int(len(train_x) * 0.2), 1)\n",
+ " train_x, test_x = train_test_split(train_x, test_size=test_split_size)\n",
+ " train_y, test_y = train_test_split(train_y, test_size=test_split_size)\n",
+ "\n",
+ " return (train_x, train_y), (valid_x, valid_y), (test_x, test_y)\n",
+ "\n",
+ "# Image reading function\n",
+ "def read_image(path):\n",
+ " img = tf.io.read_file(path)\n",
+ " img = tf.image.decode_jpeg(img, channels=3)\n",
+ " img = tf.image.resize(img, [H, W])\n",
+ " img = img / 255.0 # Normalize to [0, 1]\n",
+ " return img\n",
+ "\n",
+ "# Mask reading function (for dummy masks, just returns zeros)\n",
+ "def read_mask(path):\n",
+ " # In actual use, you would load real masks. This is just a placeholder.\n",
+ " mask = tf.zeros((H, W, 1), dtype=tf.float32)\n",
+ " return mask\n",
+ "\n",
+ "# TensorFlow Dataset function\n",
+ "def tf_parse(x, y):\n",
+ " def _parse(x, y):\n",
+ " x = read_image(x)\n",
+ " y = read_mask(y)\n",
+ " return x, y\n",
+ "\n",
+ " x, y = tf.numpy_function(_parse, [x, y], [tf.float32, tf.float32])\n",
+ " x.set_shape([H, W, 3])\n",
+ " y.set_shape([H, W, 1])\n",
+ " return x, y\n",
+ "\n",
+ "def tf_dataset(train_x, train_y, batch_size):\n",
+ " dataset = tf.data.Dataset.from_tensor_slices((train_x, train_y))\n",
+ " dataset = dataset.map(tf_parse, num_parallel_calls=tf.data.AUTOTUNE)\n",
+ " dataset = dataset.shuffle(buffer_size=1000).batch(batch_size).prefetch(tf.data.AUTOTUNE)\n",
+ " dataset = dataset.repeat() # Ensure the dataset repeats\n",
+ " return dataset\n",
+ "\n",
+ "# Example model architecture (ResUNet-like)\n",
+ "def build_resunet(input_shape):\n",
+ " inputs = layers.Input(shape=input_shape)\n",
+ "\n",
+ " # Example of downsampling layers\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",
+ " # Bottleneck\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",
+ "\n",
+ " # Example of upsampling layers\n",
+ " u1 = layers.Conv2DTranspose(64, (2, 2), strides=(2, 2), padding='same')(c2)\n",
+ " u1 = layers.concatenate([u1, c1])\n",
+ " c3 = layers.Conv2D(64, (3, 3), activation='relu', padding='same')(u1)\n",
+ " c3 = layers.Conv2D(64, (3, 3), activation='relu', padding='same')(c3)\n",
+ "\n",
+ " outputs = layers.Conv2D(1, (1, 1), activation='sigmoid')(c3) # For binary segmentation\n",
+ " model = Model(inputs, outputs)\n",
+ " return model\n",
+ "\n",
+ "# Custom metrics\n",
+ "def dice_coef(y_true, y_pred):\n",
+ " smooth = 1e-6\n",
+ " intersection = tf.reduce_sum(y_true * y_pred)\n",
+ " return (2. * intersection + smooth) / (tf.reduce_sum(y_true) + tf.reduce_sum(y_pred) + smooth)\n",
+ "\n",
+ "def dice_loss(y_true, y_pred):\n",
+ " return 1 - dice_coef(y_true, y_pred)\n",
+ "\n",
+ "# Main execution\n",
+ "if __name__ == \"__main__\":\n",
+ " np.random.seed(42)\n",
+ " tf.random.set_seed(42)\n",
+ "\n",
+ " create_dir(\"/content/drive/MyDrive/ISIC2018/files1\")\n",
+ "\n",
+ " # Load the dataset\n",
+ " (train_x, train_y), (valid_x, valid_y), (test_x, test_y) = load_data(DATASET_PATH)\n",
+ "\n",
+ " print(f\"Train: {len(train_x)} - {len(train_y)}\")\n",
+ " print(f\"Valid: {len(valid_x)} - {len(valid_y)}\")\n",
+ " print(f\"Test: {len(test_x)} - {len(test_y)}\")\n",
+ "\n",
+ " # Create TensorFlow datasets\n",
+ " train_dataset = tf_dataset(train_x, train_y, BATCH_SIZE)\n",
+ " valid_dataset = tf_dataset(valid_x, valid_y, BATCH_SIZE)\n",
+ "\n",
+ " # Steps per epoch\n",
+ " train_steps = len(train_x) // BATCH_SIZE + (len(train_x) % BATCH_SIZE > 0)\n",
+ " valid_steps = len(valid_x) // BATCH_SIZE + (len(valid_x) % BATCH_SIZE > 0)\n",
+ "\n",
+ " # Build and compile model\n",
+ " model = build_resunet((H, W, 3))\n",
+ " model.compile(loss=dice_loss, optimizer=Adam(learning_rate=LEARNING_RATE), metrics=[dice_coef])\n",
+ "\n",
+ " # Callbacks for training\n",
+ " callbacks = [\n",
+ " ModelCheckpoint(MODEL_PATH, verbose=1, save_best_only=True),\n",
+ " ReduceLROnPlateau(monitor='val_loss', factor=0.1, patience=5, min_lr=1e-7, verbose=1),\n",
+ " CSVLogger(CSV_PATH),\n",
+ " TensorBoard(),\n",
+ " EarlyStopping(monitor='val_loss', patience=20, restore_best_weights=True)\n",
+ " ]\n",
+ "\n",
+ " # Start model training\n",
+ " model.fit(\n",
+ " train_dataset,\n",
+ " epochs=NUM_EPOCHS,\n",
+ " validation_data=valid_dataset,\n",
+ " steps_per_epoch=train_steps,\n",
+ " validation_steps=valid_steps,\n",
+ " callbacks=callbacks\n",
+ " )"
+ ],
+ "metadata": {
+ "id": "dq2C_ZwysG47",
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "outputId": "37f2c88a-ba79-435d-dd54-3eeb53d68137"
+ },
+ "execution_count": 68,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "Train: 640 - 640\n",
+ "Valid: 200 - 200\n",
+ "Test: 160 - 160\n",
+ "Epoch 1/5\n",
+ "\u001b[1m80/80\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 5s/step - dice_coef: 1.4641e-11 - loss: 1.0000\n",
+ "Epoch 1: val_loss improved from inf to 1.00000, saving model to /content/drive/MyDrive/ISIC2018/files1/resunet_model.keras\n",
+ "\u001b[1m80/80\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m470s\u001b[0m 5s/step - dice_coef: 1.4641e-11 - loss: 1.0000 - val_dice_coef: 1.4640e-11 - val_loss: 1.0000 - learning_rate: 1.0000e-04\n",
+ "Epoch 2/5\n",
+ "\u001b[1m80/80\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 5s/step - dice_coef: 1.4642e-11 - loss: 1.0000\n",
+ "Epoch 2: val_loss did not improve from 1.00000\n",
+ "\u001b[1m80/80\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m441s\u001b[0m 5s/step - dice_coef: 1.4642e-11 - loss: 1.0000 - val_dice_coef: 1.4640e-11 - val_loss: 1.0000 - learning_rate: 1.0000e-04\n",
+ "Epoch 3/5\n",
+ "\u001b[1m80/80\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 5s/step - dice_coef: 1.4642e-11 - loss: 1.0000\n",
+ "Epoch 3: val_loss did not improve from 1.00000\n",
+ "\u001b[1m80/80\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m437s\u001b[0m 5s/step - dice_coef: 1.4642e-11 - loss: 1.0000 - val_dice_coef: 1.4640e-11 - val_loss: 1.0000 - learning_rate: 1.0000e-04\n",
+ "Epoch 4/5\n",
+ "\u001b[1m80/80\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 5s/step - dice_coef: 1.4645e-11 - loss: 1.0000\n",
+ "Epoch 4: val_loss did not improve from 1.00000\n",
+ "\u001b[1m80/80\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m435s\u001b[0m 5s/step - dice_coef: 1.4645e-11 - loss: 1.0000 - val_dice_coef: 1.4640e-11 - val_loss: 1.0000 - learning_rate: 1.0000e-04\n",
+ "Epoch 5/5\n",
+ "\u001b[1m80/80\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 5s/step - dice_coef: 1.4640e-11 - loss: 1.0000\n",
+ "Epoch 5: val_loss did not improve from 1.00000\n",
+ "\u001b[1m80/80\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m431s\u001b[0m 5s/step - dice_coef: 1.4640e-11 - loss: 1.0000 - val_dice_coef: 1.4640e-11 - val_loss: 1.0000 - learning_rate: 1.0000e-04\n"
+ ]
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "from tensorflow.keras.layers import Conv2D, BatchNormalization, Activation, MaxPool2D, UpSampling2D, Concatenate, Input, ZeroPadding2D\n",
+ "from tensorflow.keras.models import Model\n",
+ "\n",
+ "def batchnorm_relu(inputs):\n",
+ " x = BatchNormalization()(inputs)\n",
+ " x = Activation(\"relu\")(x)\n",
+ " return x\n",
+ "\n",
+ "def residual_block(inputs, num_filters, strides=1):\n",
+ " \"\"\" Convolutional Layer \"\"\"\n",
+ " x = batchnorm_relu(inputs)\n",
+ " x = Conv2D(num_filters, 3, padding=\"same\", strides=strides)(x)\n",
+ " x = batchnorm_relu(x)\n",
+ " x = Conv2D(num_filters, 3, padding=\"same\", strides=1)(x)\n",
+ "\n",
+ " \"\"\" Shortcut Connection \"\"\"\n",
+ " s = Conv2D(num_filters, 1, padding=\"same\", strides=strides)(inputs)\n",
+ " x = x + s\n",
+ " return x\n",
+ "\n",
+ "def decoder_block(inputs, skip_features, num_filters):\n",
+ " x = UpSampling2D((2, 2))(inputs)\n",
+ " x = Concatenate()([x, skip_features])\n",
+ " x = residual_block(x, num_filters, strides=1)\n",
+ " return x\n",
+ "\n",
+ "def build_resunet(input_shape):\n",
+ " inputs = Input(input_shape)\n",
+ "\n",
+ " \"\"\" Encoder 1 \"\"\"\n",
+ " x = Conv2D(64, 3, padding=\"same\", strides=1)(inputs)\n",
+ " x = batchnorm_relu(x)\n",
+ " x = Conv2D(64, 3, padding=\"same\", strides=1)(x)\n",
+ " s = Conv2D(64, 1, padding=\"same\", strides=1)(inputs)\n",
+ " s1 = x + s\n",
+ "\n",
+ " \"\"\" Encoder 2 and 3 \"\"\"\n",
+ " s2 = residual_block(s1, 128, strides=2)\n",
+ " s3 = residual_block(s2, 256, strides=2)\n",
+ "\n",
+ " \"\"\" Bridge \"\"\"\n",
+ " b = residual_block(s3, 512, strides=2)\n",
+ "\n",
+ " \"\"\" Decoder 1, 2, 3 \"\"\"\n",
+ " d1 = decoder_block(b, s3, 256)\n",
+ " d2 = decoder_block(d1, s2, 128)\n",
+ " d3 = decoder_block(d2, s1, 64)\n",
+ "\n",
+ " \"\"\" Classifier \"\"\"\n",
+ " outputs = Conv2D(1, 1, padding=\"same\", activation=\"sigmoid\")(d3)\n",
+ "\n",
+ " \"\"\" Model \"\"\"\n",
+ " model = Model(inputs, outputs)\n",
+ " return model\n",
+ "\n",
+ "if __name__ == \"__main__\":\n",
+ " model = build_resunet((256, 256, 3))\n",
+ " model.summary()"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 1000
+ },
+ "id": "70lk7ygX_JdN",
+ "outputId": "10eca017-025d-438a-c14c-3dc95cfda0b6"
+ },
+ "execution_count": 69,
+ "outputs": [
+ {
+ "output_type": "display_data",
+ "data": {
+ "text/plain": [
+ "\u001b[1mModel: \"functional_6\"\u001b[0m\n"
+ ],
+ "text/html": [
+ "
Model: \"functional_6\"\n",
+ "
\n"
+ ]
+ },
+ "metadata": {}
+ },
+ {
+ "output_type": "display_data",
+ "data": {
+ "text/plain": [
+ "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
+ "┃\u001b[1m \u001b[0m\u001b[1mLayer (type) \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mOutput Shape \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m Param #\u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mConnected to \u001b[0m\u001b[1m \u001b[0m┃\n",
+ "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
+ "│ input_layer_6 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m256\u001b[0m, \u001b[38;5;34m256\u001b[0m, \u001b[38;5;34m3\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │ - │\n",
+ "│ (\u001b[38;5;33mInputLayer\u001b[0m) │ │ │ │\n",
+ "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n",
+ "│ conv2d_87 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m256\u001b[0m, \u001b[38;5;34m256\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m1,792\u001b[0m │ input_layer_6[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m] │\n",
+ "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n",
+ "│ batch_normalization_39 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m256\u001b[0m, \u001b[38;5;34m256\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m256\u001b[0m │ conv2d_87[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m] │\n",
+ "│ (\u001b[38;5;33mBatchNormalization\u001b[0m) │ │ │ │\n",
+ "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n",
+ "│ activation_39 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m256\u001b[0m, \u001b[38;5;34m256\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │ batch_normalization_3… │\n",
+ "│ (\u001b[38;5;33mActivation\u001b[0m) │ │ │ │\n",
+ "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n",
+ "│ conv2d_88 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m256\u001b[0m, \u001b[38;5;34m256\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m36,928\u001b[0m │ activation_39[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m] │\n",
+ "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n",
+ "│ conv2d_89 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m256\u001b[0m, \u001b[38;5;34m256\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m256\u001b[0m │ input_layer_6[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m] │\n",
+ "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n",
+ "│ add_21 (\u001b[38;5;33mAdd\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m256\u001b[0m, \u001b[38;5;34m256\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │ conv2d_88[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m], │\n",
+ "│ │ │ │ conv2d_89[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m] │\n",
+ "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n",
+ "│ batch_normalization_40 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m256\u001b[0m, \u001b[38;5;34m256\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m256\u001b[0m │ add_21[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m] │\n",
+ "│ (\u001b[38;5;33mBatchNormalization\u001b[0m) │ │ │ │\n",
+ "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n",
+ "│ activation_40 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m256\u001b[0m, \u001b[38;5;34m256\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │ batch_normalization_4… │\n",
+ "│ (\u001b[38;5;33mActivation\u001b[0m) │ │ │ │\n",
+ "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n",
+ "│ conv2d_90 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m128\u001b[0m, \u001b[38;5;34m128\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m73,856\u001b[0m │ activation_40[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m] │\n",
+ "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n",
+ "│ batch_normalization_41 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m128\u001b[0m, \u001b[38;5;34m128\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m512\u001b[0m │ conv2d_90[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m] │\n",
+ "│ (\u001b[38;5;33mBatchNormalization\u001b[0m) │ │ │ │\n",
+ "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n",
+ "│ activation_41 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m128\u001b[0m, \u001b[38;5;34m128\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │ batch_normalization_4… │\n",
+ "│ (\u001b[38;5;33mActivation\u001b[0m) │ │ │ │\n",
+ "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n",
+ "│ conv2d_91 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m128\u001b[0m, \u001b[38;5;34m128\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m147,584\u001b[0m │ activation_41[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m] │\n",
+ "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n",
+ "│ conv2d_92 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m128\u001b[0m, \u001b[38;5;34m128\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m8,320\u001b[0m │ add_21[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m] │\n",
+ "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n",
+ "│ add_22 (\u001b[38;5;33mAdd\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m128\u001b[0m, \u001b[38;5;34m128\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │ conv2d_91[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m], │\n",
+ "│ │ │ │ conv2d_92[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m] │\n",
+ "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n",
+ "│ batch_normalization_42 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m128\u001b[0m, \u001b[38;5;34m128\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m512\u001b[0m │ add_22[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m] │\n",
+ "│ (\u001b[38;5;33mBatchNormalization\u001b[0m) │ │ │ │\n",
+ "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n",
+ "│ activation_42 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m128\u001b[0m, \u001b[38;5;34m128\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │ batch_normalization_4… │\n",
+ "│ (\u001b[38;5;33mActivation\u001b[0m) │ │ │ │\n",
+ "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n",
+ "│ conv2d_93 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m64\u001b[0m, \u001b[38;5;34m64\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m295,168\u001b[0m │ activation_42[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m] │\n",
+ "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n",
+ "│ batch_normalization_43 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m64\u001b[0m, \u001b[38;5;34m64\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m1,024\u001b[0m │ conv2d_93[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m] │\n",
+ "│ (\u001b[38;5;33mBatchNormalization\u001b[0m) │ │ │ │\n",
+ "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n",
+ "│ activation_43 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m64\u001b[0m, \u001b[38;5;34m64\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │ batch_normalization_4… │\n",
+ "│ (\u001b[38;5;33mActivation\u001b[0m) │ │ │ │\n",
+ "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n",
+ "│ conv2d_94 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m64\u001b[0m, \u001b[38;5;34m64\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m590,080\u001b[0m │ activation_43[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m] │\n",
+ "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n",
+ "│ conv2d_95 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m64\u001b[0m, \u001b[38;5;34m64\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m33,024\u001b[0m │ add_22[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m] │\n",
+ "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n",
+ "│ add_23 (\u001b[38;5;33mAdd\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m64\u001b[0m, \u001b[38;5;34m64\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │ conv2d_94[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m], │\n",
+ "│ │ │ │ conv2d_95[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m] │\n",
+ "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n",
+ "│ batch_normalization_44 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m64\u001b[0m, \u001b[38;5;34m64\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m1,024\u001b[0m │ add_23[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m] │\n",
+ "│ (\u001b[38;5;33mBatchNormalization\u001b[0m) │ │ │ │\n",
+ "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n",
+ "│ activation_44 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m64\u001b[0m, \u001b[38;5;34m64\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │ batch_normalization_4… │\n",
+ "│ (\u001b[38;5;33mActivation\u001b[0m) │ │ │ │\n",
+ "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n",
+ "│ conv2d_96 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m32\u001b[0m, \u001b[38;5;34m32\u001b[0m, \u001b[38;5;34m512\u001b[0m) │ \u001b[38;5;34m1,180,160\u001b[0m │ activation_44[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m] │\n",
+ "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n",
+ "│ batch_normalization_45 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m32\u001b[0m, \u001b[38;5;34m32\u001b[0m, \u001b[38;5;34m512\u001b[0m) │ \u001b[38;5;34m2,048\u001b[0m │ conv2d_96[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m] │\n",
+ "│ (\u001b[38;5;33mBatchNormalization\u001b[0m) │ │ │ │\n",
+ "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n",
+ "│ activation_45 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m32\u001b[0m, \u001b[38;5;34m32\u001b[0m, \u001b[38;5;34m512\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │ batch_normalization_4… │\n",
+ "│ (\u001b[38;5;33mActivation\u001b[0m) │ │ │ │\n",
+ "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n",
+ "│ conv2d_97 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m32\u001b[0m, \u001b[38;5;34m32\u001b[0m, \u001b[38;5;34m512\u001b[0m) │ \u001b[38;5;34m2,359,808\u001b[0m │ activation_45[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m] │\n",
+ "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n",
+ "│ conv2d_98 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m32\u001b[0m, \u001b[38;5;34m32\u001b[0m, \u001b[38;5;34m512\u001b[0m) │ \u001b[38;5;34m131,584\u001b[0m │ add_23[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m] │\n",
+ "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n",
+ "│ add_24 (\u001b[38;5;33mAdd\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m32\u001b[0m, \u001b[38;5;34m32\u001b[0m, \u001b[38;5;34m512\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │ conv2d_97[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m], │\n",
+ "│ │ │ │ conv2d_98[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m] │\n",
+ "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n",
+ "│ up_sampling2d_9 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m64\u001b[0m, \u001b[38;5;34m64\u001b[0m, \u001b[38;5;34m512\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │ add_24[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m] │\n",
+ "│ (\u001b[38;5;33mUpSampling2D\u001b[0m) │ │ │ │\n",
+ "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n",
+ "│ concatenate_12 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m64\u001b[0m, \u001b[38;5;34m64\u001b[0m, \u001b[38;5;34m768\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │ up_sampling2d_9[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m], │\n",
+ "│ (\u001b[38;5;33mConcatenate\u001b[0m) │ │ │ add_23[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m] │\n",
+ "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n",
+ "│ batch_normalization_46 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m64\u001b[0m, \u001b[38;5;34m64\u001b[0m, \u001b[38;5;34m768\u001b[0m) │ \u001b[38;5;34m3,072\u001b[0m │ concatenate_12[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m] │\n",
+ "│ (\u001b[38;5;33mBatchNormalization\u001b[0m) │ │ │ │\n",
+ "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n",
+ "│ activation_46 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m64\u001b[0m, \u001b[38;5;34m64\u001b[0m, \u001b[38;5;34m768\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │ batch_normalization_4… │\n",
+ "│ (\u001b[38;5;33mActivation\u001b[0m) │ │ │ │\n",
+ "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n",
+ "│ conv2d_99 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m64\u001b[0m, \u001b[38;5;34m64\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m1,769,728\u001b[0m │ activation_46[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m] │\n",
+ "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n",
+ "│ batch_normalization_47 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m64\u001b[0m, \u001b[38;5;34m64\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m1,024\u001b[0m │ conv2d_99[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m] │\n",
+ "│ (\u001b[38;5;33mBatchNormalization\u001b[0m) │ │ │ │\n",
+ "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n",
+ "│ activation_47 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m64\u001b[0m, \u001b[38;5;34m64\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │ batch_normalization_4… │\n",
+ "│ (\u001b[38;5;33mActivation\u001b[0m) │ │ │ │\n",
+ "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n",
+ "│ conv2d_100 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m64\u001b[0m, \u001b[38;5;34m64\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m590,080\u001b[0m │ activation_47[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m] │\n",
+ "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n",
+ "│ conv2d_101 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m64\u001b[0m, \u001b[38;5;34m64\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m196,864\u001b[0m │ concatenate_12[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m] │\n",
+ "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n",
+ "│ add_25 (\u001b[38;5;33mAdd\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m64\u001b[0m, \u001b[38;5;34m64\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │ conv2d_100[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m], │\n",
+ "│ │ │ │ conv2d_101[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m] │\n",
+ "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n",
+ "│ up_sampling2d_10 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m128\u001b[0m, \u001b[38;5;34m128\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │ add_25[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m] │\n",
+ "│ (\u001b[38;5;33mUpSampling2D\u001b[0m) │ │ │ │\n",
+ "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n",
+ "│ concatenate_13 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m128\u001b[0m, \u001b[38;5;34m128\u001b[0m, \u001b[38;5;34m384\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │ up_sampling2d_10[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m… │\n",
+ "│ (\u001b[38;5;33mConcatenate\u001b[0m) │ │ │ add_22[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m] │\n",
+ "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n",
+ "│ batch_normalization_48 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m128\u001b[0m, \u001b[38;5;34m128\u001b[0m, \u001b[38;5;34m384\u001b[0m) │ \u001b[38;5;34m1,536\u001b[0m │ concatenate_13[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m] │\n",
+ "│ (\u001b[38;5;33mBatchNormalization\u001b[0m) │ │ │ │\n",
+ "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n",
+ "│ activation_48 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m128\u001b[0m, \u001b[38;5;34m128\u001b[0m, \u001b[38;5;34m384\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │ batch_normalization_4… │\n",
+ "│ (\u001b[38;5;33mActivation\u001b[0m) │ │ │ │\n",
+ "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n",
+ "│ conv2d_102 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m128\u001b[0m, \u001b[38;5;34m128\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m442,496\u001b[0m │ activation_48[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m] │\n",
+ "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n",
+ "│ batch_normalization_49 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m128\u001b[0m, \u001b[38;5;34m128\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m512\u001b[0m │ conv2d_102[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m] │\n",
+ "│ (\u001b[38;5;33mBatchNormalization\u001b[0m) │ │ │ │\n",
+ "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n",
+ "│ activation_49 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m128\u001b[0m, \u001b[38;5;34m128\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │ batch_normalization_4… │\n",
+ "│ (\u001b[38;5;33mActivation\u001b[0m) │ │ │ │\n",
+ "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n",
+ "│ conv2d_103 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m128\u001b[0m, \u001b[38;5;34m128\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m147,584\u001b[0m │ activation_49[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m] │\n",
+ "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n",
+ "│ conv2d_104 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m128\u001b[0m, \u001b[38;5;34m128\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m49,280\u001b[0m │ concatenate_13[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m] │\n",
+ "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n",
+ "│ add_26 (\u001b[38;5;33mAdd\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m128\u001b[0m, \u001b[38;5;34m128\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │ conv2d_103[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m], │\n",
+ "│ │ │ │ conv2d_104[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m] │\n",
+ "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n",
+ "│ up_sampling2d_11 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m256\u001b[0m, \u001b[38;5;34m256\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │ add_26[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m] │\n",
+ "│ (\u001b[38;5;33mUpSampling2D\u001b[0m) │ │ │ │\n",
+ "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n",
+ "│ concatenate_14 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m256\u001b[0m, \u001b[38;5;34m256\u001b[0m, \u001b[38;5;34m192\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │ up_sampling2d_11[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m… │\n",
+ "│ (\u001b[38;5;33mConcatenate\u001b[0m) │ │ │ add_21[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m] │\n",
+ "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n",
+ "│ batch_normalization_50 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m256\u001b[0m, \u001b[38;5;34m256\u001b[0m, \u001b[38;5;34m192\u001b[0m) │ \u001b[38;5;34m768\u001b[0m │ concatenate_14[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m] │\n",
+ "│ (\u001b[38;5;33mBatchNormalization\u001b[0m) │ │ │ │\n",
+ "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n",
+ "│ activation_50 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m256\u001b[0m, \u001b[38;5;34m256\u001b[0m, \u001b[38;5;34m192\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │ batch_normalization_5… │\n",
+ "│ (\u001b[38;5;33mActivation\u001b[0m) │ │ │ │\n",
+ "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n",
+ "│ conv2d_105 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m256\u001b[0m, \u001b[38;5;34m256\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m110,656\u001b[0m │ activation_50[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m] │\n",
+ "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n",
+ "│ batch_normalization_51 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m256\u001b[0m, \u001b[38;5;34m256\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m256\u001b[0m │ conv2d_105[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m] │\n",
+ "│ (\u001b[38;5;33mBatchNormalization\u001b[0m) │ │ │ │\n",
+ "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n",
+ "│ activation_51 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m256\u001b[0m, \u001b[38;5;34m256\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │ batch_normalization_5… │\n",
+ "│ (\u001b[38;5;33mActivation\u001b[0m) │ │ │ │\n",
+ "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n",
+ "│ conv2d_106 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m256\u001b[0m, \u001b[38;5;34m256\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m36,928\u001b[0m │ activation_51[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m] │\n",
+ "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n",
+ "│ conv2d_107 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m256\u001b[0m, \u001b[38;5;34m256\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m12,352\u001b[0m │ concatenate_14[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m] │\n",
+ "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n",
+ "│ add_27 (\u001b[38;5;33mAdd\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m256\u001b[0m, \u001b[38;5;34m256\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │ conv2d_106[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m], │\n",
+ "│ │ │ │ conv2d_107[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m] │\n",
+ "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n",
+ "│ conv2d_108 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m256\u001b[0m, \u001b[38;5;34m256\u001b[0m, \u001b[38;5;34m1\u001b[0m) │ \u001b[38;5;34m65\u001b[0m │ add_27[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m] │\n",
+ "└───────────────────────────┴────────────────────────┴────────────────┴────────────────────────┘\n"
+ ],
+ "text/html": [
+ "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┓\n", + "┃ Layer (type) ┃ Output Shape ┃ Param # ┃ Connected to ┃\n", + "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━┩\n", + "│ input_layer_6 │ (None, 256, 256, 3) │ 0 │ - │\n", + "│ (InputLayer) │ │ │ │\n", + "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n", + "│ conv2d_87 (Conv2D) │ (None, 256, 256, 64) │ 1,792 │ input_layer_6[0][0] │\n", + "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n", + "│ batch_normalization_39 │ (None, 256, 256, 64) │ 256 │ conv2d_87[0][0] │\n", + "│ (BatchNormalization) │ │ │ │\n", + "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n", + "│ activation_39 │ (None, 256, 256, 64) │ 0 │ batch_normalization_3… │\n", + "│ (Activation) │ │ │ │\n", + "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n", + "│ conv2d_88 (Conv2D) │ (None, 256, 256, 64) │ 36,928 │ activation_39[0][0] │\n", + "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n", + "│ conv2d_89 (Conv2D) │ (None, 256, 256, 64) │ 256 │ input_layer_6[0][0] │\n", + "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n", + "│ add_21 (Add) │ (None, 256, 256, 64) │ 0 │ conv2d_88[0][0], │\n", + "│ │ │ │ conv2d_89[0][0] │\n", + "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n", + "│ batch_normalization_40 │ (None, 256, 256, 64) │ 256 │ add_21[0][0] │\n", + "│ (BatchNormalization) │ │ │ │\n", + "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n", + "│ activation_40 │ (None, 256, 256, 64) │ 0 │ batch_normalization_4… │\n", + "│ (Activation) │ │ │ │\n", + "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n", + "│ conv2d_90 (Conv2D) │ (None, 128, 128, 128) │ 73,856 │ activation_40[0][0] │\n", + "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n", + "│ batch_normalization_41 │ (None, 128, 128, 128) │ 512 │ conv2d_90[0][0] │\n", + "│ (BatchNormalization) │ │ │ │\n", + "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n", + "│ activation_41 │ (None, 128, 128, 128) │ 0 │ batch_normalization_4… │\n", + "│ (Activation) │ │ │ │\n", + "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n", + "│ conv2d_91 (Conv2D) │ (None, 128, 128, 128) │ 147,584 │ activation_41[0][0] │\n", + "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n", + "│ conv2d_92 (Conv2D) │ (None, 128, 128, 128) │ 8,320 │ add_21[0][0] │\n", + "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n", + "│ add_22 (Add) │ (None, 128, 128, 128) │ 0 │ conv2d_91[0][0], │\n", + "│ │ │ │ conv2d_92[0][0] │\n", + "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n", + "│ batch_normalization_42 │ (None, 128, 128, 128) │ 512 │ add_22[0][0] │\n", + "│ (BatchNormalization) │ │ │ │\n", + "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n", + "│ activation_42 │ (None, 128, 128, 128) │ 0 │ batch_normalization_4… │\n", + "│ (Activation) │ │ │ │\n", + "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n", + "│ conv2d_93 (Conv2D) │ (None, 64, 64, 256) │ 295,168 │ activation_42[0][0] │\n", + "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n", + "│ batch_normalization_43 │ (None, 64, 64, 256) │ 1,024 │ conv2d_93[0][0] │\n", + "│ (BatchNormalization) │ │ │ │\n", + "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n", + "│ activation_43 │ (None, 64, 64, 256) │ 0 │ batch_normalization_4… │\n", + "│ (Activation) │ │ │ │\n", + "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n", + "│ conv2d_94 (Conv2D) │ (None, 64, 64, 256) │ 590,080 │ activation_43[0][0] │\n", + "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n", + "│ conv2d_95 (Conv2D) │ (None, 64, 64, 256) │ 33,024 │ add_22[0][0] │\n", + "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n", + "│ add_23 (Add) │ (None, 64, 64, 256) │ 0 │ conv2d_94[0][0], │\n", + "│ │ │ │ conv2d_95[0][0] │\n", + "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n", + "│ batch_normalization_44 │ (None, 64, 64, 256) │ 1,024 │ add_23[0][0] │\n", + "│ (BatchNormalization) │ │ │ │\n", + "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n", + "│ activation_44 │ (None, 64, 64, 256) │ 0 │ batch_normalization_4… │\n", + "│ (Activation) │ │ │ │\n", + "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n", + "│ conv2d_96 (Conv2D) │ (None, 32, 32, 512) │ 1,180,160 │ activation_44[0][0] │\n", + "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n", + "│ batch_normalization_45 │ (None, 32, 32, 512) │ 2,048 │ conv2d_96[0][0] │\n", + "│ (BatchNormalization) │ │ │ │\n", + "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n", + "│ activation_45 │ (None, 32, 32, 512) │ 0 │ batch_normalization_4… │\n", + "│ (Activation) │ │ │ │\n", + "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n", + "│ conv2d_97 (Conv2D) │ (None, 32, 32, 512) │ 2,359,808 │ activation_45[0][0] │\n", + "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n", + "│ conv2d_98 (Conv2D) │ (None, 32, 32, 512) │ 131,584 │ add_23[0][0] │\n", + "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n", + "│ add_24 (Add) │ (None, 32, 32, 512) │ 0 │ conv2d_97[0][0], │\n", + "│ │ │ │ conv2d_98[0][0] │\n", + "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n", + "│ up_sampling2d_9 │ (None, 64, 64, 512) │ 0 │ add_24[0][0] │\n", + "│ (UpSampling2D) │ │ │ │\n", + "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n", + "│ concatenate_12 │ (None, 64, 64, 768) │ 0 │ up_sampling2d_9[0][0], │\n", + "│ (Concatenate) │ │ │ add_23[0][0] │\n", + "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n", + "│ batch_normalization_46 │ (None, 64, 64, 768) │ 3,072 │ concatenate_12[0][0] │\n", + "│ (BatchNormalization) │ │ │ │\n", + "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n", + "│ activation_46 │ (None, 64, 64, 768) │ 0 │ batch_normalization_4… │\n", + "│ (Activation) │ │ │ │\n", + "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n", + "│ conv2d_99 (Conv2D) │ (None, 64, 64, 256) │ 1,769,728 │ activation_46[0][0] │\n", + "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n", + "│ batch_normalization_47 │ (None, 64, 64, 256) │ 1,024 │ conv2d_99[0][0] │\n", + "│ (BatchNormalization) │ │ │ │\n", + "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n", + "│ activation_47 │ (None, 64, 64, 256) │ 0 │ batch_normalization_4… │\n", + "│ (Activation) │ │ │ │\n", + "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n", + "│ conv2d_100 (Conv2D) │ (None, 64, 64, 256) │ 590,080 │ activation_47[0][0] │\n", + "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n", + "│ conv2d_101 (Conv2D) │ (None, 64, 64, 256) │ 196,864 │ concatenate_12[0][0] │\n", + "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n", + "│ add_25 (Add) │ (None, 64, 64, 256) │ 0 │ conv2d_100[0][0], │\n", + "│ │ │ │ conv2d_101[0][0] │\n", + "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n", + "│ up_sampling2d_10 │ (None, 128, 128, 256) │ 0 │ add_25[0][0] │\n", + "│ (UpSampling2D) │ │ │ │\n", + "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n", + "│ concatenate_13 │ (None, 128, 128, 384) │ 0 │ up_sampling2d_10[0][0… │\n", + "│ (Concatenate) │ │ │ add_22[0][0] │\n", + "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n", + "│ batch_normalization_48 │ (None, 128, 128, 384) │ 1,536 │ concatenate_13[0][0] │\n", + "│ (BatchNormalization) │ │ │ │\n", + "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n", + "│ activation_48 │ (None, 128, 128, 384) │ 0 │ batch_normalization_4… │\n", + "│ (Activation) │ │ │ │\n", + "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n", + "│ conv2d_102 (Conv2D) │ (None, 128, 128, 128) │ 442,496 │ activation_48[0][0] │\n", + "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n", + "│ batch_normalization_49 │ (None, 128, 128, 128) │ 512 │ conv2d_102[0][0] │\n", + "│ (BatchNormalization) │ │ │ │\n", + "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n", + "│ activation_49 │ (None, 128, 128, 128) │ 0 │ batch_normalization_4… │\n", + "│ (Activation) │ │ │ │\n", + "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n", + "│ conv2d_103 (Conv2D) │ (None, 128, 128, 128) │ 147,584 │ activation_49[0][0] │\n", + "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n", + "│ conv2d_104 (Conv2D) │ (None, 128, 128, 128) │ 49,280 │ concatenate_13[0][0] │\n", + "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n", + "│ add_26 (Add) │ (None, 128, 128, 128) │ 0 │ conv2d_103[0][0], │\n", + "│ │ │ │ conv2d_104[0][0] │\n", + "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n", + "│ up_sampling2d_11 │ (None, 256, 256, 128) │ 0 │ add_26[0][0] │\n", + "│ (UpSampling2D) │ │ │ │\n", + "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n", + "│ concatenate_14 │ (None, 256, 256, 192) │ 0 │ up_sampling2d_11[0][0… │\n", + "│ (Concatenate) │ │ │ add_21[0][0] │\n", + "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n", + "│ batch_normalization_50 │ (None, 256, 256, 192) │ 768 │ concatenate_14[0][0] │\n", + "│ (BatchNormalization) │ │ │ │\n", + "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n", + "│ activation_50 │ (None, 256, 256, 192) │ 0 │ batch_normalization_5… │\n", + "│ (Activation) │ │ │ │\n", + "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n", + "│ conv2d_105 (Conv2D) │ (None, 256, 256, 64) │ 110,656 │ activation_50[0][0] │\n", + "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n", + "│ batch_normalization_51 │ (None, 256, 256, 64) │ 256 │ conv2d_105[0][0] │\n", + "│ (BatchNormalization) │ │ │ │\n", + "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n", + "│ activation_51 │ (None, 256, 256, 64) │ 0 │ batch_normalization_5… │\n", + "│ (Activation) │ │ │ │\n", + "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n", + "│ conv2d_106 (Conv2D) │ (None, 256, 256, 64) │ 36,928 │ activation_51[0][0] │\n", + "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n", + "│ conv2d_107 (Conv2D) │ (None, 256, 256, 64) │ 12,352 │ concatenate_14[0][0] │\n", + "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n", + "│ add_27 (Add) │ (None, 256, 256, 64) │ 0 │ conv2d_106[0][0], │\n", + "│ │ │ │ conv2d_107[0][0] │\n", + "├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤\n", + "│ conv2d_108 (Conv2D) │ (None, 256, 256, 1) │ 65 │ add_27[0][0] │\n", + "└───────────────────────────┴────────────────────────┴────────────────┴────────────────────────┘\n", + "\n" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "\u001b[1m Total params: \u001b[0m\u001b[38;5;34m8,227,393\u001b[0m (31.39 MB)\n" + ], + "text/html": [ + "
Total params: 8,227,393 (31.39 MB)\n", + "\n" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m8,220,993\u001b[0m (31.36 MB)\n" + ], + "text/html": [ + "
Trainable params: 8,220,993 (31.36 MB)\n", + "\n" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "\u001b[1m Non-trainable params: \u001b[0m\u001b[38;5;34m6,400\u001b[0m (25.00 KB)\n" + ], + "text/html": [ + "
Non-trainable params: 6,400 (25.00 KB)\n", + "\n" + ] + }, + "metadata": {} + } + ] + }, + { + "cell_type": "code", + "source": [ + "import numpy as np\n", + "import tensorflow as tf\n", + "from tensorflow.keras import backend as K\n", + "\n", + "def iou(y_true, y_pred):\n", + " def f(y_true, y_pred):\n", + " intersection = (y_true * y_pred).sum()\n", + " union = y_true.sum() + y_pred.sum() - intersection\n", + " x = (intersection + 1e-15) / (union + 1e-15)\n", + " x = x.astype(np.float32)\n", + " return x\n", + " return tf.numpy_function(f, [y_true, y_pred], tf.float32)\n", + "\n", + "smooth = 1e-15\n", + "def dice_coef(y_true, y_pred):\n", + " y_true = tf.keras.layers.Flatten()(y_true)\n", + " y_pred = tf.keras.layers.Flatten()(y_pred)\n", + " intersection = tf.reduce_sum(y_true * y_pred)\n", + " return (2. * intersection + smooth) / (tf.reduce_sum(y_true) + tf.reduce_sum(y_pred) + smooth)\n", + "\n", + "def dice_loss(y_true, y_pred):\n", + " return 1.0 - dice_coef(y_true, y_pred)\n", + "\n", + "\n", + "\n", + "import os\n", + "os.environ[\"TF_CPP_MIN_LOG_LEVEL\"] = \"2\"\n", + "import numpy as np\n", + "import cv2\n", + "import pandas as pd\n", + "from glob import glob\n", + "from tqdm import tqdm\n", + "import tensorflow as tf\n", + "from tensorflow.keras.utils import CustomObjectScope\n", + "from sklearn.metrics import accuracy_score, f1_score, jaccard_score, precision_score, recall_score\n", + "# from metrics import dice_loss, dice_coef, iou\n", + "# from train import load_data, create_dir\n", + "\n", + "H = 256\n", + "W = 256\n", + "\n", + "def read_image(path):\n", + " x = cv2.imread(path, cv2.IMREAD_COLOR)\n", + " x = cv2.resize(x, (H, W))\n", + " ori_x = x\n", + " x = x/255.0\n", + " x = x.astype(np.float32)\n", + " x = np.expand_dims(x, axis=0)\n", + " return ori_x, x\n", + "\n", + "def read_mask(path):\n", + " x = cv2.imread(path, cv2.IMREAD_GRAYSCALE)\n", + " x = cv2.resize(x, (H, W))\n", + " ori_x = x\n", + " x = x/np.max(x)\n", + " x = x.astype(np.int32)\n", + " return ori_x, x\n", + "\n", + "def save_result(ori_x, ori_y, y_pred, save_image_path):\n", + " line = np.ones((H, 10, 3)) * 255.0\n", + "\n", + " ori_y = np.expand_dims(ori_y, axis=-1) ## (256, 256, 1)\n", + " ori_y = np.concatenate([ori_y, ori_y, ori_y], axis=-1) ## (256, 256, 3)\n", + "\n", + " y_pred = np.expand_dims(y_pred, axis=-1) ## (256, 256, 1)\n", + " y_pred = np.concatenate([y_pred, y_pred, y_pred], axis=-1) * 255.0 ## (256, 256, 3)\n", + "\n", + " cat_images = np.concatenate([ori_x, line, ori_y, line, y_pred], axis=1)\n", + " cv2.imwrite(save_image_path, cat_images)\n", + "\n", + "if __name__ == \"__main__\":\n", + " \"\"\" Seeding \"\"\"\n", + " np.random.seed(42)\n", + " tf.random.set_seed(42)\n", + "\n", + " \"\"\" Directory for storing files \"\"\"\n", + " create_dir(\"results\")\n", + "\n", + " \"\"\" Loading the model \"\"\"\n", + " with CustomObjectScope({\"iou\": iou, \"dice_coef\": dice_coef, \"dice_loss\": dice_loss}):\n", + " model = tf.keras.models.load_model(\"/content/drive/MyDrive/ISIC2018/files1/resunet_model_ph2.h5\")\n", + "\n", + " \"\"\" Loading the dataset. \"\"\"\n", + " dataset_path = \"/content/drive/MyDrive/ISIC2018/\"\n", + " (train_x, train_y),(valid_x,valid_y),(test_x, test_y) = load_data(dataset_path)\n", + "\n", + " \"\"\" Predict the mask and calculate the metrics values \"\"\"\n", + " SCORE = []\n", + " for x, y in tqdm(zip(train_x, train_y), total=len(train_x)):\n", + " \"\"\" Extract the image name \"\"\"\n", + " name = x.split(\"/\")[-1]\n", + "\n", + " \"\"\" Reading the image and mask. \"\"\"\n", + " ori_x, x = read_image(x)\n", + " ori_y, y = read_mask(y)\n", + "\n", + " \"\"\" Predict the mask \"\"\"\n", + " y_pred = model.predict(x)[0] > 0.5\n", + " y_pred = np.squeeze(y_pred, axis=-1)\n", + " y_pred = y_pred.astype(np.int32)\n", + "\n", + " \"\"\" Save the image \"\"\"\n", + " save_image_path = f\"results/{name}\"\n", + " save_result(ori_x, ori_y, y_pred, save_image_path)\n", + "\n", + " \"\"\" Flattening the numpy arrays. \"\"\"\n", + " y = y.flatten()\n", + " y_pred = y_pred.flatten()\n", + "\n", + " \"\"\" Calculating metrics values \"\"\"\n", + " acc_value = accuracy_score(y, y_pred)\n", + " f1_value = f1_score(y, y_pred, labels=[0, 1], average=\"binary\")\n", + " jac_value = jaccard_score(y, y_pred, labels=[0, 1], average=\"binary\")\n", + " recall_value = recall_score(y, y_pred, labels=[0, 1], average=\"binary\")\n", + " precision_value = precision_score(y, y_pred, labels=[0, 1], average=\"binary\")\n", + " SCORE.append([name, acc_value, f1_value, jac_value, recall_value, precision_value])\n", + "\n", + " \"\"\" Metrics values \"\"\"\n", + " score = [s[1:]for s in SCORE]\n", + " score = np.mean(score, axis=0)\n", + " print(f\"Accuracy: {score[0]:0.5f}\")\n", + " print(f\"F1: {score[1]:0.5f}\")\n", + " print(f\"Jaccard: {score[2]:0.5f}\")\n", + " print(f\"Recall: {score[3]:0.5f}\")\n", + " print(f\"Precision: {score[4]:0.5f}\")\n", + "\n", + " \"\"\" Saving all the results \"\"\"\n", + " df = pd.DataFrame(SCORE, columns=[\"Image\", \"Accuracy\", \"F1\", \"Jaccard\", \"Recall\", \"Precision\"])\n", + " df.to_csv(\"/content/drive/MyDrive/ISIC2018/files1/score.csv\")" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 529 + }, + "id": "kfpA_-Dj_PIl", + "outputId": "4211a9ed-b789-4272-e71d-e7cbebd2a77a" + }, + "execution_count": 71, + "outputs": [ + { + "output_type": "error", + "ename": "FileNotFoundError", + "evalue": "[Errno 2] Unable to synchronously open file (unable to open file: name = '/content/drive/MyDrive/ISIC2018/files1/resunet_model_ph2.h5', errno = 2, error message = 'No such file or directory', flags = 0, o_flags = 0)", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mFileNotFoundError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m