{"cells":[{"metadata":{},"cell_type":"markdown","source":"# Overview\n******\nPneumonia is an infection in one or both lungs. The infection causes inflammation in the air sacs in your lungs, which are called **alveoli**. The alveoli fill with fluid or pus, making it difficult to breathe.\n\n![Pneumonia Inflammation](https://www.physio-pedia.com/images/9/94/Pneumonia_Inflammation.jpg)","execution_count":null},{"metadata":{},"cell_type":"markdown","source":"\nDoctors or radiologiests conduct a physical exam and use **CXR**(chest x-ray) to examin and detect pneumonia. In CXR it shows opacity in the reagion.\n\n![Pneumonia CXRs](https://ars.els-cdn.com/content/image/1-s2.0-S0092867418301545-figs6_lrg.jpg)\n\n\n* There are multiple causes of opacity n CXR other than pneumonia like;\n    * fluid overload (pulmonary edema)\n    * bleeding\n    * volume loss (atelectasis or collapse)\n    * lung cancer\n    * post-radiation or surgical changes\n    * Outside of the lungs, fluid in the pleural space (pleural effusion) \n\nA number of factors such as positioning of the patient and depth of inspiration can alter the appearance of the CXR.\n\n\n\nPneumonia opacity can occour in different reagions of chest and the opacity can be of different kinds. This makes it the problem of detection(regression) as well as recognition(classification). For such purpose we can think of using the pre-existing models like 'Faster R-CNN' or 'Yolo'.\n\n![Types and Regions](http://adigaskell.org/wp-content/uploads/2017/11/pneumonia-xray.jpg)\n\n","execution_count":null},{"metadata":{},"cell_type":"markdown","source":"### Importing all the python Libraries","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport os\nimport sys\nimport math\nimport cv2\nimport seaborn as sns\nimport tensorflow as tf\n\n# To calculate accuracy measures and confusion matrix\nfrom sklearn import metrics\n# To get Recall and precision values\nfrom sklearn.metrics import classification_report\n\n# !pip install -q pydicom\n# After installing pydicom. This is needed to load .dcm files\nimport pydicom\nimport pydicom as dcm\nfrom pydicom import dcmread\n\nfrom matplotlib import pyplot\nimport matplotlib.patches as patches\n\nfrom skimage import measure\nfrom skimage.transform import resize\n\nimport tensorflow.keras.utils as pltUtil\nfrom tensorflow.keras.utils import Sequence\n\nfrom tensorflow.keras.layers import Layer\nfrom tensorflow.keras.layers import Concatenate, UpSampling2D, Conv2D, Reshape, BatchNormalization, Activation\nfrom tensorflow.keras.models import Model\n\nfrom tensorflow.keras.applications.mobilenet import MobileNet\nfrom tensorflow.keras.applications.mobilenet import preprocess_input \n\nfrom tensorflow.keras.optimizers import Adam\nfrom tensorflow.keras.callbacks import ModelCheckpoint, EarlyStopping, ReduceLROnPlateau\n\nfrom tensorflow.keras.applications.resnet import ResNet50\nfrom tensorflow.keras.applications.resnet import preprocess_input as resnetProcess_input\n","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"#### Setting up project path","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"# Load train set image metadata\ndataDirPath = '../input/rsna-pneumonia-detection-challenge/'\n\nTrain_Image_path = dataDirPath + 'stage_2_train_images'\n\nSAVED_FILES_ROOT = '../input/reportfiles/'\nRES_FILES_ROOT = '../input/resreportfiles/'","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### Function definations","execution_count":null},{"metadata":{},"cell_type":"markdown","source":"#### Function to load the metadata from images","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"class ImageMetadata():\n    \"\"\"Structure to hold image metadata\n\n    Arguments:\n        setName -- name of the data set\n\n        file -- file name\n    \"\"\"\n    \n    def __init__(self, setName, file):\n        # print(name, file)\n        # dataset name(train or test)\n        self.setName = setName\n        # image file name\n        self.file = file\n\n    def __repr__(self):\n        return self.imagePath()\n\n    def imagePath(self):\n        return os.path.join(self.setName, self.file) \n    \n\n# function to load image metadada   \ndef loadImageMetadata(dataSetName):\n    \"\"\"Load image file names from the images from dataset\n\n    Arguments:\n        dataSetName -- path of the data set folder\n    \"\"\"\n    imageMetadata = []\n    for f in os.listdir(dataSetName):\n        # Check file extension. Allow only .dcm files.\n        ext = os.path.splitext(f)[1]\n        if ext == '.dcm' :\n            imageMetadata.append(ImageMetadata(dataSetName, f))\n            \n    # Return an array of filenames\n    return np.array(imageMetadata)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"#### Functions to load image and patientId(file name) from the given path","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"def loadImage(path):\n    \"\"\"Load image from the path \n\n    Arguments:\n        path -- path of the image\n    \"\"\"\n    img = pydicom.dcmread(path)\n    \n    # Return image\n    return img\n\n\ndef getImgId(imgPath) :\n    \"\"\"Get image name which is patientId from the given image path \n\n    Arguments:\n        imgPath -- path of the image\n    \"\"\"\n    \n    # Return patientId \n    return str(imgPath).split(\".dcm\")[0].split(\"/\")[4]","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"#### Getting Metadata Information","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"trainSetImageMetadata = loadImageMetadata(Train_Image_path)\n\nprint(\"trainSetImageMetadata.shape : \", trainSetImageMetadata.shape)\n\nprint(\"Sample image path : \", trainSetImageMetadata[0])","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"#### Insights from Metadata\n\nThere are 26684 images in the Training data\nThese are DICOM Images which has pixel information as well as several tags added to it like patientid, age,gender etc.","execution_count":null},{"metadata":{},"cell_type":"markdown","source":"#### Loaging a sample Image","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"# with given index\nimgIndex = 4\nimgPath = trainSetImageMetadata[imgIndex]\nimgPath = imgPath.imagePath()\nimgData = loadImage(imgPath)\n\npyplot.imshow(imgData.pixel_array, cmap=pyplot.cm.bone)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"#### Preparing Dataset with patient id and respective image paths","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"trainSetImageMetadata_df = pd.DataFrame(trainSetImageMetadata, columns=[\"Path\"])\ntrainSetImageMetadata_df.head(2)\n\nimageIdPaths = pd.DataFrame(columns=[\"patientId\", \"imgPath\"])\nimageIdPaths[\"patientId\"] = trainSetImageMetadata_df[\"Path\"].apply(getImgId)\nimageIdPaths[\"imgPath\"] = trainSetImageMetadata_df[\"Path\"]\n\nprint(\"imageIdPaths\", imageIdPaths.shape)\nimageIdPaths.head(2)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Exploratory Data Analysis on Train Labels and Detail Info CSV data sets","execution_count":null},{"metadata":{},"cell_type":"markdown","source":"**Analyzing Detailed Classes CSV file**","execution_count":null},{"metadata":{},"cell_type":"markdown","source":"Step 1 -> Define and read the Detail_Info CSV File ","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"classesPath =  dataDirPath + 'stage_2_detailed_class_info.csv'\n\ndetailedClasses = pd.read_csv(classesPath)\n\ndetailedClasses.head(2)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Step 2 -> Check for Missing Values\n","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"detailedClasses.isna().apply(pd.value_counts)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"No Missing Values found","execution_count":null},{"metadata":{},"cell_type":"markdown","source":"Step 3 -> Checking the shape of data frame","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"print(\"detailedClasses.shape : \", detailedClasses.shape)\n\n# File has 30227 rows and 2 columns - PatientID & Class","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Step 3 -> Checking Unique Patients","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"print(\"Unique patientIds : \", detailedClasses['patientId'].nunique())","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Total number of unique patients in data - 26684\n\n**Observation - As we have total 30227 records and out of that 26684 are unique records, this shows presence of multiple records for some patients**","execution_count":null},{"metadata":{},"cell_type":"markdown","source":"Step 4 -> Checking unique Classes","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"print(\"Unique patientIds : \", detailedClasses['class'].nunique(), )\n\nprint(detailedClasses['class'].unique)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"3 Unique classes observed \n1 - No Lung Opacity/Not Normal,\n2 - Normal,\n3 - Lung Opacity","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"sns.countplot(x=\"class\",hue=\"class\",data=detailedClasses)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"#### Analyzing Train Lables Dataset","execution_count":null},{"metadata":{},"cell_type":"markdown","source":"Step 1 -> Reading the data ","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"labelsPath = dataDirPath + 'stage_2_train_labels.csv'\n\ntrainLabels = pd.read_csv(labelsPath)\n\ntrainLabels.head(2)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Step 2 -> Checking the missing values if any","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"trainLabels.isna().apply(pd.value_counts)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"#### Observation - For around 20672 patients Bounding box cordinates not available where as for 9555 patients its avaialable","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"trainLabels[trainLabels['Target']==0].head(2)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Few records have observed with missing values in **x, y, width** and **height** coulmn, but no missing values observed in **patientId** and **Target**.\n\nAlso this is observed such missing columns are present for those records with **Target** as '0'.\n\n**x, y, width** and **height** columns have the information for bounding boxes in Images where Penumonia is detected.\n\n**Explaination on missing values - These are not the missing values instead it is expected not to have Bounding Box co-ordinates for those images where Pneumonia is not detected (Target - '0')**\n\nHence concluding there are no missing values in this dataset as well","execution_count":null},{"metadata":{},"cell_type":"markdown","source":"Step 3 -> Checking unique Patients","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"print(\"Unique patientIds : \", trainLabels['patientId'].nunique(), )","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Total Unique patients found - 26684\n\nThis is same as the number of patients in Detailed CSV sheet hence both sheets share the information for same patients","execution_count":null},{"metadata":{},"cell_type":"markdown","source":"Step 4 -> Checkin unqiue Targets","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"print(\"Unique patientIds : \", trainLabels['Target'].nunique(), )\n\nprint(\"Unique patientIds : \", trainLabels['Target'].unique(), )","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Trail label has only 2 target variables [0 & 1] \n\n**Conclusion - In Train labels only two target variables are present 0 & 1, where as in Detailed_Info sheet we have 3 classes.**","execution_count":null},{"metadata":{},"cell_type":"markdown","source":"**As we have 3 Classes in Detailed_Info dataset and 2 Target Variables in Train_Labels, concatenating to get better insight into the data**","execution_count":null},{"metadata":{},"cell_type":"markdown","source":"Step 1 -> Sorting both the datasets based on patientId","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"trainLabels.sort_values(\"patientId\", inplace=True)\ndetailedClasses.sort_values(\"patientId\", inplace=True)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Step 2 -> Concatenating the data\n\n* To get the Target and classes into one dataframe","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"Combined_Data = pd.concat([trainLabels, detailedClasses[\"class\"]], axis=1, sort=False)\nCombined_Data.head(3)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"**Validating the concatenation results**","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"Combined_Data.shape","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"Combined_Data.isna().apply(pd.value_counts)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"Combined_Data[Combined_Data[\"Target\"] == 1].isna().apply(pd.value_counts)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"Combined_Data[Combined_Data[\"Target\"] == 0].isna().apply(pd.value_counts)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"Combined_Data[Combined_Data[\"class\"] == \"Lung Opacity\"].isna().apply(pd.value_counts)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"From Above Analysis our concatenated data is correct","execution_count":null},{"metadata":{},"cell_type":"markdown","source":"## Prepare data for training\n\n\nStep 1 -> \n* Convert data to only two classes, 'Normal' and 'Lung Opacity'\n* Splitting the data in three parts, train, validation and test sets.\n* Replace all 'NaN' values to zero(0)\n","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"# Conver data to only two classes, 'Normal' and 'Lung Opacity'\nCombined_Data[\"class\"].replace(\"No Lung Opacity / Not Normal\", \"Normal\", inplace=True)\nCombined_Data.head(3)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"\ntrain_CombinedData = Combined_Data[0:15000]\nvalidate_CombinedData = Combined_Data[15000:25000]\ntest_CombinedData = Combined_Data[25000:30227]\n\nprint(\"train_CombinedData.shape : \", train_CombinedData.shape)\nprint(\"validate_CombinedData.shape : \", validate_CombinedData.shape)\nprint(\"test_CombinedData.shape : \", test_CombinedData.shape)\n\nprint(\"\\nunique train patients : \", train_CombinedData[\"patientId\"].nunique())\nprint(\"unique validate patients : \", validate_CombinedData[\"patientId\"].nunique())\nprint(\"unique test patients : \", test_CombinedData[\"patientId\"].nunique())\n\nprint(\"\\nTotal unique patients : \", imageIdPaths[\"patientId\"].nunique())\nprint(\"Total of unique train and test : \", train_CombinedData[\"patientId\"].nunique() + validate_CombinedData[\"patientId\"].nunique() + test_CombinedData[\"patientId\"].nunique())\n\nprint(\"\\nLast from train set : \", train_CombinedData.iloc[14999][\"patientId\"])\nprint(\"First from validate set : \", validate_CombinedData.iloc[0][\"patientId\"])\nprint(\"\\nLast from validate set : \", validate_CombinedData.iloc[9999][\"patientId\"])\nprint(\"First from test set : \", test_CombinedData.iloc[0][\"patientId\"])\n\n# Set all NaN values to 0 in train and test data sets. While training NaN will not have any meaning.\n#    * x, y, width and hight values as zero(0) means no bounding box.\ntrain_CombinedData.fillna(0, inplace=True)\nvalidate_CombinedData.fillna(0, inplace=True)\ntest_CombinedData.fillna(0, inplace=True)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"imageIdPaths.sort_values(\"patientId\", inplace=True)\n\ntrain_imageIdPaths = imageIdPaths[0:13163]\nvalidate_imageIdPaths = imageIdPaths[13163:21764]\ntest_imageIdPaths = imageIdPaths[21764:26684]\n\nprint(\"train_imageIdPaths.shape : \", train_imageIdPaths.shape)\nprint(\"validate_imageIdPaths.shape : \", validate_imageIdPaths.shape)\nprint(\"test_imageIdPaths.shape : \", test_imageIdPaths.shape)\n\nprint(\"\\nunique train patients : \", train_imageIdPaths[\"patientId\"].nunique())\nprint(\"unique validate patients : \", validate_imageIdPaths[\"patientId\"].nunique())\nprint(\"unique test patients : \", test_imageIdPaths[\"patientId\"].nunique())\n\nprint(\"\\nTotal unique patients : \", imageIdPaths[\"patientId\"].nunique())\nprint(\"Total of unique train and test : \", train_imageIdPaths[\"patientId\"].nunique() + validate_imageIdPaths[\"patientId\"].nunique() + test_imageIdPaths[\"patientId\"].nunique())\n\nprint(\"\\nLast from train set : \", train_imageIdPaths.iloc[13162][\"patientId\"])\nprint(\"First from validate set : \", validate_imageIdPaths.iloc[0][\"patientId\"])\nprint(\"Last from validate set : \", validate_imageIdPaths.iloc[8600][\"patientId\"])\nprint(\"First from test set : \", test_imageIdPaths.iloc[0][\"patientId\"])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"sns.countplot(x=\"Target\",hue=\"class\",data=train_CombinedData)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"sns.countplot(x=\"Target\",hue=\"class\",data=validate_CombinedData)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"sns.countplot(x=\"Target\",hue=\"class\",data=test_CombinedData)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"* Observation\n    * train, validation and test sets are not well balanced. \n    * Images with 'Lung Opacity' are less in proportion in all these sets.","execution_count":null},{"metadata":{},"cell_type":"markdown","source":"# Build UNet","execution_count":null},{"metadata":{},"cell_type":"markdown","source":"### Constants","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"IMAGE_SIZE = 224\n\nIMG_WIDTH = 1024\nIMG_HEIGHT = 1024\n\nTRAIN_BATCH_SIZE = 10\nTEST_BATCH_SIZE = 10\n\nALPHA = 1.0","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### Function and Class definations","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"# define iou or jaccard loss function\ndef iou_loss(y_true, y_pred):\n    \"\"\"Get Intersection over Union(IoU) ratio from ground truth and predicted masks.\n    Arguments:\n        y_true -- ground truth mask\n        \n        y_pred -- predicted mask\n    \"\"\"\n    y_true = tf.reshape(y_true, [-1])\n    y_pred = tf.reshape(y_pred, [-1])\n    intersection = tf.reduce_sum(y_true * y_pred)\n    score = (intersection + 1.) / (tf.reduce_sum(y_true) + tf.reduce_sum(y_pred) - intersection + 1.)\n    return 1 - score\n\n# mean iou as a metric\ndef mean_iou(y_true, y_pred):\n    \"\"\"Get mean Intersection over Union(IoU) ratio from ground truth and predicted masks.\n    Arguments:\n        y_true -- ground truth mask\n        \n        y_pred -- predicted mask\n    \"\"\"\n    y_pred = tf.round(y_pred)    \n    intersect = tf.reduce_sum(y_true * y_pred, axis=[1]) \n    union = tf.reduce_sum(y_true, axis=[1]) + tf.reduce_sum(y_pred, axis=[1])\n    smooth = tf.ones(tf.shape(intersect))\n    return tf.reduce_mean((intersect + smooth) / (union - intersect + smooth))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def iouFromCoords(boxA, boxB) :\n    \"\"\"Get Intersection over Union(IoU) ratio from ground truth and predicted box coordinates.\n    Arguments:\n        boxA -- ground truth mask\n        \n        boxB -- predicted mask\n    \"\"\"\n    # determine the (x, y)-coordinates of the intersection rectangle\n    xA = max(boxA[0], boxB[0])\n    yA = max(boxA[1], boxB[1])\n    xB = min(boxA[2], boxB[2])\n    yB = min(boxA[3], boxB[3])\n\n    # compute the area of intersection rectangle\n    interArea = abs(max((xB - xA, 0)) * max((yB - yA), 0))\n    if interArea == 0:\n        return 0\n    # compute the area of both the prediction and ground-truth\n    # rectangles\n    boxAArea = abs((boxA[2] - boxA[0]) * (boxA[3] - boxA[1]))\n    boxBArea = abs((boxB[2] - boxB[0]) * (boxB[3] - boxB[1]))\n\n    # compute the intersection over union by taking the intersection\n    # area and dividing it by the sum of prediction + ground-truth\n    # areas - the interesection area\n    iou = interArea / float(boxAArea + boxBArea - interArea)\n\n    # return the intersection over union value\n    return iou","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"\ndef showMaskedImage(_imageSet, _maskSet, _index) :\n    \"\"\"To show image with imposing mask on it for the given index, form the given sets of images and masks.\n    Arguments:\n        _imageSet -- set of images\n        \n        _maskSet -- set of masks\n        \n        _index -- index of a set/collection\n    \"\"\"\n    maskImage = _imageSet[_index]\n\n    #pyplot.imshow(maskImage[:,:,0], cmap=pyplot.cm.bone)\n    maskImage[:,:,0] = _maskSet[_index] * _imageSet[_index][:,:,0]\n    maskImage[:,:,1] = _maskSet[_index] * _imageSet[_index][:,:,1]\n    maskImage[:,:,2] = _maskSet[_index] * _imageSet[_index][:,:,2]\n\n    pyplot.imshow(maskImage[:,:,0], cmap=pyplot.cm.bone)\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"\nclass UNetTrainGenerator(Sequence):\n    \"\"\"Generator class to get data batches for training model. Extends Sequence class.\n        \n    Arguments:\n        _imageIdPaths -- dataframe having patientId and image paths to load image for the patientId\n        \n        _CombinedData -- dataframe having patientId, image labels, target and class values combined together\n        \n        idx -- index of a batch\n    \"\"\"\n    def __init__(self, _imageIdPaths, _CombinedData):       \n        self.pids = _CombinedData[\"patientId\"].to_numpy()\n        self.imgIdPaths = _imageIdPaths\n        self.coords = _CombinedData[[\"x\", \"y\", \"width\", \"height\"]].to_numpy()\n        # Resize Bounding box\n        self.coords = self.coords * IMAGE_SIZE / IMG_WIDTH\n        \n\n    def __len__(self):\n        return math.ceil(len(self.coords) / TRAIN_BATCH_SIZE)\n    \n\n    def __getitem__(self, idx): # Get a batch\n        batch_coords = self.coords[idx * TRAIN_BATCH_SIZE:(idx + 1) * TRAIN_BATCH_SIZE] # Image coords\n        batch_pids = self.pids[idx * TRAIN_BATCH_SIZE:(idx + 1) * TRAIN_BATCH_SIZE] # Image pids    \n        \n        batch_images = np.zeros((len(batch_pids), IMAGE_SIZE, IMAGE_SIZE, 3), dtype=np.float32)\n        batch_masks = np.zeros((len(batch_pids), IMAGE_SIZE, IMAGE_SIZE))\n        for _indx, _pid in enumerate(batch_pids):\n            _path = self.imgIdPaths[self.imgIdPaths[\"patientId\"] == _pid][\"imgPath\"].array[0]\n            _imgData = loadImage(str(_path)) # Read image\n            img = _imgData.pixel_array \n            \n            # Resize image\n            resized_img = cv2.resize(img, (IMAGE_SIZE, IMAGE_SIZE), interpolation=cv2.INTER_AREA)\n    \n            #print(\"batch_images[_indx] shape :\", batch_images[_indx][:,:,0].shape)\n            # preprocess image for the batch\n            batch_images[_indx][:,:,0] = preprocess_input(np.array(resized_img[:,:], dtype=np.float32)) # Convert to float32 array\n            batch_images[_indx][:,:,1] = preprocess_input(np.array(resized_img[:,:], dtype=np.float32)) # Convert to float32 array\n            batch_images[_indx][:,:,2] = preprocess_input(np.array(resized_img[:,:], dtype=np.float32)) # Convert to float32 array  \n            \n            x = int(batch_coords[_indx, 0])\n            y = int(batch_coords[_indx, 1])\n            width = int(batch_coords[_indx, 2])\n            height = int(batch_coords[_indx, 3])\n            \n            batch_masks[_indx][y:y+height, x:x+width] = 1\n            \n        # Returns images and ground truth masks for training\n        return batch_images, batch_masks","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Generator for Predicting/Testing model\nclass UNetTestGenerator(Sequence):\n    \"\"\"Generator class to get data batches for testing model. Used to get batches of test data used for getting predictions.\n        \n    Arguments:\n        _imageIdPaths -- dataframe having patientId and image paths to load image for the patientId\n        \n        _CombinedData -- dataframe having patientId, image labels, target and class values combined together\n        \n        idx -- index of a batch\n    \"\"\"\n    def __init__(self, _imageIdPaths, _CombinedData):       \n        self.pids = _CombinedData[\"patientId\"].to_numpy()\n        self.imgIdPaths = _imageIdPaths\n        self.coords = _CombinedData[[\"x\", \"y\", \"width\", \"height\", \"Target\"]].to_numpy() #for (1024, 1024)\n        self.classes = _CombinedData[\"class\"]\n        # Resize Bounding box\n        self.coordsOrig = self.coords #for (1024, 1024)\n        self.coords = self.coords * IMAGE_SIZE / IMG_WIDTH   #for (224, 224)\n        \n\n    def __len__(self):\n        # Returns total number of batches\n        return math.ceil(len(self.coords) / TEST_BATCH_SIZE)\n    \n\n    def __getitem__(self, idx): # Get a batch\n        batch_coords = self.coords[idx * TEST_BATCH_SIZE:(idx + 1) * TEST_BATCH_SIZE] # Image coords for (224, 224)\n        batch_coordsOrig = self.coordsOrig[idx * TEST_BATCH_SIZE:(idx + 1) * TEST_BATCH_SIZE] # Image coords for (1024, 1024)\n        batch_pids = self.pids[idx * TEST_BATCH_SIZE:(idx + 1) * TEST_BATCH_SIZE] # Image pids    \n        batch_classes = self.classes[idx * TEST_BATCH_SIZE:(idx + 1) * TEST_BATCH_SIZE] # Image classes           \n        \n        batch_images = np.zeros((len(batch_pids), IMAGE_SIZE, IMAGE_SIZE, 3), dtype=np.float32)\n        batch_masks = np.zeros((len(batch_pids), IMAGE_SIZE, IMAGE_SIZE))\n        for _indx, _pid in enumerate(batch_pids):\n            _path = self.imgIdPaths[self.imgIdPaths[\"patientId\"] == _pid][\"imgPath\"].array[0]\n            _imgData = loadImage(str(_path)) # Read image\n            img = _imgData.pixel_array \n            \n            # Resize image\n            resized_img = cv2.resize(img, (IMAGE_SIZE, IMAGE_SIZE), interpolation=cv2.INTER_AREA) #(224, 224)\n            #resized_img = cv2.resize(img[200:824, 200:824], dsize=(IMAGE_SIZE, IMAGE_SIZE), interpolation=cv2.INTER_AREA)\n    \n            #print(\"batch_images[_indx] shape :\", batch_images[_indx][:,:,0].shape)\n            # preprocess image for the batch\n            batch_images[_indx][:,:,0] = preprocess_input(np.array(resized_img[:,:], dtype=np.float32)) # Convert to float32 array\n            batch_images[_indx][:,:,1] = preprocess_input(np.array(resized_img[:,:], dtype=np.float32)) # Convert to float32 array\n            batch_images[_indx][:,:,2] = preprocess_input(np.array(resized_img[:,:], dtype=np.float32)) # Convert to float32 array  \n            \n            x = int(batch_coords[_indx, 0])\n            y = int(batch_coords[_indx, 1])\n            width = int(batch_coords[_indx, 2])\n            height = int(batch_coords[_indx, 3])\n            target = int(batch_coords[_indx, 4])\n            \n            batch_coords[_indx, 0] = x\n            batch_coords[_indx, 1] = y \n            batch_coords[_indx, 2] = width \n            batch_coords[_indx, 3] = height    \n            batch_coords[_indx, 4] = target \n            \n            batch_masks[_indx][y:y+height, x:x+width] = 1\n\n        # Returns images, ground truth masks, patientIds, resized-coordinates, class targets and ground truth coordinates/lables.   \n        return batch_images, batch_masks, batch_pids, batch_coords, batch_classes, batch_coordsOrig  #for (224, 224) and (1024, 1024)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"\ndef create_UNetModel(trainable=True):\n    \"\"\"Function to create UNet architecture with MobileNet.\n        \n    Arguments:\n        trainable -- Flag to make layers trainable. Default value is 'True'.\n    \"\"\"\n    # Get all layers with 'imagenet' weights\n    model = MobileNet(input_shape=(IMAGE_SIZE, IMAGE_SIZE, 3), include_top=False, alpha=ALPHA, weights=\"imagenet\") \n    # Top layer is last layer of the model\n    \n    # Make all layers trainable\n    for layer in model.layers:\n        layer.trainable = trainable\n\n    # Add all the UNET layers here\n    convLayer_112by112 = model.get_layer(\"conv_pw_1_relu\").output\n    convLayer_56by56 = model.get_layer(\"conv_pw_3_relu\").output\n    convLayer_28by28 = model.get_layer(\"conv_pw_5_relu\").output\n    convLayer_14by14 = model.get_layer(\"conv_pw_11_relu\").output\n    convLayer_7by7 = model.get_layer(\"conv_pw_13_relu\").output\n    # The last layer of mobilenet model is of dimensions (7x7x1024)\n\n    # Start upsampling from 7x7 to 14x14 ...up to 224x224 to form UNET\n    # concatinate with the original image layer of the same size from MobileNet\n    x = Concatenate()([UpSampling2D()(convLayer_7by7), convLayer_14by14])\n    x = Concatenate()([UpSampling2D()(x), convLayer_28by28])\n    x = Concatenate()([UpSampling2D()(x), convLayer_56by56])\n    x = Concatenate()([UpSampling2D()(x), convLayer_112by112])\n    x = UpSampling2D(name=\"unet_last\")(x) # upsample to 224x224\n\n    # Add classification layer\n    x = Conv2D(1, kernel_size=1, activation=\"sigmoid\", name=\"masks\")(x)\n    x = Reshape((IMAGE_SIZE, IMAGE_SIZE))(x) \n\n    return Model(inputs=model.input, outputs=x)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"\ndef conv_block_simple(prevlayer, filters, prefix, strides=(1, 1)):\n    \"\"\"Function to create part of UNet architecture with ResNet50. \n    Adds convolutional layer followed by Batch Normalization and Activation layers.\n        \n    Arguments:\n        prevlayer -- previous layer of the convolution block\n        \n        filters -- number of filters for convolution\n        \n        prefix -- prefix for the layer name\n        \n        strides -- convolution stride. Default is 1x1.\n    \"\"\"\n    conv = Conv2D(filters, (3, 3), padding=\"same\", kernel_initializer=\"he_normal\", strides=strides, name=prefix + \"_conv\")(prevlayer)\n    conv = BatchNormalization(name=prefix + \"_bn\")(conv)\n    conv = Activation('relu', name=prefix + \"_activation\")(conv)\n    \n    # Returns the built layers of the block.\n    return conv","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"* Trained all layers of ResNet50 starting with initial pre-trained  weights on ‘imagenet’. All U-Net decoder layer weights are trained from zero. \n* We have image dataset very different from the ‘imagenet’. Here identifying features/segments for pattern is important, than finding an object. Hence decided to train all the weights, starting with pre-loaded ‘imagenet’ weights.\n","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"\ndef create_ResNetUNetModel(trainable=True):\n    \"\"\"Function to create UNet architecture with ResNet50.\n        \n    Arguments:\n        trainable -- Flag to make layers trainable. Default value is 'True'.\n    \"\"\"\n    resnetLayers = ResNet50(weights='imagenet', input_shape=(IMAGE_SIZE, IMAGE_SIZE, 3), include_top=False) # Load pre-trained Resnet\n    # Top layer is last layer of the model\n\n    for layer in resnetLayers.layers:\n        layer.trainable = trainable\n\n    # Add all the UNet layers here\n    convLayer_112by112 = resnetLayers.get_layer(\"conv1_relu\").output\n    convLayer_56by56 = resnetLayers.get_layer(\"conv2_block3_out\").output # conv2_block3_2_relu\n    convLayer_28by28 = resnetLayers.get_layer(\"conv3_block4_out\").output # conv3_block4_2_relu\n    convLayer_14by14 = resnetLayers.get_layer(\"conv4_block6_out\").output # conv4_block6_2_relu\n    convLayer_7by7 = resnetLayers.get_layer(\"conv5_block3_out\").output # conv5_block3_2_relu\n    # The last layer of resnet model(conv5_block3_out) is of dimensions (7x7x2048)\n\n    # Start upsampling from 7x7 to 14x14 ...up to 224x224 to form UNet\n    # concatinate with the original image layer of the same size from ResNet50\n    up14by14 = Concatenate()([UpSampling2D()(convLayer_7by7), convLayer_14by14])\n    upConvLayer_14by14 = conv_block_simple(up14by14, 256, \"upConvLayer_14by14_1\")\n    upConvLayer_14by14 = conv_block_simple(upConvLayer_14by14, 256, \"upConvLayer_14by14_2\")\n    \n    up28by28 = Concatenate()([UpSampling2D()(upConvLayer_14by14), convLayer_28by28])\n    upConvLayer_28by28 = conv_block_simple(up28by28, 256, \"upConvLayer_28by28_1\")\n    upConvLayer_28by28 = conv_block_simple(upConvLayer_28by28, 256, \"upConvLayer_28by28_2\")\n     \n    up56by56 = Concatenate()([UpSampling2D()(upConvLayer_28by28), convLayer_56by56])\n    upConvLayer_56by56 = conv_block_simple(up56by56, 256, \"upConvLayer_56by56_1\")\n    upConvLayer_56by56 = conv_block_simple(upConvLayer_56by56, 256, \"upConvLayer_56by56_2\")    \n    \n    up112by112 = Concatenate()([UpSampling2D()(upConvLayer_56by56), convLayer_112by112])\n    upConvLayer_112by112 = conv_block_simple(up112by112, 256, \"upConvLayer_112by112_1\")\n    upConvLayer_112by112 = conv_block_simple(upConvLayer_112by112, 256, \"upConvLayer_112by112_2\")   \n    \n    up224by224 = UpSampling2D(name=\"unet_last\")(upConvLayer_112by112) # upsample to 224x224\n    upConvLayer_224by224 = conv_block_simple(up224by224, 256, \"upConvLayer_224by224_1\")\n    upConvLayer_224by224 = conv_block_simple(upConvLayer_224by224, 256, \"upConvLayer_224by224_2\")   \n\n    # Add classification layer\n    upConvLayer_224by224 = Conv2D(1, kernel_size=1, activation=\"sigmoid\", name=\"masks\")(upConvLayer_224by224)\n    upConvLayer_224by224 = Reshape((IMAGE_SIZE, IMAGE_SIZE))(upConvLayer_224by224) \n\n    return Model(inputs=resnetLayers.input, outputs=upConvLayer_224by224)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"\ndef showConfusionMatrixFromFile(report30IOU) :\n    \"\"\"To show Confusion Matrix and Classification report from given dataframe.\n        \n    Arguments:\n        report30IOU -- dataframe having target and prediction columns.\n    \"\"\"\n    report30IOU.fillna(0, inplace=True) # set NA IOU values to zero\n    # Get Targets and Predictions\n    y_30_test = report30IOU[\"Target\"]\n    y_30_predicted = report30IOU[\"predTarget\"]\n    print(\"Predictions above 30% IOU :\\n\")\n    print(\"Confusion Matrix:- \\n\", metrics.confusion_matrix(y_30_test, y_30_predicted), \"\\n\")\n    print(\"Classification Report:- \\n\", metrics.classification_report(y_30_test, y_30_predicted))\n    \n    \ndef showConfusionMatrixFromYs(y_test, y_predicted) :\n    \"\"\"To show Confusion Matrix and Classification report from given dataframes y_test and y_predicted.\n        \n    Arguments:\n        y_test -- 1D dataframe having target values.\n        y_predicted -- 1D dataframe having predicted values.\n    \"\"\"\n    print(\"Predictions above 30% IOU :\\n\")\n    print(\"Confusion Matrix:- \\n\", metrics.confusion_matrix(y_test, y_predicted), \"\\n\")\n    print(\"Classification Report:- \\n\", metrics.classification_report(y_test, y_predicted))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"\n# Funstion to plot history curves\ndef plotHistory(_HISTORY_FILE) :\n    \"\"\"To plot history curves for training and validation losses\n        \n    Arguments:\n        _HISTORY_FILE -- training history file name with path.\n    \"\"\"\n    unetSavedHistory = np.load(_HISTORY_FILE, allow_pickle=True).item()\n    unetSavedHistoryDF = pd.DataFrame(unetSavedHistory)\n    \n    # list data in history\n    # summarize history for loss\n    pyplot.plot(unetSavedHistoryDF['loss'])\n    pyplot.plot(unetSavedHistoryDF['val_loss'])\n    pyplot.title('model loss')\n    pyplot.ylabel('loss')\n    pyplot.xlabel('epoch')\n    pyplot.legend(['train', 'validation'], loc='best')\n    pyplot.show()\n    # summarize history for mean IOU\n    pyplot.plot(unetSavedHistoryDF['mean_iou'])\n    pyplot.plot(unetSavedHistoryDF['val_mean_iou'])\n    pyplot.plot(unetSavedHistoryDF['lr'])\n    pyplot.title('model IOU and Leraning rate')\n    pyplot.ylabel('IOU and LR')\n    pyplot.xlabel('epoch')\n    pyplot.legend(['train', 'validation', 'Lerning Rate'], loc='best')\n    pyplot.show()\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"\ndef predictBatches(_test_CombinedData, _test_imageIdPaths, _UNetModel) :\n    \"\"\"Method to predict test data set and save the submission report into a csv file.\n        \n    Arguments:\n        _test_CombinedData -- test set dataframe having patientId, image labels, target and class values combined together\n\n        _imageIdPaths -- test set dataframe having patientId and image paths to load image for the patientId\n        \n        _UNetModel -- UNet model with trainined weights used for predicting test data\n    \"\"\"\n    print('Number of Test Samples :', _test_CombinedData[\"patientId\"].nunique()) # about 20% of the dataset\n    \n    # create test generator instance\n    testUNetDataGen = UNetTestGenerator(_test_imageIdPaths, _test_CombinedData) #for (224, 224)\n    \n    # create submission dafa frame with column names\n    submissionDF = pd.DataFrame(columns=['patientId', 'x', 'y', 'width', 'height', 'Target', 'class', 'x_pred', 'y_pred', 'width_pred', \n                                         'height_pred', 'predTarget', 'iou', 'class_pred'])\n    dfIndex = 0\n    iouThreshold = 0.3 # IoU above 30%\n\n    # loop through testset\n    # for batches from testUNetDataGen\n    print(\"Predicting Batches \", end='')\n    for batchImages, gtBatchMasks, batchPids, batchCoords, batchClasses, batchCoordsOrig in testUNetDataGen:    #for (224, 224)\n        print(\".\", end = '')    \n        \n        # predict batch of images\n        batchPreds = _UNetModel.predict(batchImages)    #for (224, 224)\n\n        prevPid = \"\"\n        # loop through batch\n        for pred, gtMask, pid, coords, gtClass, coordsOrig in zip(batchPreds, gtBatchMasks, batchPids, batchCoords, batchClasses, batchCoordsOrig):   #for (224, 224)\n\n            if prevPid != pid :\n                prevPid = pid\n\n                # resize predicted mask\n                pred = resize(pred, (1024, 1024), mode='reflect')   #for (1024, 1024)\n                # recompute coords for resized pred\n                coords = coordsOrig   #for (1024, 1024)\n\n                # threshold predicted mask\n                strongPred = pred[:, :] > 0.5   \n\n                # apply connected components\n                strongPred = measure.label(strongPred)\n\n                loopIndx = 0\n                # collect all reagions for the prediction\n                iouCoordsDF = pd.DataFrame(columns=['iou', 'x', 'y', 'width', 'height'])\n                for region in measure.regionprops(strongPred) :\n                    # retrieve x, y, height and width\n                    y, x, y2, x2 = region.bbox\n                    height = y2 - y\n                    width = x2 - x\n                    # Get IOUs\n                    coordsXYs = np.array([coords[0], coords[1], coords[2]+coords[0], coords[3]+coords[1]])\n                    regionXYs = np.array([x, y, x2, y2])\n                    IOU = iouFromCoords(coordsXYs, regionXYs)\n                    #print(\"IOU \", IOU)\n                    iouCoordsRow = [IOU, x, y, width, height]\n                    iouCoordsDF.loc[loopIndx] = iouCoordsRow\n                    loopIndx = loopIndx + 1\n\n                GTDFRow = [pid, coords[0], coords[1], coords[2], coords[3], coords[4], gtClass] # ground truth data \n                prevGTDFRow = []\n                # Get top 2 predictions based on IOU \n                iouCoordsDF.sort_values(\"iou\", ascending=False, inplace=True)\n                predIOUCoordCount = 0\n                # If predictions exist\n                if len(iouCoordsDF) > 0 :\n                    for predIOUCoordIdx in (0, len(iouCoordsDF)-1) :\n                        if iouCoordsDF.loc[predIOUCoordIdx][\"iou\"] > iouThreshold :\n                            # add row with ground truth and prediction values to data frame    \n                            submissionDFRow = [pid, coords[0], coords[1], coords[2], coords[3], coords[4],\n                                               gtClass, int(iouCoordsDF.loc[predIOUCoordIdx][\"x\"]), int(iouCoordsDF.loc[predIOUCoordIdx][\"y\"]), \n                                               int(iouCoordsDF.loc[predIOUCoordIdx][\"width\"]), int(iouCoordsDF.loc[predIOUCoordIdx][\"height\"]), \n                                               1, iouCoordsDF.loc[predIOUCoordIdx][\"iou\"], \"Lung Opacity\"]\n                            if predIOUCoordCount < 2 :\n                                if GTDFRow != prevGTDFRow : \n                                    submissionDF.loc[dfIndex] = submissionDFRow\n                                    dfIndex = dfIndex + 1 \n                                    predIOUCoordCount = predIOUCoordCount + 1\n                                    prevGTDFRow = GTDFRow\n                            else :\n                                break;\n                        else : # Normal if IOU below threshold\n                            # add row with ground truth and prediction values to data frame\n                            if GTDFRow != prevGTDFRow :  \n                                submissionDFRow = [pid, coords[0], coords[1], coords[2], coords[3], coords[4], \n                                                   gtClass, 0, 0, 0, 0, 0, iouCoordsDF.loc[predIOUCoordIdx][\"iou\"], \"Normal\"]\n                                submissionDF.loc[dfIndex] = submissionDFRow\n                                dfIndex = dfIndex + 1  \n                                prevGTDFRow = GTDFRow\n                                break;\n                            # end of if\n                        # end of if\n                    # end of for\n\n                else : # else of If predictions exist. Normal if no predictions\n                    # add row with ground truth and prediction values to data frame\n                    submissionDFRow = [pid, coords[0], coords[1], coords[2], coords[3], coords[4], \n                                       gtClass, 0, 0, 0, 0, 0, 'NA', \"Normal\"]\n                    submissionDF.loc[dfIndex] = submissionDFRow\n                    dfIndex = dfIndex + 1      \n\n        # To stop at certain count. Used to debug code.\n#             if len(submissionDF) >= 5 :\n#                 break\n\n    # save dictionary as csv file\n    submissionDF.to_csv('submission.csv', index=False)\n    print(\"Prediction Complete!\")\n    \n    test_y = submissionDF[\"Target\"]\n    predicted_y = submissionDF[\"predTarget\"]\n    \n    return test_y.apply(int), predicted_y.apply(int)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"\ndef visualizePredictions(_predReportDF, _topNum) :\n    \"\"\"Method to visualize predictions by displaying ground truth and predicted bounding boxes.\n        \n    Arguments:\n        _predReportDF -- dataframe having target and prediction coordinate columns; patientId and IoUs.\n\n        _topNum -- number indicating the count of top predictions to be visualized.\n    \"\"\"\n    # Sort on IOU to get higher IOUs on top\n    _predReportDF.sort_values(\"iou\", ascending=False, inplace=True)\n    # Get patientIds\n    topPids = _predReportDF[\"patientId\"].head(_topNum)\n    topPidsAry = np.array(topPids)\n    # Get IOUs\n    topIOUs = _predReportDF[\"iou\"].head(_topNum)\n    topIOUsAry = np.array(topIOUs)\n\n    # To get ground truth images for top IOU scored pids\n    imageCollc = np.zeros((_topNum, IMG_WIDTH, IMG_HEIGHT), np.float32) # (1024, 1024)\n\n    # Get ground truth coordinates for top IOU scored rows and prepare masks\n    gtCoordCollc = _predReportDF[[\"x\", \"y\", \"width\", \"height\"]].to_numpy()  # (1024, 1024)\n    # To get ground truth masks\n    gtMaskCollc  = np.zeros((_topNum, IMG_WIDTH, IMG_HEIGHT), np.int) # (1024, 1024)\n\n    # Get ground truth coordinates for top IOU scored rows and prepare masks\n    predCoordCollc = _predReportDF[[\"x_pred\", \"y_pred\", \"width_pred\", \"height_pred\"]].to_numpy()  # (1024, 1024)\n    # To get ground truth masks\n    predMaskCollc  = np.zeros((_topNum, IMG_WIDTH, IMG_HEIGHT), np.int)\n\n    # Get ground truth and prediction masks\n    for indx in range(0, _topNum) :\n        # Get images\n        path = test_imageIdPaths[test_imageIdPaths[\"patientId\"] == topPidsAry[indx]][\"imgPath\"].array[0]\n        imgData = loadImage(str(path)) # Read image\n        img = imgData.pixel_array\n        imageCollc[indx][:,:] = preprocess_input(np.array(img[:,:], dtype=np.float32)) # Convert to float32 array\n\n        # prepare ground truth masks\n        x = int(gtCoordCollc[indx, 0])\n        y = int(gtCoordCollc[indx, 1])\n        width = int(gtCoordCollc[indx, 2])\n        height = int(gtCoordCollc[indx, 3])\n        gtMaskCollc[indx][y:y+height, x:x+width] = 1   # (1024, 1024)\n\n        # prepare predicted masks\n        x_pred = int(predCoordCollc[indx, 0])\n        y_pred = int(predCoordCollc[indx, 1])\n        width_pred = int(predCoordCollc[indx, 2])\n        height_pred = int(predCoordCollc[indx, 3])\n        predMaskCollc[indx][y_pred:y_pred+height_pred, x_pred:x_pred+width_pred] = 1   # (1024, 1024)\n        \n    # Show images and bounding boxes\n    imageArea, axesArry = pyplot.subplots(int(_topNum/2), 2, figsize=(18,18))\n    axesArry = axesArry.ravel()\n    for axidx in range(0, _topNum) :\n        axesArry[axidx].imshow(imageCollc[axidx][:, :], cmap=pyplot.cm.bone)\n\n        gtComp = gtMaskCollc[axidx][:, :] > 0.5\n        # apply connected components\n        gtComp = measure.label(gtComp)\n        # apply ground truth bounding boxes\n        for region in measure.regionprops(gtComp):\n            # retrieve x, y, height and width\n            y1, x1, y2, x2 = region.bbox\n            heightReg = y2 - y1\n            widthReg = x2 - x1\n            axesArry[axidx].add_patch(patches.Rectangle((x1, y1), widthReg, heightReg, linewidth=1, edgecolor='r', \n                                                        facecolor='none'))\n\n        predComp = predMaskCollc[axidx][:, :] > 0.5\n        # apply connected components\n        predComp = measure.label(predComp)\n        # apply predicted bounding boxes\n        for region_pred in measure.regionprops(predComp):\n            # retrieve x, y, height and width\n            y1_pred, x1_pred, y2_pred, x2_pred = region_pred.bbox\n            heightReg_pred = y2_pred - y1_pred\n            widthReg_pred = x2_pred - x1_pred\n            axesArry[axidx].add_patch(patches.Rectangle((x1_pred, y1_pred), widthReg_pred, heightReg_pred, linewidth=1, edgecolor='b', \n                                                        facecolor='none'))\n            axesArry[axidx].set_title('IOU : '+str(topIOUsAry[axidx]))\n    # Show subplots\n    pyplot.show()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### Create Generator instances for Train and Validation datasets\n\n* These are further used in fit() method while training the model.","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"trainUNetDataGen = UNetTrainGenerator(train_imageIdPaths, train_CombinedData)\nvalidateUNetDataGen = UNetTrainGenerator(validate_imageIdPaths, validate_CombinedData)\n\nprint(len(trainUNetDataGen), \"# of iterations in one train epoch\")\nprint(len(validateUNetDataGen), \"# of iterations in one validate epoch\")","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"#### visualize sample image with a mask to verify train generator instance ","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"imageSet0 = trainUNetDataGen[0][0]\nmaskSet0 = trainUNetDataGen[0][1]    \nshowMaskedImage(imageSet0, maskSet0, 5)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Build UNet with MobileNet\n\n* We start with a simple UNet architecture using MobileNet layers pretrained with 'imagenet' weights.","execution_count":null},{"metadata":{},"cell_type":"markdown","source":"#### Train the Model","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"trainUnetModel = False\n\nEPOCHS = 3\nWEIGHTS_FILE = SAVED_FILES_ROOT + \"unetModel-0.73.h5\"\n\nadamOptimizer = Adam(lr=1e-4, beta_1=0.9, beta_2=0.999, epsilon=None, decay=0.0, amsgrad=False)\ncheckpoint = ModelCheckpoint(\"unetModel-{loss:.2f}.h5\", monitor=\"loss\", verbose=1, save_best_only=True,\n                             save_weights_only=True, mode=\"min\", period=1)\nstop = EarlyStopping( monitor=\"loss\", patience=5, mode=\"min\")\nreduce_lr = ReduceLROnPlateau(monitor=\"loss\", factor=0.2, patience=5, min_lr=1e-6, verbose=1, mode=\"min\")\n\nUNetModel = create_UNetModel()\nUNetModel.compile(loss=iou_loss, optimizer=adamOptimizer, metrics=[mean_iou]) \n\nUNetModel.load_weights(WEIGHTS_FILE) # train with saved weights\n\nif trainUnetModel==True :\n    # Make layers trainable\n    for layer in UNetModel.layers:\n        layer.trainable = True\n\n    hist = UNetModel.fit_generator(generator=trainUNetDataGen,\n                        epochs=EPOCHS,\n                        validation_data=validateUNetDataGen,\n                        callbacks=[checkpoint, reduce_lr, stop],\n                        shuffle=True,\n                        verbose=1)\n    \n    unet_history = np.array(hist.history)\n    np.save(\"unetTrainHist-3\", unet_history, allow_pickle=True)\n    ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"markdown","source":"#### Plot training history curves","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"HISTORY_FILE = SAVED_FILES_ROOT + \"unetTrainHist.npy\"\nplotHistory(HISTORY_FILE)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"#### Visualize the UNet architecture","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"pltUtil.plot_model(UNetModel,\n                    to_file=\"UnetModel.png\",\n                    show_shapes=True,\n                    show_layer_names=True,\n                    expand_nested=False,\n                    dpi=70)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Check sample ground truth masked image and predicted masked image \nimageSet0 = trainUNetDataGen[0][0]\nmaskSet0 = trainUNetDataGen[0][1]\nprint(\"Ground Truth Box/Mask\")\nshowMaskedImage(imageSet0, maskSet0, 5)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"predMasks = UNetModel.predict(imageSet0)\nprint(\"Predicted Box/Mask\")\nshowMaskedImage(imageSet0, predMasks, 5)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"markdown","source":"#### Predict the Test data set","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"predictUnetModel = False\n\nif predictUnetModel == True :\n    y_test, y_predicted = predictBatches(test_CombinedData, test_imageIdPaths, UNetModel)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"#### Show Confusion Matrix and Classification Report","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"REPORT_30_FILE = SAVED_FILES_ROOT + \"submission_30.csv\"\nreport30IOU = pd.read_csv(REPORT_30_FILE)\nshowConfusionMatrixFromFile(report30IOU)\n","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### Top predicted masks with bounding boxes\n\n* Lets see some of the the top predictions\n* Red boxes are ground truth\n* Blue boxes are predictions","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"topNum = 6 # provide even number\nvisualizePredictions(report30IOU, topNum)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Build UNet with ResNet50\n\n* We started with a simple UNet architecture using MobileNet layers pretrained with 'imagenet' weights.\n\n* Now we do advancement to it by using ResNet50 layers  pretrained with 'imagenet' weights to build the UNet architecture.","execution_count":null},{"metadata":{},"cell_type":"markdown","source":"#### Train the Model","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"trainResnetUnetModel = False\nEPOCHS = 1\nWEIGHTS_FILE = RES_FILES_ROOT + \"resnetModel-0.78.h5\"\n\nres_adamOptimizer = Adam(lr=1e-1, beta_1=0.9, beta_2=0.999, epsilon=None, decay=0.0, amsgrad=False)\nres_checkpoint = ModelCheckpoint(\"resnetModel-{loss:.2f}.h5\", monitor=\"loss\", verbose=1, save_best_only=False,\n                             save_weights_only=True, mode=\"min\", period=1)\nres_stop = EarlyStopping( monitor=\"loss\", patience=5, mode=\"min\")\nres_reduce_lr = ReduceLROnPlateau(monitor=\"loss\", factor=0.2, patience=5, min_lr=1e-4, verbose=1, mode=\"min\")\n\nResNetUNetModel = create_ResNetUNetModel()\nResNetUNetModel.compile(loss=iou_loss, optimizer=res_adamOptimizer, metrics=[mean_iou]) \n\nResNetUNetModel.load_weights(WEIGHTS_FILE)\n\nif trainResnetUnetModel==True :\n    # Make layers trainable\n    for layer in ResNetUNetModel.layers:\n        layer.trainable = True\n\n    reshist = ResNetUNetModel.fit_generator(generator=trainUNetDataGen,\n                        epochs=EPOCHS,\n                        validation_data=validateUNetDataGen,\n                        callbacks=[res_checkpoint, res_reduce_lr, res_stop],\n                        shuffle=True,\n                        verbose=1)\n    \n    resnetUnet_history = np.array(reshist.history)\n    np.save(\"resnetUnetTrainHist\", resnetUnet_history, allow_pickle=True)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"![image.png](attachment:image.png)\n\n**Providing a screenshot here of the training process output. \nFurther we are loading the best saved weights for prediction.**","attachments":{"image.png":{"image/png":"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"}},"execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"pltUtil.plot_model(ResNetUNetModel,\n                    to_file=\"resnetUnetModel.png\",\n                    show_shapes=True,\n                    show_layer_names=True,\n                    expand_nested=False,\n                    dpi=70)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"#### Observe ResNetUNet Model training history\n* See how loss and mean-IoU improved over the epochs","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"RES_HISTORY_FILE = RES_FILES_ROOT + \"resnetUnetTrainHist.npy\"\nplotHistory(RES_HISTORY_FILE)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"#### After 4th epoch we see that the validation loss getting increased which indicates overfitting of the model.\n* Hence we take the weights saved after 4th epoch (i.e. **‘resnetModel-0.78.h5’**) for performing predictions.\n","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"predictResNetUNetModel = False\n\nif predictResNetUNetModel == True :\n    y_test_res, y_predicted_res = predictBatches(test_CombinedData, test_imageIdPaths, ResNetUNetModel)\n","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"#### As mentioned above we are using weights saved after 4th epoch. \n* Here we load the submission file saved with these weights and showing confusion matrix. ","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"RESREPORT_30_FILE = RES_FILES_ROOT + \"resSubmission_30_IOU_4thEpoch.csv\"\n\nif predictResNetUNetModel == True :\n    showConfusionMatrixFromYs(y_test_res, y_predicted_res)\nelse :\n    ResReport30IOU = pd.read_csv(RESREPORT_30_FILE)\n    showConfusionMatrixFromFile(ResReport30IOU)\n","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"#### This Confusion matrix and Classification report are much better that that of U-Net with MobileNet.\n\n#### Analyze Confusion matrix\n* In this capstone project, the goal is to build a pneumonia detection system, to locate the position of inflammation in an image.\n* Thought there are three classes given in the dataset, for this classification we have considered “Not Normal No Lung Opacity” class as \"Normal\" and reduced the problem to binary classification.\n* So we are interested in predicting patients who has pneumonia, i.e. \"Lung Opacity\" class.\n* Since we have a data imbalance considering classes, the overall accuracy is not the right measure to evaluate the model. Hence it is important to analyze confusion martix. This gives accuracy at the class level.\n\nLets analyze confusion martix with this interest in mind.\n\nIn actual test data;\n* True Positives(TP) are;\n    * 372 patients who have actually 'Lung Opacity' correctly predicted as has 'Lung Opacity'.\n\n\n* True Negatives(TN) are;\n    * 4214 patients who have actually 'No Lung Opacity'/'Normal' correctly predicted as 'Normal'.\n\n\n* False Positives(FP) are;\n    * 0 patients(No patients) who have actually 'No Lung Opacity'/'Normal' incorrectly predicted as having 'Lung Opacity'. \n    * This means there are no model mistakes in identifying 'Normal' as 'Lung Opacity'. Type-I error is zero.\n    * This is a big positive point for a medical test. \n    \n\n* False Negatives(FN) are;\n    * 368 patients who have actually 'Lung Opacity' incorrectly predicted as'Normal'. \n    * These are model mistakes. \n    \n\n#### Analyze Precision and Recall\n\n* Precision For 'Lung Opacity' = TP/(TP+FP)\n    * The above FP value impacts 'Precision' value. Hence we see 'Precision' for category '1' i.e. 'Lung Opacity' is 1 (100%). \n\n\n* Recall For 'Lung Opacity' = TP/(TP+FN) \n    * The 'Recall' value for  category '0' i.e. 'Normal' is 1 (100%).\n    * The above FN value impacts 'Recall' value. There is a scope to improve the model 'Recall' value for category '1' i.e. 'Lung Opacity'.\n\n\n* f1-score is harmonic mean of Precision and Recall. Ths is used when we are interested in both.\n    * 'accuracy' f1-score is 93%\n    * 'weighted avg' f1-score is 91%\n\n","execution_count":null},{"metadata":{},"cell_type":"markdown","source":"#### Lets see some of the top predictions alongwith the bounding box IoU values.\n\n* Red boxes are ground truths\n* Blue boxes are predictions","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"topNum = 10 # provide even number\nvisualizePredictions(ResReport30IOU, topNum)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"*  ** Even though some of the IoU valuses are less than 80%, we observe that the ground truth boxes are completely covered within the predicted boxes. **\n\n* **It is important to see that images with different brightness, clarity, contrast are amoung the top predictions.**","execution_count":null},{"metadata":{},"cell_type":"markdown","source":"### Classification Accuracy and Error","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"TP = 372\nTN = 4214\ncorrectPredictions = TP + TN\ntotalPredictions = 4954\n\nclassificationAccuracy = correctPredictions / totalPredictions * 100.0\nprint(\"Classification Accuracy :\", classificationAccuracy)\n\n\nFP = 0\nFN = 368\nincorrectPredictions = FP + FN\n\nclassificationError = incorrectPredictions / totalPredictions\nprint(\"Classification Error :\", classificationError)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"* Classification Accuracy is 92.57%. The model is 92.57% accurate.\n* Classification Error is 7.42%.","execution_count":null},{"metadata":{},"cell_type":"markdown","source":"### Confidence Interval\n\nRather than presenting just a single error score, a confidence interval can be calculated and presented as part of the model skill.\n\nA confidence interval is comprised of two things:\n\nRange:- This is the lower and upper limit on the skill that can be expected on the model.\n\nProbability:- This is the probability that the skill of the model will fall within the range.\n\nIn general, the confidence interval for classification error can be calculated as follows:\n\n**error +/- const * sqrt( (error * (1 - error)) / n)**\n\nWhere error is the classification error, const is a constant value that defines the chosen probability, sqrt is the square root function, and n is the number of observations (rows) used to evaluate the model. Technically, this is called the Wilson score interval.\n\nThe values for const are provided from statistics, and common values used are:\n\n1.64 (90%)\n\n1.96 (95%)\n\n2.33 (98%)\n\n2.58 (99%)\n","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"chosenProbability = 1.96    # 1.96 for (95%)\nnumOfObservations = 4954\n\nclassificationInterval = (chosenProbability * math.sqrt(classificationError * (1 - classificationError) / numOfObservations))\nprint(\"Classification Interval :\", classificationInterval)\n\nconfidenceIntervalUpper = classificationError + classificationInterval\nprint(\"Confidence Interval for classification error Upper Level:\", confidenceIntervalUpper)\n\nconfidenceIntervalLower = classificationError - classificationInterval\nprint(\"Confidence Interval for classification error Lower :\", confidenceIntervalLower)\n","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"* **There is a 95% likelihood that the confidence interval [0.0670, 0.0816] covers the true classification error of the model on unseen data.**\n    * That means the model will give classification error between 6.70% and 8.16%; 95% of the time on unseen data, that means in production. \n\n\n*** In other words, the model will give accuracy between **91.84%**(100-8.16) and **93.3%**(100-6.70) with 95% of confidence(or 95% of the time)**","execution_count":null},{"metadata":{},"cell_type":"markdown","source":"### ROC and AUC","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"\ntest_y = ResReport30IOU[\"Target\"].apply(int)\npredicted_y = ResReport30IOU[\"predTarget\"].apply(int)\n# IoU values are prediction probabilities. \npred_prob_y = ResReport30IOU[\"iou\"] # Taking float values.\n\nimport matplotlib.pyplot as plt\nfpr, tpr, thresholds = metrics.roc_curve(test_y, pred_prob_y)\nplt.plot(fpr, tpr)\nplt.xlim([0.0, 1.0])\nplt.ylim([0.0, 1.0])\nplt.title('ROC curve for pnuemonia classifier')\nplt.xlabel('False Positive Rate (1 - Specificity)')\nplt.ylabel('True Positive Rate (Sensitivity)')\nplt.grid(True)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"* 'False Positive Rate' is the total number of FP divide by 'total number of negatives' in the test set.\n    * FPR = FP/N = FP/FP+TN \n\n\n* 'True Positive Rate' is the total number of TP divide by 'total number of positives' in the test set.\n    * TPR = TP/TP+FN\n    * This is same as 'Recall' for class 'Lung Opacity'.\n    \n    \n* ROC curve is not affected by the imbalance(skeweness) of the classes in the dataset.\n* This curve is with the different probability cutoff values for the target class.\n\n\n* The curve shows non-zero value for zero FPR. This is beacuse the FP value is zero in confusion matrix. \n    * That means for any threshold on the predicted probabilities; when the FP is zero, TP is always above zero.\n","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"threshold = 0.3 # The IoU threshold set to classify as \"Lung Opacity\"\nprint(\"Sensitivity:\", tpr[thresholds > threshold][-1])\nprint(\"Specificity:\", 1 - fpr[thresholds > threshold][-1])\nprint(\"AUC :\", metrics.roc_auc_score(test_y, pred_prob_y))\n","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"* AUC(Area Under Curve) is the percentage of the ROC plot that is underneath the curve.\n* If you randomly chose one 'Lung Opacity' and one 'Normal' observation, AUC represents the likelihood that the model will assign a higher predicted probability to the 'Lung Opacity' observation.\n* This tells the power of a test which in this case is about 82%.","execution_count":null},{"metadata":{},"cell_type":"markdown","source":"# Summary","execution_count":null},{"metadata":{},"cell_type":"markdown","source":"* We started with exploring data and checking how clean the data is. Observed three different classes and after analysis we logically categorized them into two to build the model.\n\n* Model selection was a challenge as both localization and classification was needed into one. After interim sumbmission we started to Build Faster R-CNN architecture. After spending a week on that we realized that for binarry classification U-Net is better and simpler than Faster R-CNN. We found that U-Net is also widely used in medical applications. Hence switched to U-Net.\n\n* First we built siple U-Net with MobileNet. We achieved near to 90% performance on it. Further we made advancement to it by choosing ResNet50 for U-Net. It was a struggle to identify the right points from ResNet50 layers for the crossconnections to the upsampling part of the U-Net. With some experiments we built the right architecture and achieved better results near to 93%.\n\n* Had we saved a time what we spent on building Faster R-CNN, we would have done some upsampling of the 'Lung Opacity' class using augmentations. This would have helped us improving Recall value for 'Lung Opacity' class. \n\n* Overall it was a great experience working on this project and we learned a lot in the journey. ","execution_count":null}],"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":4,"nbformat_minor":4}