{"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# from efficientnet.keras import EfficientNetB7\n\n%matplotlib inline\nsns.set(style=\"whitegrid\")\nwarnings.filterwarnings(\"ignore\")","metadata":{"execution":{"iopub.status.busy":"2022-10-21T14:13:53.432563Z","iopub.execute_input":"2022-10-21T14:13:53.433102Z","iopub.status.idle":"2022-10-21T14:13:58.993099Z","shell.execute_reply.started":"2022-10-21T14:13:53.433044Z","shell.execute_reply":"2022-10-21T14:13:58.992104Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# !pip install efficientnet","metadata":{"execution":{"iopub.status.busy":"2022-10-21T14:13:59.002312Z","iopub.execute_input":"2022-10-21T14:13:59.003754Z","iopub.status.idle":"2022-10-21T14:13:59.008841Z","shell.execute_reply.started":"2022-10-21T14:13:59.003704Z","shell.execute_reply":"2022-10-21T14:13:59.007826Z"},"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-21T14:13:59.011118Z","iopub.execute_input":"2022-10-21T14:13:59.012482Z","iopub.status.idle":"2022-10-21T14:13:59.063376Z","shell.execute_reply.started":"2022-10-21T14:13:59.01244Z","shell.execute_reply":"2022-10-21T14:13:59.062442Z"},"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-21T14:13:59.067257Z","iopub.execute_input":"2022-10-21T14:13:59.068584Z","iopub.status.idle":"2022-10-21T14:14:00.274326Z","shell.execute_reply.started":"2022-10-21T14:13:59.068548Z","shell.execute_reply":"2022-10-21T14:14:00.273276Z"},"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-21T14:14:00.276404Z","iopub.execute_input":"2022-10-21T14:14:00.278085Z","iopub.status.idle":"2022-10-21T14:14:00.337604Z","shell.execute_reply.started":"2022-10-21T14:14:00.278044Z","shell.execute_reply":"2022-10-21T14:14:00.336655Z"},"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-21T14:14:00.339754Z","iopub.execute_input":"2022-10-21T14:14:00.340969Z","iopub.status.idle":"2022-10-21T14:14:03.257008Z","shell.execute_reply.started":"2022-10-21T14:14:00.340932Z","shell.execute_reply":"2022-10-21T14:14:03.255956Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# EfficentNetB7","metadata":{}},{"cell_type":"code","source":"# from efficientnet.keras import EfficientNetB7\nfrom keras.applications.efficientnet import EfficientNetB7\n\nfrom tensorflow.keras.layers import Input, MaxPooling2D, Dense, Flatten, Dropout\nfrom tensorflow.keras.models import Model\n\n\nbaseModel=EfficientNetB7(include_top=False, input_tensor=Input(shape=(224, 224, 3)), \n                         weights='../input/efficientnet-keras-noisystudent-weights-b0b7/imagenet/imagenet.notop-b7.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-21T14:14:03.258634Z","iopub.execute_input":"2022-10-21T14:14:03.259321Z","iopub.status.idle":"2022-10-21T14:14:15.263564Z","shell.execute_reply.started":"2022-10-21T14:14:03.259262Z","shell.execute_reply":"2022-10-21T14:14:15.262523Z"},"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-21T14:14:15.265229Z","iopub.execute_input":"2022-10-21T14:14:15.266808Z","iopub.status.idle":"2022-10-21T14:14:15.275971Z","shell.execute_reply.started":"2022-10-21T14:14:15.266768Z","shell.execute_reply":"2022-10-21T14:14:15.2748Z"},"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-21T14:14:15.278564Z","iopub.execute_input":"2022-10-21T14:14:15.279059Z","iopub.status.idle":"2022-10-21T14:14:15.307803Z","shell.execute_reply.started":"2022-10-21T14:14:15.279021Z","shell.execute_reply":"2022-10-21T14:14:15.305805Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"mcp = ModelCheckpoint('EfficentNetB7.h5')","metadata":{"execution":{"iopub.status.busy":"2022-10-21T14:14:15.309279Z","iopub.execute_input":"2022-10-21T14:14:15.310366Z","iopub.status.idle":"2022-10-21T14:14:15.315464Z","shell.execute_reply.started":"2022-10-21T14:14:15.310321Z","shell.execute_reply":"2022-10-21T14:14:15.314462Z"},"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-21T14:14:15.316914Z","iopub.execute_input":"2022-10-21T14:14:15.318132Z","iopub.status.idle":"2022-10-21T14:14:15.349224Z","shell.execute_reply.started":"2022-10-21T14:14:15.318084Z","shell.execute_reply":"2022-10-21T14:14:15.348293Z"},"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-21T14:14:15.350626Z","iopub.execute_input":"2022-10-21T14:14:15.351636Z"},"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('EfficentNet_B7.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('EfficentNet_B7_acc_loss.png', dpi = 900)\nplt.savefig('EfficentNet_B7_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('EfficentNet_B7_train_valid_acc.png', dpi = 900)\nplt.savefig('EfficentNet_B7_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('EfficentNet_B7_train_valid_loss.png', dpi = 900)\nplt.savefig('EfficentNet_B7_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('EfficentNet_B7_cm.png', dpi = 900)\nplt.savefig('EfficentNet_B7_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('./EfficentNet_B7.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('EfficentNet_B7_cm_2.png', dpi=900)\nplt.savefig('EfficentNet_B7_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('EfficentNet_B7_cm_3.png', dpi=900)\nplt.savefig('EfficentNet_B7_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":[]}]}