{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"markdown","source":"# Cassava Leaf Disease Classification\n> ### Identify the type of disease present on a Cassava Leaf image\n\nThe following topics will be covered:\n\n1.   Exploratory Data Analysis\n1.   Data visualization \n1.   Image Augmentation\n1.   Model Building and Prediction\n1.   Evaluation "},{"metadata":{"trusted":true},"cell_type":"code","source":"import numpy as np \nimport pandas as pd\nimport seaborn as sns\nimport matplotlib.pyplot as plt\nimport keras\nfrom keras.models import Sequential\nfrom keras.layers import Dense, Conv2D, MaxPool2D, Flatten, Activation\nfrom keras.preprocessing.image import ImageDataGenerator\nfrom keras.optimizers import RMSprop\nfrom keras.metrics import AUC \nimport matplotlib.image as mpimg\nimport cv2\nimport json\nimport os ","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"> ### EDA"},{"metadata":{"trusted":true},"cell_type":"code","source":"# import train_dataset\ntrain_=pd.read_csv(\"../input/cassava-leaf-disease-classification/train.csv\")\ntrain_.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# import real disease_names. \ndisease_names = open('../input/cassava-leaf-disease-classification/label_num_to_disease_map.json') # disease_name\ndisease_names = json.load(disease_names)\ntrain_['disease_name'] = train_['label'].apply(lambda x: disease_names[str(x)])\ntrain_.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_['disease_name'].unique() # cassava_leaf_disease","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"> ### Data visualization"},{"metadata":{"trusted":true},"cell_type":"code","source":"sns.countplot(train_['label'],palette=\"Greens\") # largest number of samples for label 3 \nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_['label'].value_counts().plot.pie(autopct='%1.1f%%',y=train_['label'])\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"**Cassava Bacterial Blight (CBB)**"},{"metadata":{"trusted":true},"cell_type":"code","source":"df0 = train_[train_[\"label\"] == 0] # label 0 is Cassava Bacterial Blight (CBB)\ndf0.head(4)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"image_name=df0[df0['label']==0]['image_id'].iloc[3] \ndisease_name=df0[df0['label']==0]['disease_name'].iloc[3]\nimg = mpimg.imread(\"../input/cassava-leaf-disease-classification/train_images/\"+image_name)\nimgplot = plt.imshow(img)\nplt.title(r\"$\\bf{\"+disease_name+ \"}$\"+'\\n'+image_name)\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"**Cassava Brown Streak Disease (CBSD)**"},{"metadata":{"trusted":true},"cell_type":"code","source":"df1 = train_[train_[\"label\"] == 1] # label 1 is Cassava Brown Streak Disease (CBSD)\ndf1.head(4)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"image_name1=df1[df1['label']==1]['image_id'].iloc[3]\ndisease_name1=df1[df1['label']==1]['disease_name'].iloc[3]\nimg = mpimg.imread(\"../input/cassava-leaf-disease-classification/train_images/\"+image_name1)\nimgplot = plt.imshow(img)\nplt.title(r\"$\\bf{\"+disease_name1+ \"}$\"+'\\n'+image_name1)\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"**Cassava Green Mottle (CGM)**"},{"metadata":{"trusted":true},"cell_type":"code","source":"df2 = train_[train_[\"label\"] == 2] # label 2 is Cassava Green Mottle (CGM)\ndf2.head(3)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"image_name2=df2[df2['label']==2]['image_id'].iloc[3]\ndisease_name2=df2[df2['label']==2]['disease_name'].iloc[3]\nimg = mpimg.imread(\"../input/cassava-leaf-disease-classification/train_images/\"+image_name2)\nimgplot = plt.imshow(img)\nplt.title(r\"$\\bf{\"+disease_name2+ \"}$\"+'\\n'+image_name2)\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"**Cassava Mosaic Disease (CMD)**"},{"metadata":{"trusted":true},"cell_type":"code","source":"df3 = train_[train_[\"label\"] == 3] # Label 3 is Cassava Mosaic Disease (CMD)\ndf3.head(3)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"image_name3=df3[df3['label']==3]['image_id'].iloc[2]\ndisease_name3=df3[df3['label']==3]['disease_name'].iloc[2]\nimg = mpimg.imread(\"../input/cassava-leaf-disease-classification/train_images/\"+image_name3)\nimgplot = plt.imshow(img)\nplt.title(r\"$\\bf{\"+disease_name3+ \"}$\"+'\\n'+image_name3)\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"**Healthy**"},{"metadata":{"trusted":true},"cell_type":"code","source":"df4 = train_[train_[\"label\"] == 4] # Label 4 is Healthy\ndf4.head(3)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"image_name4=df4[df4['label']==4]['image_id'].iloc[2]\ndisease_name4=df4[df4['label']==4]['disease_name'].iloc[2]\nimg = mpimg.imread(\"../input/cassava-leaf-disease-classification/train_images/\"+image_name4)\nimgplot = plt.imshow(img)\nplt.title(r\"$\\bf{\"+disease_name4+ \"}$\"+'\\n'+image_name4)\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"img.shape # Image Height : 600, Image Width : 800, channel : 3","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"img.size, img.max(),img.min() # Image size 1440000, Maximum RGB value 255, Minimum RGB value 0","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"> ### ImageDataGenerator"},{"metadata":{"trusted":true},"cell_type":"code","source":"train_['label'] = train_['label'].astype('str') \ntrain_path=\"../input/cassava-leaf-disease-classification\"\ninput_shape=(512, 512, 3)\n\ntrain_datagen = ImageDataGenerator(validation_split = 0.3,\n        rescale=1./255,\n        shear_range=0.2,\n        rotation_range=90,\n        width_shift_range=0.1,\n        height_shift_range=0.1,\n        zoom_range=0.2,\n        horizontal_flip=True,\n        fill_mode=\"nearest\")\n\ntrain_generator = train_datagen.flow_from_dataframe(train_,\n                         directory = os.path.join(train_path, \"train_images\"),\n                         subset = \"training\",\n                         x_col = \"image_id\",\n                         y_col = \"label\",\n                         target_size = (512, 512),\n                         batch_size = 8,\n                         class_mode = \"sparse\")\n\n\nvalidation_datagen = ImageDataGenerator(validation_split = 0.3, rescale=1./255)\n\nvalidation_generator = validation_datagen.flow_from_dataframe(train_,\n                         directory = os.path.join(train_path, \"train_images\"),\n                         subset = \"validation\",\n                         x_col = \"image_id\",\n                         y_col = \"label\",\n                         target_size = (512, 512),\n                         batch_size = 8,\n                         class_mode = \"sparse\")","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"> # Model Building"},{"metadata":{"trusted":true},"cell_type":"code","source":"cnn_model=keras.models.Sequential([keras.layers.Conv2D(filters=512,padding=\"same\",kernel_size=5, activation='relu', input_shape=input_shape),\n                                  keras.layers.MaxPool2D(pool_size=(2,2)),\n                                  keras.layers.Conv2D(filters=256,padding='same',kernel_size=4, activation='relu'),\n                                  keras.layers.MaxPool2D(pool_size=(2,2)),\n                                  keras.layers.Conv2D(filters=128,padding='same',kernel_size=3, activation='relu'),\n                                  keras.layers.MaxPool2D(pool_size=(2,2)),\n                                  keras.layers.Conv2D(filters=64,padding='same',kernel_size=2, activation='relu'),\n                                  keras.layers.MaxPool2D(pool_size=(2,2)),\n                                  keras.layers.Conv2D(filters=32,padding='same',kernel_size=2, activation='relu'),\n                                  keras.layers.MaxPool2D(pool_size=(2,2)),\n                                  keras.layers.Dropout(0.5),\n                                  keras.layers.Flatten(),\n                                  keras.layers.Dense(units=512, activation='relu'),\n                                  keras.layers.Dropout(0.1),\n                                  keras.layers.Dense(units=256, activation='relu'),\n                                  keras.layers.Dropout(0.25),\n                                  keras.layers.Dense(units=128, activation='relu'),\n                                  keras.layers.Dropout(0.25),\n                                  keras.layers.Dense(units=5, activation='softmax')])\n\n# complie cnn model\ncnn_model.compile(optimizer = RMSprop(learning_rate=0.001,rho=0.9,momentum=0.9), loss = 'sparse_categorical_crossentropy', metrics = ['accuracy'])\n\n# cnn model summary\ncnn_model.summary()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from keras.callbacks import ModelCheckpoint\n# Save the model with the minimum validation loss\ncheckpoint = ModelCheckpoint(\"./Cassava_best_model.h5\",\n                             save_best_only=True,\n                             monitor = 'val_loss',\n                             mode='min')\n\n# train cnn model\ncnn_model.fit(train_generator, epochs=5, verbose=1, validation_data=validation_generator,callbacks=[checkpoint])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"cnn_model.save('Cassava_best_model.h5')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# import test_dataset.\ntest=pd.read_csv(\"../input/cassava-leaf-disease-classification/sample_submission.csv\")\ntest.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from PIL import Image # Prediction\npreds = []\nWORK_DIR=\"../input/cassava-leaf-disease-classification\"\nfor image_id in test.image_id:\n    image = Image.open(os.path.join(WORK_DIR,  \"test_images\", image_id))\n    image = image.resize((512, 512))\n    image = np.expand_dims(image, axis = 0)\n    preds.append(np.argmax(cnn_model.predict(image)))\n\ntest['label'] = preds\ntest","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"img = mpimg.imread(\"../input/cassava-leaf-disease-classification/test_images/2216849948.jpg\")\nimgplot = plt.imshow(img)\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test.to_csv('test.csv', index = False)","execution_count":null,"outputs":[]}],"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":4,"nbformat_minor":4}