{"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":"# Plant Pathology 2021 - Keras practice","metadata":{}},{"cell_type":"markdown","source":"This notebook is my practice book of image classification using Keras + Tensorflow.\n* Approach: Transformation Multi-Label classification into Multi-Class classification","metadata":{}},{"cell_type":"markdown","source":"I referrd to these notebooks. Thanks a lot.\n* Classify foliar diseases in apple trees (Beginner)\nhttps://www.kaggle.com/yashvi/classify-diseases-in-apple-trees-beginner\n* Apple Leaf Diseases with InceptionResNetV2 (keras)\nhttps://www.kaggle.com/arnabs007/apple-leaf-diseases-with-inceptionresnetv2-keras\n* Basic CNN for Foliar Disease Detection\nhttps://www.kaggle.com/mahmoudlimam/basic-cnn-for-foliar-disease-detection","metadata":{}},{"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\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_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 1. 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_count":null,"outputs":[]},{"cell_type":"code","source":"df_train = pd.read_csv(train_df_path)\ndf_test=pd.read_csv(test_df_path)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_test","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_train.labels.value_counts()","metadata":{},"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_count":null,"outputs":[]},{"cell_type":"code","source":"print('df_train', df_train.shape)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(df_train[0:10])","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"img=plt.imread(train_image_path+\"/\"+df_train[\"image\"][0])","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"img.shape","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.imshow(img)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_train[\"image\"][0]","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"img=plt.imread(train_image_path+\"/\"+df_train[\"image\"][1])","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"img.shape","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.imshow(img)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_train[\"image\"][1]","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 2. Data Augumentation","metadata":{}},{"cell_type":"code","source":"HEIGHT = 128\nWIDTH=128\nSEED = 42\nBATCH_SIZE= 128","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_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)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_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)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"validation_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)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_datagen = ImageDataGenerator(\n    rescale = 1./255\n)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"INPUT_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    shuffle = False,\n    target_size=INPUT_SIZE[:2])","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 3. Model Training","metadata":{}},{"cell_type":"code","source":"df_train[\"labels\"].unique()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = Sequential()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.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(128,(3,3),activation='relu',padding='same'))\nmodel.add(MaxPooling2D(2,2))\nmodel.add(Conv2D(256,(3,3),activation='relu',padding='same'))\nmodel.add(MaxPooling2D(2,2))\nmodel.add(Flatten())\nmodel.add(Dense(12,activation='softmax'))","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(model.summary())","metadata":{},"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'])","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"checkpoint_path = \"./PP2021_model.h5\"\ncheckpoint_dir = os.path.dirname(checkpoint_path)\n\n# Create a callback that saves the model\ncp_callback = tf.keras.callbacks.ModelCheckpoint(filepath=checkpoint_path,\n                                                 monitor='val_loss',\n                                                 save_best_only=True,\n                                                 verbose=1)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"early_stopping = EarlyStopping(\n                        monitor='val_loss',\n                        min_delta=0.0,\n                        patience=5,\n                        verbose=1\n                )","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fit = model.fit_generator(train_dataset,\n                                  validation_data=validation_dataset,\n                                  epochs=10,\n                                  steps_per_epoch=train_dataset.samples//BATCH_SIZE,\n                                  validation_steps=validation_dataset.samples//BATCH_SIZE,\n                                  callbacks=[cp_callback, early_stopping]\n                                 )","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.clf()\nfig,ax=plt.subplots(1,2, figsize=(16.0, 6.0))\nax[0].set_xlabel('epochs')\nax[0].plot(np.arange(1, len(fit.history['loss'])+1),\n         fit.history['loss'], label='loss')\nax[0].plot(np.arange(1, len(fit.history['loss'])+1),\n         fit.history['val_loss'], label='val_loss')\nax[0].set_title(\"Loss\")\nax[0].legend()\nax[1].set_xlabel('epochs')\nax[1].plot(np.arange(1, len(fit.history['accuracy'])+1),\n         fit.history['accuracy'], label='accuracy')\nax[1].plot(np.arange(1, len(fit.history['accuracy'])+1),\n         fit.history['val_accuracy'], label='val_accuracy')\nax[1].set_title(\"Accuracy\")\nax[1].legend()\nplt.show()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 4. Prediction","metadata":{}},{"cell_type":"code","source":"train_dataset.class_indices.items()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = tf.keras.models.load_model(\"./PP2021_model.h5\")","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"preds = model.predict(test_dataset)\nprint(preds)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"preds_disease_ind=np.argmax(preds, axis=-1)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"preds_disease_ind","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def get_key(val):\n    for key, value in train_dataset.class_indices.items():\n        if val == value:\n            return key","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for i in range(len(preds_disease_ind)):\n    df_test[\"labels\"] [i] = get_key(preds_disease_ind[i])","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_test","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_test.to_csv('./submission.csv', index=False)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}