{"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":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2022-02-17T20:20:58.624030Z","iopub.execute_input":"2022-02-17T20:20:58.624303Z","iopub.status.idle":"2022-02-17T20:21:00.948874Z","shell.execute_reply.started":"2022-02-17T20:20:58.624274Z","shell.execute_reply":"2022-02-17T20:21:00.947863Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 1 ère étape : importation des bibli","metadata":{}},{"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":{"execution":{"iopub.status.busy":"2022-02-17T20:21:06.524983Z","iopub.execute_input":"2022-02-17T20:21:06.525267Z","iopub.status.idle":"2022-02-17T20:21:06.546209Z","shell.execute_reply.started":"2022-02-17T20:21:06.525238Z","shell.execute_reply":"2022-02-17T20:21:06.545048Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 2ème étape : importation des données : train et test","metadata":{}},{"cell_type":"code","source":"train = pd.read_csv('../input/aptos2019-blindness-detection/train.csv')\ntest = pd.read_csv('../input/aptos2019-blindness-detection/test.csv')","metadata":{"execution":{"iopub.status.busy":"2022-02-17T20:21:09.643165Z","iopub.execute_input":"2022-02-17T20:21:09.643464Z","iopub.status.idle":"2022-02-17T20:21:09.659002Z","shell.execute_reply.started":"2022-02-17T20:21:09.643416Z","shell.execute_reply":"2022-02-17T20:21:09.658158Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## visualisation de la structure des données  ","metadata":{}},{"cell_type":"code","source":"print('les nbre de train samples est : ', train.shape[0])\nprint('les nbre de test samples est: ', test.shape[0])\ndisplay(train.head())\ndisplay(train.tail())","metadata":{"execution":{"iopub.status.busy":"2022-02-17T20:21:11.961917Z","iopub.execute_input":"2022-02-17T20:21:11.962492Z","iopub.status.idle":"2022-02-17T20:21:11.984950Z","shell.execute_reply.started":"2022-02-17T20:21:11.962428Z","shell.execute_reply":"2022-02-17T20:21:11.984004Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## importation de HTML notebook","metadata":{}},{"cell_type":"code","source":"import pandas_profiling as pp\npp.ProfileReport(train)","metadata":{"execution":{"iopub.status.busy":"2022-02-17T20:21:16.442687Z","iopub.execute_input":"2022-02-17T20:21:16.442997Z","iopub.status.idle":"2022-02-17T20:21:19.267055Z","shell.execute_reply.started":"2022-02-17T20:21:16.442965Z","shell.execute_reply":"2022-02-17T20:21:19.266302Z"},"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":"2022-02-17T20:21:23.407653Z","iopub.execute_input":"2022-02-17T20:21:23.408237Z","iopub.status.idle":"2022-02-17T20:21:23.643245Z","shell.execute_reply.started":"2022-02-17T20:21:23.408202Z","shell.execute_reply":"2022-02-17T20:21:23.642358Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"en peut constater que les données ne sont pas equilibrées","metadata":{}},{"cell_type":"markdown","source":"## visualisation des photos","metadata":{}},{"cell_type":"code","source":"sns.set_style(\"white\")\ncount = 1\nplt.figure(figsize=[15, 15])\nfor img_name in train['id_code'][:10]:\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":"2022-02-17T20:21:27.780351Z","iopub.execute_input":"2022-02-17T20:21:27.780996Z","iopub.status.idle":"2022-02-17T20:21:34.620371Z","shell.execute_reply.started":"2022-02-17T20:21:27.780960Z","shell.execute_reply":"2022-02-17T20:21:34.619321Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"définir une variable qui contient les nombres des classes de la dataset : \n\n5 classe ","metadata":{}},{"cell_type":"code","source":"N_CLASSES = train['diagnosis'].nunique()\nN_CLASSES","metadata":{"execution":{"iopub.status.busy":"2022-02-17T20:21:39.250376Z","iopub.execute_input":"2022-02-17T20:21:39.250714Z","iopub.status.idle":"2022-02-17T20:21:39.261052Z","shell.execute_reply.started":"2022-02-17T20:21:39.250683Z","shell.execute_reply":"2022-02-17T20:21:39.259761Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 3 ème étape : preprocessing des données  \n- l'attribut id_code  de la base train et test","metadata":{}},{"cell_type":"code","source":"train[\"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()\ntrain.tail()","metadata":{"execution":{"iopub.status.busy":"2022-02-17T20:21:42.602523Z","iopub.execute_input":"2022-02-17T20:21:42.602878Z","iopub.status.idle":"2022-02-17T20:21:42.623613Z","shell.execute_reply.started":"2022-02-17T20:21:42.602833Z","shell.execute_reply":"2022-02-17T20:21:42.622585Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 4 ème étape : génerer les données d'entrainement, données de test et validation à  partir de dataset","metadata":{}},{"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":"2022-02-17T20:21:48.901384Z","iopub.execute_input":"2022-02-17T20:21:48.902681Z","iopub.status.idle":"2022-02-17T20:21:50.696221Z","shell.execute_reply.started":"2022-02-17T20:21:48.902615Z","shell.execute_reply":"2022-02-17T20:21:50.695123Z"},"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":"2022-02-17T20:21:55.066939Z","iopub.execute_input":"2022-02-17T20:21:55.067934Z","iopub.status.idle":"2022-02-17T20:21:55.143367Z","shell.execute_reply.started":"2022-02-17T20:21:55.067900Z","shell.execute_reply":"2022-02-17T20:21:55.142217Z"},"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":"2022-02-17T20:22:47.586356Z","iopub.execute_input":"2022-02-17T20:22:47.586679Z","iopub.status.idle":"2022-02-17T20:22:48.562301Z","shell.execute_reply.started":"2022-02-17T20:22:47.586647Z","shell.execute_reply":"2022-02-17T20:22:48.561125Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 5 ème étape : Préparation et téléchargement de modèle","metadata":{}},{"cell_type":"code","source":"base_model = tf.keras.applications.ResNet152V2(input_shape=(224,224,3),include_top=False,weights=\"imagenet\")","metadata":{"execution":{"iopub.status.busy":"2022-02-17T20:23:26.877235Z","iopub.execute_input":"2022-02-17T20:23:26.877571Z","iopub.status.idle":"2022-02-17T20:23:36.681918Z","shell.execute_reply.started":"2022-02-17T20:23:26.877539Z","shell.execute_reply":"2022-02-17T20:23:36.680943Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"- Frezzing ","metadata":{}},{"cell_type":"code","source":"for layer in base_model.layers[:-10]:\n    layer.trainable=False","metadata":{"execution":{"iopub.status.busy":"2022-02-17T20:24:21.671362Z","iopub.execute_input":"2022-02-17T20:24:21.671733Z","iopub.status.idle":"2022-02-17T20:24:21.701981Z","shell.execute_reply.started":"2022-02-17T20:24:21.671700Z","shell.execute_reply":"2022-02-17T20:24:21.701052Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"- construction de modèle","metadata":{}},{"cell_type":"code","source":"model=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":"2022-02-17T20:25:52.267934Z","iopub.execute_input":"2022-02-17T20:25:52.268245Z","iopub.status.idle":"2022-02-17T20:25:53.646196Z","shell.execute_reply.started":"2022-02-17T20:25:52.268216Z","shell.execute_reply":"2022-02-17T20:25:53.645126Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"- visualisation de modèle","metadata":{}},{"cell_type":"code","source":"model.summary()","metadata":{"execution":{"iopub.status.busy":"2022-02-17T20:26:25.453364Z","iopub.execute_input":"2022-02-17T20:26:25.453675Z","iopub.status.idle":"2022-02-17T20:26:25.511083Z","shell.execute_reply.started":"2022-02-17T20:26:25.453645Z","shell.execute_reply":"2022-02-17T20:26:25.510126Z"},"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":"2022-02-17T20:26:48.025550Z","iopub.execute_input":"2022-02-17T20:26:48.025984Z","iopub.status.idle":"2022-02-17T20:26:49.040303Z","shell.execute_reply.started":"2022-02-17T20:26:48.025889Z","shell.execute_reply":"2022-02-17T20:26:49.039307Z"},"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-02-17T20:28:19.236659Z","iopub.execute_input":"2022-02-17T20:28:19.237006Z","iopub.status.idle":"2022-02-17T20:28:19.245993Z","shell.execute_reply.started":"2022-02-17T20:28:19.236969Z","shell.execute_reply":"2022-02-17T20:28:19.244540Z"},"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-02-17T20:28:42.211011Z","iopub.execute_input":"2022-02-17T20:28:42.211305Z","iopub.status.idle":"2022-02-17T20:28:42.241396Z","shell.execute_reply.started":"2022-02-17T20:28:42.211274Z","shell.execute_reply":"2022-02-17T20:28:42.240501Z"},"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('ResNet152V2.h5')\n\nes = EarlyStopping(verbose=1, patience=2)","metadata":{"execution":{"iopub.status.busy":"2022-02-17T20:28:58.109696Z","iopub.execute_input":"2022-02-17T20:28:58.110020Z","iopub.status.idle":"2022-02-17T20:28:58.116298Z","shell.execute_reply.started":"2022-02-17T20:28:58.109988Z","shell.execute_reply":"2022-02-17T20:28:58.114987Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.compile(optimizer='Adam', loss=\"categorical_crossentropy\", metrics=METRICS)","metadata":{"execution":{"iopub.status.busy":"2022-02-17T20:29:10.255246Z","iopub.execute_input":"2022-02-17T20:29:10.255552Z","iopub.status.idle":"2022-02-17T20:29:10.285822Z","shell.execute_reply.started":"2022-02-17T20:29:10.255519Z","shell.execute_reply":"2022-02-17T20:29:10.284879Z"},"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":"2022-02-17T20:29:24.097845Z","iopub.execute_input":"2022-02-17T20:29:24.098143Z","iopub.status.idle":"2022-02-17T20:29:24.103189Z","shell.execute_reply.started":"2022-02-17T20:29:24.098111Z","shell.execute_reply":"2022-02-17T20:29:24.102042Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(STEP_SIZE_TRAIN)\nprint(STEP_SIZE_VALID)","metadata":{"execution":{"iopub.status.busy":"2022-02-17T20:29:33.624478Z","iopub.execute_input":"2022-02-17T20:29:33.624765Z","iopub.status.idle":"2022-02-17T20:29:33.630896Z","shell.execute_reply.started":"2022-02-17T20:29:33.624735Z","shell.execute_reply":"2022-02-17T20:29:33.629905Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\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":"2022-02-17T20:30:05.959681Z","iopub.execute_input":"2022-02-17T20:30:05.960037Z","iopub.status.idle":"2022-02-17T21:27:21.518351Z","shell.execute_reply.started":"2022-02-17T20:30:05.960006Z","shell.execute_reply":"2022-02-17T21:27:21.515879Z"},"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":{"iopub.status.busy":"2022-02-17T21:28:37.416152Z","iopub.execute_input":"2022-02-17T21:28:37.417459Z","iopub.status.idle":"2022-02-17T21:28:39.192330Z","shell.execute_reply.started":"2022-02-17T21:28:37.417406Z","shell.execute_reply":"2022-02-17T21:28:39.191177Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## prédire les données d'entrainement","metadata":{}},{"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":{"iopub.status.busy":"2022-02-17T21:42:15.767587Z","iopub.execute_input":"2022-02-17T21:42:15.767903Z","iopub.status.idle":"2022-02-17T21:49:32.886086Z","shell.execute_reply.started":"2022-02-17T21:42:15.767856Z","shell.execute_reply":"2022-02-17T21:49:32.882962Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## matrice de confusion","metadata":{}},{"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":{"iopub.status.busy":"2022-02-17T21:36:58.217428Z","iopub.execute_input":"2022-02-17T21:36:58.218103Z","iopub.status.idle":"2022-02-17T21:36:58.248110Z","shell.execute_reply.started":"2022-02-17T21:36:58.218054Z","shell.execute_reply":"2022-02-17T21:36:58.246509Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## prédire les données de test","metadata":{}},{"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":{"iopub.status.busy":"2022-02-17T21:39:42.591236Z","iopub.execute_input":"2022-02-17T21:39:42.591524Z","iopub.status.idle":"2022-02-17T21:41:42.697440Z","shell.execute_reply.started":"2022-02-17T21:39:42.591494Z","shell.execute_reply":"2022-02-17T21:41:42.696429Z"},"trusted":true},"execution_count":null,"outputs":[]}]}