{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":14774,"databundleVersionId":875431,"sourceType":"competition"},{"sourceId":8409759,"sourceType":"datasetVersion","datasetId":5005013}],"dockerImageVersionId":30699,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import numpy as np\nfrom skimage import exposure\nimport pandas as pd\nimport cv2\nimport matplotlib.pyplot as plt \nimport tensorflow as tf\nfrom tensorflow import keras\nfrom PIL import Image as im\nfrom glob import glob\nimport seaborn as sns\nimport random\nimport imgaug.augmenters as iaa\nimport os\n\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.preprocessing import LabelEncoder\nfrom tensorflow.keras.preprocessing.image import load_img, img_to_array\nfrom tensorflow.keras.utils import to_categorical\nfrom tensorflow.keras.models import Sequential, load_model\nfrom tensorflow.keras.models import Model\n\n\nfrom tensorflow.keras.applications import InceptionV3\nfrom tensorflow.keras.applications import DenseNet121\nfrom tensorflow.keras.applications.resnet50 import ResNet50\nfrom tensorflow.keras.applications import EfficientNetB0\n\nfrom tensorflow.keras.layers import Conv2D, MaxPool2D, Dense, Flatten, Dropout,MaxPooling2D,BatchNormalization\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom tensorflow.keras.optimizers import Adam\nfrom tensorflow.keras import losses\nfrom tensorflow.keras.callbacks import ModelCheckpoint, EarlyStopping, ReduceLROnPlateau\nfrom sklearn import preprocessing\nfrom skimage import exposure,filters,color\n\n# from Preprocessing import *\nfrom sklearn.metrics import classification_report, accuracy_score,confusion_matrix, precision_score, recall_score, f1_score,roc_curve, roc_auc_score\nimport warnings \nwarnings.filterwarnings('ignore')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-23T22:11:22.450899Z","iopub.execute_input":"2025-03-23T22:11:22.451662Z","iopub.status.idle":"2025-03-23T22:11:22.458622Z","shell.execute_reply.started":"2025-03-23T22:11:22.451638Z","shell.execute_reply":"2025-03-23T22:11:22.457645Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"<img src='https://media.springernature.com/lw685/springer-static/image/art%3A10.1186%2Fs12938-020-00766-3/MediaObjects/12938_2020_766_Fig1_HTML.png?as=webp'>","metadata":{}},{"cell_type":"markdown","source":"* [Microaneurysms Segmentation](#ms)\n* [Haemorrhages Segmentation](#hae)\n* [Hard Exudates Segmentation](#hes)","metadata":{"execution":{"iopub.status.busy":"2024-05-15T08:19:05.125109Z","iopub.execute_input":"2024-05-15T08:19:05.125538Z","iopub.status.idle":"2024-05-15T08:19:05.166126Z","shell.execute_reply.started":"2024-05-15T08:19:05.125496Z","shell.execute_reply":"2024-05-15T08:19:05.164359Z"}}},{"cell_type":"code","source":"def read_image(path,input_image_size=(512,512)):\n    image = cv2.imread(path)\n    image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)\n    image = cv2.resize(image,input_image_size)\n    return image\n\ndef read_segmentation_training_data(images_train_dir,masks_train_dir,images_train_listdir,masks_train_listdir,image_size = 512):\n\n    MASKS=np.zeros((1,image_size, image_size, 1), dtype=bool)\n    IMAGES=np.zeros((1,image_size, image_size, 3),dtype=np.uint8)\n\n    for j,file in enumerate(images_train_listdir):   ##the smaller, the faster\n        image = read_image(f\"{images_train_dir}/{file}\")\n        image_ex = np.expand_dims(image, axis=0)\n        IMAGES = np.vstack([IMAGES, image_ex])\n\n    images_train=np.array(IMAGES)[1:]\n\n    for j,file in enumerate(masks_train_listdir):   ##the smaller, the faster\n        mask = read_image(f\"{masks_train_dir}/{file}\") \n        mask = cv2.cvtColor(mask, cv2.COLOR_BGR2GRAY)\n        mask = mask.reshape(512,512,1)\n        mask_ex = np.expand_dims(mask, axis=0)    \n        MASKS = np.vstack([MASKS, mask_ex])\n\n    masks_train=np.array(MASKS)[1:]\n    \n    print(images_train.shape,masks_train.shape)\n\n    return images_train,masks_train","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-23T22:11:49.513984Z","iopub.execute_input":"2025-03-23T22:11:49.514756Z","iopub.status.idle":"2025-03-23T22:11:49.524207Z","shell.execute_reply.started":"2025-03-23T22:11:49.514721Z","shell.execute_reply":"2025-03-23T22:11:49.52326Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def preprocess_images(images):\n    # Creating the pre-processing process\n    preprocessed_images = []\n    for image in images:\n        # Convert image to uint8\n        image_uint8 = image.astype(np.uint8)\n        # Split channels\n        b, green_channel, r = cv2.split(image_uint8)\n        # Apply CLAHE\n        \n        clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))\n        contrast_limit_image = clahe.apply(green_channel)\n        # Gamma correction\n        gamma_corrected_image = cv2.convertScaleAbs(contrast_limit_image, alpha=1.2)\n        # Gaussian filtering\n        filtered_image = filters.gaussian(gamma_corrected_image, sigma=0.5)\n\n        preprocessed_images.append(filtered_image)\n    return np.array(preprocessed_images)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-23T22:12:15.864702Z","iopub.execute_input":"2025-03-23T22:12:15.865572Z","iopub.status.idle":"2025-03-23T22:12:15.87109Z","shell.execute_reply.started":"2025-03-23T22:12:15.865544Z","shell.execute_reply":"2025-03-23T22:12:15.870021Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Define a convolutional block\ndef conv_block(input, num_filters):\n    # Convolution layer with 'num_filters' filters and 3x3 kernel size\n    conv = tf.keras.layers.Conv2D(num_filters, 3, padding=\"same\")(input)\n    # Batch normalization to normalize and stabilize the activations\n    conv = tf.keras.layers.BatchNormalization()(conv)\n    # ReLU activation function to introduce non-linearity\n    conv = tf.keras.layers.Activation(\"relu\")(conv)\n    # Second convolution layer with 'num_filters' filters and 3x3 kernel size\n    conv = tf.keras.layers.Conv2D(num_filters, 3, padding=\"same\")(conv)\n    # Batch normalization\n    conv = tf.keras.layers.BatchNormalization()(conv)\n    # ReLU activation\n    conv = tf.keras.layers.Activation(\"relu\")(conv)\n    return conv\n\n# Define an encoder block\ndef encoder_block(input, num_filters):\n    # Create convolutional block\n    skip = conv_block(input, num_filters)\n    # Max pooling layer to downsample the spatial dimensions\n    pool = tf.keras.layers.MaxPool2D((2,2))(skip)\n    return skip, pool\n\n# Define a decoder block\ndef decoder_block(input, skip, num_filters):\n    # Upsampling layer followed by a convolutional layer\n    up_conv = tf.keras.layers.Conv2DTranspose(num_filters, (2,2), strides=2, padding=\"same\")(input)\n    # Concatenate the upsampled feature map with the corresponding skip connection from the encoder\n    conv = tf.keras.layers.Concatenate()([up_conv, skip])\n    # Convolutional block to extract features\n    conv = conv_block(conv, num_filters)\n    return conv\n\n# Define the U-Net architecture\ndef Unet(input_shape):\n    # Input layer\n    inputs = tf.keras.layers.Input(input_shape)\n\n    # Encoding path\n    skip1, pool1 = encoder_block(inputs, 64)\n    skip2, pool2 = encoder_block(pool1, 128)\n    skip3, pool3 = encoder_block(pool2, 256)\n    skip4, pool4 = encoder_block(pool3, 512)\n\n    # Bridge convolutional block\n    bridge = conv_block(pool4, 1024)\n\n    # Decoding path\n    decode1 = decoder_block(bridge, skip4, 512)\n    decode2 = decoder_block(decode1, skip3, 256)\n    decode3 = decoder_block(decode2, skip2, 128)\n    decode4 = decoder_block(decode3, skip1, 64)\n\n    # Output layer\n    outputs = tf.keras.layers.Conv2D(1, 1, padding=\"same\", activation=\"sigmoid\")(decode4)\n    # Define the model with input and output layers\n    model = tf.keras.models.Model(inputs, outputs, name=\"U-Net\")\n    return model\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-23T22:12:26.136737Z","iopub.execute_input":"2025-03-23T22:12:26.137609Z","iopub.status.idle":"2025-03-23T22:12:26.146572Z","shell.execute_reply.started":"2025-03-23T22:12:26.137577Z","shell.execute_reply":"2025-03-23T22:12:26.1457Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"<img src=\"https://media.geeksforgeeks.org/wp-content/uploads/20220614121231/Group14.jpg\">","metadata":{}},{"cell_type":"code","source":"train_df = pd.read_csv('/kaggle/input/aptos2019-blindness-detection/train.csv').head(20)\n\nx_train = []\ny_train = []\n\nimage_size = (512,512)\n\nfor index, row in train_df.iterrows():\n    image_path = f\"/kaggle/input/aptos2019-blindness-detection/train_images/{row['id_code']}.png\"\n    image = cv2.imread(image_path,cv2.IMREAD_COLOR)\n    image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)\n    image = cv2.resize(image, image_size)\n    x_train.append(image)\n    y_train.append(row['diagnosis'])\n    \nx_train = np.array(x_train)\ny_train = np.array(y_train,dtype=np.int32)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-20T06:41:17.480041Z","iopub.execute_input":"2025-03-20T06:41:17.480369Z","iopub.status.idle":"2025-03-20T06:41:20.077844Z","shell.execute_reply.started":"2025-03-20T06:41:17.480337Z","shell.execute_reply":"2025-03-20T06:41:20.077091Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"<h1 id='ms'>Microaneurysm Segmentation</h1>","metadata":{}},{"cell_type":"markdown","source":"## importing IDRiD dataset","metadata":{}},{"cell_type":"code","source":"images_train,masks_train = read_segmentation_training_data(images_train_dir,masks_train_dir,images_train_listdir,masks_train_listdir)\nimages_test,masks_test = read_segmentation_training_data(images_test_dir,masks_test_dir,images_test_listdir,masks_test_listdir)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-22T21:20:09.990841Z","iopub.execute_input":"2025-03-22T21:20:09.991844Z","iopub.status.idle":"2025-03-22T21:20:10.560775Z","shell.execute_reply.started":"2025-03-22T21:20:09.991806Z","shell.execute_reply":"2025-03-22T21:20:10.559268Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#Training data dir\nimages_train_dir ='/kaggle/input/idrid-2018/IDRiD/Segmentation/Images/a. Training Set'\nmasks_train_dir = '/kaggle/input/idrid-2018/IDRiD/Segmentation/Mask/a. Training Set/1. Microaneurysms'\n#Testing data dir\nimages_test_dir ='/kaggle/input/idrid-2018/IDRiD/Segmentation/Images/b. Testing Set'\nmasks_test_dir = '/kaggle/input/idrid-2018/IDRiD/Segmentation/Mask/b. Testing Set/1. Microaneurysms'\n\nimages_train_listdir = sorted(os.listdir(images_train_dir))\nmasks_train_listdir = sorted(os.listdir(masks_train_dir))\n\nimages_test_listdir = sorted(os.listdir(images_test_dir))\nmasks_test_listdir = sorted(os.listdir(masks_test_dir))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-22T19:47:46.262211Z","iopub.status.idle":"2025-03-22T19:47:46.26246Z","shell.execute_reply.started":"2025-03-22T19:47:46.262341Z","shell.execute_reply":"2025-03-22T19:47:46.262351Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"plt.figure(figsize=(10, 5))\n\nfor i,image in enumerate(images_train[:3]):\n    plt.subplot(1, 3, i+1)\n    plt.title(f\"{images_train_listdir[i]}\")\n    plt.imshow(image)\n    plt.axis('off')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-21T19:23:30.762673Z","iopub.execute_input":"2025-03-21T19:23:30.763359Z","iopub.status.idle":"2025-03-21T19:23:31.266685Z","shell.execute_reply.started":"2025-03-21T19:23:30.763327Z","shell.execute_reply":"2025-03-21T19:23:31.265847Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"plt.figure(figsize=(10, 5))\n\nfor i,mask in enumerate(masks_train[:3]):\n    plt.subplot(1, 3, i+1)\n    plt.title(f\"{masks_train_listdir[i]}\")\n    plt.imshow(mask,cmap='gray')\n    plt.axis('off')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-21T19:23:35.630751Z","iopub.execute_input":"2025-03-21T19:23:35.631342Z","iopub.status.idle":"2025-03-21T19:23:35.969101Z","shell.execute_reply.started":"2025-03-21T19:23:35.631313Z","shell.execute_reply":"2025-03-21T19:23:35.968233Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## U-net model","metadata":{}},{"cell_type":"code","source":"# Create an instance of the U-Net model with the specified input shape\nunet_model = Unet((512,512,3))\n# Compile the model with Adam optimizer and binary crossentropy loss\noptimizer = Adam(learning_rate=1e-4) \n    \nunet_model.compile(optimizer=optimizer, \n                   loss=losses.BinaryCrossentropy(from_logits=True), \n                   metrics=['accuracy'])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-21T19:23:45.333459Z","iopub.execute_input":"2025-03-21T19:23:45.334227Z","iopub.status.idle":"2025-03-21T19:23:46.501584Z","shell.execute_reply.started":"2025-03-21T19:23:45.334197Z","shell.execute_reply":"2025-03-21T19:23:46.500934Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import warnings\nwarnings.filterwarnings('ignore')\n\nreduce_lr = ReduceLROnPlateau(monitor='val_loss', patience=3, min_lr=1e-6, verbose=1)\nearly_stopping = EarlyStopping(monitor='val_loss', patience=3, restore_best_weights=True)\n\nunet_history = unet_model.fit(\n    images_train, masks_train, \n    validation_split = 0.2, batch_size = 2, epochs = 37,callbacks=[reduce_lr])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-21T19:23:57.865721Z","iopub.execute_input":"2025-03-21T19:23:57.866547Z","iopub.status.idle":"2025-03-21T19:28:08.666596Z","shell.execute_reply.started":"2025-03-21T19:23:57.866518Z","shell.execute_reply":"2025-03-21T19:28:08.665858Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"plt.figure(figsize=(20,5))\nplt.subplot(1,2,1)\nloss = unet_history.history['loss']\nval_loss = unet_history.history['val_loss']\nepochs = range(1, len(loss) + 1)\nplt.plot(epochs, loss, 'y', label='Training loss')\nplt.plot(epochs, val_loss, 'r', label='Validation loss')\nplt.title('Training and validation loss')\nplt.xlabel('Epochs')\nplt.ylabel('Loss')\nplt.subplot(1,2,2)\naccuracy = unet_history.history['accuracy']\nval_accuracy = unet_history.history['val_accuracy']\nepochs = range(1, len(accuracy) + 1)\nplt.plot(epochs, accuracy, 'y', label='Training accuracy')\nplt.plot(epochs, val_accuracy, 'r', label='Validation accuracy')\nplt.title('Training and validation accuracy')\nplt.xlabel('Epochs')\nplt.ylabel('Loss')\nplt.legend()\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-21T19:41:48.206206Z","iopub.execute_input":"2025-03-21T19:41:48.206575Z","iopub.status.idle":"2025-03-21T19:41:48.653251Z","shell.execute_reply.started":"2025-03-21T19:41:48.20655Z","shell.execute_reply":"2025-03-21T19:41:48.652312Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def show_result(idx, og, unet, target, p):\n    \n    fig, axs = plt.subplots(1, 3, figsize=(12,12))\n    axs[0].set_title(\"Original \"+str(idx) )\n    axs[0].imshow(og)\n    axs[0].axis('off')\n    \n    axs[1].set_title(\"U-Net: p>\"+str(p))\n    axs[1].imshow(unet,cmap='gray')\n    axs[1].axis('off')\n    \n    axs[2].set_title(\"Ground Truth\")\n    axs[2].imshow(target,cmap='gray')\n    axs[2].axis('off')\n\n    plt.show()\n    \nunet_predict = unet_model.predict(images_test[:20])\n\nr1,r2,r3,r4=0.7,0.8,0.9,0.99\n\nunet_predict1 = (unet_predict > r1).astype(np.uint8)\nunet_predict2 = (unet_predict > r2).astype(np.uint8)\nunet_predict3 = (unet_predict > r3).astype(np.uint8)\nunet_predict4 = (unet_predict > r4).astype(np.uint8)\n\nshow_test_idx = random.sample(range(len(unet_predict)), 2)\nfor idx in show_test_idx:\n    show_result(idx, images_test[idx], unet_predict1[idx], masks_test[idx], r1)\n    show_result(idx, images_test[idx], unet_predict2[idx], masks_test[idx], r2)\n    show_result(idx, images_test[idx], unet_predict3[idx], masks_test[idx], r3)\n    show_result(idx, images_test[idx], unet_predict4[idx], masks_test[idx], r4)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-21T19:41:53.721828Z","iopub.execute_input":"2025-03-21T19:41:53.722677Z","iopub.status.idle":"2025-03-21T19:43:39.736725Z","shell.execute_reply.started":"2025-03-21T19:41:53.722649Z","shell.execute_reply":"2025-03-21T19:43:39.735962Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"loss,accuracy = unet_model.evaluate(images_test[:20],masks_test[:20])\n\nprint(\"Test Loss:\", loss)\nprint(\"Test Accuracy:\", accuracy)","metadata":{"trusted":true,"_kg_hide-input":false,"_kg_hide-output":false,"execution":{"iopub.status.busy":"2025-03-21T19:43:48.65523Z","iopub.execute_input":"2025-03-21T19:43:48.655562Z","iopub.status.idle":"2025-03-21T19:43:50.403032Z","shell.execute_reply.started":"2025-03-21T19:43:48.655534Z","shell.execute_reply":"2025-03-21T19:43:50.402171Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def show_result(idx, og, unet, p):\n    \n    fig, axs = plt.subplots(1, 2, figsize=(12,12))\n    axs[0].set_title(\"Original \"+str(idx) )\n    axs[0].imshow(og)\n    axs[0].axis('off')\n    \n    axs[1].set_title(\"U-Net: p>\"+str(p))\n    axs[1].imshow(unet,cmap='gray')\n    axs[1].axis('off')\n\n    plt.show()\n    \nunet_predict = unet_model.predict(images_train)\n\nr1 = 0.99\n\n\nunet_predict4 = (unet_predict > r1).astype(np.uint8)\n\nshow_test_idx = random.sample(range(len(unet_predict)), 2)\nfor idx in show_test_idx:\n    show_result(idx, images_train[idx], unet_predict4[idx], masks_train[idx])  \n    ","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-21T19:46:23.928609Z","iopub.execute_input":"2025-03-21T19:46:23.929403Z","iopub.status.idle":"2025-03-21T19:50:47.439027Z","shell.execute_reply.started":"2025-03-21T19:46:23.929373Z","shell.execute_reply":"2025-03-21T19:50:47.438127Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# **---------------------------------------------START------------------------------------------------**","metadata":{}},{"cell_type":"markdown","source":"**PREPROCESSING GRAYSCALE**","metadata":{}},{"cell_type":"code","source":"import  os","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-23T22:12:45.237895Z","iopub.execute_input":"2025-03-23T22:12:45.238236Z","iopub.status.idle":"2025-03-23T22:12:45.242541Z","shell.execute_reply.started":"2025-03-23T22:12:45.238212Z","shell.execute_reply":"2025-03-23T22:12:45.241634Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#Training data dir\nimages_train_dir ='/kaggle/input/idrid-2018/IDRiD/Segmentation/Images/a. Training Set'\nmasks_train_dir = '/kaggle/input/idrid-2018/IDRiD/Segmentation/Mask/a. Training Set/1. Microaneurysms'\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-23T22:12:47.29523Z","iopub.execute_input":"2025-03-23T22:12:47.295588Z","iopub.status.idle":"2025-03-23T22:12:47.300174Z","shell.execute_reply.started":"2025-03-23T22:12:47.295558Z","shell.execute_reply":"2025-03-23T22:12:47.299182Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#Testing data dir\n\nimages_test_dir ='/kaggle/input/idrid-2018/IDRiD/Segmentation/Images/b. Testing Set'\nmasks_test_dir = '/kaggle/input/idrid-2018/IDRiD/Segmentation/Mask/b. Testing Set/1. Microaneurysms'\n\nimages_train_listdir = sorted(os.listdir(images_train_dir))\nmasks_train_listdir = sorted(os.listdir(masks_train_dir))\n\nprint(images_train_listdir)\nprint(masks_train_listdir)\n\nimages_test_listdir = sorted(os.listdir(images_test_dir))\nmasks_test_listdir = sorted(os.listdir(masks_test_dir))\nprint(images_test_listdir)\nprint(masks_test_listdir)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-23T22:12:48.898241Z","iopub.execute_input":"2025-03-23T22:12:48.898563Z","iopub.status.idle":"2025-03-23T22:12:48.951297Z","shell.execute_reply.started":"2025-03-23T22:12:48.898537Z","shell.execute_reply":"2025-03-23T22:12:48.950396Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-23T21:08:23.99231Z","iopub.execute_input":"2025-03-23T21:08:23.992887Z","iopub.status.idle":"2025-03-23T21:08:24.027715Z","shell.execute_reply.started":"2025-03-23T21:08:23.99286Z","shell.execute_reply":"2025-03-23T21:08:24.026929Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"images_train,masks_train = read_segmentation_training_data(images_train_dir,masks_train_dir,images_train_listdir,masks_train_listdir)\nimages_test,masks_test = read_segmentation_training_data(images_test_dir,masks_test_dir,images_test_listdir,masks_test_listdir)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-23T22:12:55.939739Z","iopub.execute_input":"2025-03-23T22:12:55.940599Z","iopub.status.idle":"2025-03-23T22:13:15.43249Z","shell.execute_reply.started":"2025-03-23T22:12:55.94057Z","shell.execute_reply":"2025-03-23T22:13:15.431601Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(images_train)\nprint(masks_train)\nprint(images_test)\nprint(masks_test)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-23T22:13:15.434204Z","iopub.execute_input":"2025-03-23T22:13:15.434884Z","iopub.status.idle":"2025-03-23T22:13:15.444437Z","shell.execute_reply.started":"2025-03-23T22:13:15.43483Z","shell.execute_reply":"2025-03-23T22:13:15.443628Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"images_train_processed = preprocess_images(images_train)\nimages_test_processed = preprocess_images(images_test)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-23T22:13:18.137283Z","iopub.execute_input":"2025-03-23T22:13:18.1376Z","iopub.status.idle":"2025-03-23T22:13:18.841706Z","shell.execute_reply.started":"2025-03-23T22:13:18.137576Z","shell.execute_reply":"2025-03-23T22:13:18.840783Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"**AUGMENTATION**","metadata":{}},{"cell_type":"code","source":"import albumentations as A","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-23T22:13:25.296329Z","iopub.execute_input":"2025-03-23T22:13:25.296966Z","iopub.status.idle":"2025-03-23T22:13:25.466338Z","shell.execute_reply.started":"2025-03-23T22:13:25.29694Z","shell.execute_reply":"2025-03-23T22:13:25.465647Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Define augmentation pipeline with specific transformations\naugmentations = {\n    \"hflip\": A.HorizontalFlip(p=1),   # Horizontal Flip\n    \"vflip\": A.VerticalFlip(p=1),     # Vertical Flip\n    \"rotate90\": A.RandomRotate90(p=1),  # 90-degree Rotation\n    \"transpose\": A.Transpose(p=1),      # Transpose\n    \"shift_scale_rotate\": A.ShiftScaleRotate(shift_limit=0.05, scale_limit=0.05, rotate_limit=10, p=1)  # Shift, Scale, Rotate\n}","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-23T22:13:28.060237Z","iopub.execute_input":"2025-03-23T22:13:28.060562Z","iopub.status.idle":"2025-03-23T22:13:28.065794Z","shell.execute_reply.started":"2025-03-23T22:13:28.060536Z","shell.execute_reply":"2025-03-23T22:13:28.064874Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Function to apply augmentation and save images\ndef augment_and_save(images, masks, image_names, mask_names, output_folder, prefix=\"train\"):\n    \"\"\"\n    Apply augmentations and save images and masks with the specified naming convention.\n\n    Parameters:\n        images (list): List of images (NumPy arrays).\n        masks (list): List of masks (NumPy arrays).\n        image_names (list): List of original image filenames.\n        mask_names (list): List of original mask filenames.\n        output_folder (str): Output directory to save augmented data.\n        prefix (str): Prefix to differentiate between train and test data.\n    \"\"\"\n    # Create output directories if they don't exist\n    output_image_folder = os.path.join(output_folder, \"images\")\n    output_mask_folder = os.path.join(output_folder, \"masks\")\n    os.makedirs(output_image_folder, exist_ok=True)\n    os.makedirs(output_mask_folder, exist_ok=True)\n\n    for idx, (img, mask, img_name, mask_name) in enumerate(zip(images, masks, image_names, mask_names)):\n        # Check if image and mask are valid\n        if img is None or mask is None:\n            print(f\"⚠️ Image or mask at index {idx} is invalid.\")\n            continue\n\n        # Resize to maintain consistency\n        img = cv2.resize(img, (512, 512))\n        mask = cv2.resize(mask, (512, 512), interpolation=cv2.INTER_NEAREST)\n\n        # Extract filename without extension\n        img_base = os.path.splitext(img_name)[0]  # Remove file extension\n        mask_base = os.path.splitext(mask_name)[0]  # Remove file extension\n\n        \n\n        # Apply augmentations\n        for aug_name, aug in augmentations.items():\n            augmented = aug(image=img, mask=mask)\n            aug_img = augmented['image']\n            aug_mask = augmented['mask']\n\n            # Define new filenames\n            aug_img_filename = f\"{img_base}_{aug_name}.jpg\"\n            aug_mask_filename = f\"{mask_base}_{aug_name}.tif\"\n\n            # Save augmented images and masks\n            cv2.imwrite(os.path.join(output_image_folder, f\"{img_base}_{aug_name}{os.path.splitext(img_name)[1]}.jpg\"), aug_img)\n            cv2.imwrite(os.path.join(output_mask_folder, f\"{mask_base}_{aug_name}{os.path.splitext(mask_name)[1]}.tif\"), aug_mask)\n        print(f\"Augmented images saved for {img_base}\")\n        print(f\"Augmented images saved for {mask_base}\")\n\n    print(f\"✅ Augmented images and masks saved in {output_image_folder} and {output_mask_folder}\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-23T22:13:30.248835Z","iopub.execute_input":"2025-03-23T22:13:30.24973Z","iopub.status.idle":"2025-03-23T22:13:30.258442Z","shell.execute_reply.started":"2025-03-23T22:13:30.249705Z","shell.execute_reply":"2025-03-23T22:13:30.257434Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"output_folder = \"/kaggle/working/microaneurysms-segmentation/\"  # Folder to store augmented images\n\n# Apply augmentation and save images/masks for training data\naugment_and_save(images_train_processed, masks_train, images_train_listdir, masks_train_listdir, output_folder, prefix=\"train\")\n\n# Apply augmentation and save images/masks for test data\naugment_and_save(images_test_processed, masks_test, images_test_dir, masks_test_dir, output_folder, prefix=\"test\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-23T22:13:33.285402Z","iopub.execute_input":"2025-03-23T22:13:33.285729Z","iopub.status.idle":"2025-03-23T22:13:35.241781Z","shell.execute_reply.started":"2025-03-23T22:13:33.285704Z","shell.execute_reply":"2025-03-23T22:13:35.24081Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"**Don't run this cell**","metadata":{}},{"cell_type":"code","source":"plt.figure(figsize=(10, 5))\n\nfor i,image in enumerate(images_train_processed[:3]):\n    plt.subplot(1, 3, i+1)\n    plt.title(f\"{images_train_listdir[i]}\")\n    plt.imshow(image,cmap='gray')\n    #plt.imshow(image)\n    plt.axis('off')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-22T20:20:50.940392Z","iopub.execute_input":"2025-03-22T20:20:50.9412Z","iopub.status.idle":"2025-03-22T20:20:51.316258Z","shell.execute_reply.started":"2025-03-22T20:20:50.941172Z","shell.execute_reply":"2025-03-22T20:20:51.315437Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Select one image and its augmented versions\nimage_index = 0  # Change this to select a different image\noriginal_image = images_train_processed[image_index]\noriginal_mask = masks_train[image_index]\n\n# Plot the original image and its augmented versions\nplt.figure(figsize=(10, 5))\n\n# Plot original image\nplt.subplot(2, 3, 1)\nplt.title(\"Original Image\")\nplt.imshow(original_image, cmap='gray')\nplt.axis('off')\n\n\n# Plot augmented images\nfor i, (aug_img, aug_name) in enumerate(zip(augmented_images, augmentations.keys())):\n    plt.subplot(2, 3, i + 2)  # i + 2 because the first subplot is for the original image\n    plt.title(f\"Augmented: {aug_name}\")\n    plt.imshow(aug_img, cmap='gray')\n    plt.axis('off')\n\nplt.tight_layout()\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-23T22:13:40.28103Z","iopub.execute_input":"2025-03-23T22:13:40.281356Z","iopub.status.idle":"2025-03-23T22:13:40.937Z","shell.execute_reply.started":"2025-03-23T22:13:40.281331Z","shell.execute_reply":"2025-03-23T22:13:40.935253Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"BATCH_SIZE = 2\nEPOCHS = 50\nLEARNING_RATE = 0.0001\n","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Create an instance of the U-Net model with the specified input shape\nunet_model2 = Unet((512,512,1))\n# Compile the model with Adam optimizer and binary crossentropy loss\noptimizer = Adam(LEARNING_RATE) \n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-22T20:20:55.531191Z","iopub.execute_input":"2025-03-22T20:20:55.531968Z","iopub.status.idle":"2025-03-22T20:20:56.69671Z","shell.execute_reply.started":"2025-03-22T20:20:55.531938Z","shell.execute_reply":"2025-03-22T20:20:56.696041Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#Assuming balanced classes\n\nunet_model2.compile(optimizer=optimizer, \n                   loss=losses.BinaryCrossentropy(from_logits=True), \n                   metrics=['accuracy'])","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import warnings\nfrom tensorflow.keras.callbacks import ModelCheckpoint, EarlyStopping, ReduceLROnPlateau, TensorBoard, CSVLogger, LearningRateFinder\nimport datetime\n\nwarnings.filterwarnings('ignore')\n\ncheckpoint = ModelCheckpoint('MA_best_model.h5', monitor= 'val_loss', save_best_only = True)\nreduce_lr = ReduceLROnPlateau(monitor='val_loss', factor=0.2, patience=5, min_lr=1e-6, verbose=1)\nearly_stopping = EarlyStopping(monitor='val_loss', patience=5, restore_best_weights=True)\nlog_dir = 'logs/fit/' + datetime.datetime.now().strftime(' %Y%m%d - %H%M%S')\ntensorboard = TensorBoard(log_dir = log_dir, histogram_freq = 1)\ncsv_logger = CSVLogger('MA_training_log.csv')\nlr_finder = LearningRateFinder()\n\ndef lr_schedule(EPOCHS):\n    iinitial_lr = 0.001\n    drop_factor - 0.5\n    drop_epochs = 10\n    lr = initial_lr * (drop_factor ** (epoch // drop_epochs)\n\n    return lr\n\nlr_scheduler = LearningRateScheduler(lr_schedule)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\n\nunet_history = unet_model2.fit(\n    images_train_processed, masks_train, \n    validation_split = 0.1, BATCH_SIZE, EPOCHS,\n   callbacks=[checkpoint, early_stopping, reduce_lr, tensorboard, csv_logger, lr_scheduler, lr_finder])","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"**PLOT LOSS HISTORY**","metadata":{}},{"cell_type":"code","source":"def plot_training_history(history):\n    plt.figure(figsize=(12, 4))\n\n    # Plot training and validation loss\n    plt.subplot(1, 2, 1)\n    plt.plot(history.history['loss'], label='Training Loss')\n    plt.plot(history.history['val_loss'], label='Validation Loss')\n    plt.title(\"Loss Over Epochs\")\n    plt.xlabel(\"Epoch\")\n    plt.ylabel(\"Loss\")\n    plt.legend()\n\n    # Plot training and validation accuracy\n    plt.subplot(1, 2, 2)\n    plt.plot(history.history['accuracy'], label='Training Accuracy')\n    plt.plot(history.history['val_accuracy'], label='Validation Accuracy')\n    plt.title(\"Accuracy Over Epochs\")\n    plt.xlabel(\"Epoch\")\n    plt.ylabel(\"Accuracy\")\n    plt.legend()\n\n    plt.tight_layout()\n    plt.show()\n\n# Plot training history\nplot_training_history(history)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-22T20:20:58.510717Z","iopub.execute_input":"2025-03-22T20:20:58.511035Z","iopub.status.idle":"2025-03-22T20:26:01.967457Z","shell.execute_reply.started":"2025-03-22T20:20:58.511012Z","shell.execute_reply":"2025-03-22T20:26:01.966783Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"plt.figure(figsize=(20,5))\nplt.subplot(1,2,1)\nloss = unet_history.history['loss']\nval_loss = unet_history.history['val_loss']\nepochs = range(1, len(loss) + 1)\nplt.plot(epochs, loss, 'y', label='Training loss')\nplt.plot(epochs, val_loss, 'r', label='Validation loss')\nplt.title('Training and validation loss')\nplt.xlabel('Epochs')\nplt.ylabel('Loss')\nplt.legend()\n\nplt.subplot(1,2,2)\naccuracy = unet_history.history['accuracy']\nval_accuracy = unet_history.history['val_accuracy']\nepochs = range(1, len(accuracy) + 1)\nplt.plot(epochs, accuracy, 'y', label='Training accuracy')\nplt.plot(epochs, val_accuracy, 'r', label='Validation accuracy')\nplt.title('Training and validation accuracy')\nplt.xlabel('Epochs')\nplt.ylabel('Loss')\nplt.legend()\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-22T20:26:43.333909Z","iopub.execute_input":"2025-03-22T20:26:43.334232Z","iopub.status.idle":"2025-03-22T20:26:44.028342Z","shell.execute_reply.started":"2025-03-22T20:26:43.334207Z","shell.execute_reply":"2025-03-22T20:26:44.027571Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def show_result(idx, og, unet, target, p):\n    \n    fig, axs = plt.subplots(1, 3, figsize=(12,12))\n    axs[0].set_title(\"Original \"+str(idx) )\n    axs[0].imshow(og,cmap='gray')\n    axs[0].axis('off')\n    \n    axs[1].set_title(\"U-Net: p>\"+str(p))\n    axs[1].imshow(unet,cmap='gray')\n    axs[1].axis('off')\n    \n    axs[2].set_title(\"Ground Truth\")\n    axs[2].imshow(target,cmap='gray')\n    axs[2].axis('off')\n\n    plt.show()\n    \n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-22T20:26:45.624203Z","iopub.execute_input":"2025-03-22T20:26:45.624872Z","iopub.status.idle":"2025-03-22T20:28:28.877571Z","shell.execute_reply.started":"2025-03-22T20:26:45.624842Z","shell.execute_reply":"2025-03-22T20:28:28.87658Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"unet_predict = unet_model2.predict(images_test_processed[:20])\n\nr1 = 0.99\n\nunet_predict1 = (unet_predict > r1).astype(np.uint8)\n\n\nshow_test_idx = random.sample(range(len(unet_predict)), 3)\nfor idx in show_test_idx:\n    show_result(idx, images_test_processed[idx], unet_predict1[idx], masks_test[idx], r1)\n\n\n","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"output_dir = \"/kaggle/working/predicted_masks/\"\n\nos.makedirs(output_dir, exist_ok=True)  # Create the directory if it doesn't exist\n","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"for idx, pred_mask in enumerate(unet_predict1):\n    # Convert the predicted mask to an image (0s and 255s)\n    pred_mask_image = pred_mask * 255  # Scale to 0-255 for saving as an image\n\n    # Save the predicted mask as a PNG file\n    output_path = os.path.join(output_dir, f\"pred_mask_{idx}.png\")\n    cv2.imwrite(output_path, pred_mask_image)\n\n    print(f\"Saved predicted mask for image {idx} at {output_path}\")\n\nprint(f\"✅ All predicted masks saved in {output_dir}\")","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"loss,accuracy = unet_model2.evaluate(images_test_processed[:20],masks_test[:20])\n\nprint(\"Test Loss:\", loss)\nprint(\"Test Accuracy:\", accuracy)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-22T20:44:33.824244Z","iopub.execute_input":"2025-03-22T20:44:33.824591Z","iopub.status.idle":"2025-03-22T20:44:34.538872Z","shell.execute_reply.started":"2025-03-22T20:44:33.824565Z","shell.execute_reply":"2025-03-22T20:44:34.538183Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def show_result(idx, og, unet, p):\n    \n    fig, axs = plt.subplots(1, 2, figsize=(12,12))\n    axs[0].set_title(\"Original \"+str(idx) )\n    axs[0].imshow(og,cmap='gray')\n    axs[0].axis('off')\n    \n    axs[1].set_title(\"U-Net: Class \"+str(p))\n    axs[1].imshow(unet,cmap='gray')\n    axs[1].axis('off')\n\n    plt.show()\n    \nunet_predict = unet_model2.predict(preprocess_images(x_train))\n\nr1 = 0.9\n\nunet_predict1 = (unet_predict > r1).astype(np.uint8)\n\nshow_test_idx = random.sample(range(len(unet_predict)), 3)\nfor idx in show_test_idx:\n    show_result(idx, preprocess_images(x_train)[idx], unet_predict1[idx], y_train[idx])\n    ","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-22T20:44:36.870667Z","iopub.execute_input":"2025-03-22T20:44:36.870962Z","iopub.status.idle":"2025-03-22T20:48:57.458634Z","shell.execute_reply.started":"2025-03-22T20:44:36.870941Z","shell.execute_reply":"2025-03-22T20:48:57.457827Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Save the entire model (architecture + weights + optimizer state)\nunet_model2.save(\"MA_trained_model.h5\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-22T20:54:32.450864Z","iopub.execute_input":"2025-03-22T20:54:32.451459Z","iopub.status.idle":"2025-03-22T20:54:33.16329Z","shell.execute_reply.started":"2025-03-22T20:54:32.451432Z","shell.execute_reply":"2025-03-22T20:54:33.162608Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# **--------------------------------------------END-------------------------------------------------**","metadata":{}},{"cell_type":"markdown","source":"<h1 id='hae'>Haemorrhages Segmentation</h1>","metadata":{}},{"cell_type":"markdown","source":"## Importing data","metadata":{}},{"cell_type":"code","source":"#Training data dir\nimages_train_dir ='/kaggle/input/idrid-2018/IDRiD/Segmentation/Images/a. Training Set'\nmasks_train_dir = '/kaggle/input/idrid-2018/IDRiD/Segmentation/Mask/a. Training Set/2. Haemorrhages'\n#Testing data dir\nimages_test_dir ='/kaggle/input/idrid-2018/IDRiD/Segmentation/Images/b. Testing Set'\nmasks_test_dir = '/kaggle/input/idrid-2018/IDRiD/Segmentation/Mask/b. Testing Set/2. Haemorrhages'\n\nimages_train_listdir = sorted(os.listdir(images_train_dir))\nmasks_train_listdir = sorted(os.listdir(masks_train_dir))\n\nimages_test_listdir = sorted(os.listdir(images_test_dir))\nmasks_test_listdir = sorted(os.listdir(masks_test_dir))\n\nimages_train_listdir = np.delete(images_train_listdir, 42, axis=0)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-20T06:41:47.464793Z","iopub.execute_input":"2025-03-20T06:41:47.465599Z","iopub.status.idle":"2025-03-20T06:41:47.523904Z","shell.execute_reply.started":"2025-03-20T06:41:47.465569Z","shell.execute_reply":"2025-03-20T06:41:47.523215Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"images_train,masks_train = read_segmentation_training_data(images_train_dir,masks_train_dir,images_train_listdir,masks_train_listdir)\nimages_test,masks_test = read_segmentation_training_data(images_test_dir,masks_test_dir,images_test_listdir,masks_test_listdir)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-20T06:41:47.525261Z","iopub.execute_input":"2025-03-20T06:41:47.525518Z","iopub.status.idle":"2025-03-20T06:42:06.170914Z","shell.execute_reply.started":"2025-03-20T06:41:47.525499Z","shell.execute_reply":"2025-03-20T06:42:06.170064Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"plt.figure(figsize=(10, 5))\n\nfor i,image in enumerate(images_train[:3]):\n    plt.subplot(1, 3, i+1)\n    plt.title(f\"{images_train_listdir[i]}\")\n    plt.imshow(image)\n    plt.axis('off')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-20T06:42:06.171986Z","iopub.execute_input":"2025-03-20T06:42:06.172238Z","iopub.status.idle":"2025-03-20T06:42:06.605415Z","shell.execute_reply.started":"2025-03-20T06:42:06.172218Z","shell.execute_reply":"2025-03-20T06:42:06.604535Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"plt.figure(figsize=(10, 5))\n\nfor i,mask in enumerate(masks_train[:3]):\n    plt.subplot(1, 3, i+1)\n    plt.title(f\"{masks_train_listdir[i]}\")\n    plt.imshow(mask,cmap='gray')\n    plt.axis('off')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-20T06:42:06.607283Z","iopub.execute_input":"2025-03-20T06:42:06.60754Z","iopub.status.idle":"2025-03-20T06:42:06.868196Z","shell.execute_reply.started":"2025-03-20T06:42:06.60752Z","shell.execute_reply":"2025-03-20T06:42:06.867421Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Create an instance of the U-Net model with the specified input shape\nunet_model = Unet((512,512,3))\n# Compile the model with Adam optimizer and binary crossentropy loss\noptimizer = Adam(learning_rate=1e-4) \n    \nunet_model.compile(optimizer=optimizer, \n                   loss=losses.BinaryCrossentropy(from_logits=True), \n                   metrics=['accuracy'])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-20T06:42:06.869344Z","iopub.execute_input":"2025-03-20T06:42:06.869678Z","iopub.status.idle":"2025-03-20T06:42:08.059575Z","shell.execute_reply.started":"2025-03-20T06:42:06.869636Z","shell.execute_reply":"2025-03-20T06:42:08.058918Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"reduce_lr = ReduceLROnPlateau(monitor='val_loss', patience=3, min_lr=1e-8, verbose=1)\nearly_stopping = EarlyStopping(monitor='val_loss', patience=3, restore_best_weights=True)\n\nunet_history = unet_model.fit(\n    images_train, masks_train, \n    validation_split = 0.1, batch_size = 2, epochs = 37)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-20T06:42:08.06058Z","iopub.execute_input":"2025-03-20T06:42:08.060861Z","iopub.status.idle":"2025-03-20T06:46:27.666614Z","shell.execute_reply.started":"2025-03-20T06:42:08.06084Z","shell.execute_reply":"2025-03-20T06:46:27.665705Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"plt.figure(figsize=(20,5))\nplt.subplot(1,2,1)\nloss = unet_history.history['loss']\nval_loss = unet_history.history['val_loss']\nepochs = range(1, len(loss) + 1)\nplt.plot(epochs, loss, 'y', label='Training loss')\nplt.plot(epochs, val_loss, 'r', label='Validation loss')\nplt.title('Training and validation loss')\nplt.xlabel('Epochs')\nplt.ylabel('Loss')\nplt.legend()\n\nplt.subplot(1,2,2)\naccuracy = unet_history.history['accuracy']\nval_accuracy = unet_history.history['val_accuracy']\nepochs = range(1, len(accuracy) + 1)\nplt.plot(epochs, accuracy, 'y', label='Training accuracy')\nplt.plot(epochs, val_accuracy, 'r', label='Validation accuracy')\nplt.title('Training and validation accuracy')\nplt.xlabel('Epochs')\nplt.ylabel('Loss')\nplt.legend()\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-20T06:46:27.668007Z","iopub.execute_input":"2025-03-20T06:46:27.668265Z","iopub.status.idle":"2025-03-20T06:46:28.105387Z","shell.execute_reply.started":"2025-03-20T06:46:27.668244Z","shell.execute_reply":"2025-03-20T06:46:28.104482Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def show_result(idx, og, unet, target, p):\n    \n    fig, axs = plt.subplots(1, 3, figsize=(12,12))\n    axs[0].set_title(\"Original \"+str(idx) )\n    axs[0].imshow(og)\n    axs[0].axis('off')\n    \n    axs[1].set_title(\"U-Net: p>\"+str(p))\n    axs[1].imshow(unet,cmap='gray')\n    axs[1].axis('off')\n    \n    axs[2].set_title(\"Ground Truth\")\n    axs[2].imshow(target,cmap='gray')\n    axs[2].axis('off')\n\n    plt.show()\n    \nunet_predict = unet_model.predict(images_test[:20])\n\nr1 = 0.99\n\nunet_predict1 = (unet_predict > r1).astype(np.uint8)\n\nshow_test_idx = random.sample(range(len(unet_predict)), 3)\nfor idx in show_test_idx:\n    show_result(idx, images_test[idx], unet_predict1[idx], masks_test[idx], r1)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-20T06:46:28.10648Z","iopub.execute_input":"2025-03-20T06:46:28.106785Z","iopub.status.idle":"2025-03-20T06:48:13.028228Z","shell.execute_reply.started":"2025-03-20T06:46:28.106763Z","shell.execute_reply":"2025-03-20T06:48:13.027432Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"loss,accuracy = unet_model.evaluate(images_test[:20],masks_test[:20])\n\nprint(\"Test Loss:\", loss)\nprint(\"Test Accuracy:\", accuracy)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-20T06:48:13.029355Z","iopub.execute_input":"2025-03-20T06:48:13.029712Z","iopub.status.idle":"2025-03-20T06:48:15.281432Z","shell.execute_reply.started":"2025-03-20T06:48:13.029679Z","shell.execute_reply":"2025-03-20T06:48:15.280489Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def show_result(idx, og, unet, p):\n    \n    fig, axs = plt.subplots(1, 2, figsize=(12,12))\n    axs[0].set_title(\"Original \"+str(idx) )\n    axs[0].imshow(og)\n    axs[0].axis('off')\n    \n    axs[1].set_title(\"U-Net: Class \"+str(p))\n    axs[1].imshow(unet,cmap='gray')\n    axs[1].axis('off')\n\n    plt.show()\n    \nunet_predict = unet_model.predict(x_train)\n\nr1 = 0.99\n\nunet_predict4 = (unet_predict > r1).astype(np.uint8)\n\nshow_test_idx = random.sample(range(len(unet_predict)), 2)\nfor idx in show_test_idx:\n    show_result(idx, x_train[idx], unet_predict4[idx], y_train[idx])  \n    ","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-20T06:48:15.284105Z","iopub.execute_input":"2025-03-20T06:48:15.284366Z","iopub.status.idle":"2025-03-20T06:48:16.79846Z","shell.execute_reply.started":"2025-03-20T06:48:15.284345Z","shell.execute_reply":"2025-03-20T06:48:16.797701Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"images_train_processed = preprocess_images(images_train)\nimages_test_processed = preprocess_images(images_test)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-20T06:48:16.799677Z","iopub.execute_input":"2025-03-20T06:48:16.800003Z","iopub.status.idle":"2025-03-20T06:48:17.358691Z","shell.execute_reply.started":"2025-03-20T06:48:16.799975Z","shell.execute_reply":"2025-03-20T06:48:17.357707Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"plt.figure(figsize=(10, 5))\n\nfor i,image in enumerate(images_train_processed[:3]):\n    plt.subplot(1, 3, i+1)\n    plt.title(f\"{images_train_listdir[i]}\")\n    plt.imshow(image,cmap='gray')\n    plt.axis('off')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-20T06:48:17.359854Z","iopub.execute_input":"2025-03-20T06:48:17.36012Z","iopub.status.idle":"2025-03-20T06:48:17.738078Z","shell.execute_reply.started":"2025-03-20T06:48:17.3601Z","shell.execute_reply":"2025-03-20T06:48:17.737257Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"plt.figure(figsize=(10, 5))\n\nfor i,image in enumerate(masks_train[:3]):\n    plt.subplot(1, 3, i+1)\n    plt.title(f\"{masks_train_listdir[i]}\")\n    plt.imshow(image,cmap='gray')\n    plt.axis('off')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-20T06:48:17.739164Z","iopub.execute_input":"2025-03-20T06:48:17.739479Z","iopub.status.idle":"2025-03-20T06:48:18.363665Z","shell.execute_reply.started":"2025-03-20T06:48:17.739454Z","shell.execute_reply":"2025-03-20T06:48:18.362852Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Create an instance of the U-Net model with the specified input shape\nunet_model2 = Unet((512,512,1))\n# Compile the model with Adam optimizer and binary crossentropy loss\noptimizer = Adam(learning_rate=1e-4) \n    \nunet_model2.compile(optimizer=optimizer, \n                   loss=losses.BinaryCrossentropy(from_logits=True), \n                   metrics=['accuracy'])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-20T06:48:18.364615Z","iopub.execute_input":"2025-03-20T06:48:18.364878Z","iopub.status.idle":"2025-03-20T06:48:18.652933Z","shell.execute_reply.started":"2025-03-20T06:48:18.364859Z","shell.execute_reply":"2025-03-20T06:48:18.652217Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import warnings\nwarnings.filterwarnings('ignore')\n\nunet_history = unet_model2.fit(\n    images_train_processed, masks_train, \n    validation_split = 0.1, batch_size = 2, epochs = 37)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-20T06:48:18.653924Z","iopub.execute_input":"2025-03-20T06:48:18.654243Z","iopub.status.idle":"2025-03-20T06:51:53.891948Z","shell.execute_reply.started":"2025-03-20T06:48:18.654214Z","shell.execute_reply":"2025-03-20T06:51:53.890963Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"plt.figure(figsize=(20,5))\nplt.subplot(1,2,1)\nloss = unet_history.history['loss']\nval_loss = unet_history.history['val_loss']\nepochs = range(1, len(loss) + 1)\nplt.plot(epochs, loss, 'y', label='Training loss')\nplt.plot(epochs, val_loss, 'r', label='Validation loss')\nplt.title('Training and validation loss')\nplt.xlabel('Epochs')\nplt.ylabel('Loss')\nplt.legend()\n\nplt.subplot(1,2,2)\naccuracy = unet_history.history['accuracy']\nval_accuracy = unet_history.history['val_accuracy']\nepochs = range(1, len(accuracy) + 1)\nplt.plot(epochs, accuracy, 'y', label='Training accuracy')\nplt.plot(epochs, val_accuracy, 'r', label='Validation accuracy')\nplt.title('Training and validation accuracy')\nplt.xlabel('Epochs')\nplt.ylabel('Loss')\nplt.legend()\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-20T06:51:53.893232Z","iopub.execute_input":"2025-03-20T06:51:53.893504Z","iopub.status.idle":"2025-03-20T06:51:54.318218Z","shell.execute_reply.started":"2025-03-20T06:51:53.893484Z","shell.execute_reply":"2025-03-20T06:51:54.31743Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def show_result(idx, og, unet, target, p):\n    \n    fig, axs = plt.subplots(1, 3, figsize=(12,12))\n    axs[0].set_title(\"Original \"+str(idx) )\n    axs[0].imshow(og,cmap='gray')\n    axs[0].axis('off')\n    \n    axs[1].set_title(\"U-Net: p>\"+str(p))\n    axs[1].imshow(unet,cmap='gray')\n    axs[1].axis('off')\n    \n    axs[2].set_title(\"Ground Truth\")\n    axs[2].imshow(target,cmap='gray')\n    axs[2].axis('off')\n\n    plt.show()\n    \nunet_predict = unet_model2.predict(images_test_processed[:20])\n\nr1 = 0.99\n\nunet_predict1 = (unet_predict > r1).astype(np.uint8)\n\n\nshow_test_idx = random.sample(range(len(unet_predict)), 3)\nfor idx in show_test_idx:\n    show_result(idx, images_test_processed[idx], unet_predict1[idx], masks_test[idx], r1)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-20T06:51:54.319456Z","iopub.execute_input":"2025-03-20T06:51:54.320088Z","iopub.status.idle":"2025-03-20T06:52:05.098784Z","shell.execute_reply.started":"2025-03-20T06:51:54.320056Z","shell.execute_reply":"2025-03-20T06:52:05.097927Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"loss,accuracy = unet_model2.evaluate(images_test_processed[:20],masks_test[:20])\n\nprint(\"Test Loss:\", loss)\nprint(\"Test Accuracy:\", accuracy)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-20T06:52:05.099766Z","iopub.execute_input":"2025-03-20T06:52:05.100018Z","iopub.status.idle":"2025-03-20T06:52:07.336973Z","shell.execute_reply.started":"2025-03-20T06:52:05.099997Z","shell.execute_reply":"2025-03-20T06:52:07.336124Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def show_result(idx, og, unet, p):\n    \n    fig, axs = plt.subplots(1, 2, figsize=(12,12))\n    axs[0].set_title(\"Original \"+str(idx) )\n    axs[0].imshow(og,cmap='gray')\n    axs[0].axis('off')\n    \n    axs[1].set_title(\"U-Net: Class \"+str(p))\n    axs[1].imshow(unet,cmap='gray')\n    axs[1].axis('off')\n\n    plt.show()\n    \nunet_predict = unet_model2.predict(preprocess_images(x_train))\n\nr1 = 0.9\n\nunet_predict1 = (unet_predict > r1).astype(np.uint8)\n\nshow_test_idx = random.sample(range(len(unet_predict)), 3)\nfor idx in show_test_idx:\n    show_result(idx, preprocess_images(x_train)[idx], unet_predict1[idx], y_train[idx])\n    ","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-20T06:52:07.338055Z","iopub.execute_input":"2025-03-20T06:52:07.338335Z","iopub.status.idle":"2025-03-20T06:52:09.530053Z","shell.execute_reply.started":"2025-03-20T06:52:07.338313Z","shell.execute_reply":"2025-03-20T06:52:09.529151Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"unet_model.save('Haemorrhages_u-net.h5')\nunet_model2.save('Haemorrhages_u-net_preprocessed.h5')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-20T06:52:09.531251Z","iopub.execute_input":"2025-03-20T06:52:09.531592Z","iopub.status.idle":"2025-03-20T06:52:10.86254Z","shell.execute_reply.started":"2025-03-20T06:52:09.531562Z","shell.execute_reply":"2025-03-20T06:52:10.861862Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"<h1 id='hes'>Hard Exudates Segmentation</h1>","metadata":{}},{"cell_type":"markdown","source":"## Importing data","metadata":{}},{"cell_type":"code","source":"#Training data dir\nimages_train_dir ='/kaggle/input/idrid-2018/IDRiD/Segmentation/Images/a. Training Set'\nmasks_train_dir = '/kaggle/input/idrid-2018/IDRiD/Segmentation/Mask/a. Training Set/3. Hard Exudates'\n#Testing data dir\nimages_test_dir ='/kaggle/input/idrid-2018/IDRiD/Segmentation/Images/b. Testing Set'\nmasks_test_dir = '/kaggle/input/idrid-2018/IDRiD/Segmentation/Mask/b. Testing Set/3. Hard Exudates'\n\nimages_train_listdir = sorted(os.listdir(images_train_dir))\nmasks_train_listdir = sorted(os.listdir(masks_train_dir))\n\nimages_test_listdir = sorted(os.listdir(images_test_dir))\nmasks_test_listdir = sorted(os.listdir(masks_test_dir))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-21T05:48:34.05813Z","iopub.execute_input":"2025-03-21T05:48:34.058468Z","iopub.status.idle":"2025-03-21T05:48:34.073931Z","shell.execute_reply.started":"2025-03-21T05:48:34.05844Z","shell.execute_reply":"2025-03-21T05:48:34.073306Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"images_train,masks_train = read_segmentation_training_data(images_train_dir,masks_train_dir,images_train_listdir,masks_train_listdir)\nimages_test,masks_test = read_segmentation_training_data(images_test_dir,masks_test_dir,images_test_listdir,masks_test_listdir)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-21T05:48:37.132735Z","iopub.execute_input":"2025-03-21T05:48:37.13352Z","iopub.status.idle":"2025-03-21T05:48:57.484233Z","shell.execute_reply.started":"2025-03-21T05:48:37.133492Z","shell.execute_reply":"2025-03-21T05:48:57.483395Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"plt.figure(figsize=(10, 5))\n\nfor i,image in enumerate(images_train[:3]):\n    plt.subplot(1, 3, i+1)\n    plt.title(f\"{images_train_listdir[i]}\")\n    plt.imshow(image)\n    plt.axis('off')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-21T05:48:57.486051Z","iopub.execute_input":"2025-03-21T05:48:57.486672Z","iopub.status.idle":"2025-03-21T05:48:58.007217Z","shell.execute_reply.started":"2025-03-21T05:48:57.486621Z","shell.execute_reply":"2025-03-21T05:48:58.00635Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"plt.figure(figsize=(10, 5))\n\nfor i,mask in enumerate(masks_train[:3]):\n    plt.subplot(1, 3, i+1)\n    plt.title(f\"{masks_train_listdir[i]}\")\n    plt.imshow(mask,cmap='gray')\n    plt.axis('off')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-21T05:48:58.008329Z","iopub.execute_input":"2025-03-21T05:48:58.008586Z","iopub.status.idle":"2025-03-21T05:48:58.344324Z","shell.execute_reply.started":"2025-03-21T05:48:58.008565Z","shell.execute_reply":"2025-03-21T05:48:58.343447Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Create an instance of the U-Net model with the specified input shape\nunet_model = Unet((512,512,3))\n# Compile the model with Adam optimizer and binary crossentropy loss\noptimizer = Adam(learning_rate=1e-4) \n    \nunet_model.compile(optimizer=optimizer, \n                   loss=losses.BinaryCrossentropy(from_logits=True), \n                   metrics=['accuracy'])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-21T05:49:12.900564Z","iopub.execute_input":"2025-03-21T05:49:12.901408Z","iopub.status.idle":"2025-03-21T05:49:14.033436Z","shell.execute_reply.started":"2025-03-21T05:49:12.901365Z","shell.execute_reply":"2025-03-21T05:49:14.032775Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"unet_history = unet_model.fit(\n    images_train, masks_train, \n    validation_split = 0.1, batch_size = 2, epochs = 37)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-21T05:49:14.034654Z","iopub.execute_input":"2025-03-21T05:49:14.034881Z","execution_failed":"2025-03-21T05:49:34.082Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"plt.figure(figsize=(20,5))\nplt.subplot(1,2,1)\nloss = unet_history.history['loss']\nval_loss = unet_history.history['val_loss']\nepochs = range(1, len(loss) + 1)\nplt.plot(epochs, loss, 'y', label='Training loss')\nplt.plot(epochs, val_loss, 'r', label='Validation loss')\nplt.title('Training and validation loss')\nplt.xlabel('Epochs')\nplt.ylabel('Loss')\nplt.subplot(1,2,2)\naccuracy = unet_history.history['accuracy']\nval_accuracy = unet_history.history['val_accuracy']\nepochs = range(1, len(accuracy) + 1)\nplt.plot(epochs, accuracy, 'y', label='Training accuracy')\nplt.plot(epochs, val_accuracy, 'r', label='Validation accuracy')\nplt.title('Training and validation accuracy')\nplt.xlabel('Epochs')\nplt.ylabel('Loss')\nplt.legend()\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-20T20:56:55.633251Z","iopub.execute_input":"2025-03-20T20:56:55.633643Z","iopub.status.idle":"2025-03-20T20:56:55.664034Z","shell.execute_reply.started":"2025-03-20T20:56:55.633615Z","shell.execute_reply":"2025-03-20T20:56:55.662539Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def show_result(idx, og, unet, target, p):\n    \n    fig, axs = plt.subplots(1, 3, figsize=(12,12))\n    axs[0].set_title(\"Original \"+str(idx) )\n    axs[0].imshow(og)\n    axs[0].axis('off')\n    \n    axs[1].set_title(\"U-Net: p>\"+str(p))\n    axs[1].imshow(unet,cmap='gray')\n    axs[1].axis('off')\n    \n    axs[2].set_title(\"Ground Truth\")\n    axs[2].imshow(target,cmap='gray')\n    axs[2].axis('off')\n\n    plt.show()\n    \nunet_predict = unet_model.predict(images_test[:20])\n\nr1 = 0.99\n\nunet_predict1 = (unet_predict > r1).astype(np.uint8)\n\nshow_test_idx = random.sample(range(len(unet_predict)), 3)\nfor idx in show_test_idx:\n    show_result(idx, images_test[idx], unet_predict1[idx], masks_test[idx], r1)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-20T20:56:45.687565Z","iopub.status.idle":"2025-03-20T20:56:45.687932Z","shell.execute_reply.started":"2025-03-20T20:56:45.687759Z","shell.execute_reply":"2025-03-20T20:56:45.687774Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"loss,accuracy = unet_model.evaluate(images_test[:20],masks_test[:20])\n\nprint(\"Test Loss:\", loss)\nprint(\"Test Accuracy:\", accuracy)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-20T20:56:45.6899Z","iopub.status.idle":"2025-03-20T20:56:45.690475Z","shell.execute_reply.started":"2025-03-20T20:56:45.690175Z","shell.execute_reply":"2025-03-20T20:56:45.690219Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def show_result(idx, og, unet, p):\n    \n    fig, axs = plt.subplots(1, 2, figsize=(12,12))\n    axs[0].set_title(\"Original \"+str(idx) )\n    axs[0].imshow(og)\n    axs[0].axis('off')\n    \n    axs[1].set_title(\"U-Net: p>\"+str(p))\n    axs[1].imshow(unet,cmap='gray')\n    axs[1].axis('off')\n\n    plt.show()\n    \nunet_predict = unet_model.predict(x_train)\n\nr1 = 0.99\n\n\nunet_predict4 = (unet_predict > r1).astype(np.uint8)\n\nshow_test_idx = random.sample(range(len(unet_predict)), 2)\nfor idx in show_test_idx:\n    show_result(idx, x_train[idx], unet_predict4[idx], y_train[idx])  \n    ","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-20T20:56:45.69216Z","iopub.status.idle":"2025-03-20T20:56:45.692749Z","shell.execute_reply.started":"2025-03-20T20:56:45.692463Z","shell.execute_reply":"2025-03-20T20:56:45.692488Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"images_train_processed = preprocess_images(images_train)\nimages_test_processed = preprocess_images(images_test)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-20T20:56:45.694286Z","iopub.status.idle":"2025-03-20T20:56:45.694632Z","shell.execute_reply.started":"2025-03-20T20:56:45.694471Z","shell.execute_reply":"2025-03-20T20:56:45.694486Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"plt.figure(figsize=(10, 5))\n\nfor i,image in enumerate(images_train_processed[:3]):\n    plt.subplot(1, 3, i+1)\n    plt.title(f\"{images_train_listdir[i]}\")\n    plt.imshow(image,cmap='gray')\n    plt.axis('off')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-20T20:56:45.696443Z","iopub.status.idle":"2025-03-20T20:56:45.696824Z","shell.execute_reply.started":"2025-03-20T20:56:45.696653Z","shell.execute_reply":"2025-03-20T20:56:45.696669Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Create an instance of the U-Net model with the specified input shape\nunet_model2 = Unet((512,512,1))\n# Compile the model with Adam optimizer and binary crossentropy loss\noptimizer = Adam(learning_rate=1e-4) \n    \nunet_model2.compile(optimizer=optimizer, \n                   loss=losses.BinaryCrossentropy(from_logits=True), \n                   metrics=['accuracy'])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-20T20:56:45.698625Z","iopub.status.idle":"2025-03-20T20:56:45.698995Z","shell.execute_reply.started":"2025-03-20T20:56:45.698833Z","shell.execute_reply":"2025-03-20T20:56:45.698848Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import warnings\nwarnings.filterwarnings('ignore')\n\nunet_history = unet_model2.fit(\n    images_train_processed, masks_train, \n    validation_split = 0.1, batch_size = 2, epochs = 50)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-20T06:56:07.84772Z","iopub.execute_input":"2025-03-20T06:56:07.847936Z","iopub.status.idle":"2025-03-20T07:00:44.410356Z","shell.execute_reply.started":"2025-03-20T06:56:07.847918Z","shell.execute_reply":"2025-03-20T07:00:44.409448Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"plt.figure(figsize=(20,5))\nplt.subplot(1,2,1)\nloss = unet_history.history['loss']\nval_loss = unet_history.history['val_loss']\nepochs = range(1, len(loss) + 1)\nplt.plot(epochs, loss, 'y', label='Training loss')\nplt.plot(epochs, val_loss, 'r', label='Validation loss')\nplt.title('Training and validation loss')\nplt.xlabel('Epochs')\nplt.ylabel('Loss')\nplt.legend()\n\nplt.subplot(1,2,2)\naccuracy = unet_history.history['accuracy']\nval_accuracy = unet_history.history['val_accuracy']\nepochs = range(1, len(accuracy) + 1)\nplt.plot(epochs, accuracy, 'y', label='Training accuracy')\nplt.plot(epochs, val_accuracy, 'r', label='Validation accuracy')\nplt.title('Training and validation accuracy')\nplt.xlabel('Epochs')\nplt.ylabel('Loss')\nplt.legend()\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-20T07:00:44.411832Z","iopub.execute_input":"2025-03-20T07:00:44.412069Z","iopub.status.idle":"2025-03-20T07:00:44.755781Z","shell.execute_reply.started":"2025-03-20T07:00:44.412049Z","shell.execute_reply":"2025-03-20T07:00:44.754954Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def show_result(idx, og, unet, target, p):\n    \n    fig, axs = plt.subplots(1, 3, figsize=(12,12))\n    axs[0].set_title(\"Original \"+str(idx) )\n    axs[0].imshow(og,cmap='gray')\n    axs[0].axis('off')\n    \n    axs[1].set_title(\"U-Net: p>\"+str(p))\n    axs[1].imshow(unet,cmap='gray')\n    axs[1].axis('off')\n    \n    axs[2].set_title(\"Ground Truth\")\n    axs[2].imshow(target,cmap='gray')\n    axs[2].axis('off')\n\n    plt.show()\n    \nunet_predict = unet_model2.predict(images_test_processed[:20])\n\nr1 = 0.99\n\nunet_predict1 = (unet_predict > r1).astype(np.uint8)\n\n\nshow_test_idx = random.sample(range(len(unet_predict)), 3)\nfor idx in show_test_idx:\n    show_result(idx, images_test_processed[idx], unet_predict1[idx], masks_test[idx], r1)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-20T07:00:44.757036Z","iopub.execute_input":"2025-03-20T07:00:44.757707Z","iopub.status.idle":"2025-03-20T07:00:48.060502Z","shell.execute_reply.started":"2025-03-20T07:00:44.757674Z","shell.execute_reply":"2025-03-20T07:00:48.059593Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"loss,accuracy = unet_model2.evaluate(images_test_processed[:20],masks_test[:20])\n\nprint(\"Test Loss:\", loss)\nprint(\"Test Accuracy:\", accuracy)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-20T07:00:48.061638Z","iopub.execute_input":"2025-03-20T07:00:48.061918Z","iopub.status.idle":"2025-03-20T07:00:50.153851Z","shell.execute_reply.started":"2025-03-20T07:00:48.061897Z","shell.execute_reply":"2025-03-20T07:00:50.153123Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def show_result(idx, og, unet, p):\n    \n    fig, axs = plt.subplots(1, 2, figsize=(12,12))\n    axs[0].set_title(\"Original \"+str(idx) )\n    axs[0].imshow(og,cmap='gray')\n    axs[0].axis('off')\n    \n    axs[1].set_title(\"U-Net: class \"+str(p))\n    axs[1].imshow(unet,cmap='gray')\n    axs[1].axis('off')\n\n    plt.show()\n    \nunet_predict = unet_model2.predict(preprocess_images(x_train))\n\nr1 = 0.9\n\nunet_predict1 = (unet_predict > r1).astype(np.uint8)\n\n\nshow_test_idx = random.sample(range(len(unet_predict)), 3)\nfor idx in show_test_idx:\n    show_result(idx, preprocess_images(x_train)[idx], unet_predict1[idx], y_train[idx])\n    ","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-20T07:00:50.154931Z","iopub.execute_input":"2025-03-20T07:00:50.155233Z","iopub.status.idle":"2025-03-20T07:00:52.115373Z","shell.execute_reply.started":"2025-03-20T07:00:50.15521Z","shell.execute_reply":"2025-03-20T07:00:52.114512Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"unet_model.save('HardExudates_u-net.h5')\nunet_model2.save('HardExudates_u-net_preprocessed.h5')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-20T07:00:52.116584Z","iopub.execute_input":"2025-03-20T07:00:52.116946Z","iopub.status.idle":"2025-03-20T07:00:53.548376Z","shell.execute_reply.started":"2025-03-20T07:00:52.116917Z","shell.execute_reply":"2025-03-20T07:00:53.547687Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}