{"cells":[{"metadata":{},"cell_type":"markdown","source":"## Import Libraries"},{"metadata":{"trusted":true},"cell_type":"code","source":"import numpy as np\nimport matplotlib.pyplot as plt\nplt.style.use('seaborn')\nimport pandas as pd\nimport cv2\nimport os","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Get Data"},{"metadata":{"trusted":true},"cell_type":"code","source":"train_df = pd.read_csv('../input/aptos2019-blindness-detection/train.csv')\ntest_df = pd.read_csv('../input/aptos2019-blindness-detection/test.csv')\ntrain_dir = '../input/aptos2019-blindness-detection/train_images'\ntest_dir = '../input/aptos2019-blindness-detection/test_images'","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_df.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test_df.head()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Data Statistics"},{"metadata":{"trusted":true},"cell_type":"code","source":"print('Num of training images: ', len(train_df))\nprint('Num of test images: ', len(test_df))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_df.hist()\nplt.title('Training Data Class Distribution')\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"_, counts = np.unique(train_df['diagnosis'].values, return_counts=True)\nnum_classes = len(counts)\n\nfor i in range(num_classes):\n    print(\"Label {}: {} or {:.2f}%\".format(i,counts[i],counts[i]/len(train_df)*100))","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Clearly there is a large class imbalance in the training dataset. The labels are not provided for the test dataset so there is no information on their class distribution."},{"metadata":{},"cell_type":"markdown","source":"## Example Images\n\n\"DR leads to gradual changes in vasculature structure and resulting abnormalities such as microaneurysms, hemorrhages, hard exudates, and cotton wool spots. Along with the changes, there may be a presence of venous beading, retinal neovascularization which can be utilized to classify DR retinopathy in one of the two phases known as non-proliferative diabetic retinopathy (NPDR) and proliferative diabetic retinopathy (PDR)\" - DeepDRiD Challenge"},{"metadata":{"trusted":true},"cell_type":"code","source":"# n, the number of images to display, must be even\ndef plotExamples(ids, n):\n  np.random.seed(0)\n  rand_ids = ids[np.random.choice(len(ids),n)]\n\n  fig = plt.figure(figsize=(15, 10))\n  for i in range(n):\n    fig.add_subplot(int(n/2),2,i+1)\n    I = cv2.imread(os.path.join(train_dir, rand_ids[i]+\".png\"))\n    I = cv2.cvtColor(I, cv2.COLOR_BGR2RGB)\n    plt.imshow(I)\n    plt.xlabel(rand_ids[i] + \".png\")\n    plt.grid(None)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Class 0 corresponds to no apparent DR: there should be no signs of abnormalities."},{"metadata":{"trusted":true},"cell_type":"code","source":"class0 = train_df.loc[train_df['diagnosis'] == 0, ['id_code']].values.flatten()\nplotExamples(class0, 4)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Class 1 corresponds to mild NPDR: only presence of microaneurysms."},{"metadata":{"trusted":true},"cell_type":"code","source":"class1 = train_df.loc[train_df['diagnosis'] == 1, ['id_code']].values.flatten()\nplotExamples(class1, 4)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Class 2 corresponds to moderate NPDR: more than just microaneurysms but less than severe NPDR."},{"metadata":{"trusted":true},"cell_type":"code","source":"class2 = train_df.loc[train_df['diagnosis'] == 2, ['id_code']].values.flatten()\nplotExamples(class2, 4)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Class 3 corresponds to severe NPDR:\n\nModerate NPDR and any of the following:\n\n• > 20 intraretinal hemorrhages\n\n• Venous beading (localized increase in vein diameter)\n\n• Intraretinal microvascular abnormalities"},{"metadata":{"trusted":true},"cell_type":"code","source":"class3 = train_df.loc[train_df['diagnosis'] == 3, ['id_code']].values.flatten()\nplotExamples(class3, 4)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Class 4 corresponds to PDR:\n\nSevere NPDR and one or both of the following:\n\n• Neovascularization\n\n• Vitreous/preretinal hemorrhage"},{"metadata":{"trusted":true},"cell_type":"code","source":"class4 = train_df.loc[train_df['diagnosis'] == 4, ['id_code']].values.flatten()\nplotExamples(class4, 4)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Preprocessing"},{"metadata":{"trusted":true},"cell_type":"code","source":"import albumentations as A","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### Crop Function"},{"metadata":{"trusted":true},"cell_type":"code","source":"def cropEye(img, radius):\n    mid_row = img[int(img.shape[0]/2),:,:].sum(1)\n    r = (mid_row > mid_row.mean()/10).sum()/2\n    s = radius*(1/r)\n    I_r = cv2.resize(img,(0,0),fx=s,fy=s)\n    center_row = int(I_r.shape[0]/2)\n    center_col = int(I_r.shape[1]/2)\n    start_x = max(center_row - radius, 0)\n    end_x = center_row + radius\n    start_y = max(center_col - radius, 0)\n    end_y = center_col + radius\n    I_cropped = I_r[start_x:end_x, start_y:end_y, :]\n    if I_cropped.shape[0] != radius*2 or I_cropped.shape[1] != radius*2:\n        I_cropped = cv2.resize(I_cropped, (radius*2,radius*2))\n    return I_cropped","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"np.random.seed(0)\nids = train_df['id_code'].values.flatten()\nrand_ids = ids[np.random.choice(len(ids),6)]\nrand_ids","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### Original Images"},{"metadata":{"trusted":true},"cell_type":"code","source":"fig = plt.figure(figsize=(15, 10))\nn = len(rand_ids)\nfor i in range(n):\n    fig.add_subplot(int(n/2),2,i+1)\n    I = cv2.imread(os.path.join(train_dir, rand_ids[i]+\".png\"))\n    I = cv2.cvtColor(I, cv2.COLOR_BGR2RGB)\n    plt.imshow(I)\n    plt.xlabel(rand_ids[i] + \".png\")\n    plt.grid(None)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### Cropped Images"},{"metadata":{"trusted":true},"cell_type":"code","source":"fig = plt.figure(figsize=(15, 10))\nn = len(rand_ids)\nfor i in range(n):\n    I = cv2.imread(os.path.join(train_dir, rand_ids[i]+\".png\"))\n    I = cv2.cvtColor(I, cv2.COLOR_BGR2RGB)\n    I = I.astype('float32')\n    I = cropEye(I, 128)\n    I = I/255\n\n    fig.add_subplot(int(n/2),2,i+1)\n    plt.imshow(I)\n    plt.xlabel(rand_ids[i] + \".png\")\n    plt.grid(None)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]}],"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}