{"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\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":{"execution":{"iopub.status.busy":"2024-05-16T08:50:44.712709Z","iopub.execute_input":"2024-05-16T08:50:44.713936Z","iopub.status.idle":"2024-05-16T08:50:44.724760Z","shell.execute_reply.started":"2024-05-16T08:50:44.713900Z","shell.execute_reply":"2024-05-16T08:50:44.723779Z"},"trusted":true},"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":{"execution":{"iopub.status.busy":"2024-05-16T10:25:35.008867Z","iopub.execute_input":"2024-05-16T10:25:35.009225Z","iopub.status.idle":"2024-05-16T10:25:35.022356Z","shell.execute_reply.started":"2024-05-16T10:25:35.009199Z","shell.execute_reply":"2024-05-16T10:25:35.021309Z"},"trusted":true},"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        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":{"execution":{"iopub.status.busy":"2024-05-16T08:50:49.659269Z","iopub.execute_input":"2024-05-16T08:50:49.659735Z","iopub.status.idle":"2024-05-16T08:50:49.668623Z","shell.execute_reply.started":"2024-05-16T08:50:49.659698Z","shell.execute_reply":"2024-05-16T08:50:49.667522Z"},"trusted":true},"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":{"execution":{"iopub.status.busy":"2024-05-16T08:50:49.971683Z","iopub.execute_input":"2024-05-16T08:50:49.972511Z","iopub.status.idle":"2024-05-16T08:50:49.989421Z","shell.execute_reply.started":"2024-05-16T08:50:49.972455Z","shell.execute_reply":"2024-05-16T08:50:49.988386Z"},"trusted":true},"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":{"execution":{"iopub.status.busy":"2024-05-16T09:04:16.855138Z","iopub.execute_input":"2024-05-16T09:04:16.855524Z","iopub.status.idle":"2024-05-16T09:04:19.471854Z","shell.execute_reply.started":"2024-05-16T09:04:16.855475Z","shell.execute_reply":"2024-05-16T09:04:19.470807Z"},"trusted":true},"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":"#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'","metadata":{"execution":{"iopub.status.busy":"2024-05-16T08:50:51.941870Z","iopub.execute_input":"2024-05-16T08:50:51.942246Z","iopub.status.idle":"2024-05-16T08:50:51.947039Z","shell.execute_reply.started":"2024-05-16T08:50:51.942215Z","shell.execute_reply":"2024-05-16T08:50:51.946065Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"images_train,masks_train,images_train_listdir,masks_train_listdir = read_segmentation_training_data(images_train_dir,masks_train_dir)\nimages_test,masks_test,images_test_listdir,masks_test_listdir = read_segmentation_training_data(images_test_dir,masks_test_dir)","metadata":{"execution":{"iopub.status.busy":"2024-05-16T08:50:53.268464Z","iopub.execute_input":"2024-05-16T08:50:53.268845Z","iopub.status.idle":"2024-05-16T08:51:12.103412Z","shell.execute_reply.started":"2024-05-16T08:50:53.268819Z","shell.execute_reply":"2024-05-16T08:51:12.102522Z"},"trusted":true},"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":{"execution":{"iopub.status.busy":"2024-05-15T13:23:44.178664Z","iopub.execute_input":"2024-05-15T13:23:44.179034Z","iopub.status.idle":"2024-05-15T13:23:44.771656Z","shell.execute_reply.started":"2024-05-15T13:23:44.179000Z","shell.execute_reply":"2024-05-15T13:23:44.770733Z"},"trusted":true},"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":{"execution":{"iopub.status.busy":"2024-05-15T13:23:44.772801Z","iopub.execute_input":"2024-05-15T13:23:44.773064Z","iopub.status.idle":"2024-05-15T13:23:45.164903Z","shell.execute_reply.started":"2024-05-15T13:23:44.773041Z","shell.execute_reply":"2024-05-15T13:23:45.164058Z"},"trusted":true},"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":{"execution":{"iopub.status.busy":"2024-05-15T13:07:15.197769Z","iopub.execute_input":"2024-05-15T13:07:15.198642Z","iopub.status.idle":"2024-05-15T13:07:15.582051Z","shell.execute_reply.started":"2024-05-15T13:07:15.198606Z","shell.execute_reply":"2024-05-15T13:07:15.580949Z"},"trusted":true},"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":{"execution":{"iopub.status.busy":"2024-05-15T13:07:15.694272Z","iopub.execute_input":"2024-05-15T13:07:15.694700Z","iopub.status.idle":"2024-05-15T13:11:48.234812Z","shell.execute_reply.started":"2024-05-15T13:07:15.694667Z","shell.execute_reply":"2024-05-15T13:11:48.233897Z"},"collapsed":true,"jupyter":{"outputs_hidden":true},"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.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":{"execution":{"iopub.status.busy":"2024-05-15T13:11:48.237018Z","iopub.execute_input":"2024-05-15T13:11:48.237373Z","iopub.status.idle":"2024-05-15T13:11:48.760574Z","shell.execute_reply.started":"2024-05-15T13:11:48.237343Z","shell.execute_reply":"2024-05-15T13:11:48.759589Z"},"jupyter":{"source_hidden":true},"trusted":true},"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":{"execution":{"iopub.status.busy":"2024-05-15T13:11:48.761910Z","iopub.execute_input":"2024-05-15T13:11:48.762212Z","iopub.status.idle":"2024-05-15T13:11:54.488214Z","shell.execute_reply.started":"2024-05-15T13:11:48.762184Z","shell.execute_reply":"2024-05-15T13:11:54.487265Z"},"jupyter":{"source_hidden":true},"trusted":true},"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":{"execution":{"iopub.status.busy":"2024-05-15T13:11:54.490719Z","iopub.execute_input":"2024-05-15T13:11:54.491400Z","iopub.status.idle":"2024-05-15T13:11:56.183782Z","shell.execute_reply.started":"2024-05-15T13:11:54.491361Z","shell.execute_reply":"2024-05-15T13:11:56.182602Z"},"trusted":true},"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":{"execution":{"iopub.status.busy":"2024-05-15T13:12:15.220532Z","iopub.execute_input":"2024-05-15T13:12:15.221383Z","iopub.status.idle":"2024-05-15T13:12:16.902088Z","shell.execute_reply.started":"2024-05-15T13:12:15.221333Z","shell.execute_reply":"2024-05-15T13:12:16.900945Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"images_train_processed = preprocess_images(images_train)\nimages_test_processed = preprocess_images(images_test)","metadata":{"execution":{"iopub.status.busy":"2024-05-15T13:23:47.595414Z","iopub.execute_input":"2024-05-15T13:23:47.595714Z","iopub.status.idle":"2024-05-15T13:23:48.217255Z","shell.execute_reply.started":"2024-05-15T13:23:47.595689Z","shell.execute_reply":"2024-05-15T13:23:48.216373Z"},"trusted":true},"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":{"execution":{"iopub.status.busy":"2024-05-15T13:23:48.218369Z","iopub.execute_input":"2024-05-15T13:23:48.218655Z","iopub.status.idle":"2024-05-15T13:23:48.671417Z","shell.execute_reply.started":"2024-05-15T13:23:48.218630Z","shell.execute_reply":"2024-05-15T13:23:48.670436Z"},"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=1e-4) \n    \nunet_model2.compile(optimizer=optimizer, \n                   loss=losses.BinaryCrossentropy(from_logits=True), \n                   metrics=['accuracy'])","metadata":{"execution":{"iopub.status.busy":"2024-05-15T13:25:20.881931Z","iopub.execute_input":"2024-05-15T13:25:20.882477Z","iopub.status.idle":"2024-05-15T13:25:21.902071Z","shell.execute_reply.started":"2024-05-15T13:25:20.882442Z","shell.execute_reply":"2024-05-15T13:25:21.901278Z"},"trusted":true},"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=5, restore_best_weights=True)\n\nunet_history = unet_model2.fit(\n    images_train_processed, masks_train, \n    validation_split = 0.1, batch_size = 2, epochs = 50)","metadata":{"execution":{"iopub.status.busy":"2024-05-15T13:25:21.903687Z","iopub.execute_input":"2024-05-15T13:25:21.903975Z","iopub.status.idle":"2024-05-15T13:30:39.602781Z","shell.execute_reply.started":"2024-05-15T13:25:21.903950Z","shell.execute_reply":"2024-05-15T13:30:39.601811Z"},"collapsed":true,"jupyter":{"outputs_hidden":true},"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":{"execution":{"iopub.status.busy":"2024-05-15T13:30:39.605289Z","iopub.execute_input":"2024-05-15T13:30:39.606153Z","iopub.status.idle":"2024-05-15T13:30:40.071208Z","shell.execute_reply.started":"2024-05-15T13:30:39.606111Z","shell.execute_reply":"2024-05-15T13:30:40.070237Z"},"trusted":true},"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)\n\n","metadata":{"execution":{"iopub.status.busy":"2024-05-15T13:32:39.473737Z","iopub.execute_input":"2024-05-15T13:32:39.474116Z","iopub.status.idle":"2024-05-15T13:32:41.673190Z","shell.execute_reply.started":"2024-05-15T13:32:39.474086Z","shell.execute_reply":"2024-05-15T13:32:41.672266Z"},"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":{"execution":{"iopub.status.busy":"2024-05-15T13:32:47.694496Z","iopub.execute_input":"2024-05-15T13:32:47.694836Z","iopub.status.idle":"2024-05-15T13:32:50.167066Z","shell.execute_reply.started":"2024-05-15T13:32:47.694811Z","shell.execute_reply":"2024-05-15T13:32:50.166129Z"},"trusted":true},"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: p>\"+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":{"execution":{"iopub.status.busy":"2024-05-15T13:33:38.471848Z","iopub.execute_input":"2024-05-15T13:33:38.472206Z","iopub.status.idle":"2024-05-15T13:33:40.596635Z","shell.execute_reply.started":"2024-05-15T13:33:38.472179Z","shell.execute_reply":"2024-05-15T13:33:40.595799Z"},"trusted":true},"outputs":[],"execution_count":null},{"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":{"execution":{"iopub.status.busy":"2024-05-16T11:14:20.423705Z","iopub.execute_input":"2024-05-16T11:14:20.424315Z","iopub.status.idle":"2024-05-16T11:14:20.442846Z","shell.execute_reply.started":"2024-05-16T11:14:20.424287Z","shell.execute_reply":"2024-05-16T11:14:20.442059Z"},"trusted":true},"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":{"execution":{"iopub.status.busy":"2024-05-16T11:14:20.755915Z","iopub.execute_input":"2024-05-16T11:14:20.756636Z","iopub.status.idle":"2024-05-16T11:14:33.946407Z","shell.execute_reply.started":"2024-05-16T11:14:20.756607Z","shell.execute_reply":"2024-05-16T11:14:33.945376Z"},"trusted":true},"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":{"execution":{"iopub.status.busy":"2024-05-16T11:14:33.948277Z","iopub.execute_input":"2024-05-16T11:14:33.949126Z","iopub.status.idle":"2024-05-16T11:14:34.453875Z","shell.execute_reply.started":"2024-05-16T11:14:33.949092Z","shell.execute_reply":"2024-05-16T11:14:34.452925Z"},"jupyter":{"source_hidden":true},"trusted":true},"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":{"execution":{"iopub.status.busy":"2024-05-16T10:37:43.284566Z","iopub.execute_input":"2024-05-16T10:37:43.284851Z","iopub.status.idle":"2024-05-16T10:37:43.610273Z","shell.execute_reply.started":"2024-05-16T10:37:43.284828Z","shell.execute_reply":"2024-05-16T10:37:43.609316Z"},"jupyter":{"source_hidden":true},"trusted":true},"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":{"execution":{"iopub.status.busy":"2024-05-16T11:14:57.625850Z","iopub.execute_input":"2024-05-16T11:14:57.626599Z","iopub.status.idle":"2024-05-16T11:14:57.970335Z","shell.execute_reply.started":"2024-05-16T11:14:57.626564Z","shell.execute_reply":"2024-05-16T11:14:57.969389Z"},"trusted":true},"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":{"execution":{"iopub.status.busy":"2024-05-16T11:14:58.105212Z","iopub.execute_input":"2024-05-16T11:14:58.105583Z","iopub.status.idle":"2024-05-16T11:18:37.718159Z","shell.execute_reply.started":"2024-05-16T11:14:58.105553Z","shell.execute_reply":"2024-05-16T11:18:37.717385Z"},"collapsed":true,"jupyter":{"outputs_hidden":true},"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":{"execution":{"iopub.status.busy":"2024-05-16T11:20:03.426091Z","iopub.execute_input":"2024-05-16T11:20:03.426543Z","iopub.status.idle":"2024-05-16T11:20:03.965505Z","shell.execute_reply.started":"2024-05-16T11:20:03.426507Z","shell.execute_reply":"2024-05-16T11:20:03.964558Z"},"jupyter":{"source_hidden":true},"trusted":true},"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":{"execution":{"iopub.status.busy":"2024-05-16T11:20:05.307615Z","iopub.execute_input":"2024-05-16T11:20:05.307992Z","iopub.status.idle":"2024-05-16T11:20:08.392006Z","shell.execute_reply.started":"2024-05-16T11:20:05.307947Z","shell.execute_reply":"2024-05-16T11:20:08.390841Z"},"jupyter":{"source_hidden":true},"trusted":true},"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":{"execution":{"iopub.status.busy":"2024-05-16T11:20:16.734406Z","iopub.execute_input":"2024-05-16T11:20:16.735157Z","iopub.status.idle":"2024-05-16T11:20:19.009765Z","shell.execute_reply.started":"2024-05-16T11:20:16.735123Z","shell.execute_reply":"2024-05-16T11:20:19.008653Z"},"trusted":true},"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":{"execution":{"iopub.status.busy":"2024-05-16T11:20:20.225087Z","iopub.execute_input":"2024-05-16T11:20:20.225825Z","iopub.status.idle":"2024-05-16T11:20:21.641847Z","shell.execute_reply.started":"2024-05-16T11:20:20.225793Z","shell.execute_reply":"2024-05-16T11:20:21.640838Z"},"jupyter":{"source_hidden":true},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"images_train_processed = preprocess_images(images_train)\nimages_test_processed = preprocess_images(images_test)","metadata":{"execution":{"iopub.status.busy":"2024-05-16T10:27:16.113319Z","iopub.execute_input":"2024-05-16T10:27:16.113721Z","iopub.status.idle":"2024-05-16T10:27:16.674318Z","shell.execute_reply.started":"2024-05-16T10:27:16.113689Z","shell.execute_reply":"2024-05-16T10:27:16.673448Z"},"trusted":true},"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":{"execution":{"iopub.status.busy":"2024-05-16T10:27:16.675760Z","iopub.execute_input":"2024-05-16T10:27:16.676046Z","iopub.status.idle":"2024-05-16T10:27:17.055363Z","shell.execute_reply.started":"2024-05-16T10:27:16.676022Z","shell.execute_reply":"2024-05-16T10:27:17.054342Z"},"jupyter":{"source_hidden":true},"trusted":true},"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":{"execution":{"iopub.status.busy":"2024-05-16T10:27:17.056911Z","iopub.execute_input":"2024-05-16T10:27:17.057197Z","iopub.status.idle":"2024-05-16T10:27:17.398528Z","shell.execute_reply.started":"2024-05-16T10:27:17.057172Z","shell.execute_reply":"2024-05-16T10:27:17.397547Z"},"jupyter":{"source_hidden":true},"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=1e-4) \n    \nunet_model2.compile(optimizer=optimizer, \n                   loss=losses.BinaryCrossentropy(from_logits=True), \n                   metrics=['accuracy'])","metadata":{"execution":{"iopub.status.busy":"2024-05-16T10:31:03.315176Z","iopub.execute_input":"2024-05-16T10:31:03.315980Z","iopub.status.idle":"2024-05-16T10:31:03.648519Z","shell.execute_reply.started":"2024-05-16T10:31:03.315948Z","shell.execute_reply":"2024-05-16T10:31:03.647761Z"},"jupyter":{"source_hidden":true},"trusted":true},"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":{"execution":{"iopub.status.busy":"2024-05-16T10:31:03.758786Z","iopub.execute_input":"2024-05-16T10:31:03.759427Z","iopub.status.idle":"2024-05-16T10:34:50.012301Z","shell.execute_reply.started":"2024-05-16T10:31:03.759400Z","shell.execute_reply":"2024-05-16T10:34:50.011289Z"},"jupyter":{"source_hidden":true,"outputs_hidden":true},"collapsed":true,"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":{"execution":{"iopub.status.busy":"2024-05-16T10:35:17.550753Z","iopub.execute_input":"2024-05-16T10:35:17.551717Z","iopub.status.idle":"2024-05-16T10:35:18.084558Z","shell.execute_reply.started":"2024-05-16T10:35:17.551683Z","shell.execute_reply":"2024-05-16T10:35:18.083542Z"},"jupyter":{"source_hidden":true},"trusted":true},"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":{"execution":{"iopub.status.busy":"2024-05-16T10:35:21.985428Z","iopub.execute_input":"2024-05-16T10:35:21.986146Z","iopub.status.idle":"2024-05-16T10:35:24.976748Z","shell.execute_reply.started":"2024-05-16T10:35:21.986114Z","shell.execute_reply":"2024-05-16T10:35:24.975760Z"},"jupyter":{"source_hidden":true},"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":{"execution":{"iopub.status.busy":"2024-05-16T10:35:45.828903Z","iopub.execute_input":"2024-05-16T10:35:45.829264Z","iopub.status.idle":"2024-05-16T10:35:48.061341Z","shell.execute_reply.started":"2024-05-16T10:35:45.829235Z","shell.execute_reply":"2024-05-16T10:35:48.060546Z"},"trusted":true},"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":{"execution":{"iopub.status.busy":"2024-05-16T10:43:51.567181Z","iopub.execute_input":"2024-05-16T10:43:51.567553Z","iopub.status.idle":"2024-05-16T10:43:53.655481Z","shell.execute_reply.started":"2024-05-16T10:43:51.567524Z","shell.execute_reply":"2024-05-16T10:43:53.654561Z"},"jupyter":{"source_hidden":true},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"unet_model.save('Haemorrhages_u-net.h5')\nunet_model2.save('Haemorrhages_u-net_preprocessed.h5')","metadata":{"execution":{"iopub.status.busy":"2024-05-16T10:44:03.620391Z","iopub.execute_input":"2024-05-16T10:44:03.621214Z","iopub.status.idle":"2024-05-16T10:44:05.011514Z","shell.execute_reply.started":"2024-05-16T10:44:03.621184Z","shell.execute_reply":"2024-05-16T10:44:05.010554Z"},"trusted":true},"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":{"execution":{"iopub.status.busy":"2024-05-16T10:52:32.044688Z","iopub.execute_input":"2024-05-16T10:52:32.045610Z","iopub.status.idle":"2024-05-16T10:52:32.088013Z","shell.execute_reply.started":"2024-05-16T10:52:32.045567Z","shell.execute_reply":"2024-05-16T10:52:32.086985Z"},"jupyter":{"source_hidden":true},"trusted":true},"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":{"execution":{"iopub.status.busy":"2024-05-16T10:52:32.672248Z","iopub.execute_input":"2024-05-16T10:52:32.672725Z","iopub.status.idle":"2024-05-16T10:52:48.456442Z","shell.execute_reply.started":"2024-05-16T10:52:32.672693Z","shell.execute_reply":"2024-05-16T10:52:48.455433Z"},"trusted":true},"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":{"execution":{"iopub.status.busy":"2024-05-16T10:54:10.478350Z","iopub.execute_input":"2024-05-16T10:54:10.478766Z","iopub.status.idle":"2024-05-16T10:54:11.050536Z","shell.execute_reply.started":"2024-05-16T10:54:10.478736Z","shell.execute_reply":"2024-05-16T10:54:11.049626Z"},"jupyter":{"source_hidden":true},"trusted":true},"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":{"execution":{"iopub.status.busy":"2024-05-16T10:54:11.131861Z","iopub.execute_input":"2024-05-16T10:54:11.132158Z","iopub.status.idle":"2024-05-16T10:54:11.526226Z","shell.execute_reply.started":"2024-05-16T10:54:11.132135Z","shell.execute_reply":"2024-05-16T10:54:11.525211Z"},"jupyter":{"source_hidden":true},"trusted":true},"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":{"execution":{"iopub.status.busy":"2024-05-16T10:54:32.434031Z","iopub.execute_input":"2024-05-16T10:54:32.434378Z","iopub.status.idle":"2024-05-16T10:54:32.767040Z","shell.execute_reply.started":"2024-05-16T10:54:32.434353Z","shell.execute_reply":"2024-05-16T10:54:32.766210Z"},"trusted":true},"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":{"execution":{"iopub.status.busy":"2024-05-16T10:54:43.939552Z","iopub.execute_input":"2024-05-16T10:54:43.939914Z","iopub.status.idle":"2024-05-16T10:58:25.904006Z","shell.execute_reply.started":"2024-05-16T10:54:43.939884Z","shell.execute_reply":"2024-05-16T10:58:25.903173Z"},"collapsed":true,"jupyter":{"outputs_hidden":true},"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.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":{"execution":{"iopub.status.busy":"2024-05-16T10:58:41.953611Z","iopub.execute_input":"2024-05-16T10:58:41.954001Z","iopub.status.idle":"2024-05-16T10:58:42.543622Z","shell.execute_reply.started":"2024-05-16T10:58:41.953971Z","shell.execute_reply":"2024-05-16T10:58:42.542539Z"},"jupyter":{"source_hidden":true},"trusted":true},"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":{"execution":{"iopub.status.busy":"2024-05-16T10:58:59.205180Z","iopub.execute_input":"2024-05-16T10:58:59.205936Z","iopub.status.idle":"2024-05-16T10:59:02.157525Z","shell.execute_reply.started":"2024-05-16T10:58:59.205903Z","shell.execute_reply":"2024-05-16T10:59:02.156544Z"},"jupyter":{"source_hidden":true},"trusted":true},"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":{"execution":{"iopub.status.busy":"2024-05-16T10:59:18.342614Z","iopub.execute_input":"2024-05-16T10:59:18.342986Z","iopub.status.idle":"2024-05-16T10:59:20.587868Z","shell.execute_reply.started":"2024-05-16T10:59:18.342956Z","shell.execute_reply":"2024-05-16T10:59:20.586913Z"},"trusted":true},"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":{"execution":{"iopub.status.busy":"2024-05-16T10:59:57.197070Z","iopub.execute_input":"2024-05-16T10:59:57.198012Z","iopub.status.idle":"2024-05-16T10:59:58.621874Z","shell.execute_reply.started":"2024-05-16T10:59:57.197970Z","shell.execute_reply":"2024-05-16T10:59:58.620905Z"},"jupyter":{"source_hidden":true},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"images_train_processed = preprocess_images(images_train)\nimages_test_processed = preprocess_images(images_test)","metadata":{"execution":{"iopub.status.busy":"2024-05-16T11:00:09.582500Z","iopub.execute_input":"2024-05-16T11:00:09.583275Z","iopub.status.idle":"2024-05-16T11:00:10.167726Z","shell.execute_reply.started":"2024-05-16T11:00:09.583244Z","shell.execute_reply":"2024-05-16T11:00:10.166851Z"},"trusted":true},"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":{"execution":{"iopub.status.busy":"2024-05-16T11:00:11.755771Z","iopub.execute_input":"2024-05-16T11:00:11.756646Z","iopub.status.idle":"2024-05-16T11:00:12.205413Z","shell.execute_reply.started":"2024-05-16T11:00:11.756616Z","shell.execute_reply":"2024-05-16T11:00:12.204552Z"},"jupyter":{"source_hidden":true},"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=1e-4) \n    \nunet_model2.compile(optimizer=optimizer, \n                   loss=losses.BinaryCrossentropy(from_logits=True), \n                   metrics=['accuracy'])","metadata":{"execution":{"iopub.status.busy":"2024-05-16T11:00:26.422427Z","iopub.execute_input":"2024-05-16T11:00:26.422839Z","iopub.status.idle":"2024-05-16T11:00:26.755666Z","shell.execute_reply.started":"2024-05-16T11:00:26.422809Z","shell.execute_reply":"2024-05-16T11:00:26.754884Z"},"jupyter":{"source_hidden":true},"trusted":true},"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":{"execution":{"iopub.status.busy":"2024-05-16T11:00:43.634361Z","iopub.execute_input":"2024-05-16T11:00:43.635100Z","iopub.status.idle":"2024-05-16T11:05:23.011323Z","shell.execute_reply.started":"2024-05-16T11:00:43.635070Z","shell.execute_reply":"2024-05-16T11:05:23.010521Z"},"jupyter":{"source_hidden":true,"outputs_hidden":true},"collapsed":true,"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":{"execution":{"iopub.status.busy":"2024-05-16T11:08:04.723417Z","iopub.execute_input":"2024-05-16T11:08:04.724151Z","iopub.status.idle":"2024-05-16T11:08:05.254987Z","shell.execute_reply.started":"2024-05-16T11:08:04.724120Z","shell.execute_reply":"2024-05-16T11:08:05.254043Z"},"jupyter":{"source_hidden":true},"trusted":true},"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":{"execution":{"iopub.status.busy":"2024-05-16T11:08:10.821668Z","iopub.execute_input":"2024-05-16T11:08:10.822387Z","iopub.status.idle":"2024-05-16T11:08:13.821589Z","shell.execute_reply.started":"2024-05-16T11:08:10.822352Z","shell.execute_reply":"2024-05-16T11:08:13.820678Z"},"jupyter":{"source_hidden":true},"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":{"execution":{"iopub.status.busy":"2024-05-16T11:08:20.923323Z","iopub.execute_input":"2024-05-16T11:08:20.923959Z","iopub.status.idle":"2024-05-16T11:08:25.157205Z","shell.execute_reply.started":"2024-05-16T11:08:20.923927Z","shell.execute_reply":"2024-05-16T11:08:25.156298Z"},"trusted":true},"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":{"execution":{"iopub.status.busy":"2024-05-16T11:09:21.237290Z","iopub.execute_input":"2024-05-16T11:09:21.237674Z","iopub.status.idle":"2024-05-16T11:09:23.537520Z","shell.execute_reply.started":"2024-05-16T11:09:21.237642Z","shell.execute_reply":"2024-05-16T11:09:23.536621Z"},"jupyter":{"source_hidden":true},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"unet_model.save('HardExudates_u-net.h5')\nunet_model2.save('HardExudates_u-net_preprocessed.h5')","metadata":{"execution":{"iopub.status.busy":"2024-05-16T11:11:38.237239Z","iopub.execute_input":"2024-05-16T11:11:38.237583Z","iopub.status.idle":"2024-05-16T11:11:39.575509Z","shell.execute_reply.started":"2024-05-16T11:11:38.237557Z","shell.execute_reply":"2024-05-16T11:11:39.574713Z"},"trusted":true},"outputs":[],"execution_count":null}]}