{"cells":[{"metadata":{},"cell_type":"markdown","source":"# Ensamble 커널\n### 각각의 fold 한 커널의 파라메터 파일들로 앙상블예측 시행\n* https://www.kaggle.com/wodlfrh/fold-1-model-hsv-cutout-xception-single\n* https://www.kaggle.com/wodlfrh/fold-2-model-hsv-cutout-xception-single\n* https://www.kaggle.com/wodlfrh/fold-3-model-hsv-cutout-xception-single\n* https://www.kaggle.com/wodlfrh/fold-4-model-hsv-cutout-xception-single\n* https://www.kaggle.com/wodlfrh/fold-5-model-hsv-cutout-xception-single"},{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"import numpy as np\nimport pandas as pd \nimport os\nimport warnings\nimport PIL\nfrom numba import jit\nwarnings.filterwarnings(action='ignore')\nprint(os.listdir(\"../input\"))","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"DATA_PATH = '../input/2019-3rd-ml-month-with-kakr/'\nWEIGHTS_PATH = '../input/southgg-ensemble-model-weights/'\nos.listdir(DATA_PATH)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"os.listdir(WEIGHTS_PATH)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"TRAIN_IMG_PATH = os.path.join(DATA_PATH,'train')\nTEST_IMG_PATH = os.path.join(DATA_PATH,'test')\n\ndf_train = pd.read_csv(os.path.join(DATA_PATH, 'train.csv'))\ndf_test = pd.read_csv(os.path.join(DATA_PATH, 'test.csv'))\ndf_class=pd.read_csv(os.path.join(DATA_PATH, 'class.csv'))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from keras.applications.xception import Xception, preprocess_input\nfrom keras.models import Sequential, Model\nfrom keras import optimizers\nfrom keras.layers import Dense, Dropout, Flatten, Activation, Conv2D, GlobalAveragePooling2D\nfrom keras.preprocessing.image import ImageDataGenerator\nfrom skimage.color import rgb2hsv","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from keras import backend as K\n\ndef recall_m(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\ndef precision_m(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    \ndef f1_m(y_true, y_pred):\n    precision = precision_m(y_true, y_pred)\n    recall = recall_m(y_true, y_pred)\n    return 2*((precision*recall)/(precision+recall+K.epsilon()))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"@jit\ndef get_random_eraser(input_img, p=0.5, s_l=0.02, s_h=0.4, r_1=0.3, r_2=1/0.3, v_l=0, v_h=255, pixel_level=False):\n\n    img_h, img_w, img_c = input_img.shape\n    p_1 = np.random.rand()\n\n    if p_1 > p:\n        return input_img\n\n    while True:\n        s = np.random.uniform(s_l, s_h) * img_h * img_w\n        r = np.random.uniform(r_1, r_2)\n        w = int(np.sqrt(s / r))\n        h = int(np.sqrt(s * r))\n        left = np.random.randint(0, img_w)\n        top = np.random.randint(0, img_h)\n\n        if left + w <= img_w and top + h <= img_h:\n            break\n\n    if pixel_level:\n        c = np.random.uniform(v_l, v_h, (h, w, img_c))\n    else:\n        c = np.random.uniform(v_l, v_h)\n\n    input_img[top:top + h, left:left + w, :] = c\n\n\n\n    return input_img","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"@jit\ndef rgb_to_hsv_erg(img):\n    cvt_img = rgb2hsv(img)\n    erg_img = get_random_eraser(cvt_img)\n    pre_img = preprocess_input(erg_img)\n    return pre_img","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"@jit\ndef rgb_to_hsv(img):\n    cvt_img = rgb2hsv(img)\n    pre_img = preprocess_input(cvt_img)\n    return pre_img","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"IMG_SIZE = (299,299)\ndef crop_boxing_img(img_name, margin=10):\n    if img_name.split('_')[0] == \"train\":\n        PATH = TRAIN_IMG_PATH\n        data = df_train\n    elif img_name.split('_')[0] == \"test\":\n        PATH = TEST_IMG_PATH\n        data = df_test\n        \n    img = PIL.Image.open(os.path.join(PATH, img_name))\n    pos = data.loc[data[\"img_file\"] == img_name, ['bbox_x1','bbox_y1','bbox_x2','bbox_y2']].values.reshape(-1)\n    \n    width , height = img.size\n    x1 = max(0, pos[0] - margin)\n    y1 = max(0, pos[1] - margin)\n    x2 = min(pos[2] + margin, width)\n    y2 = min(pos[3] + margin, height)\n    \n    if abs(pos[2] - pos[0]) > width or abs(pos[3] - pos[1]) > height:\n        print(f'{img_name} is wrong bounding box, img size : {img.size}, bbox_x1 : {pos[0]}, bbox_x2 : {pos[2]}, bbox_y1 : {pos[1]}, bbox_y2 : {pos[3]}')\n        \n        return img\n    return img.crop((x1,y1,x2,y2)).resize(IMG_SIZE)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"TRAIN_CROP_PATH = \"./train_crop\"\nTEST_CROP_PATH = \"./test_crop\"\n!mkdir {TRAIN_CROP_PATH}\n!mkdir {TEST_CROP_PATH}","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"for i, row in df_train.iterrows():\n    PATH = TRAIN_CROP_PATH\n    cropped = crop_boxing_img(row['img_file'])\n    cropped.save(os.path.join(PATH, row['img_file']))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"for i, row in df_test.iterrows():\n    PATH = TEST_CROP_PATH\n    cropped = crop_boxing_img(row['img_file'])\n    cropped.save(os.path.join(PATH, row['img_file']))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"batch_size = 32\nimg_size = (299, 299)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_datagen = ImageDataGenerator(\n    horizontal_flip = True,\n    vertical_flip = False,\n    zoom_range = 0.1,\n    preprocessing_function = rgb_to_hsv)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test_datagen = ImageDataGenerator(\n    preprocessing_function=rgb_to_hsv)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df_train['class'] = df_train['class'].astype('str')","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_CROP_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        )","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test_generator = test_datagen.flow_from_dataframe(\n    dataframe = df_test,\n    directory = TEST_CROP_PATH,\n    x_col = 'img_file',\n    y_col = None,\n    target_size = img_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":"def 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":"def get_model():\n    Xceptionmodel = Xception(weights='imagenet', input_shape = (299,299,3), include_top = False)\n    model = Sequential()\n    model.add(Xceptionmodel)\n    model.add(GlobalAveragePooling2D())\n    model.add(Dense(1024, activation='relu'))\n    model.add(Dropout(0.5))\n    model.add(Dense(1024, activation='relu'))\n    model.add(Dropout(0.5))\n    model.add(Dense(196, activation='softmax', kernel_initializer='he_normal'))\n    model.summary()\n    \n    optimizer = optimizers.RMSprop(lr=0.0003)\n    model.compile(optimizer=optimizer, loss='categorical_crossentropy', metrics=[f1_m])\n    \n    return model","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model_xception_names = []\nfor i in range(1,6):\n    model_name = WEIGHTS_PATH + str(i) + '_xception.hdf5'\n    print(model_name)\n    model_xception_names.append(model_name)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"xception_prediction = []\nfor i, name in enumerate(model_xception_names):\n    model_xception = get_model()\n    model_xception.load_weights(name)\n    test_generator.reset()\n    pred = model_xception.predict_generator(\n        generator=test_generator,\n        steps = get_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":"predicted_class_indices","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"predicted_class_indices = np.argmax(y_pred_xception, axis=1)\nlabels = (train_generator.class_indices)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"labels = dict((v,k) for k,v in labels.items())\npredictions = [labels[k] for k in predicted_class_indices]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"submission = pd.read_csv(os.path.join(DATA_PATH, 'sample_submission.csv'))\nsubmission['class'] = predictions\nsubmission.to_csv(\"submission.csv\", index=False)\nsubmission.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"!rm -rf {TRAIN_CROP_PATH}\n!rm -rf {TEST_CROP_PATH}","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":1}