{"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":"**Inference Notebook :** [ https://www.kaggle.com/virajkadam/plant-pathology-inference ]","metadata":{}},{"cell_type":"markdown","source":"# Resources\n* **[ https://www.kaggle.com/ankursingh12/resized-plant2021 ]**\n* **[ https://www.kaggle.com/arnabs007/apple-leaf-diseases-with-inceptionresnetv2-keras ]**","metadata":{}},{"cell_type":"code","source":"import pandas as pd \nimport numpy as np \nimport matplotlib.pyplot as plt\nimport seaborn as sns\nimport os,gc\nimport pickle\n\n#kfolds\nfrom sklearn.model_selection import KFold \nfrom sklearn.preprocessing import MultiLabelBinarizer\n\n\n\nimport cv2\nimport tensorflow as tf\nfrom tensorflow.keras import layers\nfrom tensorflow.keras import Model\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom tensorflow.keras import backend as K\nfrom tensorflow.keras.applications import EfficientNetB7,InceptionResNetV2\nfrom tensorflow.keras.losses import BinaryCrossentropy\nfrom tensorflow.keras.callbacks import ReduceLROnPlateau,EarlyStopping,ModelCheckpoint\n\nfrom tensorflow_addons.metrics import F1Score","metadata":{"execution":{"iopub.status.busy":"2021-05-24T13:48:16.445581Z","iopub.execute_input":"2021-05-24T13:48:16.445953Z","iopub.status.idle":"2021-05-24T13:48:22.654317Z","shell.execute_reply.started":"2021-05-24T13:48:16.445870Z","shell.execute_reply":"2021-05-24T13:48:22.653192Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Loading data.","metadata":{}},{"cell_type":"code","source":"train=pd.read_csv('../input/plant-pathology-2021-fgvc8/train.csv')\nsample_sub=pd.read_csv('../input/plant-pathology-2021-fgvc8/sample_submission.csv')\n\ntrain_dir='../input/resized-plant2021/img_sz_256'\ntest_dir='../input/plant-pathology-2021-fgvc8/test_images'\n\nsample_sub.head()","metadata":{"execution":{"iopub.status.busy":"2021-05-24T13:48:22.655956Z","iopub.execute_input":"2021-05-24T13:48:22.656286Z","iopub.status.idle":"2021-05-24T13:48:22.716469Z","shell.execute_reply.started":"2021-05-24T13:48:22.656251Z","shell.execute_reply":"2021-05-24T13:48:22.715373Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train.head()","metadata":{"execution":{"iopub.status.busy":"2021-05-24T13:48:22.718704Z","iopub.execute_input":"2021-05-24T13:48:22.719174Z","iopub.status.idle":"2021-05-24T13:48:22.731403Z","shell.execute_reply.started":"2021-05-24T13:48:22.719134Z","shell.execute_reply":"2021-05-24T13:48:22.730499Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Basic EDA**","metadata":{}},{"cell_type":"code","source":"print(f'Number of Images in Training set : {len(os.listdir(train_dir))}')\nprint(f'Number of Images in test set : {len(os.listdir(test_dir))}')","metadata":{"execution":{"iopub.status.busy":"2021-05-24T13:48:22.733011Z","iopub.execute_input":"2021-05-24T13:48:22.733835Z","iopub.status.idle":"2021-05-24T13:48:23.077144Z","shell.execute_reply.started":"2021-05-24T13:48:22.733782Z","shell.execute_reply":"2021-05-24T13:48:23.076173Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#lets count the instances of each class we have :\n\nfig,ax=plt.subplots(figsize=(16,8))\nsns.countplot(train['labels'])\n#rotate labels\nplt.setp(ax.get_xticklabels(),rotation=45)\n\nplt.title('Label counts')\n","metadata":{"execution":{"iopub.status.busy":"2021-05-24T13:48:23.079929Z","iopub.execute_input":"2021-05-24T13:48:23.080271Z","iopub.status.idle":"2021-05-24T13:48:23.441758Z","shell.execute_reply.started":"2021-05-24T13:48:23.080235Z","shell.execute_reply":"2021-05-24T13:48:23.440900Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Multilabel Classification**","metadata":{}},{"cell_type":"code","source":"#converting the labels as multiple labels:\ntrain['labels']=train['labels'].str.split(' ')\n\nmlb = MultiLabelBinarizer()\n\n# one hot encode labels\nlab=mlb.fit_transform(train['labels'])\nlab[:10]","metadata":{"execution":{"iopub.status.busy":"2021-05-24T13:48:23.443289Z","iopub.execute_input":"2021-05-24T13:48:23.443790Z","iopub.status.idle":"2021-05-24T13:48:23.635808Z","shell.execute_reply.started":"2021-05-24T13:48:23.443752Z","shell.execute_reply":"2021-05-24T13:48:23.634822Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#classes for OHE encoded var.\nclasses=mlb.classes_\nclasses","metadata":{"execution":{"iopub.status.busy":"2021-05-24T13:48:23.637124Z","iopub.execute_input":"2021-05-24T13:48:23.637529Z","iopub.status.idle":"2021-05-24T13:48:23.643712Z","shell.execute_reply.started":"2021-05-24T13:48:23.637489Z","shell.execute_reply":"2021-05-24T13:48:23.642656Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Lets see some Images**","metadata":{}},{"cell_type":"code","source":"def show_sample_images(df,train_dir,n):\n    dfs=df.sample(n)\n    plt.subplots(int(n/3),3,figsize=(20,7*int(n/3)))\n    \n    for i in range(n):\n        plt.subplot(int(n/3),3,i+1)\n        \n        row=dfs.iloc[i]\n        img_id=row['image']\n        title=row['labels']\n        path=os.path.join(train_dir +'/' +f'{img_id}')\n        image=cv2.imread(path)\n        \n        plt.imshow(image)\n        plt.title(f'{title}')\n        plt.axis('off')\n     \n    plt.grid('off')\n    plt.tight_layout()\n    plt.show()\nshow_sample_images(train,train_dir,n=18)","metadata":{"execution":{"iopub.status.busy":"2021-05-24T13:48:23.645327Z","iopub.execute_input":"2021-05-24T13:48:23.645941Z","iopub.status.idle":"2021-05-24T13:48:27.012152Z","shell.execute_reply.started":"2021-05-24T13:48:23.645900Z","shell.execute_reply":"2021-05-24T13:48:27.011026Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**SETTING RANDOM SEED**","metadata":{}},{"cell_type":"code","source":"#setting random seed :\nseed=7\n\ndef set_seed(seed):\n    tf.random.set_seed(seed)\n    np.random.seed(seed)\n    os.environ['PYHTONHASHSEED']=str(seed)\n    \nset_seed(seed)","metadata":{"execution":{"iopub.status.busy":"2021-05-24T13:48:27.013487Z","iopub.execute_input":"2021-05-24T13:48:27.013877Z","iopub.status.idle":"2021-05-24T13:48:27.019924Z","shell.execute_reply.started":"2021-05-24T13:48:27.013834Z","shell.execute_reply":"2021-05-24T13:48:27.018841Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"* **USING ALREADY RESIZED IMAGES. CREDITS TO AUTHOR [ https://www.kaggle.com/ankursingh12/resized-plant2021 ]**","metadata":{}},{"cell_type":"markdown","source":"**Loading Images**","metadata":{}},{"cell_type":"code","source":"def load_images(df,val_df,path):\n    \n    datagen=ImageDataGenerator(\n        width_shift_range=(0.1,0.2),\n        height_shift_range=(0.1,0.2),\n        shear_range=0.2,\n        zoom_range=0.2,\n        horizontal_flip=True,\n        vertical_flip=True,\n        fill_mode='nearest',\n        rescale=1./255\n        )\n    \n    train=datagen.flow_from_dataframe(\n        dataframe=df,\n        directory = path,\n        x_col='image',\n        y_col='labels',\n        target_size=image_size,\n        batch_size=batch,\n        color_mode=\"rgb\",\n        class_mode='categorical',\n        shuffle=True,\n        seed=seed)\n    \n    val=datagen.flow_from_dataframe(\n        dataframe=val_df,\n        directory = path,\n        x_col='image',\n        y_col='labels',\n        target_size=image_size,\n        batch_size=batch,\n        color_mode=\"rgb\",\n        class_mode='categorical',\n        shuffle=True,\n        seed=seed)\n    \n    return train,val\n    ","metadata":{"execution":{"iopub.status.busy":"2021-05-24T13:48:27.021570Z","iopub.execute_input":"2021-05-24T13:48:27.022126Z","iopub.status.idle":"2021-05-24T13:48:27.032976Z","shell.execute_reply.started":"2021-05-24T13:48:27.022086Z","shell.execute_reply":"2021-05-24T13:48:27.032001Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#loading images:\n\nbatch=64\nimage_size=(256,256)\n\nkf=KFold(n_splits = 3, random_state = seed, shuffle = True) \nnum_images=len(train)\ny=train.labels","metadata":{"execution":{"iopub.status.busy":"2021-05-24T13:48:27.034266Z","iopub.execute_input":"2021-05-24T13:48:27.034812Z","iopub.status.idle":"2021-05-24T13:48:27.044282Z","shell.execute_reply.started":"2021-05-24T13:48:27.034776Z","shell.execute_reply":"2021-05-24T13:48:27.043308Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Model","metadata":{}},{"cell_type":"code","source":"def build_model(base,dense=False):\n    '''build a cnn model with base provided.'''\n    \n    inp=layers.Input(shape=(256,256,3))\n    \n    x=base(inp)\n    \n    \n    x=layers.GlobalAveragePooling2D()(x)\n#     x=layers.BatchNormalization()(x)\n    \n    #dense\n    if dense: \n        for i in range(len(dense)):\n            x=layers.Dense(dense[i],activation='relu')(x)\n#             x=layers.Dropout(rate=0.5)(x)\n            x=layers.BatchNormalization()(x)\n            \n    #output\n    out=layers.Dense(6,activation='sigmoid')(x)\n    \n    model=Model(inputs=inp,outputs=out)\n    \n    return model\n            ","metadata":{"execution":{"iopub.status.busy":"2021-05-24T13:48:27.045648Z","iopub.execute_input":"2021-05-24T13:48:27.046337Z","iopub.status.idle":"2021-05-24T13:48:27.055321Z","shell.execute_reply.started":"2021-05-24T13:48:27.046288Z","shell.execute_reply":"2021-05-24T13:48:27.054320Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#plotting accuracy and loss  \ndef plot_history(history):\n    his=pd.DataFrame(history.history)\n    plt.subplots(1,2,figsize=(16,8))\n    \n    #loss:\n    plt.subplot(1,2,1)\n    plt.plot(range(len(his)),his['loss'],color='g',label='training')\n    plt.plot(range(len(his)),his['val_loss'],color='r',label='validation')\n    plt.legend()\n    plt.title('Loss')\n    \n    #accuracy\n    plt.subplot(1,2,2)\n    plt.plot(range(len(his)),his['accuracy'],color='g',label='training_acc')\n    plt.plot(range(len(his)),his['val_accuracy'],color='r',label='validation_acc')\n    \n    #f1_score\n    plt.plot(range(len(his)),his['f1_score'],color='steelblue',label='training_f1')\n    plt.plot(range(len(his)),his['val_f1_score'],color='maroon',label='validation_f1')\n    \n    plt.legend()\n    plt.title('accuracy')\n    \n    plt.show()              ","metadata":{"execution":{"iopub.status.busy":"2021-05-24T13:48:27.056653Z","iopub.execute_input":"2021-05-24T13:48:27.057293Z","iopub.status.idle":"2021-05-24T13:48:27.070464Z","shell.execute_reply.started":"2021-05-24T13:48:27.057252Z","shell.execute_reply":"2021-05-24T13:48:27.069629Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Model1 with EfficientNet B7 Base","metadata":{}},{"cell_type":"code","source":"#using inceptionresnet for transfer learning\nbase1=InceptionResNetV2(include_top=False,weights='imagenet')","metadata":{"execution":{"iopub.status.busy":"2021-05-24T13:48:27.071780Z","iopub.execute_input":"2021-05-24T13:48:27.072326Z","iopub.status.idle":"2021-05-24T13:48:36.009752Z","shell.execute_reply.started":"2021-05-24T13:48:27.072291Z","shell.execute_reply":"2021-05-24T13:48:36.008489Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#metrics for model evaluation:\nf1_score=F1Score(num_classes=6,average='macro',name='f1_score')\n\n#model name for training in folds\ndef get_model_name(i):\n    '''return model name for out of folds'''\n    return f'model_{i}.h5' ","metadata":{"execution":{"iopub.status.busy":"2021-05-24T13:48:36.012425Z","iopub.execute_input":"2021-05-24T13:48:36.013007Z","iopub.status.idle":"2021-05-24T13:48:36.023777Z","shell.execute_reply.started":"2021-05-24T13:48:36.012969Z","shell.execute_reply":"2021-05-24T13:48:36.023132Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Training model in folds","metadata":{}},{"cell_type":"code","source":"i=0\nfor train_index,test_index in kf.split(train):\n    train_set=train.iloc[train_index]\n    val_set=train.iloc[test_index]\n    \n    train_gen,val_gen=load_images(train_set,val_set,train_dir)\n    \n    #model\n    model=build_model(base=base1,dense=None)\n    \n    #freezing layers\n    for layer in model.layers[:-1]:\n        layer.trainable=False\n    \n    #compile\n    model.compile(loss=BinaryCrossentropy(),\n             optimizer='adam',\n             metrics=['accuracy',f1_score])\n    \n    \n    \n    EPOCHS=30\n    #callbacks:\n    model_path=get_model_name(i)\n    \n    #reduce_lr\n    reduce_lr=ReduceLROnPlateau(patience=2,factor=0.5,min_delta=1e-2,\n                                monitor='val_f1_score',verbose=0,mode='max')\n\n    #early stopping\n    early_stopping=EarlyStopping(patience=5,min_delta=1e-3,\n                              monitor='val_f1_score',restore_best_weights=True,mode='max')\n\n    #save model:\n    checkpoint1 = ModelCheckpoint(filepath=model_path, monitor='val_f1_score', verbose=1,\n                                save_best_only=True,mode='max') \n\n    callbacks_1=[reduce_lr,checkpoint1,early_stopping]\n    \n    \n    history1=model.fit(\n        train_gen,\n        validation_data=val_gen,\n        steps_per_epoch=train_gen.n//batch,\n        shuffle=True,\n        callbacks=callbacks_1,\n        epochs=EPOCHS,\n        verbose=1\n       )\n\n    plot_history(history1)\n    \n    \n    #clearing model \n    K.clear_session()\n    \n    #next fold:\n    print('Number of folds Trained {}'.format(i+1))\n    i+=1","metadata":{"execution":{"iopub.status.busy":"2021-05-24T13:59:58.000850Z","iopub.execute_input":"2021-05-24T13:59:58.001180Z","iopub.status.idle":"2021-05-24T14:10:06.575516Z","shell.execute_reply.started":"2021-05-24T13:59:58.001139Z","shell.execute_reply":"2021-05-24T14:10:06.571708Z"},"trusted":true},"execution_count":null,"outputs":[]}]}