{"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":"# **Imports**","metadata":{}},{"cell_type":"code","source":"import numpy as np \nimport pandas as pd \nimport tensorflow as tf\nfrom tensorflow import keras\nimport matplotlib.pyplot as plt\nimport os\nimport PIL\nfrom PIL import Image\nimport glob\nimport time\nimport matplotlib.image as mpimg","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# **Loading Data**","metadata":{}},{"cell_type":"code","source":"plant_df = pd.read_csv('/kaggle/input/plant-pathology-2021-fgvc8/train.csv').sort_values('image')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plant_df","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# **Data Exploration**","metadata":{}},{"cell_type":"code","source":"plant_df['image'].size","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"labels_count = plant_df['labels'].value_counts()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(labels_count)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"labels_count.sum()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"classes = list(labels_count.index)\nprint(classes)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"images = glob.glob('/kaggle/input/plant-pathology-2021-fgvc8/train_images/*.jpg')\nfor image in images[:100]:\n    with open(image, 'rb') as file:\n        img = Image.open(file)\n        print(img.size)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"already_visited_labels = []\ni = 0\nj = 0\nfigure, axes = plt.subplots(nrows=12, ncols=2, figsize=(250, 250))\nwhile len(already_visited_labels) < 12:\n    if plant_df['labels'][i] not in already_visited_labels:\n        already_visited_labels.append(plant_df['labels'][i])\n        axes[j, 0].imshow(mpimg.imread(r'/kaggle/input/plant-pathology-2021-fgvc8/train_images/' + plant_df['image'][i]))\n        axes[j, 1].text(0, 0, plant_df['labels'][i], fontsize=300)\n        j += 1\n    i += 1\n[axi.axis('off') for axi in axes.ravel()]\nfigure.show()\n    ","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def plot_dynamic_image_augmentations(image_path):\n    data_generators = [tf.keras.preprocessing.image.ImageDataGenerator(\n                            rotation_range=20),\n                       tf.keras.preprocessing.image.ImageDataGenerator(\n                            width_shift_range=0.2),\n                       tf.keras.preprocessing.image.ImageDataGenerator(\n                            height_shift_range=0.2),\n                       tf.keras.preprocessing.image.ImageDataGenerator(\n                            horizontal_flip=True),\n                       tf.keras.preprocessing.image.ImageDataGenerator(\n                            zoom_range = 0.2),\n                       tf.keras.preprocessing.image.ImageDataGenerator(\n                            shear_range = 0.2),\n                       tf.keras.preprocessing.image.ImageDataGenerator(\n                            \n                            rotation_range=20,\n                            width_shift_range=0.2,\n                            height_shift_range=0.2,\n                            horizontal_flip=True,\n                            zoom_range = 0.2,\n                            shear_range = 0.2,\n                        )]\n    data_generators_names = ['Rotation Range 20',\n                             'Width Shift Range  0.2',\n                             'Height Shift Range 0.2',\n                             'Horizontal Flip',\n                             'Zoom Range 0.2',\n                             'Shear Range 0.2',\n                             'All Augmentations'\n                            ]\n    fig, rows = plt.subplots(nrows=len(data_generators), ncols=2, figsize=(18,18))\n    for i in range(len(data_generators)): \n        image = mpimg.imread(image_path)\n        images = image.reshape((1, image.shape[0], image.shape[1], image.shape[2]))\n        data_generators[i].fit(images)\n        image_iterator = data_generators[i].flow(images)\n        for j in range(2):\n            rows[i, j].title.set_text(data_generators_names[i])\n            rows[i, j].imshow(image_iterator.next()[0].astype('int'))\n            rows[i, j].axis('off')\n    fig.tight_layout()\n    fig.show()\n\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plot_dynamic_image_augmentations('/kaggle/input/plant-pathology-2021-fgvc8/train_images/800113bb65efe69e.jpg')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# **Data Preprocessing**","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19"}},{"cell_type":"code","source":"TRAIN_PATH = \"../input/plant-pathology-2021-fgvc8/train_images/\"\nNUM_CLASSES =  len(classes)\nHEIGHT,WIDTH = 224,224\nBATCH_SIZE = 32\nSEED = 143\nSPLIT = 0.1","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Image training and testing datasets\ndatagen = tf.keras.preprocessing.image.ImageDataGenerator(\n    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 = SPLIT,\n    zoom_range = 0.2,\n    shear_range = 0.2,\n)\n\ntrain_dataset = datagen.flow_from_dataframe(\n    plant_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 = True\n)\n\nvalidation_dataset = datagen.flow_from_dataframe(\n    plant_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 = True\n)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_dataset[0][0][0].shape","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_dataset[0]","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for i in range(5):\n    plt.figure(i)\n    plt.title(classes[int(np.where(train_dataset[i][1][0] == 1.0)[0])])\n    plt.imshow(train_dataset[i][0][0])\n    plt.axis('off')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for i in range(5):\n    plt.figure(i)\n    plt.title(classes[int(np.where(validation_dataset[i][1][0] == 1.0)[0])])\n    plt.imshow(validation_dataset[i][0][0])\n    plt.axis('off')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# **AlexNet**","metadata":{}},{"cell_type":"code","source":"\"\"\"model = keras.models.Sequential([\n    keras.layers.Conv2D(filters=96, kernel_size=(11,11), strides=(4,4), activation='relu', input_shape=(224,224,3)),\n    keras.layers.BatchNormalization(),\n    keras.layers.MaxPool2D(pool_size=(3,3), strides=(2,2)),\n    keras.layers.Conv2D(filters=256, kernel_size=(5,5), strides=(1,1), activation='relu', padding=\"same\"),\n    keras.layers.BatchNormalization(),\n    keras.layers.MaxPool2D(pool_size=(3,3), strides=(2,2)),\n    keras.layers.Conv2D(filters=384, kernel_size=(3,3), strides=(1,1), activation='relu', padding=\"same\"),\n    keras.layers.BatchNormalization(),\n    keras.layers.Conv2D(filters=384, kernel_size=(3,3), strides=(1,1), activation='relu', padding=\"same\"),\n    keras.layers.BatchNormalization(),\n    keras.layers.Conv2D(filters=256, kernel_size=(3,3), strides=(1,1), activation='relu', padding=\"same\"),\n    keras.layers.BatchNormalization(),\n    keras.layers.MaxPool2D(pool_size=(3,3), strides=(2,2)),\n    keras.layers.Flatten(),\n    keras.layers.Dense(4096, activation='relu'),\n    keras.layers.Dropout(0.5),\n    keras.layers.Dense(4096, activation='relu'),\n    keras.layers.Dropout(0.5),\n    keras.layers.Dense(12, activation='softmax')\n])\"\"\"","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = tf.keras.models.load_model('../input/plantpathologymodels/models/plant_pathology2')\nmodel.summary()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# **Training**","metadata":{}},{"cell_type":"code","source":"\"\"\"def get_run_logdir():\n    run_id = time.strftime(\"run_%Y_%m_%d-%H_%M_%S\")\n    return os.path.join(root_logdir, run_id)\"\"\"","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\"\"\"root_logdir = os.path.join(os.curdir, \"logs\\\\fit\\\\\")\n\nrun_logdir = get_run_logdir()\ntensorboard_cb = keras.callbacks.TensorBoard(run_logdir)\"\"\"","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\"\"\"model.compile(loss='categorical_crossentropy', optimizer=tf.optimizers.SGD(lr=0.001), metrics=['accuracy'])\nmodel.summary()\"\"\"","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# **Evaluation**","metadata":{}},{"cell_type":"code","source":"TEST_PATH = \"../input/plant-pathology-2021-fgvc8/test_images/\"","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_plant_images = []\nglobbed_files = glob.glob(\"../input/plant-pathology-2021-fgvc8/test_images/*.jpg\")\nfor image_file in globbed_files:\n    test_plant_images.append(os.path.basename(image_file))\ntest_plant_df = pd.DataFrame(test_plant_images, columns=['image']).sort_values('image').reset_index().drop('index', axis=1)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_plant_df['labels'] = 'None'","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(test_plant_df)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"datagen_test = tf.keras.preprocessing.image.ImageDataGenerator(rescale = 1/255.)\n\ntest_dataset = datagen.flow_from_dataframe(\n    test_plant_df,\n    directory = TEST_PATH,\n    x_col = \"image\",\n    y_col = \"labels\",\n    target_size = (HEIGHT,WIDTH),\n    class_mode='categorical',\n    batch_size = 1,\n    shuffle = True,\n    seed = SEED,\n    validate_filenames = True\n)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"predictions = model.predict(test_dataset)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def convert_predictions_to_labels(predictions_list):\n    labels_list = []\n    for i in range(len(predictions_list)):\n        labels_list.append(classes[np.argmax(predictions[i])])\n    return labels_list\n        ","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(predictions)\nprint(convert_predictions_to_labels(predictions))","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_plant_df['labels'] = convert_predictions_to_labels(predictions)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(test_plant_df)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_plant_df.to_csv('./submission.csv', index=False)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data = pd.read_csv('./submission.csv').sort_values('image')\nprint(data)","metadata":{"trusted":true},"execution_count":null,"outputs":[]}]}