{"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":"<center><span style=\"font-size:30px;\"><b>PLANT PATHOLOGY USING TRANSFER LEARNING (ResNet50)</span>","metadata":{}},{"cell_type":"markdown","source":"<span style=\"font-size:28px;\">TABLE OF CONTENTS:\n    \n------------------------------------------------------------------------------------------------------    \n    \n* <span style=\"font-size:26px;\">Import Required Libraries\n* <span style=\"font-size:26px;\">Load the Images (Train_images), DataFrame (train.csv)\n* <span style=\"font-size:26px;\">Data Augumentation using ImageDataGenerator\n* <span style=\"font-size:26px;\">Create Model (ResNet50)\n* <span style=\"font-size:26px;\">Create Callbacks\n* <span style=\"font-size:26px;\">Fit the model\n* <span style=\"font-size:26px;\">Test the Model\n* <span style=\"font-size:26px;\">Make the Submission\n    ","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19"}},{"cell_type":"markdown","source":"-------------","metadata":{}},{"cell_type":"markdown","source":"## 1. IMPORT LIBRARIES","metadata":{}},{"cell_type":"code","source":"#IMPORT REQUIRED LIBRARIES:\n\nfrom tensorflow.keras.layers import Input, Lambda, Dense, Flatten\nfrom tensorflow.keras.models import Model\nfrom tensorflow.keras.applications.resnet50 import ResNet50\nfrom tensorflow.keras.applications.resnet50 import preprocess_input\nfrom tensorflow.keras.preprocessing import image\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator,load_img\nfrom tensorflow.keras.models import Sequential\nimport numpy as np\nfrom glob import glob\nimport matplotlib.pyplot as plt\nimport pandas as pd","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 2. DATASET LOCATION","metadata":{}},{"cell_type":"code","source":"TRAIN_PATH = \"../input/plant-pathology-2021-fgvc8/train_images\"\ntrain_df = pd.read_csv(\"../input/plant-pathology-2021-fgvc8/train.csv\")","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"count_dict = train_df.labels.value_counts()\nclasses = list(count_dict.index)\nclasses_count = list(count_dict.values)\nprint(\"Number of unique labels: \",len(classes))\nprint(\"-------------------------------------------\")\ntrain_df.head()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"-----","metadata":{}},{"cell_type":"markdown","source":"## 3. VISUALIZATION","metadata":{}},{"cell_type":"code","source":"plt.figure(figsize=(35,15))\nplt.bar(classes,classes_count)\nplt.title(\"Number of instances per class\",fontweight=\"bold\",fontsize=40)\nplt.xlabel(\"Classes\",fontsize = 30)\nplt.xticks(rotation=20,fontsize = 20,fontweight = \"bold\")\nplt.xticks(fontsize = 20,fontweight = \"bold\")\nplt.ylabel(\"Count\",fontsize=30)\nplt.show()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"-----","metadata":{}},{"cell_type":"markdown","source":"## 4. DATA AUGMENTATION","metadata":{}},{"cell_type":"code","source":"# Use the Image Data Generator to import the images from the dataset\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\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\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"HEIGHT = 124\nWIDTH=124\nSEED = 143\nBATCH_SIZE=32\ntrain_ds = train_datagen.flow_from_dataframe(\n    train_df,\n    directory = TRAIN_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)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"val_ds = train_datagen.flow_from_dataframe(\n    train_df,\n    directory = TRAIN_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)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"-----","metadata":{}},{"cell_type":"markdown","source":"## 5. CREATE THE RESNET MODEL","metadata":{}},{"cell_type":"code","source":"import tensorflow\ndef create_model():\n    \n    pretrained = ResNet50(include_top=False, weights='imagenet',input_shape=[HEIGHT,WIDTH, 3])\n            \n    x = pretrained.output\n    x = tensorflow.keras.layers.GlobalAveragePooling2D() (x)\n    outputs = tensorflow.keras.layers.Dense(len(classes),activation=\"softmax\", dtype='float32')(x)\n        \n    model = tensorflow.keras.Model(pretrained.input, outputs)\n    return model\n\nmodel = create_model()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.summary()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"-----","metadata":{}},{"cell_type":"markdown","source":"## 6. COMPILE THE MODEL","metadata":{}},{"cell_type":"code","source":"import tensorflow_addons as tfa\n\ndef compile_model(model, lr=0.0001):\n    \n    optimizer = tensorflow.keras.optimizers.Adam(lr=lr)\n    \n    loss = tensorflow.keras.losses.CategoricalCrossentropy()\n    \n    #tf.keras.metrics.CategoricalAccuracy(name='categorical_accuracy')\n    metrics = [\n    tfa.metrics.F1Score(num_classes = len(classes),average = \"macro\",name = \"f1_score\")\n    ]\n\n    model.compile(optimizer=optimizer, loss=loss, metrics=metrics)\n\n    return model","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"------","metadata":{}},{"cell_type":"markdown","source":"## 7. CREATE CALLBACKS","metadata":{}},{"cell_type":"code","source":"METRIC = \"val_f1_score\"\n\ndef create_callbacks(metric = METRIC):\n    \n    cpk_path = './best_model.h5'\n    \n    checkpoint = tensorflow.keras.callbacks.ModelCheckpoint(\n        filepath=cpk_path,\n        monitor= metric,\n        mode='max',\n        save_best_only=True,\n        verbose=1,\n    )\n\n    reducelr = tensorflow.keras.callbacks.ReduceLROnPlateau(\n        monitor= metric,\n        mode='max',\n        factor=0.1,\n        patience=3,\n        verbose=0\n    )\n\n    earlystop = tensorflow.keras.callbacks.EarlyStopping(\n        monitor= metric,\n        mode='max',\n        patience=10, \n        verbose=1\n    )\n    \n    callbacks = [checkpoint, reducelr, earlystop]         \n    \n    return callbacks","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"-------","metadata":{}},{"cell_type":"markdown","source":"## 8. FIT THE MODEL","metadata":{}},{"cell_type":"code","source":"EPOCHS= 3\nVERBOSE =1\n\ntensorflow.keras.backend.clear_session()\n\nwith tensorflow.device('/device:GPU:0'):\n    \n    model = create_model()\n    model = compile_model(model, lr=0.0001)\n   \n    callbacks = create_callbacks()\n    \n    history = model.fit(\n                        train_ds,\n                        epochs=EPOCHS,\n                        callbacks=callbacks,\n                        validation_data = val_ds,\n                        verbose=VERBOSE\n                       )","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"------","metadata":{}},{"cell_type":"markdown","source":"## 9. SUBMISSION OF FILE","metadata":{}},{"cell_type":"code","source":"submission = pd.read_csv('/kaggle/input/plant-pathology-2021-fgvc8/sample_submission.csv')\nsubmission.head()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_datagen = ImageDataGenerator(\n    rescale = 1./255\n)\nINPUT_SIZE = (124,124,3)\ntest_generator =  test_datagen.flow_from_dataframe(\n    submission,\n    directory=\"../input/plant-pathology-2021-fgvc8/test_images\",\n    x_col='image',\n    y_col=None,\n    class_mode=None,\n    target_size=INPUT_SIZE[:2]\n)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_ds.class_indices.items()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def get_key(val):\n    for key, value in train_ds.class_indices.items():\n        if val == value:\n            return key","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"preds = model.predict(test_generator)\nprint(preds)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def get_preds_to_labels(preds):\n    pred_lists = []\n    for pred in preds:\n        pred_list = []\n        health = (pred>=0.4)\n        \n        # get healthy\n        if health.sum()==0:\n            label = 'healthy'\n            pred_list.append(label)\n            \n        elif pred[2]>=0.5:\n            label = 'healthy'\n            pred_list.append(label)\n            \n        # get eles label\n        else:\n            for j, sub in enumerate(pred):\n                if sub>=0.28:\n                    label = get_key(j)\n                    pred_list.append(label)\n                               \n        pred_lists.append(' '.join(pred_list))\n    return pred_lists","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"preds_list = get_preds_to_labels(preds)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission['labels'] = preds_list\nsubmission.head()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission.to_csv('submission.csv', index=False)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}