{"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":"***Problem Statement***\n\nApples are one of the most important temperate fruit crops in the world. Foliar (leaf) diseases pose a major threat to the overall productivity and quality of apple orchards. \nThe current process for disease diagnosis in apple orchards is based on manual scouting by humans, which is time-consuming and expensive.\n\nThe main objective of the competition is to develop machine learning-based models to accurately classify a given leaf image from the test dataset to a particular disease category, \nand to identify an individual disease from multiple disease symptoms on a single leaf image.\n\n","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19"}},{"cell_type":"markdown","source":"### Libraries","metadata":{}},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\n%matplotlib inline\nimport seaborn as sns\nimport matplotlib.pyplot as plt\nimport cv2\nimport os\nimport warnings\nwarnings.filterwarnings('ignore')\nimport tensorflow as tf\nimport random\nimport albumentations as A\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom tensorflow.keras.layers import Dense,Activation,Flatten, Conv2D, MaxPooling2D\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.callbacks import ModelCheckpoint,EarlyStopping","metadata":{"execution":{"iopub.status.busy":"2023-02-25T08:13:03.527996Z","iopub.execute_input":"2023-02-25T08:13:03.528731Z","iopub.status.idle":"2023-02-25T08:13:11.588817Z","shell.execute_reply.started":"2023-02-25T08:13:03.528609Z","shell.execute_reply":"2023-02-25T08:13:11.587608Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"###  About Dataset","metadata":{}},{"cell_type":"code","source":"train_image_path = '../input/plant-pathology-2021-fgvc8/train_images'\ntest_image_path = '../input/plant-pathology-2021-fgvc8/test_images'\ntrain_df_path = '../input/plant-pathology-2021-fgvc8/train.csv'\ntest_df_path = '../input/plant-pathology-2021-fgvc8/sample_submission.csv'","metadata":{"execution":{"iopub.status.busy":"2023-02-25T08:13:11.591954Z","iopub.execute_input":"2023-02-25T08:13:11.593061Z","iopub.status.idle":"2023-02-25T08:13:11.598177Z","shell.execute_reply.started":"2023-02-25T08:13:11.593018Z","shell.execute_reply":"2023-02-25T08:13:11.596997Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"* train.csv contains information about the image files available in train_images. It contains 18632 rows(images) with 2 columns i.e (image , labels )\n\n* test.csv The test set images. This competition has a hidden test set: only three images are provided here as samples while the remaining 5,000 images will be available to your notebook once it is submitted.","metadata":{}},{"cell_type":"code","source":"df_train = pd.read_csv(train_df_path)\ndf_test=pd.read_csv(test_df_path)","metadata":{"execution":{"iopub.status.busy":"2023-02-25T08:13:11.600100Z","iopub.execute_input":"2023-02-25T08:13:11.600902Z","iopub.status.idle":"2023-02-25T08:13:11.667060Z","shell.execute_reply.started":"2023-02-25T08:13:11.600857Z","shell.execute_reply":"2023-02-25T08:13:11.666023Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_test","metadata":{"execution":{"iopub.status.busy":"2023-02-25T08:13:11.669886Z","iopub.execute_input":"2023-02-25T08:13:11.670475Z","iopub.status.idle":"2023-02-25T08:13:11.688348Z","shell.execute_reply.started":"2023-02-25T08:13:11.670421Z","shell.execute_reply":"2023-02-25T08:13:11.687181Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_train.labels.value_counts()","metadata":{"execution":{"iopub.status.busy":"2023-02-25T08:13:11.689870Z","iopub.execute_input":"2023-02-25T08:13:11.690924Z","iopub.status.idle":"2023-02-25T08:13:11.705857Z","shell.execute_reply.started":"2023-02-25T08:13:11.690884Z","shell.execute_reply":"2023-02-25T08:13:11.704544Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize=(15,12))\nlabels = sns.barplot(df_train.labels.value_counts().index,df_train.labels.value_counts())\nfor item in labels.get_xticklabels():\n    item.set_rotation(45)","metadata":{"execution":{"iopub.status.busy":"2023-02-25T08:13:11.707758Z","iopub.execute_input":"2023-02-25T08:13:11.708171Z","iopub.status.idle":"2023-02-25T08:13:12.058211Z","shell.execute_reply.started":"2023-02-25T08:13:11.708114Z","shell.execute_reply":"2023-02-25T08:13:12.057171Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"* We have multiple labels for eg. label can be scab or scab and rust\n\n* Main labels are - scab , healthy , frog_eye_leaf_spot , rust , complex and powdery_mildew","metadata":{}},{"cell_type":"markdown","source":"### Batch Visualisation of Images","metadata":{}},{"cell_type":"code","source":"def batch_visualize(df,batch_size,path):\n    sample_df = df_train.sample(9)\n    image_names = sample_df[\"image\"].values\n    labels = sample_df[\"labels\"].values\n    plt.figure(figsize=(16, 12))\n    \n    for image_ind, (image_name, label) in enumerate(zip(image_names, labels)):\n        plt.subplot(3, 3, image_ind + 1)\n        image = cv2.imread(os.path.join(path, image_name))\n        image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)\n        plt.imshow(image)\n        plt.title(f\"{label}\", fontsize=12)\n        plt.axis(\"off\")\n    plt.show()\n    \nbatch_visualize(df_train,9,train_image_path)","metadata":{"execution":{"iopub.status.busy":"2023-02-25T08:13:12.059717Z","iopub.execute_input":"2023-02-25T08:13:12.060827Z","iopub.status.idle":"2023-02-25T08:13:25.784843Z","shell.execute_reply.started":"2023-02-25T08:13:12.060786Z","shell.execute_reply":"2023-02-25T08:13:25.783468Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Batch visualisation with labels","metadata":{}},{"cell_type":"code","source":"def batch_visualize_with_label(df,batch_size,path,label): \n    sample_df = df_train[df_train[\"labels\"]==label].sample(9)\n    image_names = sample_df[\"image\"].values\n    labels = sample_df[\"labels\"].values\n    plt.figure(figsize=(16, 12))\n    \n    for image_ind, (image_name, label) in enumerate(zip(image_names, labels)):\n        plt.subplot(3, 3, image_ind + 1)\n        image = cv2.imread(os.path.join(path, image_name))\n        image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)\n        plt.imshow(image)\n        plt.axis(\"off\")\n    plt.show()","metadata":{"execution":{"iopub.status.busy":"2023-02-25T08:13:25.786026Z","iopub.execute_input":"2023-02-25T08:13:25.786374Z","iopub.status.idle":"2023-02-25T08:13:25.796857Z","shell.execute_reply.started":"2023-02-25T08:13:25.786336Z","shell.execute_reply":"2023-02-25T08:13:25.794335Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Visualise healthy leaves","metadata":{}},{"cell_type":"code","source":"batch_visualize_with_label(df_train,9,train_image_path,'healthy')","metadata":{"execution":{"iopub.status.busy":"2023-02-25T08:13:25.798467Z","iopub.execute_input":"2023-02-25T08:13:25.799120Z","iopub.status.idle":"2023-02-25T08:13:39.104762Z","shell.execute_reply.started":"2023-02-25T08:13:25.799070Z","shell.execute_reply":"2023-02-25T08:13:39.103469Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Visualise scab leaves","metadata":{}},{"cell_type":"code","source":"batch_visualize_with_label(df_train,9,train_image_path,'scab')\n","metadata":{"execution":{"iopub.status.busy":"2023-02-25T08:13:39.108517Z","iopub.execute_input":"2023-02-25T08:13:39.109558Z","iopub.status.idle":"2023-02-25T08:13:52.247467Z","shell.execute_reply.started":"2023-02-25T08:13:39.109516Z","shell.execute_reply":"2023-02-25T08:13:52.246188Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Visualise frog_eye_leaf_spot leaves","metadata":{}},{"cell_type":"code","source":"batch_visualize_with_label(df_train,9,train_image_path,'frog_eye_leaf_spot')","metadata":{"execution":{"iopub.status.busy":"2023-02-25T08:13:52.249227Z","iopub.execute_input":"2023-02-25T08:13:52.249612Z","iopub.status.idle":"2023-02-25T08:14:05.323038Z","shell.execute_reply.started":"2023-02-25T08:13:52.249577Z","shell.execute_reply":"2023-02-25T08:14:05.322125Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Visualise rust leaves","metadata":{}},{"cell_type":"code","source":"batch_visualize_with_label(df_train,9,train_image_path,'rust')","metadata":{"execution":{"iopub.status.busy":"2023-02-25T08:14:05.324551Z","iopub.execute_input":"2023-02-25T08:14:05.325086Z","iopub.status.idle":"2023-02-25T08:14:15.745853Z","shell.execute_reply.started":"2023-02-25T08:14:05.325052Z","shell.execute_reply":"2023-02-25T08:14:15.744762Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Visualise complex leaves","metadata":{}},{"cell_type":"code","source":"batch_visualize_with_label(df_train,9,train_image_path,'complex')","metadata":{"execution":{"iopub.status.busy":"2023-02-25T08:14:15.747433Z","iopub.execute_input":"2023-02-25T08:14:15.747811Z","iopub.status.idle":"2023-02-25T08:14:28.523706Z","shell.execute_reply.started":"2023-02-25T08:14:15.747778Z","shell.execute_reply":"2023-02-25T08:14:28.522798Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Visualise powdery_mildew leaves","metadata":{}},{"cell_type":"code","source":"batch_visualize_with_label(df_train,9,train_image_path,'powdery_mildew')","metadata":{"execution":{"iopub.status.busy":"2023-02-25T08:14:28.525136Z","iopub.execute_input":"2023-02-25T08:14:28.526201Z","iopub.status.idle":"2023-02-25T08:14:41.737594Z","shell.execute_reply.started":"2023-02-25T08:14:28.526152Z","shell.execute_reply":"2023-02-25T08:14:41.736189Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Tensorflow Dataset Generation","metadata":{}},{"cell_type":"code","source":"HEIGHT = 128\nWIDTH=128\nSEED = 45\nBATCH_SIZE= 64\n\ntrain_datagen = ImageDataGenerator(rescale = 1/255.,\n    rotation_range=20,\n    width_shift_range=0.2,\n    height_shift_range=0.2,\n    horizontal_flip=True,\n    validation_split = 0.2,\n    zoom_range = 0.2,\n    shear_range = 0.2,\n    vertical_flip = False)\n\ntrain_dataset = train_datagen.flow_from_dataframe(\n    df_train,\n    directory = train_image_path,\n    x_col = \"image\",\n    y_col = \"labels\",\n    target_size = (HEIGHT,WIDTH),\n    class_mode='categorical',\n    batch_size = BATCH_SIZE,\n    subset = \"training\",\n    shuffle = True,\n    seed = SEED,\n    validate_filenames = False\n)\n\nvalidation_dataset = train_datagen.flow_from_dataframe(\n    df_train,\n    directory = train_image_path,\n    x_col = \"image\",\n    y_col = \"labels\",\n    target_size = (HEIGHT,WIDTH),\n    class_mode='categorical',\n    batch_size = BATCH_SIZE,\n    subset = \"validation\",\n    shuffle = True,\n    seed = SEED,\n    validate_filenames = False\n)\n\ntest_datagen = ImageDataGenerator(\n    rescale = 1./255\n)\nINPUT_SIZE = (HEIGHT,WIDTH,3)\ntest_dataset=test_datagen.flow_from_dataframe(\n    df_test,\n    directory=test_image_path,\n    x_col='image',\n    y_col=None,\n    class_mode=None,\n    target_size=INPUT_SIZE[:2]\n)","metadata":{"execution":{"iopub.status.busy":"2023-02-25T08:14:41.739789Z","iopub.execute_input":"2023-02-25T08:14:41.740173Z","iopub.status.idle":"2023-02-25T08:14:41.907366Z","shell.execute_reply.started":"2023-02-25T08:14:41.740138Z","shell.execute_reply":"2023-02-25T08:14:41.906385Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Convolutional Neural Networks¶","metadata":{}},{"cell_type":"code","source":"model=Sequential()\nmodel.add(Conv2D(32,(3,3),activation='relu',padding='same',input_shape=(HEIGHT,WIDTH,3)))\nmodel.add(MaxPooling2D(2,2))\nmodel.add(Conv2D(64,(3,3),activation='relu',padding='same'))\nmodel.add(MaxPooling2D(2,2))\nmodel.add(Conv2D(64,(3,3),activation='relu',padding='same'))\nmodel.add(MaxPooling2D(2,2))\nmodel.add(Conv2D(128,(3,3),activation='relu',padding='same'))\nmodel.add(MaxPooling2D(2,2))\nmodel.add(Flatten())\nmodel.add(Dense(12,activation='softmax'))","metadata":{"execution":{"iopub.status.busy":"2023-02-25T08:14:41.911600Z","iopub.execute_input":"2023-02-25T08:14:41.914638Z","iopub.status.idle":"2023-02-25T08:14:45.445135Z","shell.execute_reply.started":"2023-02-25T08:14:41.914598Z","shell.execute_reply":"2023-02-25T08:14:45.444149Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=0.001),\n    loss='categorical_crossentropy',\n    metrics=['accuracy'])\nmodel.summary()","metadata":{"execution":{"iopub.status.busy":"2023-02-25T08:14:45.446617Z","iopub.execute_input":"2023-02-25T08:14:45.446985Z","iopub.status.idle":"2023-02-25T08:14:45.464971Z","shell.execute_reply.started":"2023-02-25T08:14:45.446944Z","shell.execute_reply":"2023-02-25T08:14:45.464068Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"checkpoint_path = \"training_1/cp.ckpt\"\ncheckpoint_dir = os.path.dirname(checkpoint_path)\n\n# Create a callback that saves the model's weights\ncp_callback = tf.keras.callbacks.ModelCheckpoint(filepath=checkpoint_path,\n                                                 save_weights_only=True,\n                                                 verbose=1)","metadata":{"execution":{"iopub.status.busy":"2023-02-25T08:14:45.466306Z","iopub.execute_input":"2023-02-25T08:14:45.467398Z","iopub.status.idle":"2023-02-25T08:14:45.473209Z","shell.execute_reply.started":"2023-02-25T08:14:45.467359Z","shell.execute_reply":"2023-02-25T08:14:45.472085Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"cnn_model=model.fit_generator(train_dataset,\n                                  validation_data=validation_dataset,\n                                  epochs=10,\n                                  verbose=1,\n                                  shuffle=True,\n                                  steps_per_epoch=train_dataset.samples//128,\n                                  validation_steps=validation_dataset.samples//128,\n                                  callbacks=[cp_callback]\n                                 )","metadata":{"execution":{"iopub.status.busy":"2023-02-25T08:14:45.474985Z","iopub.execute_input":"2023-02-25T08:14:45.475402Z","iopub.status.idle":"2023-02-25T12:10:20.165220Z","shell.execute_reply.started":"2023-02-25T08:14:45.475354Z","shell.execute_reply":"2023-02-25T12:10:20.160788Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model_history = cnn_model.history\n\nplt.figure()\nplt.plot(model_history['accuracy'])\nplt.plot(model_history['val_accuracy'])\nplt.title('model accuracy')\nplt.ylabel('accuracy')\nplt.xlabel('epoch')\nplt.legend(['train', 'validation'])\nplt.savefig('accuracy')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-02-25T12:22:53.482739Z","iopub.execute_input":"2023-02-25T12:22:53.483224Z","iopub.status.idle":"2023-02-25T12:22:53.848181Z","shell.execute_reply.started":"2023-02-25T12:22:53.483174Z","shell.execute_reply":"2023-02-25T12:22:53.847076Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure()\nplt.plot(model_history['loss'])\nplt.plot(model_history['val_loss'])\nplt.title('model loss')\nplt.ylabel('loss')\nplt.xlabel('epoch')\nplt.legend(['train', 'validation'])\nplt.savefig('loss')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-02-25T12:23:22.885383Z","iopub.execute_input":"2023-02-25T12:23:22.885774Z","iopub.status.idle":"2023-02-25T12:23:23.181186Z","shell.execute_reply.started":"2023-02-25T12:23:22.885739Z","shell.execute_reply":"2023-02-25T12:23:23.180140Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Prediction","metadata":{}},{"cell_type":"code","source":"train_dataset.class_indices.items()","metadata":{"execution":{"iopub.status.busy":"2023-02-25T12:10:20.173363Z","iopub.execute_input":"2023-02-25T12:10:20.177077Z","iopub.status.idle":"2023-02-25T12:10:20.195153Z","shell.execute_reply.started":"2023-02-25T12:10:20.177042Z","shell.execute_reply":"2023-02-25T12:10:20.194129Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"preds = model.predict(test_dataset)\nprint(preds)","metadata":{"execution":{"iopub.status.busy":"2023-02-25T12:10:20.196646Z","iopub.execute_input":"2023-02-25T12:10:20.197494Z","iopub.status.idle":"2023-02-25T12:10:21.950261Z","shell.execute_reply.started":"2023-02-25T12:10:20.197452Z","shell.execute_reply":"2023-02-25T12:10:21.948819Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"preds_disease_ind=np.argmax(preds, axis=-1)","metadata":{"execution":{"iopub.status.busy":"2023-02-25T12:19:24.882086Z","iopub.execute_input":"2023-02-25T12:19:24.883265Z","iopub.status.idle":"2023-02-25T12:19:24.891481Z","shell.execute_reply.started":"2023-02-25T12:19:24.883215Z","shell.execute_reply":"2023-02-25T12:19:24.890315Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"preds_disease_ind","metadata":{"execution":{"iopub.status.busy":"2023-02-25T12:19:48.594003Z","iopub.execute_input":"2023-02-25T12:19:48.594597Z","iopub.status.idle":"2023-02-25T12:19:48.606969Z","shell.execute_reply.started":"2023-02-25T12:19:48.594557Z","shell.execute_reply":"2023-02-25T12:19:48.605817Z"},"trusted":true},"execution_count":null,"outputs":[]}]}