{"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, 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\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\n%matplotlib inline","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2021-09-25T00:57:13.126648Z","iopub.execute_input":"2021-09-25T00:57:13.127019Z","iopub.status.idle":"2021-09-25T00:57:19.12519Z","shell.execute_reply.started":"2021-09-25T00:57:13.126933Z","shell.execute_reply":"2021-09-25T00:57:19.124218Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"im_shape = (250,250)\n\nTRAINING_DIR = '../input/cassava-leaf-disease-classification/train_images/'\nTEST_DIR = '../input/cassava-leaf-disease-classification/test_images/'\n\nseed = 10\n\nBATCH_SIZE = 16","metadata":{"execution":{"iopub.status.busy":"2021-09-25T00:57:19.128966Z","iopub.execute_input":"2021-09-25T00:57:19.130653Z","iopub.status.idle":"2021-09-25T00:57:19.13519Z","shell.execute_reply.started":"2021-09-25T00:57:19.129491Z","shell.execute_reply":"2021-09-25T00:57:19.134631Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Using keras ImageGenerator and flow_from_directoty\n\n# Subdivision in test/validation\ndata_generator = ImageDataGenerator(rescale=1./255, validation_split=0.2)\nval_data_generator = ImageDataGenerator(rescale=1./255, validation_split=0.2)","metadata":{"execution":{"iopub.status.busy":"2021-09-25T00:57:19.136284Z","iopub.execute_input":"2021-09-25T00:57:19.136791Z","iopub.status.idle":"2021-09-25T00:57:19.14547Z","shell.execute_reply.started":"2021-09-25T00:57:19.136762Z","shell.execute_reply":"2021-09-25T00:57:19.144628Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# If you want data augmentation, uncomment and run this cell\ndata_generator = ImageDataGenerator(\n        validation_split=0.2,\n        rotation_range=20,\n        width_shift_range=0.2,\n        height_shift_range=0.2,\n        rescale=1./255,\n        shear_range=0.2,\n        zoom_range=0.2,\n        horizontal_flip=True,\n        fill_mode='nearest')\n\nval_data_generator = ImageDataGenerator(rescale=1./255, validation_split=0.2)","metadata":{"execution":{"iopub.status.busy":"2021-09-25T00:57:19.149557Z","iopub.execute_input":"2021-09-25T00:57:19.150402Z","iopub.status.idle":"2021-09-25T00:57:19.156761Z","shell.execute_reply.started":"2021-09-25T00:57:19.150355Z","shell.execute_reply":"2021-09-25T00:57:19.156186Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df = pd.read_csv(\"../input/cassava-leaf-disease-classification/train.csv\")\ntrain_df.head()","metadata":{"execution":{"iopub.status.busy":"2021-09-25T00:57:19.157567Z","iopub.execute_input":"2021-09-25T00:57:19.158047Z","iopub.status.idle":"2021-09-25T00:57:19.211456Z","shell.execute_reply.started":"2021-09-25T00:57:19.158018Z","shell.execute_reply":"2021-09-25T00:57:19.210505Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df.info()","metadata":{"execution":{"iopub.status.busy":"2021-09-25T00:57:19.212716Z","iopub.execute_input":"2021-09-25T00:57:19.212912Z","iopub.status.idle":"2021-09-25T00:57:19.23588Z","shell.execute_reply.started":"2021-09-25T00:57:19.21289Z","shell.execute_reply":"2021-09-25T00:57:19.23507Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fig = plt.gcf()\nfig.set_size_inches(32, 32)\n\ntrain_images = train_df['image_id'][0:8]\n\nfor index, img_path in enumerate(train_images):\n    \n    image = plt.subplot(4, 4, index + 1)\n    image.axis('Off')\n\n    img = mpimg.imread(TRAINING_DIR + img_path)\n    plt.imshow(img)\n\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2021-09-25T00:57:19.238362Z","iopub.execute_input":"2021-09-25T00:57:19.239189Z","iopub.status.idle":"2021-09-25T00:57:21.186473Z","shell.execute_reply.started":"2021-09-25T00:57:19.23914Z","shell.execute_reply":"2021-09-25T00:57:21.185049Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Generator para parte train\ntrain_generator = data_generator.flow_from_directory(TRAINING_DIR, target_size=im_shape, shuffle=True, seed=seed,\n                                                     batch_size=BATCH_SIZE, subset=\"training\")\n# Generator para parte validação\nvalidation_generator = val_data_generator.flow_from_directory(TRAINING_DIR, target_size=im_shape, shuffle=False, seed=seed,\n                                                     batch_size=BATCH_SIZE, subset=\"validation\")\n\n# Generator para dataset de teste\ntest_generator = ImageDataGenerator(rescale=1./255)\ntest_generator = test_generator.flow_from_directory(TEST_DIR, target_size=im_shape, shuffle=False, seed=seed,\n                                                     batch_size=BATCH_SIZE)\nprint(type(train_generator))\n#nb_train_samples = train_generator.samples\n#nb_validation_samples = validation_generator.samples\n#nb_test_samples = test_generator.samples\n#classes = list(train_generator.class_indices.keys())\n#print('Classes: '+str(classes))\n#num_classes  = len(classes)\n","metadata":{"execution":{"iopub.status.busy":"2021-09-25T00:57:21.188307Z","iopub.execute_input":"2021-09-25T00:57:21.189011Z","iopub.status.idle":"2021-09-25T00:58:31.920548Z","shell.execute_reply.started":"2021-09-25T00:57:21.188954Z","shell.execute_reply":"2021-09-25T00:58:31.919858Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_generator.samples","metadata":{"execution":{"iopub.status.busy":"2021-09-25T00:58:31.92147Z","iopub.execute_input":"2021-09-25T00:58:31.921676Z","iopub.status.idle":"2021-09-25T00:58:31.927527Z","shell.execute_reply.started":"2021-09-25T00:58:31.921654Z","shell.execute_reply":"2021-09-25T00:58:31.926634Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"f = open(\"../input/cassava-leaf-disease-classification/label_num_to_disease_map.json\",\"r\")\ndata = json.load(f)\ndata['1']","metadata":{"execution":{"iopub.status.busy":"2021-09-25T00:58:31.9301Z","iopub.execute_input":"2021-09-25T00:58:31.930331Z","iopub.status.idle":"2021-09-25T00:58:31.946196Z","shell.execute_reply.started":"2021-09-25T00:58:31.930308Z","shell.execute_reply":"2021-09-25T00:58:31.945127Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_data = []\nY_data = []\n\nfor i in range(0,600):\n    image = load_img(TRAINING_DIR + train_df['image_id'][i])\n    X_data.append(img_to_array(image))\n    Y_data.append(train_df['label'][i])\n    \nX_data = np.array(X_data)","metadata":{"execution":{"iopub.status.busy":"2021-09-25T00:58:31.947489Z","iopub.execute_input":"2021-09-25T00:58:31.947778Z","iopub.status.idle":"2021-09-25T00:58:48.128626Z","shell.execute_reply.started":"2021-09-25T00:58:31.947748Z","shell.execute_reply":"2021-09-25T00:58:48.127742Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"Y_data[0:10]","metadata":{"execution":{"iopub.status.busy":"2021-09-25T00:58:48.130128Z","iopub.execute_input":"2021-09-25T00:58:48.130571Z","iopub.status.idle":"2021-09-25T00:58:48.136491Z","shell.execute_reply.started":"2021-09-25T00:58:48.13054Z","shell.execute_reply":"2021-09-25T00:58:48.135624Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"Y_data = to_categorical(Y_data, num_classes = 5)\nY_data.shape","metadata":{"execution":{"iopub.status.busy":"2021-09-25T00:58:48.137728Z","iopub.execute_input":"2021-09-25T00:58:48.137979Z","iopub.status.idle":"2021-09-25T00:58:48.150391Z","shell.execute_reply.started":"2021-09-25T00:58:48.137953Z","shell.execute_reply":"2021-09-25T00:58:48.149374Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"Y_data","metadata":{"execution":{"iopub.status.busy":"2021-09-25T00:58:48.152077Z","iopub.execute_input":"2021-09-25T00:58:48.152587Z","iopub.status.idle":"2021-09-25T00:58:48.160969Z","shell.execute_reply.started":"2021-09-25T00:58:48.152552Z","shell.execute_reply":"2021-09-25T00:58:48.160095Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_train, X_val, Y_train, Y_val = train_test_split(X_data, Y_data, test_size = 0.2, random_state=3)","metadata":{"execution":{"iopub.status.busy":"2021-09-25T00:58:48.162147Z","iopub.execute_input":"2021-09-25T00:58:48.162708Z","iopub.status.idle":"2021-09-25T00:58:50.103523Z","shell.execute_reply.started":"2021-09-25T00:58:48.162657Z","shell.execute_reply":"2021-09-25T00:58:50.102901Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(X_train.shape)\nprint(X_val.shape)\nprint(Y_train.shape)\nprint(Y_val.shape)","metadata":{"execution":{"iopub.status.busy":"2021-09-25T00:58:50.104799Z","iopub.execute_input":"2021-09-25T00:58:50.105056Z","iopub.status.idle":"2021-09-25T00:58:50.110356Z","shell.execute_reply.started":"2021-09-25T00:58:50.105028Z","shell.execute_reply":"2021-09-25T00:58:50.109533Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"num_classes = 5\nmodel = Sequential()\nmodel.add(Conv2D(16, kernel_size=(3, 3),\n                 activation='relu',\n                 input_shape = (600,800,3)))\nmodel.add(MaxPooling2D(pool_size=(2, 2)))\nmodel.add(Conv2D(16, kernel_size=(3,3), activation='relu'))\nmodel.add(Flatten())\nmodel.add(Dense(64, 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=['acc'])","metadata":{"execution":{"iopub.status.busy":"2021-09-25T00:58:50.111484Z","iopub.execute_input":"2021-09-25T00:58:50.111718Z","iopub.status.idle":"2021-09-25T00:58:50.94947Z","shell.execute_reply.started":"2021-09-25T00:58:50.111679Z","shell.execute_reply":"2021-09-25T00:58:50.948525Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"epochs = 20\nbatch_size = 8\n#Callback to save the best model\ncallbacks_list = [\n    keras.callbacks.ModelCheckpoint(\n        filepath='model.h5',\n        monitor='val_acc', save_best_only=True, verbose=1),\n    keras.callbacks.EarlyStopping(monitor='val_loss', patience=10,verbose=1)\n]\n\n#Training\nhistory = model.fit(\n        train_generator,\n        steps_per_epoch=4,\n        epochs=epochs,\n        callbacks = callbacks_list,\n        validation_data=validation_generator\n        )","metadata":{"execution":{"iopub.status.busy":"2021-09-25T00:58:50.950664Z","iopub.execute_input":"2021-09-25T00:58:50.950931Z","iopub.status.idle":"2021-09-25T00:58:51.255313Z","shell.execute_reply.started":"2021-09-25T00:58:50.950902Z","shell.execute_reply":"2021-09-25T00:58:51.254032Z"},"trusted":true},"execution_count":null,"outputs":[]}]}