{"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":"markdown","source":"# Exercício 2\n\n**Francisco De Assis Marinho Aguiar**\n\n**Leandro da Cruz Farias**","metadata":{}},{"cell_type":"code","source":"# General Libs\nfrom tensorflow import keras\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator, load_img, img_to_array\nfrom tensorflow.keras.preprocessing import image\nfrom tensorflow.keras.models import Sequential, Model\nfrom tensorflow.keras.layers import GlobalAveragePooling2D, Dense, BatchNormalization, Dropout, Flatten, Conv2D, MaxPooling2D\nfrom tensorflow.keras.optimizers import Adam\nfrom tensorflow.keras.applications.inception_resnet_v2 import InceptionResNetV2, preprocess_input\nimport numpy as np\nimport random\nimport matplotlib.pyplot as plt\nimport pandas as pd\nimport matplotlib.image as mpimg\nimport json\nfrom tensorflow.keras.utils import to_categorical \nfrom sklearn.model_selection import train_test_split\nimport tensorflow as tf\nfrom PIL import Image\nimport os\n%matplotlib inline","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2021-09-25T11:45:57.208913Z","iopub.execute_input":"2021-09-25T11:45:57.209298Z","iopub.status.idle":"2021-09-25T11:45:57.222165Z","shell.execute_reply.started":"2021-09-25T11:45:57.209259Z","shell.execute_reply":"2021-09-25T11:45:57.221333Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dir_path = '../input/cassava-leaf-disease-classification'\ntrain_read = pd.read_csv(dir_path + \"/train.csv\", sep=',')\ntrain_read.head(5)","metadata":{"execution":{"iopub.status.busy":"2021-09-25T11:45:57.224245Z","iopub.execute_input":"2021-09-25T11:45:57.225031Z","iopub.status.idle":"2021-09-25T11:45:57.276442Z","shell.execute_reply.started":"2021-09-25T11:45:57.224972Z","shell.execute_reply":"2021-09-25T11:45:57.275796Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_dir_path = '../input/cassava-leaf-disease-classification/test_images'\ntest_file_path = '/2216849948.jpg'\ndata = {'image_id': ['2216849948.jpg']}\ntest_df = pd.DataFrame(data=data)\ntest_df.head()","metadata":{"execution":{"iopub.status.busy":"2021-09-25T12:31:38.604332Z","iopub.execute_input":"2021-09-25T12:31:38.605161Z","iopub.status.idle":"2021-09-25T12:31:38.614981Z","shell.execute_reply.started":"2021-09-25T12:31:38.605120Z","shell.execute_reply":"2021-09-25T12:31:38.614066Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"with open(dir_path + '/label_num_to_disease_map.json') as f:\n    labelnames = json.loads(f.read())\n    labelnames = {int(k): v for k,v in labelnames.items()}","metadata":{"execution":{"iopub.status.busy":"2021-09-25T11:45:57.277815Z","iopub.execute_input":"2021-09-25T11:45:57.278075Z","iopub.status.idle":"2021-09-25T11:45:57.287635Z","shell.execute_reply.started":"2021-09-25T11:45:57.278030Z","shell.execute_reply":"2021-09-25T11:45:57.286906Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_read['label'] = train_read['label'].astype('string')","metadata":{"execution":{"iopub.status.busy":"2021-09-25T11:45:57.289243Z","iopub.execute_input":"2021-09-25T11:45:57.289768Z","iopub.status.idle":"2021-09-25T11:45:57.323378Z","shell.execute_reply.started":"2021-09-25T11:45:57.289706Z","shell.execute_reply":"2021-09-25T11:45:57.322479Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_im_path = dir_path + '/train_images/'\nfig = plt.figure(figsize=(15, 10))\nnpics= 6\n\ncount = 1\nimage_list = train_read[train_read['label'] == str(list(labelnames.keys())[list(labelnames.values()).index('Healthy')])]['image_id'].sample(frac=1)[:npics].to_list()  \nfor i, img in enumerate(image_list):\n    \n    sample = os.path.join(train_im_path, img) \n    sample_img = Image.open(sample)   \n    ax = fig.add_subplot(npics/2 , 3, count, xticks=[],yticks=[])   \n    plt.imshow(sample_img)\n    count +=1\nfig.suptitle('Healthy')\nplt.tight_layout()\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2021-09-25T11:45:57.326318Z","iopub.execute_input":"2021-09-25T11:45:57.326638Z","iopub.status.idle":"2021-09-25T11:45:58.362636Z","shell.execute_reply.started":"2021-09-25T11:45:57.326602Z","shell.execute_reply":"2021-09-25T11:45:58.361376Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fig = plt.figure(figsize=(15, 10))\nnpics= 6\ncount = 1\nimage_list = train_read[train_read['label'] == str(list(labelnames.keys())[list(labelnames.values()).index('Cassava Bacterial Blight (CBB)')])]['image_id'].sample(frac=1)[:npics].to_list()  \nfor i, img in enumerate(image_list):\n    \n    sample = os.path.join(train_im_path, img) \n    sample_img = Image.open(sample)   \n    ax = fig.add_subplot(npics/2 , 3, count, xticks=[],yticks=[])   \n    plt.imshow(sample_img)\n    count +=1\nfig.suptitle('CBB')\nplt.tight_layout()\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2021-09-25T11:45:58.363615Z","iopub.execute_input":"2021-09-25T11:45:58.363850Z","iopub.status.idle":"2021-09-25T11:45:59.221205Z","shell.execute_reply.started":"2021-09-25T11:45:58.363821Z","shell.execute_reply":"2021-09-25T11:45:59.215502Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"target_size = (300, 300)\ninput_shape = (300, 300, 3)\nbatch_size = 64\nseed = 10\nepochs = 3","metadata":{"execution":{"iopub.status.busy":"2021-09-25T12:42:11.843532Z","iopub.execute_input":"2021-09-25T12:42:11.843813Z","iopub.status.idle":"2021-09-25T12:42:11.849546Z","shell.execute_reply.started":"2021-09-25T12:42:11.843783Z","shell.execute_reply":"2021-09-25T12:42:11.848644Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"datagen = ImageDataGenerator(validation_split=0.2)\nval_data_generator = ImageDataGenerator(validation_split=0.2)\n\ntrain_generator = datagen.flow_from_dataframe(train_read,\n                                              directory=train_im_path,\n                                              x_col=\"image_id\",\n                                              y_col=\"label\",\n                                              target_size=target_size,\n                                              batch_size=batch_size,\n                                              shuffle=True, \n                                              seed=seed,\n                                              class_mode=\"categorical\",\n                                              subset=\"training\",)\n\nval_generator = val_data_generator.flow_from_dataframe(train_read,\n                                            directory=train_im_path,\n                                            x_col=\"image_id\",\n                                            y_col=\"label\",\n                                            target_size=target_size,\n                                            batch_size=batch_size,\n                                            shuffle=True, \n                                            seed=seed,\n                                            class_mode=\"categorical\",\n                                            subset=\"validation\",)\n\nclasses = list(train_generator.class_indices.keys())\nprint('Classes: '+str(classes))\nnum_classes  = len(classes)","metadata":{"execution":{"iopub.status.busy":"2021-09-25T11:45:59.229147Z","iopub.execute_input":"2021-09-25T11:45:59.229405Z","iopub.status.idle":"2021-09-25T11:46:18.999949Z","shell.execute_reply.started":"2021-09-25T11:45:59.229364Z","shell.execute_reply":"2021-09-25T11:46:18.999203Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = Sequential()\nmodel.add(Conv2D(40, kernel_size=(3, 3),\n                 activation='relu',\n                 input_shape=(input_shape)))\nmodel.add(MaxPooling2D(pool_size=(2, 2)))\nmodel.add(Conv2D(80, kernel_size=(3,3), activation='relu'))\nmodel.add(Flatten())\nmodel.add(Dense(100, 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-09-25T11:46:19.001242Z","iopub.execute_input":"2021-09-25T11:46:19.001659Z","iopub.status.idle":"2021-09-25T11:46:20.958626Z","shell.execute_reply.started":"2021-09-25T11:46:19.001621Z","shell.execute_reply":"2021-09-25T11:46:20.957937Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#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=10,verbose=1)\n]\n\n#Training\n\nhistory = model.fit(\n        train_generator,\n        steps_per_epoch=train_generator.samples // batch_size,\n        epochs=epochs,\n        callbacks = callbacks_list,\n        validation_data=val_generator,\n        verbose = 1,\n        validation_steps=val_generator.samples // batch_size)\n","metadata":{"execution":{"iopub.status.busy":"2021-09-25T11:46:20.959697Z","iopub.execute_input":"2021-09-25T11:46:20.959965Z","iopub.status.idle":"2021-09-25T11:58:29.027619Z","shell.execute_reply.started":"2021-09-25T11:46:20.959932Z","shell.execute_reply":"2021-09-25T11:58:29.026742Z"},"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(1, len(acc) + 1)\n\nfig = plt.figure(figsize=(15, 5))\nfig.add_subplot(121)\n\nplt.plot(epochs_range, acc, linestyle='--', label = \"Training acc\")\nplt.plot(epochs_range, val_acc, linestyle='-.', label = \"Validation acc\")\nplt.title(\"Training and validation acc\")\nplt.legend()\n\nfig.add_subplot(122)\nplt.plot(epochs_range, loss, linestyle='--', label = \"Training loss\", alpha=0.8)\nplt.plot(epochs_range, val_loss, linestyle='-.', label = \"Validation loss\", alpha=0.6)\nplt.title(\"Training and validation loss\")\nplt.legend()\n\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2021-09-25T11:58:29.031592Z","iopub.execute_input":"2021-09-25T11:58:29.031944Z","iopub.status.idle":"2021-09-25T11:58:29.525951Z","shell.execute_reply.started":"2021-09-25T11:58:29.031901Z","shell.execute_reply":"2021-09-25T11:58:29.525162Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Load the best saved model\nfrom tensorflow.keras.models import load_model\nmodel = load_model(\"model.h5\")\nscore = model.evaluate(val_generator)","metadata":{"execution":{"iopub.status.busy":"2021-09-25T11:59:11.887601Z","iopub.execute_input":"2021-09-25T11:59:11.887902Z","iopub.status.idle":"2021-09-25T11:59:58.245021Z","shell.execute_reply.started":"2021-09-25T11:59:11.887860Z","shell.execute_reply":"2021-09-25T11:59:58.244339Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print('Val loss:', score[0])\nprint('Val accuracy:', score[1])","metadata":{"execution":{"iopub.status.busy":"2021-09-25T11:59:58.248241Z","iopub.execute_input":"2021-09-25T11:59:58.248457Z","iopub.status.idle":"2021-09-25T11:59:58.254233Z","shell.execute_reply.started":"2021-09-25T11:59:58.248432Z","shell.execute_reply":"2021-09-25T11:59:58.253317Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission_df = pd.read_csv(\"../input/cassava-leaf-disease-classification/sample_submission.csv\")\nsubmission_df.head()","metadata":{"execution":{"iopub.status.busy":"2021-09-25T11:59:58.256038Z","iopub.execute_input":"2021-09-25T11:59:58.256803Z","iopub.status.idle":"2021-09-25T11:59:58.275438Z","shell.execute_reply.started":"2021-09-25T11:59:58.256766Z","shell.execute_reply":"2021-09-25T11:59:58.274687Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"preds = []\n# preds_no_argmax = []\n\n\ntest_images = os.listdir('/kaggle/input/cassava-leaf-disease-classification/test_images/')\npreds = []\n\nfor i in test_images:\n    image = Image.open(f'/kaggle/input/cassava-leaf-disease-classification/test_images/{i}')\n    image = image.resize(target_size)\n    image = np.expand_dims(image, axis=0)\n    preds.append(np.argmax(model.predict(image)))\n\ndf_sub = pd.DataFrame({'image_id': test_images, 'label': preds})\ndf_sub.head()\ndf_sub.to_csv(\"submission.csv\", index=None)","metadata":{"execution":{"iopub.status.busy":"2021-09-25T11:59:58.276666Z","iopub.execute_input":"2021-09-25T11:59:58.277159Z","iopub.status.idle":"2021-09-25T11:59:58.480481Z","shell.execute_reply.started":"2021-09-25T11:59:58.277126Z","shell.execute_reply":"2021-09-25T11:59:58.479806Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Transferência de aprendizagem","metadata":{}},{"cell_type":"code","source":"base_model = InceptionResNetV2(weights='imagenet', include_top=False, input_shape=input_shape)\n\nx = base_model.output\nx = Flatten()(x)\nx = Dense(100, activation='relu')(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-09-25T12:41:29.063400Z","iopub.execute_input":"2021-09-25T12:41:29.063679Z","iopub.status.idle":"2021-09-25T12:41:33.754041Z","shell.execute_reply.started":"2021-09-25T12:41:29.063649Z","shell.execute_reply":"2021-09-25T12:41:33.753297Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Saving the best model\ncallbacks_list = [\n    keras.callbacks.ModelCheckpoint(\n        filepath='model_transfer.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=train_generator.samples // batch_size,\n        epochs=epochs,\n        callbacks = callbacks_list,\n        validation_data=val_generator,\n        verbose = 1,\n        validation_steps=val_generator.samples // batch_size)","metadata":{"execution":{"iopub.status.busy":"2021-09-25T12:42:23.071933Z","iopub.execute_input":"2021-09-25T12:42:23.072798Z","iopub.status.idle":"2021-09-25T12:54:40.414230Z","shell.execute_reply.started":"2021-09-25T12:42:23.072750Z","shell.execute_reply":"2021-09-25T12:54:40.413342Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"history_dict = history.history\nloss_values = history_dict['loss']\nval_loss_values = history_dict['val_loss']\n\nepochs_x = range(1, len(loss_values) + 1)\nplt.figure(figsize=(10,10))\nplt.subplot(2,1,1)\nplt.plot(epochs_x, loss_values, 'bo', label='Training loss')\nplt.plot(epochs_x, val_loss_values, 'b', label='Validation loss')\nplt.title('Training and validation Loss and Accuracy')\nplt.xlabel('Epochs')\nplt.ylabel('Loss')\n#plt.legend()\nplt.subplot(2,1,2)\nacc_values = history_dict['accuracy']\nval_acc_values = history_dict['val_accuracy']\nplt.plot(epochs_x, acc_values, 'bo', label='Training acc')\nplt.plot(epochs_x, val_acc_values, 'b', label='Validation acc')\n#plt.title('Training and validation accuracy')\nplt.xlabel('Epochs')\nplt.ylabel('Acc')\nplt.legend()\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2021-09-25T12:54:43.936566Z","iopub.execute_input":"2021-09-25T12:54:43.936848Z","iopub.status.idle":"2021-09-25T12:54:44.312153Z","shell.execute_reply.started":"2021-09-25T12:54:43.936817Z","shell.execute_reply":"2021-09-25T12:54:44.311419Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = load_model('model_transfer.h5')\nscore = model.evaluate(val_generator)\nprint('Val loss:', score[0])\nprint('Val accuracy:', score[1])","metadata":{"execution":{"iopub.status.busy":"2021-09-25T12:54:49.071208Z","iopub.execute_input":"2021-09-25T12:54:49.071489Z","iopub.status.idle":"2021-09-25T12:55:46.781719Z","shell.execute_reply.started":"2021-09-25T12:54:49.071458Z","shell.execute_reply":"2021-09-25T12:55:46.781036Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}