{"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":"code","source":"import os\nimport cv2\nimport random\nimport warnings\nimport numpy as np\nimport pandas as pd\nimport seaborn as sns\nimport matplotlib.pyplot as plt\nfrom sklearn.metrics import confusion_matrix, cohen_kappa_score\nfrom keras.models import Model\nfrom keras import optimizers, applications\nfrom keras.preprocessing.image import ImageDataGenerator\nfrom keras.callbacks import EarlyStopping, ReduceLROnPlateau\nfrom keras.layers import Dense, Dropout, GlobalAveragePooling2D, Input\nimport tensorflow as tf\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom tensorflow.keras.preprocessing import image_dataset_from_directory\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.layers import InputLayer, BatchNormalization, Dropout, Flatten, Dense, Activation, MaxPool2D, Conv2D\nfrom tensorflow.keras.callbacks import EarlyStopping, ModelCheckpoint\nfrom tensorflow.keras.applications.resnet50 import ResNet50\nfrom tensorflow.keras.utils import to_categorical\nfrom keras import optimizers\nfrom tensorflow.keras.optimizers import Adam\nfrom keras.callbacks import Callback,ModelCheckpoint,ReduceLROnPlateau\nfrom keras.models import Sequential,load_model\nfrom keras.layers import Dense, Dropout\nfrom keras.wrappers.scikit_learn import KerasClassifier\nimport keras.backend as K\n#import tensorflow_addons as tfa\n#from tensorflow.keras.metrics import Metric\n#from tensorflow_addons.utils.types import AcceptableDTypes, FloatTensorLike\nfrom typeguard import typechecked\nfrom typing import Optional\n%matplotlib inline\nsns.set(style=\"whitegrid\")\nwarnings.filterwarnings(\"ignore\")","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2021-07-22T10:36:47.000386Z","iopub.execute_input":"2021-07-22T10:36:47.00083Z","iopub.status.idle":"2021-07-22T10:36:54.519484Z","shell.execute_reply.started":"2021-07-22T10:36:47.000734Z","shell.execute_reply":"2021-07-22T10:36:54.518454Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train = pd.read_csv('../input/aptos2019-blindness-detection/train.csv')\ntest = pd.read_csv('../input/aptos2019-blindness-detection/test.csv')\nsubmission= pd.read_csv('../input/aptos2019-blindness-detection/sample_submission.csv')","metadata":{"execution":{"iopub.status.busy":"2021-07-22T10:36:54.520785Z","iopub.execute_input":"2021-07-22T10:36:54.521083Z","iopub.status.idle":"2021-07-22T10:36:54.554657Z","shell.execute_reply.started":"2021-07-22T10:36:54.521056Z","shell.execute_reply":"2021-07-22T10:36:54.553738Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print('Number of train samples: ', train.shape[0])\nprint('Number of test samples: ', test.shape[0])\ndisplay(train.head())","metadata":{"execution":{"iopub.status.busy":"2021-07-22T10:37:01.163787Z","iopub.execute_input":"2021-07-22T10:37:01.16431Z","iopub.status.idle":"2021-07-22T10:37:01.200639Z","shell.execute_reply.started":"2021-07-22T10:37:01.164276Z","shell.execute_reply":"2021-07-22T10:37:01.199415Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import pandas_profiling as pp\npp.ProfileReport(train)","metadata":{"execution":{"iopub.status.busy":"2021-07-22T10:37:02.980634Z","iopub.execute_input":"2021-07-22T10:37:02.981014Z","iopub.status.idle":"2021-07-22T10:37:07.070557Z","shell.execute_reply.started":"2021-07-22T10:37:02.980976Z","shell.execute_reply":"2021-07-22T10:37:07.069765Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"f, ax = plt.subplots(figsize=(14, 5))\nax = sns.countplot(x=\"diagnosis\", data=train, palette=\"Set2\")\nsns.despine()\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2021-07-22T10:37:24.208572Z","iopub.execute_input":"2021-07-22T10:37:24.20925Z","iopub.status.idle":"2021-07-22T10:37:24.388883Z","shell.execute_reply.started":"2021-07-22T10:37:24.209202Z","shell.execute_reply":"2021-07-22T10:37:24.387861Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sns.set_style(\"white\")\ncount = 1\nplt.figure(figsize=[15, 15])\nfor img_name in train['id_code'][:15]:\n    img = cv2.imread(\"../input/aptos2019-blindness-detection/train_images/%s.png\" % img_name)[...,[2, 1, 0]]\n    plt.subplot(5, 5, count)\n    plt.imshow(img)\n    plt.title(\"Image %s\" % count)\n    count += 1\n    \nplt.show()","metadata":{"execution":{"iopub.status.busy":"2021-07-22T10:37:25.683046Z","iopub.execute_input":"2021-07-22T10:37:25.683458Z","iopub.status.idle":"2021-07-22T10:37:35.688688Z","shell.execute_reply.started":"2021-07-22T10:37:25.683425Z","shell.execute_reply":"2021-07-22T10:37:35.687981Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"N_CLASSES = train['diagnosis'].nunique()\nN_CLASSES","metadata":{"execution":{"iopub.status.busy":"2021-07-22T10:37:35.689779Z","iopub.execute_input":"2021-07-22T10:37:35.690148Z","iopub.status.idle":"2021-07-22T10:37:35.695572Z","shell.execute_reply.started":"2021-07-22T10:37:35.69012Z","shell.execute_reply":"2021-07-22T10:37:35.694933Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Preprocecss data\ntrain[\"id_code\"] = train[\"id_code\"].apply(lambda x: x + \".png\")\ntest[\"id_code\"] = test[\"id_code\"].apply(lambda x: x + \".png\")\ntrain['diagnosis'] = train['diagnosis'].astype('str')\ntrain.head()","metadata":{"execution":{"iopub.status.busy":"2021-07-22T10:37:37.474059Z","iopub.execute_input":"2021-07-22T10:37:37.474562Z","iopub.status.idle":"2021-07-22T10:37:37.494563Z","shell.execute_reply.started":"2021-07-22T10:37:37.474531Z","shell.execute_reply":"2021-07-22T10:37:37.493528Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_datagen=ImageDataGenerator(rescale=1./255, \n                                 validation_split=0.2,\n                                 horizontal_flip=True)\n\ntrain_generator=train_datagen.flow_from_dataframe(\n    dataframe=train,\n    directory=\"../input/aptos2019-blindness-detection/train_images/\",\n    x_col=\"id_code\",\n    y_col=\"diagnosis\",\n    batch_size=16,\n    class_mode=\"categorical\",\n    target_size=(224, 224),\n    subset='training')","metadata":{"execution":{"iopub.status.busy":"2021-07-22T10:37:38.932877Z","iopub.execute_input":"2021-07-22T10:37:38.933265Z","iopub.status.idle":"2021-07-22T10:37:42.500838Z","shell.execute_reply.started":"2021-07-22T10:37:38.93323Z","shell.execute_reply":"2021-07-22T10:37:42.499822Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"valid_generator=train_datagen.flow_from_dataframe(\n    dataframe=train,\n    directory=\"../input/aptos2019-blindness-detection/train_images/\",\n    x_col=\"id_code\",\n    y_col=\"diagnosis\",\n    batch_size=16,\n    class_mode=\"categorical\",    \n    target_size=(224, 224),\n    subset='validation')","metadata":{"execution":{"iopub.status.busy":"2021-07-22T10:37:42.50236Z","iopub.execute_input":"2021-07-22T10:37:42.502635Z","iopub.status.idle":"2021-07-22T10:37:42.963908Z","shell.execute_reply.started":"2021-07-22T10:37:42.502608Z","shell.execute_reply":"2021-07-22T10:37:42.962694Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_datagen = ImageDataGenerator(rescale=1./255)\n\ntest_generator = test_datagen.flow_from_dataframe(  \n        dataframe=test,\n        directory = \"../input/aptos2019-blindness-detection/test_images/\",\n        x_col=\"id_code\",\n        target_size=(224, 224),\n        batch_size=16,\n        shuffle=False,\n        class_mode=None)","metadata":{"execution":{"iopub.status.busy":"2021-07-22T10:37:44.141666Z","iopub.execute_input":"2021-07-22T10:37:44.142041Z","iopub.status.idle":"2021-07-22T10:37:48.378582Z","shell.execute_reply.started":"2021-07-22T10:37:44.142003Z","shell.execute_reply":"2021-07-22T10:37:48.377531Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from keras.applications.inception_v3 import InceptionV3","metadata":{"execution":{"iopub.status.busy":"2021-07-22T10:37:49.716065Z","iopub.execute_input":"2021-07-22T10:37:49.716439Z","iopub.status.idle":"2021-07-22T10:37:49.721424Z","shell.execute_reply.started":"2021-07-22T10:37:49.716409Z","shell.execute_reply":"2021-07-22T10:37:49.720009Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# create the base pre-trained model\nbase_model = InceptionV3()","metadata":{"execution":{"iopub.status.busy":"2021-07-22T10:37:51.01205Z","iopub.execute_input":"2021-07-22T10:37:51.012563Z","iopub.status.idle":"2021-07-22T10:37:54.864176Z","shell.execute_reply.started":"2021-07-22T10:37:51.01253Z","shell.execute_reply":"2021-07-22T10:37:54.862472Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Freezing Layers\n\nfor layer in base_model.layers[:-10]:\n    layer.trainable=False","metadata":{"execution":{"iopub.status.busy":"2021-07-22T10:37:59.684503Z","iopub.execute_input":"2021-07-22T10:37:59.684863Z","iopub.status.idle":"2021-07-22T10:37:59.700375Z","shell.execute_reply.started":"2021-07-22T10:37:59.684834Z","shell.execute_reply":"2021-07-22T10:37:59.699301Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Building Model\n\nmodel=Sequential()\nmodel.add(base_model)\nmodel.add(Dropout(0.5))\nmodel.add(Flatten())\nmodel.add(BatchNormalization())\nmodel.add(Dense(256,kernel_initializer='he_uniform'))\nmodel.add(BatchNormalization())\nmodel.add(Activation('relu'))\nmodel.add(Dropout(0.5))\nmodel.add(Dense(128,kernel_initializer='he_uniform'))\nmodel.add(BatchNormalization())\nmodel.add(Activation('relu'))\nmodel.add(Dropout(0.5))\nmodel.add(Dense(32,kernel_initializer='he_uniform'))\nmodel.add(BatchNormalization())\nmodel.add(Activation('relu'))\nmodel.add(Dense(5,activation='softmax'))","metadata":{"execution":{"iopub.status.busy":"2021-07-22T10:38:00.772836Z","iopub.execute_input":"2021-07-22T10:38:00.773182Z","iopub.status.idle":"2021-07-22T10:38:01.54243Z","shell.execute_reply.started":"2021-07-22T10:38:00.773153Z","shell.execute_reply":"2021-07-22T10:38:01.541451Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Model Summary\n\nmodel.summary()","metadata":{"execution":{"iopub.status.busy":"2021-07-22T10:38:02.116021Z","iopub.execute_input":"2021-07-22T10:38:02.116403Z","iopub.status.idle":"2021-07-22T10:38:02.150374Z","shell.execute_reply.started":"2021-07-22T10:38:02.116372Z","shell.execute_reply":"2021-07-22T10:38:02.149201Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tensorflow.keras.utils import plot_model\nfrom IPython.display import Image\nplot_model(model, to_file='convnet.png', show_shapes=True,show_layer_names=True)\nImage(filename='convnet.png')","metadata":{"execution":{"iopub.status.busy":"2021-07-22T10:38:03.242933Z","iopub.execute_input":"2021-07-22T10:38:03.24333Z","iopub.status.idle":"2021-07-22T10:38:03.845491Z","shell.execute_reply.started":"2021-07-22T10:38:03.243293Z","shell.execute_reply":"2021-07-22T10:38:03.844352Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def f1_score(y_true, y_pred): #taken from old keras source code\n    true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))\n    possible_positives = K.sum(K.round(K.clip(y_true, 0, 1)))\n    predicted_positives = K.sum(K.round(K.clip(y_pred, 0, 1)))\n    precision = true_positives / (predicted_positives + K.epsilon())\n    recall = true_positives / (possible_positives + K.epsilon())\n    f1_val = 2*(precision*recall)/(precision+recall+K.epsilon())\n    return f1_val\n","metadata":{"execution":{"iopub.status.busy":"2021-07-22T10:38:05.724882Z","iopub.execute_input":"2021-07-22T10:38:05.725296Z","iopub.status.idle":"2021-07-22T10:38:05.732916Z","shell.execute_reply.started":"2021-07-22T10:38:05.725257Z","shell.execute_reply":"2021-07-22T10:38:05.731776Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"METRICS = [\n      tf.keras.metrics.BinaryAccuracy(name='accuracy'),\n      tf.keras.metrics.Precision(name='precision'),\n      tf.keras.metrics.Recall(name='recall'),  \n      tf.keras.metrics.AUC(name='auc'),\n        f1_score,\n]","metadata":{"execution":{"iopub.status.busy":"2021-07-22T10:38:06.938123Z","iopub.execute_input":"2021-07-22T10:38:06.93854Z","iopub.status.idle":"2021-07-22T10:38:06.977308Z","shell.execute_reply.started":"2021-07-22T10:38:06.938505Z","shell.execute_reply":"2021-07-22T10:38:06.976259Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"lrd = ReduceLROnPlateau(monitor = 'val_loss',patience = 2,verbose = 1,factor = 0.8, min_lr = 1e-6)\n\nmcp = ModelCheckpoint('inception_v3_weights_tf_dim_ordering_tf_kernels.h5')\n\nes = EarlyStopping(verbose=1, patience=2)","metadata":{"execution":{"iopub.status.busy":"2021-07-22T10:38:07.978065Z","iopub.execute_input":"2021-07-22T10:38:07.978581Z","iopub.status.idle":"2021-07-22T10:38:07.984124Z","shell.execute_reply.started":"2021-07-22T10:38:07.978548Z","shell.execute_reply":"2021-07-22T10:38:07.983163Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.compile(optimizer='Adam', loss=\"categorical_crossentropy\", metrics=METRICS)","metadata":{"execution":{"iopub.status.busy":"2021-07-22T10:38:09.029787Z","iopub.execute_input":"2021-07-22T10:38:09.030158Z","iopub.status.idle":"2021-07-22T10:38:09.057883Z","shell.execute_reply.started":"2021-07-22T10:38:09.030123Z","shell.execute_reply":"2021-07-22T10:38:09.056753Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"STEP_SIZE_TRAIN = train_generator.n//train_generator.batch_size\nSTEP_SIZE_VALID = valid_generator.n//valid_generator.batch_size","metadata":{"execution":{"iopub.status.busy":"2021-07-22T10:38:10.220368Z","iopub.execute_input":"2021-07-22T10:38:10.22074Z","iopub.status.idle":"2021-07-22T10:38:10.225501Z","shell.execute_reply.started":"2021-07-22T10:38:10.220706Z","shell.execute_reply":"2021-07-22T10:38:10.224442Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(STEP_SIZE_TRAIN)\nprint(STEP_SIZE_VALID)","metadata":{"execution":{"iopub.status.busy":"2021-07-22T10:38:11.334359Z","iopub.execute_input":"2021-07-22T10:38:11.334972Z","iopub.status.idle":"2021-07-22T10:38:11.341238Z","shell.execute_reply.started":"2021-07-22T10:38:11.334919Z","shell.execute_reply":"2021-07-22T10:38:11.340106Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%time\nhistory = model.fit_generator(generator=train_generator,steps_per_epoch=STEP_SIZE_TRAIN,validation_data=valid_generator,validation_steps=STEP_SIZE_VALID,epochs=10,callbacks=[lrd,mcp,es])","metadata":{"execution":{"iopub.status.busy":"2021-07-22T10:38:12.834632Z","iopub.execute_input":"2021-07-22T10:38:12.834984Z","iopub.status.idle":"2021-07-22T11:27:45.554492Z","shell.execute_reply.started":"2021-07-22T10:38:12.834953Z","shell.execute_reply":"2021-07-22T11:27:45.548736Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"complete_datagen = ImageDataGenerator(rescale=1./255)\ncomplete_generator = complete_datagen.flow_from_dataframe(  \n        dataframe=train,\n        directory = \"../input/aptos2019-blindness-detection/train_images/\",\n        x_col=\"id_code\",\n        target_size=(224, 224),\n        batch_size=1,\n        shuffle=False,\n        class_mode=None)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"STEP_SIZE_COMPLETE = complete_generator.n//complete_generator.batch_size\ntrain_preds = model.predict_generator(complete_generator, steps=STEP_SIZE_COMPLETE)\ntrain_preds = [np.argmax(pred) for pred in train_preds]","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"labels = ['0 - No DR', '1 - Mild', '2 - Moderate', '3 - Severe', '4 - Proliferative DR']\ncnf_matrix = confusion_matrix(train['diagnosis'].astype('int'), train_preds)\ncnf_matrix_norm = cnf_matrix.astype('float') / cnf_matrix.sum(axis=1)[:, np.newaxis]\ndf_cm = pd.DataFrame(cnf_matrix_norm, index=labels, columns=labels)\nprint(df_cm.describe().T)\nplt.figure(figsize=(15, 8))\nsns.heatmap(df_cm, annot=True, fmt='.2f')\nplt.show()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_cm.head(5)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(\"Train Cohen Kappa score: %.3f\" % cohen_kappa_score(train_preds, train['diagnosis'].astype('int'), weights='quadratic'))","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_generator.reset()\nSTEP_SIZE_TEST = test_generator.n//test_generator.batch_size\npreds = model.predict_generator(test_generator, steps=STEP_SIZE_TEST)\npredictions = [np.argmax(pred) for pred in preds]\npredictions[:10]","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"filenames = test_generator.filenames\nresults = pd.DataFrame(['id_code',filenames, 'diagnosis',predictions])\nresults.to_csv('submission.csv',index=False)\nresults.head(5).T","metadata":{},"execution_count":null,"outputs":[]}]}