{"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":"# General Libs\nfrom tensorflow import keras\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom tensorflow.keras.preprocessing import image\nfrom tensorflow.keras.applications.inception_v3 import InceptionV3, preprocess_input\nfrom tensorflow.keras.applications.densenet import DenseNet121\nfrom tensorflow.keras.applications.inception_resnet_v2 import InceptionResNetV2, preprocess_input\nfrom tensorflow.keras.layers import GlobalAveragePooling2D, Dense, BatchNormalization, Dropout, Flatten, Conv2D, MaxPooling2D\nfrom tensorflow.keras.models import Sequential, Model, load_model\nfrom tensorflow.keras.optimizers import Adam\nimport numpy as np\nimport pandas as pd\nimport random\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nimport cv2\n%matplotlib inline","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2021-10-30T19:32:02.181559Z","iopub.execute_input":"2021-10-30T19:32:02.181812Z","iopub.status.idle":"2021-10-30T19:32:07.683277Z","shell.execute_reply.started":"2021-10-30T19:32:02.181784Z","shell.execute_reply":"2021-10-30T19:32:07.682303Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Detecção de retinopatia diabética para evitar cegueira**\n\n![](https://raw.githubusercontent.com/dimitreOliveira/MachineLearning/master/Kaggle/APTOS%202019%20Blindness%20Detection/aux_img.png)\n\n\n**Legend**\n* 0 - No DR\n* 1 - Mild\n* 2 - Moderate\n* 3 - Severe\n* 4 - Proliferative DR","metadata":{}},{"cell_type":"code","source":"def import_api_key(user, key):\n    !touch kaggle.json\n    !echo '{\"username\":\"'+user+'\",\"key\":\"'+key+'\"}' > ./kaggle.json\n    !mkdir -p ~/.kaggle/ && mv kaggle.json ~/.kaggle/ && chmod 600 ~/.kaggle/kaggle.json\n    !ls -la ~/.kaggle/\n    from kaggle.api.kaggle_api_extended import KaggleApi\n    \nimport_api_key('eberthfelipe', '')    ","metadata":{"execution":{"iopub.status.busy":"2021-10-29T03:18:58.397573Z","iopub.execute_input":"2021-10-29T03:18:58.398723Z","iopub.status.idle":"2021-10-29T03:19:01.71016Z","shell.execute_reply.started":"2021-10-29T03:18:58.398642Z","shell.execute_reply":"2021-10-29T03:19:01.708606Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Load Dataset","metadata":{}},{"cell_type":"code","source":"!ls -la ../input/aptos2019-blindness-detection/","metadata":{"execution":{"iopub.status.busy":"2021-10-30T03:06:26.826321Z","iopub.execute_input":"2021-10-30T03:06:26.826854Z","iopub.status.idle":"2021-10-30T03:06:27.821053Z","shell.execute_reply.started":"2021-10-30T03:06:26.826818Z","shell.execute_reply":"2021-10-30T03:06:27.819936Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"TRAINING_DIR = '../input/aptos2019-blindness-detection/train_images'\nTEST_DIR = '../input/aptos2019-blindness-detection/test_images'\nBATCH_SIZE = 64\n#seed = 10\nim_shape = (512,512)\n\n\n#Datasets path\ndf_train_path = '../input/aptos2019-blindness-detection/train.csv'\ndf_test_path = '../input/aptos2019-blindness-detection/test.csv'\n\ndf_train = pd.read_csv(df_train_path)\ndf_test = pd.read_csv(df_test_path)","metadata":{"execution":{"iopub.status.busy":"2021-10-30T19:32:09.942820Z","iopub.execute_input":"2021-10-30T19:32:09.943115Z","iopub.status.idle":"2021-10-30T19:32:09.974851Z","shell.execute_reply.started":"2021-10-30T19:32:09.943083Z","shell.execute_reply":"2021-10-30T19:32:09.974207Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Reference: https://www.kaggle.com/shubhamgajbhiye/aptos-blindness-detection-eda-and-keras-resnet50\nsns.set_style(\"white\")\ncount = 1\nplt.figure(figsize=[20, 20])\nfor img_name in df_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-10-30T03:06:59.544566Z","iopub.execute_input":"2021-10-30T03:06:59.545062Z","iopub.status.idle":"2021-10-30T03:07:12.578036Z","shell.execute_reply.started":"2021-10-30T03:06:59.545026Z","shell.execute_reply":"2021-10-30T03:07:12.577145Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Initial View","metadata":{}},{"cell_type":"code","source":"df_train.head()","metadata":{"execution":{"iopub.status.busy":"2021-10-30T03:07:12.579603Z","iopub.execute_input":"2021-10-30T03:07:12.579890Z","iopub.status.idle":"2021-10-30T03:07:12.598352Z","shell.execute_reply.started":"2021-10-30T03:07:12.579851Z","shell.execute_reply":"2021-10-30T03:07:12.597499Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_train.info()","metadata":{"execution":{"iopub.status.busy":"2021-10-30T03:07:12.599927Z","iopub.execute_input":"2021-10-30T03:07:12.600485Z","iopub.status.idle":"2021-10-30T03:07:12.626793Z","shell.execute_reply.started":"2021-10-30T03:07:12.600426Z","shell.execute_reply":"2021-10-30T03:07:12.625267Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Change type of `id_code` and `diagnosis` to string","metadata":{}},{"cell_type":"code","source":"df_train['diagnosis'] = df_train['diagnosis'].astype(str)\ndf_train['id_code'] = df_train['id_code'].astype(str)+'.png'\n\ndf_test['id_code'] = df_test['id_code'].astype(str)+'.png'","metadata":{"execution":{"iopub.status.busy":"2021-10-30T19:32:16.949392Z","iopub.execute_input":"2021-10-30T19:32:16.949871Z","iopub.status.idle":"2021-10-30T19:32:17.115601Z","shell.execute_reply.started":"2021-10-30T19:32:16.949838Z","shell.execute_reply":"2021-10-30T19:32:17.114698Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Data Augumentation ","metadata":{}},{"cell_type":"code","source":"# With augmentation\ndata_generator = ImageDataGenerator(\n        rescale=1./255,\n        validation_split=0.2,\n        #rotation_range=20,\n        #width_shift_range=0.2,\n        #height_shift_range=0.2,\n        #preprocessing_function=preprocess_input,\n        #shear_range=0.2,\n        zoom_range=0.2,\n        horizontal_flip=True,\n        vertical_flip=True,\n        #fill_mode='nearest'\n)\nval_data_generator = ImageDataGenerator(\n    #preprocessing_function=preprocess_input,\n    validation_split=0.2,\n    rescale=1./255\n)","metadata":{"execution":{"iopub.status.busy":"2021-10-30T19:32:22.894574Z","iopub.execute_input":"2021-10-30T19:32:22.894830Z","iopub.status.idle":"2021-10-30T19:32:22.899865Z","shell.execute_reply.started":"2021-10-30T19:32:22.894801Z","shell.execute_reply":"2021-10-30T19:32:22.899174Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Reference: https://colab.research.google.com/github/drprajapati/APTOS-2019-Blindness-Detection/blob/master/APTOS_Blindness_Detection_Preprocessing.ipynb#scrollTo=siy27T6ig6q4","metadata":{}},{"cell_type":"code","source":"# Generator para parte train\ntrain_generator = data_generator.flow_from_dataframe(directory=TRAINING_DIR, target_size=im_shape, shuffle=True,\n                                                     class_mode='categorical', batch_size=BATCH_SIZE,\n                                                     dataframe=df_train, x_col='id_code', y_col='diagnosis'\n                                                    )\n# Generator para parte validação\nvalidation_generator = val_data_generator.flow_from_dataframe(directory=TRAINING_DIR, target_size=im_shape, shuffle=False,\n                                                              class_mode='categorical', batch_size=BATCH_SIZE, \n                                                              dataframe=df_train, x_col='id_code', y_col='diagnosis'\n                                                             )\n\n# Generator para dataset de teste\ntest_generator = ImageDataGenerator(rescale=1./255)\ntest_generator = test_generator.flow_from_dataframe(directory=TEST_DIR, target_size=im_shape, shuffle=False,\n                                                    class_mode=None, batch_size=BATCH_SIZE,\n                                                    dataframe=df_test, x_col='id_code'#, y_col='diagnosis'\n                                                   )\n\nnb_train_samples = train_generator.samples\nnb_validation_samples = validation_generator.samples\nnb_test_samples = test_generator.samples\nclasses = list(train_generator.class_indices.keys())\nprint('Classes: '+str(classes))\nnum_classes  = len(classes)","metadata":{"execution":{"iopub.status.busy":"2021-10-30T19:32:32.971655Z","iopub.execute_input":"2021-10-30T19:32:32.971921Z","iopub.status.idle":"2021-10-30T19:32:41.019646Z","shell.execute_reply.started":"2021-10-30T19:32:32.971891Z","shell.execute_reply":"2021-10-30T19:32:41.018892Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Visualizando alguns exemplos do dataset por meio do Generator criado\nplt.figure(figsize=(15,15))\nfor i in range(9):\n    #gera subfigures\n    plt.subplot(330 + 1 + i)\n    batch = train_generator.next()[0]*255\n    image = batch[0].astype('uint8')\n    plt.imshow(image)\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2021-10-30T03:08:28.661587Z","iopub.execute_input":"2021-10-30T03:08:28.661877Z","iopub.status.idle":"2021-10-30T03:10:26.681236Z","shell.execute_reply.started":"2021-10-30T03:08:28.661846Z","shell.execute_reply":"2021-10-30T03:10:26.680383Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Create Simple Model","metadata":{}},{"cell_type":"code","source":"model = Sequential()\nmodel.add(Conv2D(20, kernel_size=(3, 3),\n                 activation='relu',\n                 input_shape=(im_shape[0],im_shape[1],3)))\nmodel.add(MaxPooling2D(pool_size=(2, 2)))\nmodel.add(Conv2D(15, kernel_size=(3,3), activation='relu'))\nmodel.add(MaxPooling2D(pool_size=(2, 2)))\nmodel.add(Conv2D(10, kernel_size=(3,3), activation='selu'))\nmodel.add(Flatten())\nmodel.add(Dense(50, activation='relu'))\nmodel.add(Dropout(0.2))\nmodel.add(Dense(num_classes, activation='softmax'))\nmodel.summary()\n\n# Compila o modelo\nmodel.compile(loss='categorical_crossentropy',\n              optimizer=Adam(),\n              metrics=['accuracy'])","metadata":{"execution":{"iopub.status.busy":"2021-10-30T19:32:47.316914Z","iopub.execute_input":"2021-10-30T19:32:47.317164Z","iopub.status.idle":"2021-10-30T19:32:49.880475Z","shell.execute_reply.started":"2021-10-30T19:32:47.317137Z","shell.execute_reply":"2021-10-30T19:32:49.879709Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"epochs = 6\n\n#Callback to save the best model\ncallbacks_list = [\n    keras.callbacks.ModelCheckpoint(\n        filepath='model.h5',\n        monitor='val_loss', save_best_only=True, verbose=1),\n    keras.callbacks.EarlyStopping(monitor='val_loss', patience=2,verbose=1)\n]\n\n#Training\nhistory = model.fit(\n        train_generator,\n        steps_per_epoch=nb_train_samples // BATCH_SIZE,\n        epochs=epochs,\n        callbacks = callbacks_list,\n        validation_data=validation_generator,\n        verbose = 1,\n        validation_steps=nb_validation_samples // BATCH_SIZE)","metadata":{"execution":{"iopub.status.busy":"2021-10-29T12:22:20.131999Z","iopub.execute_input":"2021-10-29T12:22:20.132266Z","iopub.status.idle":"2021-10-29T14:50:15.511155Z","shell.execute_reply.started":"2021-10-29T12:22:20.132238Z","shell.execute_reply":"2021-10-29T14:50:15.504794Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def plot_curves(history_param):\n    # Training curves\n    history_dict = history_param.history\n    loss_values = history_dict['loss']\n    val_loss_values = history_dict['val_loss']\n\n    epochs_x = range(1, len(loss_values) + 1)\n    plt.figure(figsize=(10,10))\n    plt.subplot(2,1,1)\n    plt.plot(epochs_x, loss_values, 'bo', label='Training loss')\n    plt.plot(epochs_x, val_loss_values, 'b', label='Validation loss')\n    plt.title('Training and validation Loss and Accuracy')\n    plt.xlabel('Epochs')\n    plt.ylabel('Loss')\n    plt.legend()\n    plt.subplot(2,1,2)\n    acc_values = history_dict['accuracy']\n    val_acc_values = history_dict['val_accuracy']\n    plt.plot(epochs_x, acc_values, 'bo', label='Training acc')\n    plt.plot(epochs_x, val_acc_values, 'b', label='Validation acc')\n    #plt.title('Training and validation accuracy')\n    plt.xlabel('Epochs')\n    plt.ylabel('Acc')\n    plt.legend()\n    plt.show()\n    \n\n","metadata":{"execution":{"iopub.status.busy":"2021-10-30T19:33:00.514552Z","iopub.execute_input":"2021-10-30T19:33:00.514809Z","iopub.status.idle":"2021-10-30T19:33:00.522382Z","shell.execute_reply.started":"2021-10-30T19:33:00.514772Z","shell.execute_reply":"2021-10-30T19:33:00.521706Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plot_curves(history)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def view_result():\n    # Load the best saved model\n    model = load_model('model.h5')\n\n    # Using the validation dataset\n    score = model.evaluate(validation_generator)\n    print('Val loss:', score[0])\n    print('Val accuracy:', score[1])\n\n    # Using the test dataset\n    score = model.evaluate(test_generator)\n    print('Test loss:', score[0])\n    print('Test accuracy:', score[1])\n    \n","metadata":{"execution":{"iopub.status.busy":"2021-10-30T19:33:08.672628Z","iopub.execute_input":"2021-10-30T19:33:08.673307Z","iopub.status.idle":"2021-10-30T19:33:08.680447Z","shell.execute_reply.started":"2021-10-30T19:33:08.673262Z","shell.execute_reply":"2021-10-30T19:33:08.677385Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"view_result()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Transfer Learning from a Deep Model","metadata":{}},{"cell_type":"code","source":"base_model = DenseNet121(weights='imagenet', include_top=False, input_shape=(im_shape[0], im_shape[1], 3))\n\nx = base_model.output\nx = MaxPooling2D(pool_size=(2, 2))(x)\nx = Conv2D(30, kernel_size=(3,3), activation='selu')(x)\nx = Flatten()(x)\nx = Dense(70, activation='selu')(x)\npredictions = Dense(num_classes, activation='softmax', kernel_initializer='random_uniform')(x)\n\nmodel = Model(inputs=base_model.input, outputs=predictions)\n\n# Freezing pretrained layers\nfor layer in base_model.layers:\n    layer.trainable=False\n    \noptimizer = Adam()\nmodel.compile(optimizer=optimizer,loss='categorical_crossentropy',metrics=['accuracy'])","metadata":{"execution":{"iopub.status.busy":"2021-10-30T19:33:36.504187Z","iopub.execute_input":"2021-10-30T19:33:36.504459Z","iopub.status.idle":"2021-10-30T19:33:39.395182Z","shell.execute_reply.started":"2021-10-30T19:33:36.504429Z","shell.execute_reply":"2021-10-30T19:33:39.394470Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"epochs = 10\n\n# Saving the best model\ncallbacks_list = [\n    keras.callbacks.ModelCheckpoint(\n        filepath='model.h5',\n        monitor='val_loss', save_best_only=True, verbose=1),\n    keras.callbacks.EarlyStopping(monitor='val_loss', patience=2,verbose=1)\n]\n\nhistory = model.fit(\n        train_generator,\n        steps_per_epoch=nb_train_samples // BATCH_SIZE,\n        epochs=epochs,\n        callbacks = callbacks_list,\n        validation_data=validation_generator,\n        verbose = 1,\n        validation_steps=nb_validation_samples // BATCH_SIZE)","metadata":{"execution":{"iopub.status.busy":"2021-10-30T19:33:56.307828Z","iopub.execute_input":"2021-10-30T19:33:56.308078Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plot_curves(history)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"view_result()","metadata":{"trusted":true},"execution_count":null,"outputs":[]}]}