{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"import gc\nimport os\nimport warnings\nimport numpy as np \nimport pandas as pd\nimport seaborn as sns\nimport matplotlib.pyplot as plt\n\nimport math\nfrom keras.callbacks import Callback\nfrom keras import backend\nfrom keras.models import Sequential, Model\nfrom keras.layers import Dense, Dropout, Flatten, Activation, Conv2D, GlobalAveragePooling2D, BatchNormalization, Input\nfrom keras.optimizers import Adam, SGD, Nadam\nfrom keras.metrics import categorical_accuracy\nfrom keras.callbacks import ModelCheckpoint, EarlyStopping\nfrom keras.callbacks import LearningRateScheduler, ReduceLROnPlateau, TensorBoard\n\nimport cv2\n\nimport PIL\nfrom PIL import ImageOps, ImageFilter, ImageDraw\nfrom keras.applications import *\nfrom sklearn.model_selection import train_test_split\nfrom keras.preprocessing.image import ImageDataGenerator\nfrom keras import backend as K\nwarnings.filterwarnings(action='ignore')\n\n!pip install git+https://github.com/qubvel/efficientnet\nfrom efficientnet.keras import EfficientNetB3\n\nK.image_data_format()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"list_dir = os.listdir('../input')\nprint(list_dir)","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","trusted":true},"cell_type":"code","source":"CROP_PATH = os.path.join('../input', list_dir[2])\nCSV_PATH = os.path.join('../input', list_dir[6])\n\n# image folder path\nTRAIN_IMG_PATH = CROP_PATH + '/train_crop'\nTEST_IMG_PATH = CROP_PATH + '/test_crop'","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model_path = './model/'\n\nif(not os.path.exists(model_path)):\n    os.mkdir(model_path)\n\n# read csv\ndf_train = pd.read_csv(CSV_PATH + '/train.csv')\ndf_test = pd.read_csv(CSV_PATH + '/test.csv')\ndf_class = pd.read_csv(CSV_PATH + '/class.csv')\n\ndf_train[\"class\"] = df_train[\"class\"].astype('str')\n\ndf_train = df_train[['img_file', 'class']]\ndf_test = df_test[['img_file']]\n\n# Parameter\n# nb_train_samples = len(X_train)\n# nb_validation_samples = len(X_val)\nnb_test_samples = len(df_test)\n\n# Define Generator config\n# https://www.kaggle.com/kozistr/seedlings-densenet-161-48-public-lb-98-236\n\nbatch_size = 32\n\ntrain_datagen = ImageDataGenerator(\n    rotation_range = 60,\n#     shear_range = 0.25,\n    width_shift_range=0.30,\n    height_shift_range=0.30,\n    horizontal_flip = True, \n    vertical_flip = False,\n    zoom_range=0.25,\n    fill_mode = 'nearest',\n    rescale = 1./255)\n\nval_datagen = ImageDataGenerator(rescale = 1./255)\ntest_datagen = ImageDataGenerator(rescale = 1./255)\n\ndef get_steps(num_samples, batch_size):\n    if (num_samples % batch_size) > 0 :\n        return (num_samples // batch_size) + 1\n    else :\n        return num_samples // batch_size","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"img_size = (299, 299)\n# Make Generator\ntrain_generator_299 = train_datagen.flow_from_dataframe(\n    dataframe=df_train, \n    directory=TRAIN_IMG_PATH,\n    x_col = 'img_file',\n    y_col = 'class',\n    target_size = img_size,\n    color_mode='rgb',\n    class_mode='categorical',\n    batch_size=batch_size,\n    seed=42\n)\n    \ntest_generator_299 = test_datagen.flow_from_dataframe(\n    dataframe=df_test,\n    directory=TEST_IMG_PATH,\n    x_col='img_file',\n    y_col=None,\n    target_size= (299, 299),\n    color_mode='rgb',\n    class_mode=None,\n    batch_size=batch_size,\n    shuffle=False\n)\n\ntest_generator_224 = test_datagen.flow_from_dataframe(\n    dataframe=df_test,\n    directory=TEST_IMG_PATH,\n    x_col='img_file',\n    y_col=None,\n    target_size= (224, 224),\n    color_mode='rgb',\n    class_mode=None,\n    batch_size=batch_size,\n    shuffle=False\n)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def get_model(base_model, input_size, train_session, dropout_rate = 0.3):\n    base_model = base_model(weights='imagenet', input_shape=(input_size,input_size,3), include_top=False)\n\n    inputs = Input(shape = (input_size, input_size, 3), name = 'input_1')\n    x = base_model(inputs)\n    x = GlobalAveragePooling2D()(x)\n    x = Dense(2048, kernel_initializer='he_normal')(x)\n    x = Dropout(dropout_rate)(x)\n    x = Activation('relu')(x)\n    x = Dense(196, activation = 'softmax')(x)\n\n    model = Model(inputs = inputs, outputs = x)\n    if(train_session):\n        nadam = Nadam(lr = lr)\n        model.compile(optimizer= nadam, loss='categorical_crossentropy', metrics=[categorical_accuracy,\n                                                                              f1_m, precision_m, recall_m])\n    return model","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import os\nos.listdir('../input')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from keras.models import load_model\n\n# MODEL folder path\nEFF_PATH = os.path.join('../input', list_dir[5])\nXCEPTION_PATH = os.path.join('../input', list_dir[1])\nINCEPRES_PATH = os.path.join('../input', list_dir[4])\nCUTMIX_PATH = os.path.join('../input', list_dir[1])\n\nxception_model = ['_Xception_f1_8fold.hdf5', Xception]\neff_model = ['_EFF_f1_8fold.hdf5', EfficientNetB3]\nincepres_model = ['_IncepRes_f1_8fold.hdf5', InceptionResNetV2]\ncutmix_model = ['_cmm.hdf5', InceptionResNetV2]\n\nmodel_list = [xception_model, eff_model, incepres_model]\n# total predictions list\npreds_list = []\n\nTTA_STEPS = 5\n\nfor model_name, base_model in model_list:\n    print(model_name)\n    # prediction each fold\n    img_size = 299\n    predictions = []\n    fold_num = 8 + 1\n    \n    # model_load_dir\n    if(model_name == '_EFF_f1_8fold.hdf5'):\n        model_load_dir = EFF_PATH\n    elif(model_name == '_Xception_f1_8fold.hdf5'):\n        model_load_dir = XCEPTION_PATH\n    elif(model_name == '_IncepRes_f1_8fold.hdf5'):\n        model_load_dir = INCEPRES_PATH\n    elif(model_name == '_cmm.hdf5'):\n        model_load_dir = CUTMIX_PATH\n\n    for i in range(1, fold_num):\n        model = get_model(base_model, img_size, train_session = False)\n        # '..input/EFF_F1_8fold/i_EFF_f1_8fold.hdf5'\n        model.load_weights(os.path.join(model_load_dir, str(i)) + model_name)\n        # tta prediction list\n        tta_preds = []\n        for _ in range(TTA_STEPS):\n            if(img_size == 224):\n                test_generator_224.reset()\n                pred = model.predict_generator(\n                generator = test_generator_224, \n                steps = get_steps(nb_test_samples, batch_size),\n                verbose = 1\n                )\n            else:\n                test_generator_299.reset()\n                pred = model.predict_generator(\n                generator = test_generator_299, \n                steps = get_steps(nb_test_samples, batch_size),\n                verbose = 1\n                )\n            tta_preds.append(pred) # (TTA_STEP, 6150, 196)\n        tta_preds = np.mean(tta_preds, axis = 0) # (6150, 196)\n        predictions.append(tta_preds) # (fold, 6150, 196)\n        # for memory leaky\n        del model\n        for _ in range(10):\n            gc.collect()\n        K.clear_session()\n    preds_list.append(np.mean(predictions, axis = 0))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# 0.34, 0.34, 0.32가 제일 좋음.\npreds = (preds_list[1] * 0.5) + (preds_list[2] * 0.5)\npreds_class_indices=np.argmax(preds, axis=1)\npreds_labels = (train_generator_299.class_indices)\nlabels = dict((v,k) for k,v in preds_labels.items())\nfinal_predictions = [labels[k] for k in preds_class_indices]\n\nsubmission = pd.read_csv(os.path.join(CSV_PATH, 'sample_submission.csv'))\nsubmission[\"class\"] = final_predictions\nsubmission.to_csv(\"submission.csv\", index=False)\nsubmission.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# 0.34, 0.34, 0.32가 제일 좋음.\npreds = preds_list[0]\npreds_class_indices=np.argmax(preds, axis=1)\npreds_labels = (train_generator_299.class_indices)\nlabels = dict((v,k) for k,v in preds_labels.items())\nfinal_predictions = [labels[k] for k in preds_class_indices]\n\nsubmission = pd.read_csv(os.path.join(CSV_PATH, 'sample_submission.csv'))\nsubmission[\"class\"] = final_predictions\nsubmission.to_csv(\"submission2.csv\", index=False)\nsubmission.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# 0.34, 0.34, 0.32가 제일 좋음.\npreds = preds_list[1]\npreds_class_indices=np.argmax(preds, axis=1)\npreds_labels = (train_generator_299.class_indices)\nlabels = dict((v,k) for k,v in preds_labels.items())\nfinal_predictions = [labels[k] for k in preds_class_indices]\n\nsubmission = pd.read_csv(os.path.join(CSV_PATH, 'sample_submission.csv'))\nsubmission[\"class\"] = final_predictions\nsubmission.to_csv(\"submission3.csv\", index=False)\nsubmission.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# 0.34, 0.34, 0.32가 제일 좋음.\npreds = (preds_list[0] * 0.8) + (preds_list[1] * 0.2)\npreds_class_indices=np.argmax(preds, axis=1)\npreds_labels = (train_generator_299.class_indices)\nlabels = dict((v,k) for k,v in preds_labels.items())\nfinal_predictions = [labels[k] for k in preds_class_indices]\n\nsubmission = pd.read_csv(os.path.join(CSV_PATH, 'sample_submission.csv'))\nsubmission[\"class\"] = final_predictions\nsubmission.to_csv(\"submission4.csv\", index=False)\nsubmission.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# 0.34, 0.34, 0.32가 제일 좋음.\npreds = (preds_list[0] * 0.2) + (preds_list[1] * 0.8)\npreds_class_indices=np.argmax(preds, axis=1)\npreds_labels = (train_generator_299.class_indices)\nlabels = dict((v,k) for k,v in preds_labels.items())\nfinal_predictions = [labels[k] for k in preds_class_indices]\n\nsubmission = pd.read_csv(os.path.join(CSV_PATH, 'sample_submission.csv'))\nsubmission[\"class\"] = final_predictions\nsubmission.to_csv(\"submission5.csv\", index=False)\nsubmission.head()","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"name":"python","version":"3.6.4","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"}},"nbformat":4,"nbformat_minor":1}