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": [ + "\"Open" + ] + }, + { + "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\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 79\u001b[0m \u001b[0;34m\"\"\" Loading the model \"\"\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 80\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mCustomObjectScope\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m{\u001b[0m\u001b[0;34m\"iou\"\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0miou\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"dice_coef\"\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mdice_coef\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"dice_loss\"\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mdice_loss\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 81\u001b[0;31m \u001b[0mmodel\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mkeras\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmodels\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mload_model\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"/content/drive/MyDrive/ISIC2018/files1/resunet_model_ph2.h5\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 82\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 83\u001b[0m \u001b[0;34m\"\"\" Loading the dataset. \"\"\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.10/dist-packages/keras/src/saving/saving_api.py\u001b[0m in \u001b[0;36mload_model\u001b[0;34m(filepath, custom_objects, compile, safe_mode)\u001b[0m\n\u001b[1;32m 187\u001b[0m )\n\u001b[1;32m 188\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfilepath\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mendswith\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\".h5\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\".hdf5\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 189\u001b[0;31m return legacy_h5_format.load_model_from_hdf5(\n\u001b[0m\u001b[1;32m 190\u001b[0m \u001b[0mfilepath\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcustom_objects\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcustom_objects\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcompile\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcompile\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 191\u001b[0m )\n", + "\u001b[0;32m/usr/local/lib/python3.10/dist-packages/keras/src/legacy/saving/legacy_h5_format.py\u001b[0m in \u001b[0;36mload_model_from_hdf5\u001b[0;34m(filepath, custom_objects, compile)\u001b[0m\n\u001b[1;32m 114\u001b[0m \u001b[0mopened_new_file\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfilepath\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mh5py\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mFile\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 115\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mopened_new_file\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 116\u001b[0;31m \u001b[0mf\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mh5py\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mFile\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfilepath\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmode\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\"r\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 117\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 118\u001b[0m \u001b[0mf\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfilepath\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.10/dist-packages/h5py/_hl/files.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, name, mode, driver, libver, userblock_size, swmr, rdcc_nslots, rdcc_nbytes, rdcc_w0, track_order, fs_strategy, fs_persist, fs_threshold, fs_page_size, page_buf_size, min_meta_keep, min_raw_keep, locking, alignment_threshold, alignment_interval, meta_block_size, **kwds)\u001b[0m\n\u001b[1;32m 560\u001b[0m \u001b[0mfs_persist\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mfs_persist\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfs_threshold\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mfs_threshold\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 561\u001b[0m fs_page_size=fs_page_size)\n\u001b[0;32m--> 562\u001b[0;31m \u001b[0mfid\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmake_fid\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmode\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0muserblock_size\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfapl\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfcpl\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mswmr\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mswmr\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 563\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 564\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlibver\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtuple\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.10/dist-packages/h5py/_hl/files.py\u001b[0m in \u001b[0;36mmake_fid\u001b[0;34m(name, mode, userblock_size, fapl, fcpl, swmr)\u001b[0m\n\u001b[1;32m 233\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mswmr\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mswmr_support\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 234\u001b[0m \u001b[0mflags\u001b[0m \u001b[0;34m|=\u001b[0m \u001b[0mh5f\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mACC_SWMR_READ\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 235\u001b[0;31m \u001b[0mfid\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mh5f\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mflags\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfapl\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mfapl\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 236\u001b[0m \u001b[0;32melif\u001b[0m \u001b[0mmode\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m'r+'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 237\u001b[0m \u001b[0mfid\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mh5f\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mh5f\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mACC_RDWR\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfapl\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mfapl\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32mh5py/_objects.pyx\u001b[0m in \u001b[0;36mh5py._objects.with_phil.wrapper\u001b[0;34m()\u001b[0m\n", + "\u001b[0;32mh5py/_objects.pyx\u001b[0m in \u001b[0;36mh5py._objects.with_phil.wrapper\u001b[0;34m()\u001b[0m\n", + "\u001b[0;32mh5py/h5f.pyx\u001b[0m in \u001b[0;36mh5py.h5f.open\u001b[0;34m()\u001b[0m\n", + "\u001b[0;31mFileNotFoundError\u001b[0m: [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)" + ] + } + ] + } + ] +} \ No newline at end of file