{"cells":[{"metadata":{"trusted":true},"cell_type":"code","source":"import numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nimport os\nimport shutil\nimport json\nfrom PIL import Image","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from tensorflow.keras.models import Sequential\nfrom tensorflow.keras import layers\nfrom tensorflow.keras.callbacks import ReduceLROnPlateau, EarlyStopping\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom tensorflow.keras.applications import ResNet50, VGG16, InceptionResNetV2\nfrom tensorflow.keras.applications.resnet import preprocess_input","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train = pd.read_csv('/kaggle/input/cassava-leaf-disease-classification/train.csv')\nimage_path = '/kaggle/input/cassava-leaf-disease-classification/train_images/'","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"label_to_disease = json.load(open('/kaggle/input/cassava-leaf-disease-classification/label_num_to_disease_map.json'))\ntrain['disease'] = train.label.map(label_to_disease)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"label_to_disease","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# new_train = []\n# sets = []; getEx = True\n# for i in trainingset:\n#     blurr = cv2.GaussianBlur(i,(5,5),0)\n#     hsv = cv2.cvtColor(blurr,cv2.COLOR_BGR2HSV)\n#     #GREEN PARAMETERS\n#     lower = (25,40,50)\n#     upper = (75,255,255)\n#     mask = cv2.inRange(hsv,lower,upper)\n#     struc = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(11,11))\n#     mask = cv2.morphologyEx(mask,cv2.MORPH_CLOSE,struc)\n#     boolean = mask>0\n#     new = np.zeros_like(i,np.uint8)\n#     new[boolean] = i[boolean]\n#     new_train.append(new)\n    \n#     if getEx:\n#         plt.subplot(2,3,1);plt.imshow(i) # ORIGINAL\n#         plt.subplot(2,3,2);plt.imshow(blurr) # BLURRED\n#         plt.subplot(2,3,3);plt.imshow(hsv) # HSV CONVERTED\n#         plt.subplot(2,3,4);plt.imshow(mask) # MASKED\n#         plt.subplot(2,3,5);plt.imshow(boolean) # BOOLEAN MASKED\n#         plt.subplot(2,3,6);plt.imshow(new) # NEW PROCESSED IMAGE\n#         plt.show()\n#         getEx = False\n# new_train = np.asarray(new_train)\n\n# # CLEANED IMAGES\n# for i in range(8):\n#     plt.subplot(2,4,i+1)\n#     plt.imshow(new_train[i])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train.label.value_counts()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"Image.open(os.path.join(image_path, train[train.label == 0].image_id.iloc[0]))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train.label = train.label.astype(str)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Somehow imbalanced on class 3"},{"metadata":{"trusted":true},"cell_type":"code","source":"import seaborn as sns\nimport matplotlib.pyplot as plt\nsns.countplot(train['label'], edgecolor='black')\n# plt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# train['label'].hist(figsize=(12, 8))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"data_generator = ImageDataGenerator(\n    rotation_range=45,\n    width_shift_range=0.2,\n    height_shift_range=0.2,\n    zoom_range=0.2,\n    horizontal_flip=True,\n    vertical_flip=True,\n    preprocessing_function=preprocess_input,\n    validation_split=0.25,\n)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_data_loader = data_generator.flow_from_dataframe(\n    train,\n    directory=image_path,\n    x_col=\"image_id\",\n    y_col=\"label\",\n    target_size=(224, 224),\n    subset='training'\n)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"val_data_loader = data_generator.flow_from_dataframe(\n    train,\n    directory=image_path,\n    x_col=\"image_id\",\n    y_col=\"label\",\n    target_size=(224, 224),\n    subset='validation'\n)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model = Sequential([\n    InceptionResNetV2(\n        include_top=False, \n        weights='../input/keras-pretrained-models/inception_resnet_v2_weights_tf_dim_ordering_tf_kernels_notop.h5', \n        pooling='avg', \n        input_shape=(224, 224, 3)\n    ),\n    \n    layers.Dense(5, activation='softmax')\n])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# train, valid = train_test_split(train_labels, train_size = 0.8, shuffle = True,\n#                                 random_state = 0)\n# BATCH_SIZE = 200\n# STEPS_PER_EPOCH = len(train) / BATCH_SIZE\n# VALIDATION_STEPS = len(valid) / BATCH_SIZE\n# EPOCHS = 8\n\n\n# def create_model():\n#     model = Sequential()\n#     model.add(layers.Conv2D(32, (5, 5), activation = \"relu\", \n#                             input_shape=(150, 150, 3)))\n#     model.add(layers.MaxPooling2D((2, 2)))\n#     model.add(layers.Conv2D(64, (5, 5), activation = \"relu\"))\n#     model.add(layers.MaxPooling2D((2, 2)))\n#     model.add(layers.Conv2D(128, (5, 5), activation = \"relu\"))\n#     model.add(layers.MaxPooling2D((2, 2)))\n#     model.add(layers.Conv2D(128, (5, 5), activation = \"relu\"))\n#     model.add(layers.MaxPooling2D(2, 2))\n#     model.add(layers.Flatten())\n#     model.add(layers.Dense(512, activation = \"relu\"))\n#     model.add(layers.Dense(5, activation = \"softmax\"))\n\n#     model.compile(optimizer = 'rmsprop',\n#                   loss = \"categorical_crossentropy\",\n#                   metrics = [\"acc\"])\n#     return model\n# model = create_model()\n# model.summary()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"callbacks = [ReduceLROnPlateau(factor=0.5, patience=5, verbose=1), EarlyStopping(monitor=\"loss\", patience=3, restore_best_weights=True)]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model.summary()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_kg_hide-output":true},"cell_type":"code","source":"model.fit(train_data_loader, \n          validation_data=val_data_loader, \n          batch_size=1024, epochs=100, \n          callbacks=callbacks)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"history_df = pd.DataFrame(model.history.history)\nhistory_df[['loss', 'val_loss']].plot()\nhistory_df[['accuracy', 'val_accuracy']].plot()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test_images = os.listdir('/kaggle/input/cassava-leaf-disease-classification/test_images/')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"predict = []\n\nfor i in test_images:\n    image = Image.open(f'/kaggle/input/cassava-leaf-disease-classification/test_images/{i}')\n    image = image.resize((224, 224))\n    \n    image = preprocess_input(np.asarray(image))\n    image = np.expand_dims(image, axis=0)\n    \n    predict.append(np.argmax(model.predict(image)))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"submission = pd.DataFrame({'image_id': test_images, 'label': predict})","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"submission","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"submission.to_csv('submission.csv', index=None)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]}],"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":4,"nbformat_minor":4}