{"cells":[{"metadata":{},"cell_type":"markdown","source":"# Summary\nIn this code, contrast adjustment was applied to the dataset in addition to EfficientNet B3. <br>\nIt was found that the score was improved compared to just EfficientNet B3 in my previous model after only 10 epochs.<br>\n<br>\nRef.: I learned a lot from the following notebook for EfficientNet model. I would like to extend my appreciation to the author. <br>\n>    Cassava Disease 🌿 Keras + TF + EfficentNet (90%)<br>\n>    https://www.kaggle.com/andreshg/cassava-disease-keras-tf-efficentnet-90\n"},{"metadata":{},"cell_type":"markdown","source":"# Import necessary modules"},{"metadata":{"trusted":true},"cell_type":"code","source":"import imp\nimport random\nimport warnings\nfrom keras import layers, models\nfrom keras import Model\nfrom keras import callbacks\nfrom keras.models import Sequential\nfrom keras_preprocessing.image import ImageDataGenerator\nfrom keras.layers import Dense, Activation, Flatten, Dropout, BatchNormalization, GlobalAveragePooling2D\nfrom keras.layers import Conv2D, MaxPooling2D\nfrom keras.optimizers import RMSprop, Adam\nfrom keras.callbacks import EarlyStopping, ModelCheckpoint, ReduceLROnPlateau\nimport pandas as pd\nimport numpy as np\nimport os\nimport matplotlib.pyplot as plt\nimport tensorflow as tf\nfrom tensorflow.keras.applications import EfficientNetB3\nfrom tensorflow.keras.models import load_model\nfrom tensorflow.python.training.tracking import base\nfrom sklearn.model_selection import train_test_split","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Data frame Preparation"},{"metadata":{"trusted":true},"cell_type":"code","source":"train_csv_location = '../input/cassava-leaf-disease-classification/train.csv'\ntrain_image_location = '../input/cassava-leaf-disease-classification/train_images'\ntest_image_location = '../input/cassava-leaf-disease-classification/test_images'\n\ndef seed_everything(seed=0):\n    random.seed(seed)\n    np.random.seed(seed)\n    tf.random.set_seed(seed)\n    os.environ['PYTHONHASHSEED'] = str(seed)\n    os.environ['TF_DETERMINISTIC_OPS'] = '1'\n\nseed = 21\nseed_everything(seed)\nwarnings.filterwarnings('ignore')\n\ntraindf = pd.read_csv(train_csv_location, dtype=str)\ntest_image_dir = os.listdir(test_image_location)\ntestdf = pd.DataFrame(test_image_dir, columns=['image_id'])\n\ntrain, valid = train_test_split(traindf, test_size = 0.05, \n    random_state = 42, stratify = traindf['label']\n    )\n\nIMG_SIZE = 456\nsize = (IMG_SIZE,IMG_SIZE)\nn_CLASS = 5\nBATCH_SIZE = 15","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Image Contrast Change\nThis changes contrast of images. It looks to me that disease pattern on the leaf became clearer.<br>\n"},{"metadata":{"trusted":true},"cell_type":"code","source":"def adj_contrast(img):\n    img_adj = tf.image.adjust_contrast(img,2)\n    return img_adj","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"> # Example (before contrast adjustment)"},{"metadata":{"trusted":true},"cell_type":"code","source":"import cv2\nimg = cv2.imread('../input/cassava-leaf-disease-classification/train_images/1000201771.jpg')\nplt.imshow(img)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Example (after contrast adjustment)\nContrast adjustment makes pattern on leaves clearer."},{"metadata":{"trusted":true},"cell_type":"code","source":"img_adj=adj_contrast(img)\nprint('After contrast adjustment')\nplt.imshow(img_adj)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Image Generator, Augmentation, Models, Submission\nFor preprocessing_function in ImageDataGenerator, I used the defined \"adj_contrast\" which changes contrast of images.<br>\nI imported a model from my private file. To make a model based on EfficientNetB3, please refer to the following. <br>\n>    Cassava Disease 🌿 Keras + TF + EfficentNet (90%)<br>\n>    https://www.kaggle.com/andreshg/cassava-disease-keras-tf-efficentnet-90"},{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"datagen_train = ImageDataGenerator(\n    preprocessing_function= adj_contrast,\n    rotation_range=40,\n    width_shift_range= 0.2,\n    height_shift_range= 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)\ndatagen_val = ImageDataGenerator(\n    preprocessing_function= adj_contrast,\n)\ntest_datagen=ImageDataGenerator(\n    preprocessing_function= adj_contrast,\n)\n\ntrain_generator = datagen_train.flow_from_dataframe(\n    dataframe = train,\n    directory = train_image_location,\n    seed= 42,\n    x_col = 'image_id',\n    y_col = 'label',\n    target_size= size,\n    class_mode= 'categorical',\n    interpolation= 'nearest',\n    shuffle= True,\n    batch_size= BATCH_SIZE\n)\n\nvalid_generator = datagen_val.flow_from_dataframe(\n    dataframe = valid,\n    directory= train_image_location,\n    seed= 42,\n    x_col = 'image_id',\n    y_col = 'label',\n    target_size= size,\n    class_mode= 'categorical',\n    interpolation= 'nearest',\n    shuffle= True,\n    batch_size= BATCH_SIZE\n)\n\ntest_generator=test_datagen.flow_from_dataframe(\n    dataframe=testdf,\n    directory= test_image_location,\n    seed=42,\n    x_col = 'image_id',\n    y_col = None,\n    target_size= size,\n    interpolation= 'nearest',\n    shuffle= False,\n    batch_size=1,\n    class_mode=None,\n)\n\nEPOCHS = 10\nSTEP_SIZE_TRAIN=train_generator.n//train_generator.batch_size\nSTEP_SIZE_VALID=valid_generator.n//valid_generator.batch_size\nSTEP_SIZE_TEST=test_generator.n//test_generator.batch_size\n\nes = EarlyStopping(\n    monitor='val_loss', \n    mode='min', \n    patience=3,\n    restore_best_weights=True, \n    verbose=1,\n)\n\ncheckpoint_cb = ModelCheckpoint(\n    \"best_model7_2x.h5\",\n    save_best_only=True,\n    monitor='val_loss',\n    mode='min',\n)\n\nreduce_lr = ReduceLROnPlateau(\n    monitor='val_loss',\n    factor=0.2,\n    patience=2,\n    min_lr=1e-6,\n    mode='min',\n    verbose=1,\n)\n\n# Fit the model\nmodel = load_model('../input/cassavaleafdiseaseclassification/best_model7_2x.h5')\nhistory = model.fit(\n    train_generator, \n    validation_data=valid_generator,                \n    epochs=EPOCHS,\n    batch_size=BATCH_SIZE,\n    steps_per_epoch=STEP_SIZE_TRAIN,\n    validation_steps=STEP_SIZE_VALID,\n    callbacks=[es,checkpoint_cb, reduce_lr],\n    workers=16,\n)\nmodel.save('./best_model7_2.h5')\n\nsess = tf.compat.v1.Session(config=tf.compat.v1.ConfigProto(log_device_placement=True))\nfrom tensorflow.compat.v1.keras import backend as K\nK.set_session(sess)\n\nfinal_model = models.load_model('./best_model7_2x.h5')\n\n# predict output\ntest_generator.reset()\npred = final_model.predict(test_generator, steps = STEP_SIZE_TEST, verbose = 1)\n\npredicted_class_indices=np.argmax(pred,axis=1)\n\nlabels = (train_generator.class_indices)\nlabels = dict((v,k) for k,v in labels.items())\npredictions = [labels[k] for k in predicted_class_indices]\n\n# export to csv\nfilenames=test_generator.filenames\nresults=pd.DataFrame({\"image_id\":filenames, \"label\":predictions})\nresults.to_csv(\"submission.csv\",index=False)","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}