{"cells":[{"metadata":{},"cell_type":"markdown","source":"## Reference\n - Xception 관련  \n https://www.kaggle.com/janged/3rd-ml-month-xception-stratifiedkfold-ensemble (Jang 님 노트북)  \n - EfficientNet 관련  \n https://www.kaggle.com/kimtaegwan/14th-solution (Taegwan Kim 님 노트북)  \n - Image Crop 관련  \n https://www.kaggle.com/tmheo74/3rd-ml-month-car-image-cropping-updated-7-10 (Taemyung Heo 님 노트북)  \n \n ### 과정\n \n             --- Using Keras ---\n             1. Image Crop하여 private dataset 으로 저장해서 불러와 사용\n             2. Xception Model Pretrain (5Fold)  - 개별 노트북\n             3. EfficientNet Model Pretrain (5Fold)  - 개별 노트북\n             4. Pretrain Model 캐글 Dataset으로 업로드\n             5. Weight Load & Prediction (fold 마다 prediction 하고 가중평균)\n             6. 2개의 Prediction 결과의 가중평균 제출 (Xception & EfficientNet)"},{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load in \n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the \"../input/\" directory.\n# For example, running this (by clicking run or pressing Shift+Enter) will list the files in the input directory\n\nimport os\nprint(os.listdir(\"../input\"))\nprint(os.listdir(\"../input/mytrain2/pretrain2\"))\n\n# Any results you write to the current directory are saved as output.","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import warnings\nimport seaborn as sns\nimport matplotlib.pylab as plt\nimport PIL\nfrom sklearn.model_selection import StratifiedKFold\nimport gc\n\n\nfrom keras import backend as K\nfrom keras.preprocessing.image import ImageDataGenerator\n\nfrom keras.applications import Xception\n\nfrom keras.callbacks import EarlyStopping, ReduceLROnPlateau, ModelCheckpoint\nfrom keras import layers, models, optimizers\n\nfrom keras.models import Sequential, Model\nfrom keras.layers import Conv2D, MaxPooling2D\nfrom keras.layers import Dense, Dropout, Flatten, Activation, Conv2D, GlobalAveragePooling2D\nfrom keras import layers\nwarnings.filterwarnings(action='ignore')\nwarnings.simplefilter(action='ignore', category=FutureWarning)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"!pip install git+https://github.com/qubvel/efficientnet\nimport efficientnet.keras as efn","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"DATA_PATH = '../input/kakr3rdcropped'\nprint(os.listdir(DATA_PATH))\nDATA_PATH2 = '../input/2019-3rd-ml-month-with-kakr'\nos.listdir(DATA_PATH2)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# 이미지 폴더 경로\nTRAIN_IMG_PATH = os.path.join(DATA_PATH, 'train')\nTEST_IMG_PATH = os.path.join(DATA_PATH, 'test')\n\n# CSV 파일 경로\ndf_train = pd.read_csv(os.path.join(DATA_PATH2, 'train.csv'))\ndf_test = pd.read_csv(os.path.join(DATA_PATH2, 'test.csv'))\ndf_class = pd.read_csv(os.path.join(DATA_PATH2, 'class.csv'))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"img_size = (299, 299)\nIMAGE_SIZE = 299\nepochs = 25\nBATCH_SIZE = 32\nk_folds=5\nseed = 9\n\ntrain_datagen = ImageDataGenerator(\n    rescale=1./255,\n    #featurewise_center= True,  # set input mean to 0 over the dataset\n    #samplewise_center=True,  # set each sample mean to 0\n    #featurewise_std_normalization= True,  # divide inputs by std of the dataset\n    #samplewise_std_normalization=True,  # divide each input by its std\n    rotation_range=20,\n    width_shift_range=0.2,\n    height_shift_range=0.2,\n    horizontal_flip=True,\n    vertical_flip=False,\n    zoom_range=0.2,\n    shear_range=0.2,\n    #brightness_range=(1, 1.2),\n    fill_mode='nearest'\n    )\nval_datagen = ImageDataGenerator(rescale=1./255)\ntest_datagen = ImageDataGenerator(rescale=1./255)\n\n#아래 세줄 실행 안하면 오류발생\ndf_train['class'] = df_train['class'].astype('str')\ndf_train = df_train[['img_file', 'class']]\ndf_test = df_test[['img_file']]\n\n#모델 저장경로 생성\nMODEL_SAVE_FOLDER_PATH = './model/'\nif not os.path.exists(MODEL_SAVE_FOLDER_PATH):\n    os.mkdir(MODEL_SAVE_FOLDER_PATH)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def f1(y_true, y_pred):\n    def recall(y_true, y_pred):\n        true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))\n        possible_positives = K.sum(K.round(K.clip(y_true, 0, 1)))\n        recall = true_positives / (possible_positives + K.epsilon())\n        return recall\n\n    def precision(y_true, y_pred):\n        true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))\n        predicted_positives = K.sum(K.round(K.clip(y_pred, 0, 1)))\n        precision = true_positives / (predicted_positives + K.epsilon())\n        return precision\n    \n    precision = precision(y_true, y_pred)\n    recall = recall(y_true, y_pred)\n    \n    return 2*((precision*recall)/(precision+recall+K.epsilon()))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def get_model(model_name, iamge_size):\n    base_model = model_name(weights='imagenet', input_shape=(iamge_size,iamge_size,3), include_top=False)\n    #base_model.trainable = False\n    model = models.Sequential()\n    model.add(base_model)\n    model.add(layers.GlobalAveragePooling2D())\n    model.add(layers.Dense(1024, activation='relu'))\n    model.add(layers.Dropout(0.25))\n    model.add(layers.Dense(1024, activation='relu'))\n    model.add(layers.Dropout(0.25))\n \n    model.add(layers.Dense(196, activation='softmax'))\n    #model.summary()\n    \n    optimizer = optimizers.Nadam(lr=0.0002)\n    #optimizer = optimizers.RMSprop(lr=0.0001)\n    model.compile(loss='categorical_crossentropy', optimizer=optimizer, metrics=['acc', f1])\n\n    return model","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def get_model_eff():\n    EfficientNet_model = efn.EfficientNetB3(weights='imagenet', include_top=False, \n                                                     input_shape=(299, 299, 3))\n\n    model = Sequential()\n    model.add(EfficientNet_model)\n    model.add(layers.GlobalAveragePooling2D())\n    model.add(layers.Dense(2048, activation='relu'))\n    model.add(layers.Dropout(0.5))\n    model.add(layers.Dense(196, activation='softmax'))\n    #model.summary()\n\n    #compile\n    optimizer = optimizers.Nadam(lr=0.0002)\n    model.compile(loss='categorical_crossentropy', optimizer=optimizer, metrics=['acc', f1])\n    \n    return model","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"xception_list = []\nefficient_list = []\npath = '../input/mytrain2/pretrain2/'\nfor i in range(5):\n    xception_list.append(path+str(i)+'_xception.hdf5')\n    efficient_list.append(path+str(i)+'_EfficientNet.hdf5')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"TRAIN_CROPPED_PATH = '../input/kakr3rdcropped/train_crop/'\nTEST_CROPPED_PATH = '../input/kakr3rdcropped/test_crop/'\n\ntest_generator = test_datagen.flow_from_dataframe(\n    dataframe=df_test,\n    directory=TEST_CROPPED_PATH,\n    x_col='img_file',\n    y_col=None,\n    target_size= (IMAGE_SIZE, IMAGE_SIZE),\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":"xception_prediction = []\nefficient_prediction = []\n\nfor i, name in enumerate(xception_list):\n    model_xception = get_model(Xception, IMAGE_SIZE)\n    model_xception.load_weights(name)\n    test_generator.reset()\n    pred = model_xception.predict_generator(\n        generator=test_generator,\n        steps = len(df_test)/BATCH_SIZE,\n        verbose=1\n    )\n    xception_prediction.append(pred)\n\ny_pred_xception = np.mean(xception_prediction, axis=0)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"for i, name in enumerate(efficient_list):\n    model_efficient = get_model_eff()\n    model_efficient.load_weights(name)\n    test_generator.reset()\n    pred = model_efficient.predict_generator(\n        generator=test_generator,\n        steps = len(df_test)/BATCH_SIZE,\n        verbose=1\n    )\n    efficient_prediction.append(pred)\n\ny_pred_efficient = np.mean(efficient_prediction, axis=0)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_generator = train_datagen.flow_from_dataframe(\n        dataframe=df_train,\n        directory=TRAIN_CROPPED_PATH,\n        x_col='img_file',\n        y_col='class',\n        target_size= (IMAGE_SIZE, IMAGE_SIZE),\n        color_mode='rgb',\n        class_mode='categorical',\n        batch_size=BATCH_SIZE,\n        seed=seed,\n        shuffle=True\n        )","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"ens = np.argmax((0.5*y_pred_xception + 0.5*y_pred_efficient), axis=1)\n\nlabels = (train_generator.class_indices)\nlabels = dict((v,k) for k,v in labels.items())\nens_pred = [labels[k] for k in ens]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"submission = pd.read_csv(os.path.join(DATA_PATH2, 'sample_submission.csv'))\n\nsub = submission\nsub[\"class\"] = ens_pred\nsub.to_csv(\"submission.csv\", index=False)","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}