{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# Introduction \n\nSemantic segmentation, or image segmentation, is the task of clustering parts of an image together which belong to the same object class. It is a form of pixel-level prediction because each pixel in an image is classified according to a category.\n\nUNet is dedicated to solving this problem. The reason it is able to localise and distinguish borders is by doing classification on every pixel, so the input and output share the same size.\n\n![Illustration-of-the-U-net-architecture-The-figure-illustrates-the-U-net-architecture.png](data:image/png;base64,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)\n\n","metadata":{"id":"qZtEIPrB6uOI"}},{"cell_type":"markdown","source":"# Workflow\nThe models are used here are modified U-Nets. A U-Net consists of an encoder (downsampler) and decoder (upsampler). To learn robust features and reduce the number of trainable parameters,\n\nHere pratrained \n\n\n*   Resnet50\n*   densenet121\n*   Mobilenetv2 \n\nare used as pretrained encoder\n\nLater simple ensemble operation is done on these 3 modified unet models to amplify the results \n\nFeel free to run the code on my collab also, here is the [link](https://colab.research.google.com/drive/1kyYjdAfzA0JcHYyhVvekpmMoDzXUXpho?usp=sharing) \n\n","metadata":{"id":"GkeT898V7Rmi"}},{"cell_type":"markdown","source":"# Imports","metadata":{"id":"F9XaMPYZspdV"}},{"cell_type":"code","source":"!pip install segmentation-models-3D\n!pip install pydicom","metadata":{"id":"aDpZtmCZwQMM","outputId":"dc0b06eb-6ada-40c6-8d3f-90d04d0b8701"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import tensorflow as tf \nimport matplotlib.pyplot as plt\nimport seaborn as sns\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nimport numpy as np \nimport pandas as pd \nimport os\nimport pydicom\nfrom keras.preprocessing import image\nfrom matplotlib.pyplot import imread\nfrom sklearn.model_selection import KFold\nfrom sklearn.utils import shuffle\nfrom sklearn.metrics import confusion_matrix, classification_report , accuracy_score\nfrom sklearn.metrics import precision_score, recall_score, f1_score\nfrom scipy.spatial import distance\nimport segmentation_models_3D as sm\n\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.metrics import roc_curve,roc_auc_score , auc \nfrom keras.utils.np_utils import to_categorical   \nimport cv2\nimport gc\nfrom keras.metrics import MeanIoU\nfrom tensorflow.keras.applications.mobilenet import preprocess_input\nfrom tensorflow.keras.layers import *\nfrom tensorflow.keras.models import Model\nfrom tensorflow.keras.applications import MobileNetV2 , VGG16 , ResNet50\nfrom tensorflow.keras.optimizers import Adam\nfrom tensorflow.keras.callbacks import EarlyStopping\nimport matplotlib.pyplot as plt \nfrom IPython.display import clear_output\nfrom keras.metrics import MeanIoU\nfrom datetime import date\nAUTOTUNE = tf.data.AUTOTUNE","metadata":{"id":"DnBhOMfHslrP","outputId":"ffbefd1b-2732-48a6-c0c2-addeadfd426e"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Data Processing ","metadata":{"id":"IK4cyp45lT88"}},{"cell_type":"code","source":"labels  = pd.read_csv(\"/kaggle/input/rsna-pneumonia-detection-challenge/stage_2_train_labels.csv\")","metadata":{"id":"iMi7BOHlp6m1"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"labels.head(10)","metadata":{"id":"C9jnOFBnqAoN","outputId":"3143f05a-3044-4394-f678-35d32411302d"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"labels.info()","metadata":{"id":"N9oQS5geqDpM","outputId":"574298c9-c264-4850-89b2-5f89de368dd6"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"labels.describe()","metadata":{"id":"mWuq5uUCqMkE","outputId":"0afd500b-923c-4e75-b55e-71e02f495725"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"details = pd.read_csv(\"/kaggle/input/rsna-pneumonia-detection-challenge/stage_2_detailed_class_info.csv\")","metadata":{"id":"ScK-dvsQqPx7"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"details.head(10)","metadata":{"id":"d2UNVgAOqWSW","outputId":"ee287fab-db37-4619-8f3a-b949434f0d2c"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# duplicates in details just have the same class so can be safely dropped\ndetails = details.drop_duplicates('patientId').reset_index(drop=True)\nlabels_w_class = labels.merge(details, how='inner', on='patientId')","metadata":{"id":"NDn8gJWI0ey3"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"labels_w_class.head()","metadata":{"id":"Ma8qOHmUOMW4","outputId":"cdf57913-5a14-40dc-e29c-942146a9bcb5"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"labels_w_class.info()","metadata":{"id":"ZnhxhgRIORhl","outputId":"c49e0af7-33b7-43a2-8829-8e793edaa8b7"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# null values in x, y, width, height indicates that there is no pneumonia. Replacing null with 0\nlabels_w_class.fillna(0, inplace=True)\nlabels_w_class.info()","metadata":{"id":"wzHVF8s9fKlu","outputId":"1bbecabc-a0b3-4475-cbcd-4ee5c6498e66"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"labels_w_class['class'].value_counts()","metadata":{"id":"oWO7mmz2uqCm","outputId":"f649e74e-6e1b-4e36-b4b4-6e0b00ab633a"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"new_df = labels_w_class.head(6000)\nnew_df.head()\n","metadata":{"id":"YZPrT04hOcnp","outputId":"165a197c-319a-4c50-82c2-9dcfd8c8ad32"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df = labels_w_class.copy()\n","metadata":{"id":"vDOXjees8IAh"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class_train, class_val = train_test_split(new_df, test_size=0.20, random_state=42, stratify=new_df['class'])","metadata":{"id":"eBNC9eDt1j3G"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class_train_full, class_val_full = train_test_split(df, test_size=0.20, random_state=42, stratify=df['class'])","metadata":{"id":"0rmNNwIn8PBJ"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Creating Masks","metadata":{"id":"bdCY7SLslj5L"}},{"cell_type":"code","source":"IMAGE_SIZE = 1024\nADJUSTED_IMAGE_SIZE=128\n# MASK_IMAGE_SIZE = 14\n# FACTOR = MASK_IMAGE_SIZE/IMAGE_SIZE\nFACTOR = ADJUSTED_IMAGE_SIZE/IMAGE_SIZE","metadata":{"id":"2DkO3zimOivi"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_feature_tr = []\ny_feature_target_tr = []\ny_feature_coordinates_tr = []\nfrom PIL import Image\ntrain_images_dir = \"/kaggle/input/rsna-pneumonia-detection-challenge/stage_2_train_images\"\ndef create_mask(datafm , n_classes = 2 ):\n    X = []\n    y=[]\n    masks = np.zeros((int(datafm.shape[0]), ADJUSTED_IMAGE_SIZE, ADJUSTED_IMAGE_SIZE)) #MASK_IMAGE_SIZE -> ADJUSTED_IMAGE_SIZE \n    for index, patient_id in enumerate(datafm['patientId'].T.to_dict().values()):\n        image_path = train_images_dir+patient_id+\".dcm\"\n        img = pydicom.dcmread(image_path)\n        img = img.pixel_array\n        img = cv2.resize(img, (ADJUSTED_IMAGE_SIZE, ADJUSTED_IMAGE_SIZE), interpolation=cv2.INTER_NEAREST)\n        img = Image.fromarray(img)\n        img = img.convert('RGB')\n        img = preprocess_input(np.array(img, dtype=np.float32))\n        X.append(img)\n        rows = labels_w_class[labels_w_class['patientId']==patient_id]\n        y.append(rows['Target'].values[0])\n\n        row_data = list(rows.T.to_dict().values())\n        for row in row_data:\n            x1 = int(row['x']*FACTOR)\n            x2 = int((row['x']*FACTOR)+(row['width']*FACTOR))\n            y1 = int(row['y']*FACTOR)\n            y2 = int((row['y']*FACTOR)+(row['height']*FACTOR))\n            masks[index][y1:y2, x1:x2] = 1\n  \n    del img,row,row_data\n    gc.collect()\n    X= np.array(X)\n    y= np.array(y)\n    \n    train_masks_input = np.expand_dims(masks, axis=3)\n    train_masks_cat = to_categorical(train_masks_input, num_classes=n_classes)\n    y_train_cat = train_masks_cat.reshape((train_masks_input.shape[0], train_masks_input.shape[1], train_masks_input.shape[2], n_classes))\n\n    return X, y, y_train_cat, masks","metadata":{"id":"YM9qTnYVOnD5"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_train, y_tr_target, y_train , mask_train = create_mask(class_train)\nX_val, y_val_target, y_val , mask_val  = create_mask(class_val)","metadata":{"id":"n1gLhf1N8x8h"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_train.shape, y_tr_target.shape, y_train.shape, X_val.shape, y_val_target.shape, y_val.shape","metadata":{"id":"wBYzj6G1vqLO","outputId":"80fa62a5-031f-4206-8cb6-8f80cf3d4e78"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train = tf.data.Dataset.from_tensor_slices((X_train, y_train)).batch(16).prefetch(buffer_size=AUTOTUNE)\nval = tf.data.Dataset.from_tensor_slices((X_val, y_val)).batch(32).prefetch(buffer_size=AUTOTUNE)","metadata":{"id":"NcZik7V8vsdF"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# visualization","metadata":{"id":"rWL_HV6Zl0sE"}},{"cell_type":"code","source":"plt.figure(figsize=(10,4))\nfor i in range(1,4):\n    plt.subplot(1,3,i)\n    img = X_train[i]\n    plt.imshow(img, cmap='jet')\n    plt.colorbar()\n    plt.axis('off')\nplt.show() ","metadata":{"id":"SUktvnf-vvNV","outputId":"ab7bbc0e-c52c-45c9-f56e-bcfbbda2dffa"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize=(10,4))\nfor i in range(1,4):\n    plt.subplot(1,3,i)\n    img = mask_train[i]\n    plt.imshow(img, cmap='jet')\n    plt.colorbar()\n    plt.axis('off')\nplt.show() ","metadata":{"id":"zidpebBZvxIW","outputId":"80e93dc1-0bb5-4cdb-c155-9ed1df6daf8a"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Creating Models","metadata":{"id":"fyyuQPnbmBJM"}},{"cell_type":"code","source":"dice_loss = sm.losses.DiceLoss(class_weights=np.array([0.5,0.5])) \nfocal_loss = sm.losses.CategoricalFocalLoss()\ntotal_loss = dice_loss + (1 * focal_loss)\nmetrics = [\"accuracy\",sm.metrics.IOUScore(threshold=0.5), sm.metrics.FScore(threshold=0.5)]\n\ninput_shape = (128,128,3)\n\ndef conv_block(input, num_filters):\n    x = Conv2D(num_filters, 3, padding=\"same\")(input)\n    x = BatchNormalization()(x)\n    x = Activation(\"relu\")(x)\n\n    x = Conv2D(num_filters, 3, padding=\"same\")(x)\n    x = BatchNormalization()(x)\n    x = Activation(\"relu\")(x)\n\n    return x\n\ndef decoder_block(input, skip_features, num_filters):\n    x = Conv2DTranspose(num_filters, (2, 2), strides=2, padding=\"same\")(input)\n    x = Concatenate()([x, skip_features])\n    x = conv_block(x, num_filters)\n    return x\n\ndef build_resnet50_unet(input_shape = input_shape , n = 2 ,  lr = 0.0001 , loss = total_loss , metrics = metrics ):\n    \"\"\" Input \"\"\"\n    inputs = Input(input_shape)\n\n    \"\"\" Pre-trained ResNet50 Model \"\"\"\n    resnet50 = tf.keras.applications.ResNet50(include_top=False, weights=\"imagenet\", input_tensor=inputs)\n    \n    resnet50.layers[0]._name  = \"input_1\"\n    \n    resnet50._name = \"Resnet50\"\n\n    \"\"\" Encoder \"\"\"\n    s1 = resnet50.get_layer(\"input_1\").output           \n    s2 = resnet50.get_layer(\"conv1_relu\").output        \n    s3 = resnet50.get_layer(\"conv2_block3_out\").output  \n    s4 = resnet50.get_layer(\"conv3_block4_out\").output  \n\n    \"\"\" Bridge \"\"\"\n    b1 = resnet50.get_layer(\"conv4_block6_out\").output  \n\n    \"\"\" Decoder \"\"\"\n    d1 = decoder_block(b1, s4, 512)                    \n    d2 = decoder_block(d1, s3, 256)                    \n    d3 = decoder_block(d2, s2, 128)                   \n    d4 = decoder_block(d3, s1, 64)                      \n\n    \"\"\" Output \"\"\"\n    outputs = Conv2D(n, 1, padding=\"same\", activation=\"softmax\")(d4)\n\n    model = Model(inputs, outputs, name=\"ResNet50_U-Net\")\n    model.compile(optimizer = tf.keras.optimizers.Adam(learning_rate=lr) ,loss = total_loss , metrics = metrics) \n    return model\n\n\n\ndef build_densenet121_unet(input_shape = input_shape, n = 2 , lr = 0.0001 , loss = total_loss , metrics = metrics ):\n    \"\"\" Input \"\"\"\n    inputs = Input(input_shape)\n\n    \"\"\" Pre-trained DenseNet121 Model \"\"\"\n    densenet =  tf.keras.applications.DenseNet121(include_top=False, weights=\"imagenet\", input_tensor=inputs)\n\n    densenet.layers[0]._name  = \"input_1\"\n    \n    densenet._name = \"Densenet121\"\n    \n    \"\"\" Encoder \"\"\"\n    s1 = densenet.get_layer(\"input_1\").output       \n    s2 = densenet.get_layer(\"conv1/relu\").output   \n    s3 = densenet.get_layer(\"pool2_relu\").output \n    s4 = densenet.get_layer(\"pool3_relu\").output  \n\n    \"\"\" Bridge \"\"\"\n    b1 = densenet.get_layer(\"pool4_relu\").output  \n\n    \"\"\" Decoder \"\"\"\n    d1 = decoder_block(b1, s4, 512)          \n    d2 = decoder_block(d1, s3, 256)             \n    d3 = decoder_block(d2, s2, 128)            \n    d4 = decoder_block(d3, s1, 64)            \n\n    \"\"\" Outputs \"\"\"\n    outputs = Conv2D(n, 1, padding=\"same\", activation=\"softmax\")(d4)\n\n    model = Model(inputs, outputs)\n    model.compile(optimizer = tf.keras.optimizers.Adam(learning_rate=lr) ,loss = total_loss , metrics = metrics) \n    return model\n\n\ndef build_mobilenetv2_unet(input_shape = input_shape, n = 2 ,  lr = 0.0001 , loss = total_loss , metrics = metrics):   \n    \"\"\" Input \"\"\"\n    inputs = Input(shape=input_shape)\n\n    \"\"\" Pre-trained MobileNetV2 \"\"\"\n    encoder = tf.keras.applications.MobileNetV2(include_top=False, weights=\"imagenet\",\n        input_tensor=inputs)\n\n    encoder.layers[0]._name  = \"input_1\"\n    \n    encoder._name = \"Mobilenetv2\"\n    \n    \"\"\" Encoder \"\"\"\n    s1 = encoder.get_layer(\"input_1\").output               \n    s2 = encoder.get_layer(\"block_1_expand_relu\").output    \n    s3 = encoder.get_layer(\"block_3_expand_relu\").output   \n    s4 = encoder.get_layer(\"block_6_expand_relu\").output   \n\n    \"\"\" Bridge \"\"\"\n    b1 = encoder.get_layer(\"block_13_expand_relu\").output  \n\n    \"\"\" Decoder \"\"\"\n    d1 = decoder_block(b1, s4, 512)                        \n    d2 = decoder_block(d1, s3, 256)                        \n    d3 = decoder_block(d2, s2, 128)                     \n    d4 = decoder_block(d3, s1, 64)                         \n\n    \"\"\" Output \"\"\"\n    outputs = Conv2D(n, 1, padding=\"same\", activation=\"softmax\")(d4)\n\n    model = Model(inputs, outputs, name=\"MobileNetV2_U-Net\")\n    model.compile(optimizer = tf.keras.optimizers.Adam(learning_rate=lr) ,loss = total_loss , metrics = metrics)  \n    return model\n\n\n\n\nmodel1 = build_resnet50_unet()\nmodel1.summary()\n\nprint()\nprint()\nprint()\nprint()\n\n\nmodel2 = build_densenet121_unet()\nmodel2.summary()\n\nprint()\nprint()\nprint()\nprint()\n\nmodel3 = build_mobilenetv2_unet()\nmodel3.summary()","metadata":{"id":"SjnsXGwqvx4l","outputId":"6efa4bbe-0987-4d14-fa15-7b69b4049291"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Training of the models ⚡","metadata":{"id":"CkqVUvbOmFN6"}},{"cell_type":"markdown","source":"# Using Resnet50 as The encoder","metadata":{"id":"-zegndZn-JKs"}},{"cell_type":"code","source":"h1 = model1.fit(train, validation_data = val, \n      epochs=15)","metadata":{"id":"8mHhjr1hv9gN","outputId":"d687c288-3c12-4b8c-c8a1-79f5ca145bb7"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Using Densenet121 as The encoder","metadata":{"id":"JlikO-jR-XbC"}},{"cell_type":"code","source":"h2 = model2.fit(train, validation_data = val, \n      epochs=15)","metadata":{"id":"qm9iJLKwwAol","outputId":"adb6b96e-b07b-49bc-db36-112dbe5c2135"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Using Mobilenetv2 as The encoder","metadata":{"id":"OyxLMbuP-bsi"}},{"cell_type":"code","source":"h3 = model3.fit(train, validation_data = val, \n      epochs=15)","metadata":{"id":"ORQ1UPRicQsJ","outputId":"4a92f598-4d2c-40f9-85aa-88c917ef2919"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Evaluation ","metadata":{"id":"dehBHh3mmMe0"}},{"cell_type":"code","source":"def plot(r):\n\n    plt.figure(figsize=(12, 16))\n\n    plt.subplot(4, 2, 1)\n    plt.plot(r.history['loss'], label='Loss')\n    plt.plot(r.history['val_loss'], label='val_Loss')\n    plt.title('Loss Function Evolution')\n    plt.legend()\n\n    plt.subplot(4, 2, 2)\n    plt.plot(r.history['accuracy'], label='accuracy')\n    plt.plot(r.history['val_accuracy'], label='val_accuracy')\n    plt.title('Accuracy Function Evolution')\n    plt.legend()\n\n    plt.subplot(4, 2, 3)\n    plt.plot(r.history['iou_score'], label='iou_score')\n    plt.plot(r.history['val_iou_score'], label='val_iou_score')\n    plt.title('Iou score Evolution')\n    plt.legend()\n\n    plt.subplot(4, 2, 4)\n    plt.plot(r.history['f1-score'], label='f1-score')\n    plt.plot(r.history['val_f1-score'], label='val_f1-score')\n    plt.title('f1-score Evolution')\n    plt.legend()","metadata":{"id":"DgMlryHNccJa"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Resnet50 Encoder  Metrics","metadata":{"id":"Wh8nk3HV-8YZ"}},{"cell_type":"code","source":"plot(h1)","metadata":{"id":"zr5UKr4Eceqy","outputId":"71bdb9a5-74a3-4b4a-d77f-cedccbd30db3"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Densenet121 Encoder  Metrics","metadata":{"id":"NnV7qRdM_N2A"}},{"cell_type":"code","source":"plot(h2)","metadata":{"id":"fUUtEWEacgpK","outputId":"815a5110-3cf1-4093-b136-04c92bf997cb"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Mobilenetv2 Encoder  Metrics","metadata":{"id":"bJeabAl5_UHA"}},{"cell_type":"code","source":"plot(h3)","metadata":{"id":"kYSq2frBcmuZ","outputId":"e86ae4aa-ec6b-4ed6-e125-02b0423ecfa7"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\ndef create_mask1(pred_mask):\n  pred_mask = tf.argmax(pred_mask, axis=-1)\n  pred_mask = pred_mask[..., tf.newaxis]\n  return pred_mask[0]\n\n\ndef show_predictions(X,y, model ):\n\n    pred_mask = model.predict(X)\n    \n    display([X, y, create_mask1(pred_mask)])\n\n\n\ndef display(display_list):\n  plt.figure(figsize=(15, 15))\n\n  title = ['Input Image', 'True Mask', 'Predicted Mask']\n\n  for i in range(len(display_list)):\n  \n    plt.subplot(1, len(display_list), i+1)\n    plt.title(title[i])\n    if(i == 0):\n      plt.imshow(tf.keras.utils.array_to_img(display_list[i][0]))\n    else:  \n      plt.imshow(tf.keras.utils.array_to_img(display_list[i]))\n    plt.axis('off')\n  plt.show()\n","metadata":{"id":"C8x0PQgHco3D"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Visualization Resnet50 Encoder ","metadata":{"id":"6P35y_eX_Zvq"}},{"cell_type":"code","source":"for i in range(0,10):\n    show_predictions(X_val[i:i+1] , mask_val[i].reshape(128,128,1),model1)","metadata":{"id":"iNnjgdBZcrhi","outputId":"d0cf39e2-219f-4122-c0ea-ff026ab775df"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Visualization Densenet121 Encoder ","metadata":{"id":"m5t5wM1v_hz0"}},{"cell_type":"code","source":"for i in range(0,10):\n    show_predictions(X_val[i:i+1] , mask_val[i].reshape(128,128,1),model2)","metadata":{"id":"_ZE0ehx9ctxB","outputId":"6ec0a85f-0e7f-40c6-b727-84d9a6f8618f"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Visualization Mobilenetv2 Encoder ","metadata":{"id":"-76VAKnK_i7c"}},{"cell_type":"code","source":"for i in range(0,10):\n    show_predictions(X_val[i:i+1] , mask_val[i].reshape(128,128,1),model2)","metadata":{"id":"3Gt2fj4Lcv5h","outputId":"ba7e6a62-af3b-4971-9e12-f39ca7a353b0"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Mean Iou Scores","metadata":{"id":"n4fSLnXs_wGp"}},{"cell_type":"code","source":"\ndef pred(X,y,model,num):\n  #returns the y preds and y accutual \n\n  y_acc = []\n  y_pred = []\n  for i in range(0,num):\n    y_acc.append(y[i].reshape(128,128,1))\n    y_pred.append(create_mask1(model.predict(X[i:i+1] , verbose = 0 )) )\n\n  y_acc = np.array(y_acc)  \n  y_pred = np.array(y_pred)\n\n  return (y_acc,y_pred)\n\n\ndef mean_iou_score(model,X_val,y_val,n_classes = 2 ):\n  y_acc , y_pred = pred(X_val,y_val,model , len(y_val))\n  IOU_ref = MeanIoU(num_classes=n_classes)\n  IOU_ref.update_state(y_acc , y_pred)\n\n  print(\"Mean iou score \", IOU_ref.result().numpy())\n\n  \n\n\n\n","metadata":{"id":"Xy-BsXlkcyMi"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Mean IOU Score on Resnet50","metadata":{"id":"FXjBtTFsA9eC"}},{"cell_type":"code","source":"\nmean_iou_score(model1,X_val,mask_val)","metadata":{"id":"4RgOBjoLc0Uy","outputId":"7659cceb-ecef-429b-f74d-030d14c24759"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Mean IOU Score on Densenet121","metadata":{"id":"n0yhkB1-BC8K"}},{"cell_type":"code","source":"mean_iou_score(model2,X_val,mask_val)","metadata":{"id":"xlU9SjwLc2Mq","outputId":"3f7dd37f-75ae-47d2-9646-9716a4dde14c"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Mean IOU Score on Mobilenetv2","metadata":{"id":"fCTnuLgxBGdd"}},{"cell_type":"code","source":"mean_iou_score(model3,X_val,mask_val)","metadata":{"id":"GSRu1DTVc4Wb","outputId":"25a62abe-3b46-49a2-8fd4-c540251f95b2"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Ensemble \n\n![ensemble-kaggle.jpg](data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAIcA8ADASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3+iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACvB/CfhO18T2N/qWpajqzXB1G4TMd86jAc44zXvFeS/DL/kXL3/sKXX/AKMNAB/wrLRv+f8A1r/wYyf40f8ACstG/wCf/Wv/AAYyf412lFAHF/8ACstG/wCf/Wv/AAYyf40f8Ky0b/n/ANa/8GMn+NdpRQBxf/CstG/5/wDWv/BjJ/jR/wAKy0b/AJ/9a/8ABjJ/jXaUUAcX/wAKy0b/AJ/9a/8ABjJ/jR/wrLRv+f8A1r/wYyf412lFAHF/8Ky0b/n/ANa/8GMn+NH/AArLRv8An/1r/wAGMn+NdpRQBxf/AArLRv8An/1r/wAGMn+NH/CstG/5/wDWv/BjJ/jXaUUAcX/wrLRv+f8A1r/wYyf40f8ACstG/wCf/Wv/AAYyf412lFAHF/8ACstG/wCf/Wv/AAYyf40f8Ky0b/n/ANa/8GMn+NdpRQBxf/CstG/5/wDWv/BjJ/jR/wAKy0b/AJ/9a/8ABjJ/jXaUUAcX/wAKy0b/AJ/9a/8ABjJ/jR/wrLRv+f8A1r/wYyf412lFAHF/8Ky0b/n/ANa/8GMn+NVtR+HGk22mXc8d/rO+KF3XOoSdQpI713tUtZ/5Aeof9e0n/oJoAn+GU81z8NdAmnleWVrVdzuxZjyepNdZXH/Cv/kl/h7/AK9B/M12FABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFF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KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACvJfhl/yLl7/ANhS6/8ARhr1qvEvDs/ijwta3unP4J1W7zfTzLNCybWVnJGOaAPR6K5D/hKvEv8A0T7Wv++4/wDGj/hKvEv/AET7Wv8AvuP/ABoA6+iuQ/4SrxL/ANE+1r/vuP8Axo/4SrxL/wBE+1r/AL7j/wAaAOvorkP+Eq8S/wDRPta/77j/AMaP+Eq8S/8ARPta/wC+4/8AGgDr6K5D/hKvEv8A0T7Wv++4/wDGj/hKvEv/AET7Wv8AvuP/ABoA6+iuQ/4SrxL/ANE+1r/vuP8Axo/4SrxL/wBE+1r/AL7j/wAaAOvorjT4w8QrMsJ8BawJXUsqGSPJAxkgZ6DI/MU//hKvEv8A0T7Wv++4/wDGgDr6K5D/AISrxL/0T7Wv++4/8aP+Eq8S/wDRPta/77j/AMaAOvorkP8AhKvEv/RPta/77j/xo/4SrxL/ANE+1r/vuP8AxoA6+iuQ/wCEq8S/9E+1r/vuP/Gj/hKvEv8A0T7Wv++4/wDGgDr6K5D/AISrxL/0T7Wv++4/8aP+Eq8S/wDRPta/77j/AMaAOvqlrP8AyA9Q/wCvaT/0E1zv/CVeJf8Aon2tf99x/wCNV77xF4mu9PubZfAGsqZomjBLpxkEetAHW/Cv/kl/h7/r0H8zXYVzPw80670n4f6JYX8DQXUNsFkibGVOScGumoAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigDldW0u6uvH2j3cN/wCSsNrK/lGLcCFdAw6j7wkH029+3VVlXH/I16f/ANeN1/6HBWrQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAGVcf8jXp//Xjdf+hwVq1lXH/I16f/ANeN1/6HBWrQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAGVcf8jXp//Xjdf+hwVq1lXH/I16f/ANeN1/6HBWrQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAGVcf8jXp//Xjdf+hwVq1lXH/I16f/ANeN1/6HBWrQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAGVcf8jXp//Xjdf+hwVq1lXH/I16f/ANeN1/6HBWrQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABXJz/ABN8FW1xJBN4ksVliYo67ycEHBHSusrxHwBp9lc6LfST2dvK/wDaVyNzxBj989yKicuVXJlLlVzvv+FqeBv+hmsf++j/AIUf8LU8Df8AQzWP/fR/wrM/sjTP+gdaf9+F/wAKP7I0z/oHWn/fhf8ACsvb+RHtfI0/+FqeBv8AoZrH/vo/4Uf8LU8Df9DNY/8AfR/wrM/sjTP+gdaf9+F/wo/sjTP+gdaf9+F/wo9v5B7XyNP/AIWp4G/6Gax/76P+FH/C1PA3/QzWP/fR/wAKzP7I0z/oHWn/AH4X/Cj+yNM/6B1p/wB+F/wo9v5B7XyNP/hangb/AKGax/76P+FH/C1PA3/QzWP/AH0f8KzP7I0z/oHWn/fhf8KP7I0z/oHWn/fhf8KPb+Qe18jT/wCFqeBv+hmsf++j/hR/wtTwN/0M1j/30f8ACsz+yNM/6B1p/wB+F/wo/sjTP+gdaf8Afhf8KPb+Qe18iSb4l+DH8QWd0viKyMEdrPG77jgMzwlR07hG/Kr/APwtTwN/0M1j/wB9H/Csz+yNM/6B1p/34X/Cj+yNM/6B1p/34X/Cj2/kHtfI0/8Ahangb/oZrH/vo/4Uf8LU8Df9DNY/99H/AArM/sjTP+gdaf8Afhf8KP7I0z/oHWn/AH4X/Cj2/kHtfI0/+FqeBv8AoZrH/vo/4Uf8LU8Df9DNY/8AfR/wrM/sjTP+gdaf9+F/wo/sjTP+gdaf9+F/wo9v5B7XyNP/AIWp4G/6Gax/76P+FH/C1PA3/QzWP/fR/wAKzP7I0z/oHWn/AH4X/Cj+yNM/6B1p/wB+F/wo9v5B7XyNP/hangb/AKGax/76P+FH/C1PA3/QzWP/AH0f8KzP7I0z/oHWn/fhf8KP7I0z/oHWn/fhf8KPb+Qe18jT/wCFqeBv+hmsf++j/hR/wtTwN/0M1j/30f8ACsz+yNM/6B1p/wB+F/wqnq2k6aujXzLp9qCLeQgiFePlPtT9v5B7XyPR7G+tdTsYb2ynSe1nUPHKhyrA9xViuP8AhX/yS/w9/wBeg/ma7CtzUKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigArxr4df8AIBvv+wndf+jDXsteNfDr/kA33/YTuv8A0YayrfCZ1fhOuoorgPjBeXVj4MiltLma3kN4i74nKHG1uMiuWKu7GCV3Y7+ivMrb4ZX89rDMfGmsgyIrY3txkZ/vVp6P8PLvStXtr6TxXql2sL7jBKxKv7H5qpxj3HZdzuqKia6t0uRbtPEs5XeIi4DFfXHXHBqpb69o93dfZbbVrGa4zjyo7lGf8gc1FhGhRSEhQSSABySe1ZsXiLQ57kW0Os6dJOTgRJdIWz6YBzRYDToorPute0ayuPs93q1hbz/885blEb8ic0AaFFIrK6B0YMrDIIOQRVV9U06KCWeS/tUhibbJI0yhUPoTng0AW6Kq2Wp2GpRNLY31tdRqcM8EquB9SDUVrrmkXt0bW01SynuB1iiuEdx+AOadmFi/RXnvxQvbq0m8Ni2uZoRJqCq/lSFdw44OOors313SEvfsT6rYrd5x5BuED59Nuc0+XS47aXL9FY/iyWSHwfrUsTtHIljMyupwVIQ4IPY1mfDa4nu/h9pU9zNJNKyybpJGLMf3jDkmlbS4raXOrorPu9d0ewuPIvNVsbeb/nnNcIjfkTmryOkiK8bKyMMqynII9qQDqp6v/wAgW/8A+veT/wBBNXKp6v8A8gW//wCveT/0E01uBp/Cv/kl/h7/AK9B/M12Fcf8K/8Akl/h7/r0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UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAH//Z)","metadata":{"id":"De-9BIIZmVDk"}},{"cell_type":"markdown","source":"As the image shows the outputs of the three models are combined to increse the mean-iou score, as the network output the probabilities of each class of every pixel, the method will add those probabilities by a weighted sum manner, and later took that class which contains the higest probality  ","metadata":{"id":"AkvRz-2tD6vm"}},{"cell_type":"code","source":"def ensemble(model1,model2,model3,X_test,y_test,n_classes = 2):\n\n\n  pred1 = model1.predict(X_test , verbose = 0 )\n  pred2 = model2.predict(X_test , verbose = 0 )\n  pred3 = model3.predict(X_test , verbose = 0 )\n\n  preds=np.array([pred1, pred2, pred3])\n\n  \n\n  weights = [0.4, 0.3, 0.3]\n\n  weighted_preds = np.tensordot(preds, weights, axes=((0),(0)))\n  weighted_ensemble_prediction = np.argmax(weighted_preds, axis=3)\n\n  \n  \n  print()\n  print(\"________________________________________________________________\")\n  print(\"weighted ensemble \" )\n  IOU_weighted = MeanIoU(num_classes=n_classes)  \n  y_actual = np.expand_dims(mask_val, axis=3)\n  IOU_weighted.update_state(y_actual, weighted_ensemble_prediction)\n  print('IOU Score for weighted average ensemble = ', IOU_weighted.result().numpy())\n\n  print(\"________________________________________________________________\")\n  print()\n\n  for i in range(0,10):\n    display([X_test[i:i+1] , mask_val[i].reshape(128,128,1) ,  weighted_ensemble_prediction[i].reshape(128,128,1)])  ","metadata":{"id":"JFpMx-uyc7Qk"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"ensemble(model1,model2,model3,X_val,mask_val)","metadata":{"id":"nkIaKA_Ic-Fy","outputId":"b241cce9-feb2-435b-9cde-8690657622ec"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Conclusion \n\nIt is seen that the Mean Iou score after ensemble Increases, previously  highest Mean IoU score was **0.838** ,now it has become **0.850**\n\nIf the readers of this notebook find this notebook usefull, please give it a upvote. Thank you for your time. ","metadata":{"id":"lJaLW7IIBLqx"}},{"cell_type":"markdown","source":"# References  \n\nhttps://github.com/bnsreenu/python_for_microscopists/blob/master/214_multiclass_Unet_sandstone_segm_models_ensemble.py\n\nhttps://github.com/nikhilroxtomar/Semantic-Segmentation-Architecture/tree/main/TensorFlow\n","metadata":{"id":"GTCQtQ1ACNAG"}}]}