{"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\nfrom tensorflow.keras.applications import ResNet101V2\n\n%matplotlib inline\nsns.set(style=\"whitegrid\")\nwarnings.filterwarnings(\"ignore\")","metadata":{"execution":{"iopub.status.busy":"2022-10-21T02:12:05.607269Z","iopub.execute_input":"2022-10-21T02:12:05.607762Z","iopub.status.idle":"2022-10-21T02:12:13.991561Z","shell.execute_reply.started":"2022-10-21T02:12:05.607669Z","shell.execute_reply":"2022-10-21T02:12:13.990297Z"},"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')\nN_CLASSES = train['diagnosis'].nunique()\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')","metadata":{"execution":{"iopub.status.busy":"2022-10-21T02:12:13.993999Z","iopub.execute_input":"2022-10-21T02:12:13.994713Z","iopub.status.idle":"2022-10-21T02:12:14.043773Z","shell.execute_reply.started":"2022-10-21T02:12:13.994608Z","shell.execute_reply":"2022-10-21T02:12:14.042792Z"},"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=32,\n    class_mode=\"categorical\",\n    target_size=(224, 224),\n    subset='training')","metadata":{"execution":{"iopub.status.busy":"2022-10-21T02:12:14.045523Z","iopub.execute_input":"2022-10-21T02:12:14.046166Z","iopub.status.idle":"2022-10-21T02:12:20.388398Z","shell.execute_reply.started":"2022-10-21T02:12:14.046129Z","shell.execute_reply":"2022-10-21T02:12:20.387353Z"},"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=32,\n    class_mode=\"categorical\",    \n    target_size=(224, 224),\n    subset='validation')","metadata":{"execution":{"iopub.status.busy":"2022-10-21T02:12:20.391852Z","iopub.execute_input":"2022-10-21T02:12:20.392531Z","iopub.status.idle":"2022-10-21T02:12:21.455194Z","shell.execute_reply.started":"2022-10-21T02:12:20.392491Z","shell.execute_reply":"2022-10-21T02:12:21.453997Z"},"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=32,\n        shuffle=False,\n        class_mode=None)","metadata":{"execution":{"iopub.status.busy":"2022-10-21T02:12:21.459151Z","iopub.execute_input":"2022-10-21T02:12:21.460093Z","iopub.status.idle":"2022-10-21T02:12:24.878948Z","shell.execute_reply.started":"2022-10-21T02:12:21.460052Z","shell.execute_reply":"2022-10-21T02:12:24.877732Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#taken from old keras source code\ndef f1_score(y_true, y_pred): \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","metadata":{"execution":{"iopub.status.busy":"2022-10-21T02:12:24.880601Z","iopub.execute_input":"2022-10-21T02:12:24.880959Z","iopub.status.idle":"2022-10-21T02:12:24.889064Z","shell.execute_reply.started":"2022-10-21T02:12:24.880926Z","shell.execute_reply":"2022-10-21T02:12:24.887805Z"},"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,]","metadata":{"execution":{"iopub.status.busy":"2022-10-21T02:12:24.89031Z","iopub.execute_input":"2022-10-21T02:12:24.89063Z","iopub.status.idle":"2022-10-21T02:12:24.98446Z","shell.execute_reply.started":"2022-10-21T02:12:24.890602Z","shell.execute_reply":"2022-10-21T02:12:24.983569Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# DenseNet201","metadata":{}},{"cell_type":"code","source":"from tensorflow.keras.applications import DenseNet201\nfrom tensorflow.keras.layers import Input, MaxPooling2D, Dense, Flatten, Dropout\nfrom tensorflow.keras.models import Model\n\n\nbaseModel=DenseNet201(include_top=False, input_tensor=Input(shape=(224, 224, 3)), \n                      weights='../input/keras-pretrain-model-weights/densenet201_weights_tf_dim_ordering_tf_kernels_notop.h5')\n\nfor layer in baseModel.layers:\n    layer.trainable=False\n    \ntransfer_model=baseModel.output\ntransfer_model=MaxPooling2D(pool_size=(4, 4))(transfer_model)\ntransfer_model=Flatten()(transfer_model)\ntransfer_model=Dense(64, activation='relu')(transfer_model)\ntransfer_model=Dropout(0.2)(transfer_model)\ntransfer_model=Dense(5, activation='softmax')(transfer_model)\n\nmodel = Model(inputs=baseModel.input, outputs=transfer_model)\nmodel.compile(optimizer=Adam(lr=0.00005),  # Very low learning rate\n              loss='binary_crossentropy',\n              metrics=['accuracy'])","metadata":{"execution":{"iopub.status.busy":"2022-10-21T02:12:42.42285Z","iopub.execute_input":"2022-10-21T02:12:42.423261Z","iopub.status.idle":"2022-10-21T02:12:49.915386Z","shell.execute_reply.started":"2022-10-21T02:12:42.423212Z","shell.execute_reply":"2022-10-21T02:12:49.914292Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#taken from old keras source code\ndef f1_score(y_true, y_pred): \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","metadata":{"execution":{"iopub.status.busy":"2022-10-21T02:12:49.917328Z","iopub.execute_input":"2022-10-21T02:12:49.91767Z","iopub.status.idle":"2022-10-21T02:12:49.924158Z","shell.execute_reply.started":"2022-10-21T02:12:49.917639Z","shell.execute_reply":"2022-10-21T02:12:49.923Z"},"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,]","metadata":{"execution":{"iopub.status.busy":"2022-10-21T02:12:49.925514Z","iopub.execute_input":"2022-10-21T02:12:49.925857Z","iopub.status.idle":"2022-10-21T02:12:49.947981Z","shell.execute_reply.started":"2022-10-21T02:12:49.925825Z","shell.execute_reply":"2022-10-21T02:12:49.946943Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"mcp = ModelCheckpoint('DenseNet201.h5')","metadata":{"execution":{"iopub.status.busy":"2022-10-21T02:12:49.950357Z","iopub.execute_input":"2022-10-21T02:12:49.950718Z","iopub.status.idle":"2022-10-21T02:12:49.955079Z","shell.execute_reply.started":"2022-10-21T02:12:49.950686Z","shell.execute_reply":"2022-10-21T02:12:49.954259Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.compile(optimizer='Adam', loss=\"categorical_crossentropy\", metrics=METRICS)\nSTEP_SIZE_TRAIN = train_generator.n//train_generator.batch_size\nSTEP_SIZE_VALID = valid_generator.n//valid_generator.batch_size\nepoch = 50","metadata":{"execution":{"iopub.status.busy":"2022-10-21T02:12:49.956107Z","iopub.execute_input":"2022-10-21T02:12:49.957107Z","iopub.status.idle":"2022-10-21T02:12:49.982691Z","shell.execute_reply.started":"2022-10-21T02:12:49.956942Z","shell.execute_reply":"2022-10-21T02:12:49.981744Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"history = model.fit_generator(generator=train_generator,\n                              steps_per_epoch=STEP_SIZE_TRAIN,\n                              validation_data=valid_generator,\n                              validation_steps=STEP_SIZE_VALID,\n                              epochs=epoch,\n                                callbacks=[mcp])\n#                               callbacks=[lrd,mcp,es])\n\n","metadata":{"execution":{"iopub.status.busy":"2022-10-21T02:12:49.984399Z","iopub.execute_input":"2022-10-21T02:12:49.984853Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"acc = history.history['accuracy']\nval_acc = history.history['val_accuracy']\nloss = history.history['loss']\nval_loss = history.history['val_loss']\nprecision = history.history['precision']\nval_precision = history.history['val_precision']\nrecall = history.history['recall']\nval_recall = history.history['val_recall']\nauc = history.history['val_recall']\nval_auc = history.history['val_auc']\nf1_score = history.history['f1_score']\nval_f1_score = history.history['val_f1_score']","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# model.save('./output/resnet101v2')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.save('DenseNet_201.h5')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"acc = history.history['accuracy']\nval_acc = history.history['val_accuracy']\nloss = history.history['loss']\nval_loss = history.history['val_loss']\n\nepochs_range = range(epoch)\n\nplt.figure(figsize=(15, 15))\nplt.rcParams.update({'font.size': 22})\nplt.subplot(2, 2, 1)\nplt.plot(epochs_range, acc, label='Training Accuracy', linewidth=2)\nplt.plot(epochs_range, val_acc, label='Validation Accuracy', linewidth=2)\nplt.legend(loc='lower right')\nplt.title('Training and Validation Accuracy')\n\nplt.subplot(2, 2, 2)\nplt.plot(epochs_range, loss, label='Training Loss', linewidth=2)\nplt.plot(epochs_range, val_loss, label='Validation Loss', linewidth=2)\nplt.legend(loc='upper right')\nplt.title('Training and Validation Loss')\n\nplt.savefig('DenseNet_201_acc_loss.png', dpi = 900)\nplt.savefig('DenseNet_201_acc_loss.eps', dpi = 900)\n\nplt.show()\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize=(15, 15), linewidth = 5)\nplt.rcParams.update({'font.size': 22})\nplt.plot(epochs_range, acc, label='Training Accuracy', linewidth=2)\nplt.plot(epochs_range, val_acc, label='Validation Accuracy', linewidth=2)\nplt.legend(loc='lower right')\nplt.title('Training and Validation Accuracy')\n\nplt.savefig('DenseNet_201_train_valid_acc.png', dpi = 900)\nplt.savefig('DenseNet_201_train_valid_acc.eps', dpi = 900)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize=(15, 15))\nplt.rcParams.update({'font.size': 22})\nplt.plot(epochs_range, loss, label='Training Loss', linewidth=2)\nplt.plot(epochs_range, val_loss, label='Validation Loss', linewidth=2)\nplt.legend(loc='upper right')\nplt.title('Training and Validation Loss')\n\nplt.savefig('DenseNet_201_train_valid_loss.png', dpi = 900)\nplt.savefig('DenseNet_201_train_valid_loss.eps', dpi = 900)","metadata":{"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":{"trusted":true},"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":{"trusted":true},"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)\npredictions = [np.argmax(pred) for pred in preds]\npredictions[:10]","metadata":{"trusted":true},"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')\n\nplt.savefig('DenseNet_201_cm.png', dpi = 900)\nplt.savefig('DenseNet_201_cm.eps', dpi = 900)\n\nplt.show()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"filenames=test_generator.filenames\nresults=pd.DataFrame({\"id_code\":filenames,\n                      \"diagnosis\":predictions})\nresults['id_code'] = results['id_code'].map(lambda x: str(x)[:-4])\nresults.to_csv(\"submission.csv\",index=False)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"> **Accuracy**","metadata":{}},{"cell_type":"code","source":"model.load_weights('./DenseNet_201.h5')\n\nres = model.evaluate(valid_generator)\nprint(\"Testing accuracy : \" + str(res[1]))\nprint(\"Testing loss : \" + str(res[0]))","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"pred_val = model.predict(x_val)\ny1 = pred_val > 0.4\ny1 = y1.astype(int).sum(axis=1) - 1\ny2 = y_val.sum(axis=1) - 1","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.metrics import classification_report\nprint(classification_report(y1, y2))","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.metrics import confusion_matrix\nimport seaborn as sns\nfrom sklearn.metrics import classification_report\n\nlabels=['No DR','Mild','Moderate','Severe','Proliferative DR']\n\nprint(classification_report(y1, y2, target_names=labels))","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.metrics import confusion_matrix\nimport seaborn as sns\ntarget_names=['No DR','Mild','Moderate','Severe','Proliferative DR']\n\ncm = confusion_matrix(y1, y2)\n# Normalise\ncmn = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis]\nfig, ax = plt.subplots(figsize=(20,16))\nplt.rcParams.update({'font.size': 22})\nplt.title('Confusion Matrix', fontsize=40)\nsns.heatmap(cmn, annot=True, fmt='.2f', xticklabels=target_names, yticklabels=target_names)\nplt.ylabel('True', fontsize=40)\nplt.xlabel('Predicted', fontsize=40)\nplt.savefig('DenseNet_201_cm_2.png', dpi=900)\nplt.savefig('DenseNet_201_cm_2.eps', dpi=900)\nplt.show(block=False)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.metrics import confusion_matrix\nimport seaborn as sns\ntarget_names=['No DR','Mild','Moderate','Severe','Proliferative DR']\n\ncm = confusion_matrix(y1, y2)\n\nfig, ax = plt.subplots(figsize=(20,16))\nax.set_xticklabels([''] + labels)\nax.set_yticklabels([''] + labels)\nplt.title('Confusion Matrix', fontsize=40)\nsns.heatmap(cm, annot=True, fmt='.0f', xticklabels=target_names, yticklabels=target_names)\nplt.ylabel('True', fontsize=30)\nplt.xlabel('Predicted', fontsize=40)\nplt.savefig('DenseNet_201_cm_3.png', dpi=900)\nplt.savefig('DenseNet_201_cm_3.eps', dpi=900)\nplt.show(block=False)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"acc","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"val_acc","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"loss","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"val_loss","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"precision","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"val_precision","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"recall","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"val_recall","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"auc","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"val_auc","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"f1_score","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\nval_f1_score","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}