{"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":"code","source":"import pandas as pd\nimport numpy as np\nimport tensorflow as tf\nimport tensorflow.keras as keras\nimport PIL\nimport cv2\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nimport os\nimport random\nfrom tqdm import tqdm\nimport tensorflow_addons as tfa\nimport random\nfrom sklearn.preprocessing import MultiLabelBinarizer\nimport tensorflow as tf\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nimport keras\nfrom keras.preprocessing import image\nfrom keras.models import Sequential\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator, load_img, img_to_array, smart_resize\nfrom keras.layers import Dense, Dropout, Flatten, BatchNormalization, Activation\nfrom keras.constraints import maxnorm\nfrom keras.layers.convolutional import Conv2D, MaxPooling2D\nfrom tensorflow.keras.optimizers import Adam\nimport cv2\nfrom PIL import Image\nfrom keras.preprocessing.image import load_img, img_to_array\nfrom keras.models import load_model\nfrom keras.metrics import AUC\nfrom tqdm.auto import tqdm\nsns.set_style('darkgrid')\npd.set_option(\"display.max_columns\", None)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_dir= '../input/resized-plant2021/img_sz_384'\ntest_dir =  '../input/plant-pathology-2021-fgvc8/test_images'\ntrain = pd.read_csv('../input/plant-pathology-2021-fgvc8/train.csv')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train['labels'] = train['labels'].apply(lambda string: string.split(' '))","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"s = list(train['labels'])\nmlb = MultiLabelBinarizer()\ntrainx = pd.DataFrame(mlb.fit_transform(s), columns=mlb.classes_, index=train.index)\nprint(trainx.columns)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"labels = pd.concat([train['image'], trainx], axis=1)\nlabels.head()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"image_datagen = ImageDataGenerator(\n    rescale=1/255.0,\n    rotation_range=5,\n    zoom_range=0.1,\n    shear_range=0.05,\n    horizontal_flip=True,\n    validation_split=0.1\n    \n)\nIMAGE = (256, 256)\nBATCH_SIZE = 64","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_data = image_datagen.flow_from_dataframe(\n    dataframe=labels,\n    directory= '../input/resized-plant2021/img_sz_512',\n    x_col=\"image\",\n    y_col=labels.columns.tolist()[1:],\n    color_mode=\"rgb\",\n    target_size = IMAGE,\n    class_mode=\"raw\",\n    subset = \"training\",\n    batch_size=BATCH_SIZE\n)\n\ntest_data = image_datagen.flow_from_dataframe(\n    dataframe=labels,\n    directory= '../input/resized-plant2021/img_sz_512',\n    x_col=\"image\",\n    y_col=labels.columns.tolist()[1:],\n    color_mode=\"rgb\",\n    target_size = IMAGE,\n    class_mode=\"raw\",\n    subset = \"validation\",\n    batch_size=BATCH_SIZE\n)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Modeling","metadata":{}},{"cell_type":"code","source":"inputs = tf.keras.Input(shape=(256, 256, 3))\nx = tf.keras.applications.MobileNetV2(include_top=False)(inputs)\nx = tf.keras.layers.GlobalAveragePooling2D()(x)\noutputs = tf.keras.layers.Dense(6, activation='sigmoid')(x)\n\nmodel = tf.keras.models.Model(inputs, outputs)\nmodel.summary()\ntf.keras.utils.plot_model(model, show_shapes=True)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.compile(loss='binary_crossentropy', \n              optimizer=tf.keras.optimizers.Adam(lr=1e-4),\n              metrics=[\"accuracy\"])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"rlp = tf.keras.callbacks.ReduceLROnPlateau(monitor='val_loss',\n                                           mode='min',\n                                           patience=2, \n                                           verbose=0, \n                                           factor=0.01)\nearlystop = tf.keras.callbacks.EarlyStopping(monitor='val_loss', \n                                             patience=5, \n                                             verbose=1, \n                                             restore_best_weights=True)\ncallbacks=[rlp,earlystop]","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model_history = model.fit(train_data, \n                          validation_data=test_data, \n                          validation_steps = test_data.n // BATCH_SIZE,\n                          epochs=30, \n                          callbacks=callbacks)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fix, ax = plt.subplots(figsize=(20, 6))\npd.DataFrame(model_history.history)[['loss', 'val_loss']].plot(ax=ax, title='Model Loss Curve')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.save('mobilenetv2image512.h5')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.metrics import classification_report","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Submission","metadata":{}},{"cell_type":"code","source":"submissions = pd.read_csv('../input/plant-pathology-2021-fgvc8/sample_submission.csv')\nsubmissions.head()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_data_generator = tf.keras.preprocessing.image.ImageDataGenerator(rescale=1./255)\n\ntest_generator = test_data_generator.flow_from_dataframe(\n    submissions,\n    directory = '../input/plant-pathology-2021-fgvc8/test_images',\n    x_col=\"image\",\n    y_col=None,\n    target_size=(256, 256),\n    color_mode=\"rgb\",\n    classes=None,\n    class_mode=None,\n    shuffle=False,\n    batch_size=32\n)\n\npredictions = model.predict(test_generator)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"verdict = (predictions>0.25)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for x in verdict:\n    count = 0\n    for i in range(len(x)):\n        if x[i]==False:\n            count=count+1\n    if count==len(x):\n        x[2]=True","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for x in verdict:\n    if x[2]:\n        for i in range(len(x)):\n            x[i]=False\n        x[2]=True","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"label = labels.columns.tolist()[1:]\nlabel","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"pred_lists = []\nfor i in range(verdict.shape[0]):\n    tmp = []\n    for j, c in enumerate(label):\n        if verdict[i, j]:\n            tmp.append(c)\n    pred_lists.append(tmp)\n\npred_lists = [' '.join(t) for t in pred_lists]\npred_lists","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submissions['labels'] = np.array(pred_lists)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submissions","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submissions.to_csv('submission.csv', index=False)  ","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}