{
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "_cell_guid": "8c845e6f-3f0a-40ee-867e-b829f3fce103"
      },
      "source": [
        "# Argument setting"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "2ea30baf-0060-be1f-ec0c-c277670a87dd"
      },
      "outputs": [],
      "source": [
        "AUG_METHOD = \"Rotate_180\"  # \"None\" or string in AUG_METHOD_List\n",
        "SYSTEM = \"Kaggle\" # \"Paperspace\" # \n",
        "AUG_METHOD_List = [\"Flip\", \"Rotate_90\", \"Rotate_180\", \"Rotate_270\", \"Flip_Rotate_90\", \"Flip_Rotate_180\", \"Flip_Rotate_270\"]"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "_cell_guid": "9692f1be-8335-6f6b-efc6-9c567b24f809"
      },
      "source": [
        "# import module"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "81d8b005-b955-c31c-d22a-c6c31077457e"
      },
      "outputs": [],
      "source": [
        "import numpy as np\n",
        "import pandas as pd\n",
        "import os\n",
        "import cv2\n",
        "import matplotlib.pyplot as plt\n",
        "import skimage.feature\n",
        "#%matplotlib inline\n",
        "\n",
        "#from subprocess import check_output\n",
        "#print(check_output([\"ls\", \"../input\"]).decode(\"utf8\"))"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "_cell_guid": "ffcf2c0b-b5ba-bff5-3582-a94ee779e758"
      },
      "source": [
        "# parse arg"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "08415fd9-e7f2-c783-55e6-7d0d3c445f45"
      },
      "outputs": [],
      "source": [
        "import sys\n",
        "arg = sys.argv[1:]\n",
        "\n",
        "if('-f' in arg):\n",
        "    arg = ['Basic', '32', 'Whole', 'Train']\n",
        "else:\n",
        "    new_arg = []\n",
        "    if('Basic' in arg):\n",
        "        idx = arg.index('Basic')\n",
        "        new_arg.append('Basic')\n",
        "        new_arg.append(arg[idx+1])\n",
        "    elif('Advance' in arg):\n",
        "        idx = arg.index('Advance')\n",
        "        new_arg.append('Advance')\n",
        "        new_arg.append(arg[idx+1])\n",
        "    else:\n",
        "        print(\"Please enter \\\"Basic\\\" or \\\"Advance\\\".\")\n",
        "    \n",
        "    if('Whole' in arg):\n",
        "        new_arg.append('Whole')\n",
        "    elif('Black' in arg):\n",
        "        new_arg.append('Black')\n",
        "    else:\n",
        "        print(\"Please enter \\\"Whole\\\" or \\\"Black\\\".\")\n",
        "    \n",
        "    if('Test' in arg):\n",
        "        new_arg.append('Test')\n",
        "    elif('Train' in arg):\n",
        "        new_arg.append('Train')\n",
        "    else:\n",
        "        print(\"Please enter \\\"Test\\\" or \\\"Train\\\".\")\n",
        "        \n",
        "    arg = new_arg"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "_cell_guid": "7f7f88ab-93b0-a090-7219-7d82085e747e"
      },
      "source": [
        "# read files"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "0d49442f-a126-3603-be58-d21f3200e03b"
      },
      "outputs": [],
      "source": [
        "Path_Type = \"{0}/{1}_{2}_{3}\".format(arg[3], arg[0], arg[1], arg[2])\n",
        "Path_Type\n",
        "PS_Root_Path = \"/home/paperspace/Project/Sealion\"\n",
        "\n",
        "if (AUG_METHOD == \"None\"):\n",
        "    AUG_Add_Path = \"\" \n",
        "elif (AUG_METHOD in AUG_METHOD_List):\n",
        "    AUG_Add_Path = \"Augment/{0}/\".format(AUG_METHOD) "
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "98a9158d-9e38-b191-8246-cf612816916a"
      },
      "outputs": [],
      "source": [
        "Path_Sealion = \"{0}/{1}/\".format(PS_Root_Path, Path_Type) if SYSTEM == \"Paperspace\" else \"./\"\n",
        "Path_Train   = \"{0}/TrainSmall2/Train/\".format(PS_Root_Path) if SYSTEM == \"Paperspace\" else \"../input/Train/\" \n",
        "Path_Dotted  = \"{0}/TrainSmall2/TrainDotted/\".format(PS_Root_Path) if SYSTEM == \"Paperspace\" else \"../input/TrainDotted/\" # \n",
        "file_names = os.listdir(Path_Train)\n",
        "file_names = sorted(file_names, key=lambda \n",
        "                    item: (int(item.partition('.')[0]) if item[0].isdigit() else float('inf'), item))\n",
        "\n",
        "file_names = file_names[1:2]\n",
        "print(file_names)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "_cell_guid": "33cd3904-8858-e39f-790f-b8eb0cf3dbf6"
      },
      "source": [
        "# Create directory "
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "83c9bb8a-87d0-09f7-655f-82265861d9bf"
      },
      "outputs": [],
      "source": [
        "if(SYSTEM == \"Paperspace\"):\n",
        "    if(AUG_METHOD == \"None\"):\n",
        "        if not os.path.exists(\"{0}/{1}\".format(PS_Root_Path, Path_Type)):\n",
        "            os.makedirs(\"{0}/{1}\".format(PS_Root_Path, Path_Type))\n",
        "        if not os.path.exists(\"{0}/{1}/labels\".format(PS_Root_Path, Path_Type)):\n",
        "            os.makedirs(\"{0}/{1}/labels\".format(PS_Root_Path, Path_Type))    \n",
        "        if not os.path.exists(\"{0}/{1}/JPEGImages\".format(PS_Root_Path, Path_Type)):\n",
        "            os.makedirs(\"{0}/{1}/JPEGImages\".format(PS_Root_Path, Path_Type))      \n",
        "        if not os.path.exists(\"{0}/{1}/DotImages\".format(PS_Root_Path, Path_Type)):\n",
        "            os.makedirs(\"{0}/{1}/DotImages\".format(PS_Root_Path, Path_Type)) \n",
        "\n",
        "    elif(AUG_METHOD in AUG_METHOD_List):\n",
        "        if not os.path.exists(\"{0}/{1}\".format(PS_Root_Path, Path_Type)):\n",
        "            os.makedirs(\"{0}/{1}\".format(PS_Root_Path, Path_Type))\n",
        "        if not os.path.exists(\"{0}/{1}/Augment\".format(PS_Root_Path, Path_Type)):\n",
        "            os.makedirs(\"{0}/{1}/Augment\".format(PS_Root_Path, Path_Type)) \n",
        "        if not os.path.exists(\"{0}/{1}/Augment/{2}\".format(PS_Root_Path, Path_Type, AUG_METHOD)):\n",
        "            os.makedirs(\"{0}/{1}/Augment/{2}\".format(PS_Root_Path, Path_Type, AUG_METHOD)) \n",
        "        if not os.path.exists(\"{0}/{1}/Augment/{2}/JPEGImages\".format(PS_Root_Path, Path_Type, AUG_METHOD)):\n",
        "            os.makedirs(\"{0}/{1}/Augment/{2}/JPEGImages\".format(PS_Root_Path, Path_Type, AUG_METHOD)) \n",
        "        if not os.path.exists(\"{0}/{1}/Augment/{2}/DotImages\".format(PS_Root_Path,Path_Type, AUG_METHOD)):\n",
        "            os.makedirs(\"{0}/{1}/Augment/{2}/DotImages\".format(PS_Root_Path, Path_Type, AUG_METHOD)) \n",
        "        if not os.path.exists(\"{0}/{1}/Augment/{2}/labels\".format(PS_Root_Path, Path_Type, AUG_METHOD)):\n",
        "            os.makedirs(\"{0}/{1}/Augment/{2}/labels\".format(PS_Root_Path, Path_Type, AUG_METHOD)) \n",
        "    \n",
        "    else:\n",
        "        print(\"Wrong in AUG_METHOD!\")\n",
        "        \n",
        "        \n",
        "elif(SYSTEM == \"Kaggle\"):\n",
        "    if(AUG_METHOD == \"None\"):\n",
        "        if not os.path.exists(\"./labels\"):\n",
        "            os.makedirs(\"./labels\")\n",
        "        if not os.path.exists(\"./JPEGImages\"):\n",
        "            os.makedirs(\"./JPEGImages\")\n",
        "        if not os.path.exists(\"./DotImages\"):\n",
        "            os.makedirs(\"./DotImages\")  \n",
        "\n",
        "    elif(AUG_METHOD in AUG_METHOD_List):\n",
        "        if not os.path.exists(\"./Augment\"):\n",
        "            os.makedirs(\"./Augment\")     \n",
        "        if not os.path.exists(\"./Augment/{0}\".format(AUG_METHOD)):\n",
        "            os.makedirs(\"./Augment/{0}\".format(AUG_METHOD)) \n",
        "        if not os.path.exists(\"./Augment/{0}/JPEGImages\".format(AUG_METHOD)):\n",
        "            os.makedirs(\"./Augment/{0}/JPEGImages\".format(AUG_METHOD))  \n",
        "        if not os.path.exists(\"./Augment/{0}/DotImages\".format(AUG_METHOD)):\n",
        "            os.makedirs(\"./Augment/{0}/DotImages\".format(AUG_METHOD))  \n",
        "        if not os.path.exists(\"./Augment/{0}/labels\".format(AUG_METHOD)):\n",
        "            os.makedirs(\"./Augment/{0}/labels\".format(AUG_METHOD))\n",
        "    \n",
        "    else:\n",
        "        print(\"Wrong in AUG_METHOD!\")\n",
        "\n",
        "else:\n",
        "    print(\"Wrong in SYSTEM!\")"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "_cell_guid": "4efe57a3-01b6-8bc5-816c-fee8cac6fc30"
      },
      "source": [
        " # generate sub_image_template"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "947a2300-1f58-b1f4-52d7-e3df126a9e11"
      },
      "outputs": [],
      "source": [
        "Sub_Im_Size = (416,416)\n",
        "\n",
        "if(arg[2] == 'Black'):\n",
        "    image_tmp = cv2.imread(Path_Train + file_names[0])\n",
        "    image_tmp = image_tmp[:Sub_Im_Size[1],:Sub_Im_Size[0],:]\n",
        "    image_tmp = cv2.absdiff(image_tmp,image_tmp)\n",
        "\n",
        "    plt.imshow(cv2.cvtColor(image_tmp, cv2.COLOR_BGR2RGB))\n",
        "    cv2.imwrite('sub_im_template.jpg',image_tmp)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "_cell_guid": "141fb606-b9ae-ca5c-e3e0-300b70a65838"
      },
      "source": [
        "# augment image function"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "ffebce4f-cc14-babf-e565-af7a240f3885"
      },
      "outputs": [],
      "source": [
        "from scipy import ndimage\n",
        "\n",
        "def augment(image, method):\n",
        "    if(method == \"Flip\"):\n",
        "        image = image[::-1]\n",
        "    elif(method[:6] == \"Rotate\"):\n",
        "        image = ndimage.rotate(image, int(method[7:]))\n",
        "    elif(method[:11] == \"Flip_Rotate\"):\n",
        "        image = image[::-1]\n",
        "        image = ndimage.rotate(image, int(method[12:]))\n",
        "    \n",
        "    return image"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "_cell_guid": "778c5b6e-4e54-2f09-c2b3-4bd89fb27e6b"
      },
      "source": [
        "# parse image"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "24d2abad-07f8-14fb-5613-708a5c191749"
      },
      "outputs": [],
      "source": [
        "def get_blobs(image_1, image_2):\n",
        "    # absolute difference between Train and Train Dotted\n",
        "    image_3 = cv2.absdiff(image_1,image_2)\n",
        "    \n",
        "    # mask out blackened regions from Train Dotted\n",
        "    mask_1 = cv2.cvtColor(image_1, cv2.COLOR_BGR2GRAY)\n",
        "    mask_1[mask_1 < 20] = 0\n",
        "    mask_1[mask_1 > 0] = 255\n",
        "    \n",
        "    mask_2 = cv2.cvtColor(image_2, cv2.COLOR_BGR2GRAY)\n",
        "    mask_2[mask_2 < 20] = 0\n",
        "    mask_2[mask_2 > 0] = 255\n",
        "    \n",
        "    image_3 = cv2.bitwise_or(image_3, image_3, mask=mask_1)\n",
        "    image_3 = cv2.bitwise_or(image_3, image_3, mask=mask_2) \n",
        "    \n",
        "    # convert to grayscale to be accepted by skimage.feature.blob_log\n",
        "    image_3 = cv2.cvtColor(image_3, cv2.COLOR_BGR2GRAY)\n",
        "    \n",
        "    # detect blobs\n",
        "    blobs = skimage.feature.blob_log(image_3, min_sigma=3, max_sigma=4, num_sigma=1, threshold=0.02)\n",
        "    \n",
        "    return blobs"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "71836ad9-e1be-4a7f-35c2-c939692641af"
      },
      "outputs": [],
      "source": [
        "# classes = [\"adult_males\", \"subadult_males\", \"pups\", \"juveniles\", \"adult_females\"]\n",
        "\n",
        "def get_species(r,g,b):    \n",
        "    if r > 200 and g < 50 and b < 50: # RED\n",
        "        return 0        \n",
        "    elif r > 200 and g > 200 and b < 50: # MAGENTA\n",
        "        return 1         \n",
        "    elif r < 100 and g < 100 and 150 < b < 200: # GREEN\n",
        "        return 2\n",
        "    elif r < 100 and  100 < g and b < 100: # BLUE\n",
        "        return 3\n",
        "    elif r < 150 and g < 50 and b < 100:  # BROWN\n",
        "        return 4\n",
        "    else:\n",
        "        return -1"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "ce390624-9575-00ba-ae8e-7fc04b4e3603"
      },
      "outputs": [],
      "source": [
        "def get_xy_range_basic(x, y, x_max, y_max, size):\n",
        "    ### x_left, x_right, y_up, y_down\n",
        "    x_left  = min(size, x)\n",
        "    x_right = min(size, x_max-x-1)\n",
        "    y_up    = min(size, y)\n",
        "    y_down  = min(size, y_max-y-1)\n",
        "    return (x_left, x_right, y_up, y_down)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "8eddbc59-4f88-2589-439d-9f60149eef0a"
      },
      "outputs": [],
      "source": [
        "def get_dict_range_basic(shape, blobs):\n",
        "    Dict_range = {}\n",
        "    \n",
        "    for blob in blobs:\n",
        "        # get the coordinates for each blob\n",
        "        y, x, s = blob\n",
        "        \n",
        "        # get basic xy_range\n",
        "        xy_range = get_xy_range_basic(x=x, y=y, x_max=shape[1], y_max=shape[0], size=int(arg[1])/2)\n",
        "        \n",
        "        # save range info    \n",
        "        Dict_range[(x,y)] = xy_range\n",
        "        \n",
        "    return Dict_range"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "f85ff2fb-49f0-b8ff-6a41-71324f18dd54"
      },
      "outputs": [],
      "source": [
        "MAX_SUB_IM_HALF_LEN = 48\n",
        "\n",
        "def get_dict_range_advance(ori_image, dot_image, blobs):\n",
        "    Dict_range = {}\n",
        "    s_size = int(arg[1])/8\n",
        "    \n",
        "    for blob in blobs:\n",
        "        # get the coordinates for each blob\n",
        "        y, x, s = blob\n",
        "        \n",
        "        # get species\n",
        "        g,b,r = dot_image[int(y)][int(x)][:]\n",
        "        species = get_species(r,g,b)\n",
        "         \n",
        "        # get basic xy_range\n",
        "        xy_range = get_xy_range_basic(x=x, y=y, x_max=ori_image.shape[1], y_max=ori_image.shape[0], size=int(arg[1])/2)\n",
        "        x_left  = xy_range[0] \n",
        "        x_right = xy_range[1]\n",
        "        y_up    = xy_range[2]\n",
        "        y_down  = xy_range[3]\n",
        "        \n",
        "        # set augmenting threshold for sea_lion\n",
        "        level = 45\n",
        "        \n",
        "        # augment xy_range\n",
        "        if(species != 2):\n",
        "            mid_im = ori_image[int(y-s_size):int(y+s_size), int(x-s_size):int(x+s_size), :]\n",
        "            mid_abs = np.linalg.norm(np.mean(mid_im, axis=(0,1)))\n",
        "            \n",
        "            # augment left side\n",
        "            while(x_left != x and x_left != MAX_SUB_IM_HALF_LEN):\n",
        "                # get three sub_sub_image on left\n",
        "                left_mid_im  = ori_image[  int(y-s_size):int(y+s_size), int(x-x_left):int(x-x_left+2*s_size), :]\n",
        "                left_up_im   = ori_image[int(y-3*s_size):int(y-s_size), int(x-x_left):int(x-x_left+2*s_size), :]\n",
        "                left_down_im = ori_image[int(y+s_size):int(y+3*s_size), int(x-x_left):int(x-x_left+2*s_size), :]\n",
        "                \n",
        "                # calculate distance\n",
        "                left_mid_abs  = np.linalg.norm(np.mean(  left_mid_im, axis=(0,1)))\n",
        "                left_up_abs   = np.linalg.norm(np.mean(   left_up_im, axis=(0,1)))\n",
        "                left_down_abs = np.linalg.norm(np.mean( left_down_im, axis=(0,1)))\n",
        "                \n",
        "                # augment if proper\n",
        "                if(abs(mid_abs-left_mid_abs) < level or abs(mid_abs-left_up_abs) < level or abs(mid_abs-left_down_abs) < level):  \n",
        "                    x_left = min(x_left+s_size, MAX_SUB_IM_HALF_LEN, x)\n",
        "                    #print(\"Augment x_left {0},{1}\".format(x,y))\n",
        "                else:\n",
        "                    break\n",
        "\n",
        "            # augment right side\n",
        "            while(x_right != ori_image.shape[1]-x and x_right != MAX_SUB_IM_HALF_LEN):\n",
        "                # get three sub_sub_image on right\n",
        "                right_mid_im  = ori_image[  int(y-s_size):int(y+s_size), int(x+x_right-2*s_size):int(x+x_right), :]\n",
        "                right_up_im   = ori_image[int(y-3*s_size):int(y-s_size), int(x+x_right-2*s_size):int(x+x_right), :]\n",
        "                right_down_im = ori_image[int(y+s_size):int(y+3*s_size), int(x+x_right-2*s_size):int(x+x_right), :]\n",
        "                \n",
        "                # calculate distance\n",
        "                right_mid_abs  = np.linalg.norm(np.mean(  right_mid_im, axis=(0,1)))\n",
        "                right_up_abs   = np.linalg.norm(np.mean(   right_up_im, axis=(0,1)))\n",
        "                right_down_abs = np.linalg.norm(np.mean( right_down_im, axis=(0,1)))\n",
        "                \n",
        "                # augment if proper\n",
        "                if(abs(mid_abs-right_mid_abs) < level or abs(mid_abs-right_up_abs) < level or abs(mid_abs-right_down_abs) < level):\n",
        "                    x_right = min(x_right+s_size, MAX_SUB_IM_HALF_LEN, ori_image.shape[1]-x)\n",
        "                    #print(\"Augment x_right {0},{1}\".format(x,y))\n",
        "                else:\n",
        "                    break\n",
        "            \n",
        "            # augment up side\n",
        "            while(y_up != y and y_up != MAX_SUB_IM_HALF_LEN):\n",
        "                # get three sub_sub_image on up\n",
        "                up_mid_im   = ori_image[int(y-y_up):int(y-y_up+2*s_size),   int(x-s_size):int(x+s_size), :]\n",
        "                up_left_im  = ori_image[int(y-y_up):int(y-y_up+2*s_size), int(x-3*s_size):int(x-s_size), :]\n",
        "                up_right_im = ori_image[int(y-y_up):int(y-y_up+2*s_size), int(x+s_size):int(x+3*s_size), :]\n",
        "                \n",
        "                # calculate distance\n",
        "                up_mid_abs   = np.linalg.norm(np.mean(   up_mid_im, axis=(0,1)))\n",
        "                up_left_abs  = np.linalg.norm(np.mean(  up_left_im, axis=(0,1)))\n",
        "                up_right_abs = np.linalg.norm(np.mean( up_right_im, axis=(0,1)))\n",
        "            \n",
        "                # augment if proper\n",
        "                if(abs(mid_abs-up_mid_abs) < level or abs(mid_abs-up_left_abs) < level or abs(mid_abs-up_right_abs) < level):\n",
        "                    y_up = min(y_up+s_size, MAX_SUB_IM_HALF_LEN, y)\n",
        "                    #print(\"Augment y_up {0},{1}\".format(x,y))\n",
        "                else:\n",
        "                    break\n",
        "            \n",
        "            # augment down side\n",
        "            while(y_down != ori_image.shape[0]-y and y_down != MAX_SUB_IM_HALF_LEN):\n",
        "                # get three sub_sub_image on down\n",
        "                down_mid_im   = ori_image[int(y+y_down-2*s_size):int(y+y_down),   int(x-s_size):int(x+s_size), :]\n",
        "                down_left_im  = ori_image[int(y+y_down-2*s_size):int(y+y_down), int(x-3*s_size):int(x-s_size), :]\n",
        "                down_right_im = ori_image[int(y+y_down-2*s_size):int(y+y_down), int(x+s_size):int(x+3*s_size), :]\n",
        "                \n",
        "                # calculate distance\n",
        "                down_mid_abs   = np.linalg.norm(np.mean(   down_mid_im, axis=(0,1)))\n",
        "                down_left_abs  = np.linalg.norm(np.mean(  down_left_im, axis=(0,1)))\n",
        "                down_right_abs = np.linalg.norm(np.mean( down_right_im, axis=(0,1)))\n",
        "                \n",
        "                # augment if proper\n",
        "                if(abs(mid_abs-down_mid_abs) < level or abs(mid_abs-down_left_abs) < level or abs(mid_abs-down_right_abs) < level):\n",
        "                    y_down = min(y_down+s_size, MAX_SUB_IM_HALF_LEN, ori_image.shape[0]-y)\n",
        "                    #print(\"Augment y_down {0},{1}\".format(x,y))\n",
        "                else:\n",
        "                    break\n",
        "                    \n",
        "        # save range info    \n",
        "        Dict_range[(x,y)] = (x_left, x_right, y_up, y_down)\n",
        "    \n",
        "    return Dict_range"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "9f102608-ea02-bef8-dd06-ca93bede229c"
      },
      "outputs": [],
      "source": [
        "def parse_image_black(filename):\n",
        "    ## open sub_image_names file\n",
        "    sub_image_names = open(Path_Sealion + \"{0}Train.txt\".format(AUG_Add_Path), 'a')\n",
        "    \n",
        "    ### get original image\n",
        "    ori_image = cv2.imread(Path_Train + filename)\n",
        "    dot_image = cv2.imread(Path_Dotted + filename)\n",
        "    cnt = 0\n",
        "    \n",
        "    ### flip origin image\n",
        "    ori_image = augment(ori_image, AUG_METHOD)\n",
        "    dot_image = augment(dot_image, AUG_METHOD)\n",
        "    \n",
        "    ### get coordinate of all sea lions\n",
        "    Dict_range = {}\n",
        "    blobs = get_blobs(ori_image, dot_image)\n",
        "    \n",
        "    ### get xy_range info for all sea_lion\n",
        "    if(arg[0] == 'Basic'):\n",
        "        Dict_range = get_dict_range_basic(ori_image.shape, blobs)\n",
        "    elif(arg[0] == 'Advance'):\n",
        "        Dict_range = get_dict_range_advance(ori_image, dot_image, blobs)\n",
        "    \n",
        "    ### output sub_image and annotation file for each blob\n",
        "    Delete_Key_List = []\n",
        "    for key in list(Dict_range.keys()):       \n",
        "        if(key in Dict_range):\n",
        "            # add cnt for new sub_image name\n",
        "            cnt += 1\n",
        "            \n",
        "            # get x, y, xy_range in original image\n",
        "            main_x = int(key[0])\n",
        "            main_y = int(key[1])\n",
        "            xy_range = Dict_range[key]\n",
        "            \n",
        "            ### get basic sub_image\n",
        "            sub_image = cv2.imread('sub_im_template.jpg')            \n",
        "            sub_x_center = int(sub_image.shape[1]/2)\n",
        "            sub_y_center = int(sub_image.shape[0]/2)\n",
        "            sub_image[int(sub_y_center-xy_range[2]):int(sub_y_center+xy_range[3]), int(sub_x_center-xy_range[0]):int(sub_x_center+xy_range[1]), :] = ori_image[int(main_y-xy_range[2]):int(main_y+xy_range[3]), int(main_x-xy_range[0]):int(main_x+xy_range[1]), :]\n",
        "            del Dict_range[key]\n",
        "                    \n",
        "            ### get species\n",
        "            g,b,r = dot_image[int(main_y)][int(main_x)][:]\n",
        "            species = get_species(r,g,b)\n",
        "            if(species == -1):\n",
        "                continue\n",
        "            \n",
        "            # get pos info for annotation file\n",
        "            x_pos = float(sub_x_center)/float(Sub_Im_Size[0])\n",
        "            y_pos = float(sub_y_center)/float(Sub_Im_Size[0])\n",
        "            x_len = float(xy_range[0]+xy_range[1])/float(Sub_Im_Size[0])\n",
        "            y_len = float(xy_range[2]+xy_range[3])/float(Sub_Im_Size[0])\n",
        "            element = [x_pos, y_pos, x_len, y_len]\n",
        "            \n",
        "            # save species info in annotation file\n",
        "            ant_file = open(Path_Sealion + '{0}labels/{1}_{2}.txt'.format(AUG_Add_Path, filename[:-4], cnt), 'w')\n",
        "            ant_file.write(str(species) + \" \" + \" \".join([str(x) for x in element]) + '\\n')\n",
        "            \n",
        "            \n",
        "            ### include other sea lion\n",
        "            # max min coordinate for including image based on origin image\n",
        "            x_min = max(main_x - sub_image.shape[1]/2 + 1, 0)\n",
        "            x_max = min(main_x + sub_image.shape[1]/2 - 1, ori_image.shape[1])\n",
        "            y_min = max(main_y - sub_image.shape[0]/2 + 1, 0)\n",
        "            y_max = min(main_y + sub_image.shape[0]/2 - 1, ori_image.shape[0])\n",
        "            \n",
        "            for ex_key in list(Dict_range.keys()):\n",
        "                if(ex_key[0] > x_min and ex_key[0] < x_max and ex_key[1] > y_min and ex_key[1] < y_max):\n",
        "                    ### coordinate of ex_sea_lion in origin image\n",
        "                    ex_range = Dict_range[ex_key]\n",
        "                    ex_left  = int(ex_key[0] - ex_range[0])\n",
        "                    ex_right = int(ex_key[0] + ex_range[1])\n",
        "                    ex_up    = int(ex_key[1] - ex_range[2])\n",
        "                    ex_down  = int(ex_key[1] + ex_range[3])\n",
        "                    if(ex_left > x_min and ex_right < x_max and ex_up > y_min and ex_down < y_max):\n",
        "                        ### sub_image's coordinate where ex_sea_lion put  \n",
        "                        in_up    = int(sub_y_center - main_y + ex_key[1] - ex_range[2])\n",
        "                        in_down  = int(sub_y_center - main_y + ex_key[1] + ex_range[3])\n",
        "                        in_left  = int(sub_x_center - main_x + ex_key[0] - ex_range[0])\n",
        "                        in_right = int(sub_x_center - main_x + ex_key[0] + ex_range[1])\n",
        "                        sub_image[ in_up:in_down, in_left:in_right, :] = ori_image[ex_up:ex_down, ex_left:ex_right, :]\n",
        "                        del Dict_range[ex_key]\n",
        "                        \n",
        "                        ### get species for include sea_lion\n",
        "                        g,b,r = dot_image[int(ex_key[1])][int(ex_key[0])][:]\n",
        "                        species = get_species(r,g,b)\n",
        "            \n",
        "                        # get pos info for annotation file\n",
        "                        x_pos = float(sub_x_center - main_x + ex_key[0])/float(Sub_Im_Size[0])\n",
        "                        y_pos = float(sub_y_center - main_y + ex_key[1])/float(Sub_Im_Size[0])\n",
        "                        x_len = float(ex_range[0]+ex_range[1])/float(Sub_Im_Size[0])\n",
        "                        y_len = float(ex_range[2]+ex_range[3])/float(Sub_Im_Size[0])\n",
        "                        element = [x_pos, y_pos, x_len, y_len]\n",
        "            \n",
        "                        # save species info in annotation file\n",
        "                        ant_file.write(str(species) + \" \" + \" \".join([str(x) for x in element]) + '\\n')                          \n",
        "            \n",
        "            cv2.imwrite(Path_Sealion + '{0}JPEGImages/{1}_{2}.jpg'.format(AUG_Add_Path, filename[:-4], cnt),sub_image)\n",
        "            sub_image_names.write(Path_Sealion + '{0}JPEGImages/{1}_{2}.jpg'.format(AUG_Add_Path, filename[:-4], cnt))\n",
        "            sub_image_names.write(\"\\n\")\n",
        "            ant_file.close()\n",
        "    sub_image_names.close()"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "5f013ad6-3c01-99ce-8aa6-90e44b6f9f49"
      },
      "outputs": [],
      "source": [
        "def parse_image_whole(filename):\n",
        "    ## open sub_image_names file\n",
        "    sub_image_names = open(Path_Sealion + \"{0}Train.txt\".format(AUG_Add_Path), 'a')\n",
        "    \n",
        "    ### get original image\n",
        "    ori_image = cv2.imread(Path_Train + filename)\n",
        "    dot_image = cv2.imread(Path_Dotted + filename)\n",
        "    cnt = 0\n",
        "    \n",
        "    ### flip origin image\n",
        "    ori_image = augment(ori_image, AUG_METHOD)\n",
        "    dot_image = augment(dot_image, AUG_METHOD)\n",
        "    \n",
        "    ### get coordinate of all sea lions\n",
        "    blobs = get_blobs(ori_image, dot_image)\n",
        "    \n",
        "    ### get xy_range info for all sea_lion\n",
        "    if(arg[0] == 'Basic'):\n",
        "        Dict_range = get_dict_range_basic(ori_image.shape, blobs)\n",
        "    elif(arg[0] == 'Advance'):\n",
        "        Dict_range = get_dict_range_advance(ori_image, dot_image, blobs)  \n",
        "    \n",
        "    ### output sub_image and annotation file for each blob\n",
        "    Used_Key_Set = set()\n",
        "    for key in Dict_range.keys():       \n",
        "        if(key not in Used_Key_Set):\n",
        "            # add cnt for new sub_image name\n",
        "            cnt += 1\n",
        "            \n",
        "            # get x, y, xy_range in original image\n",
        "            main_x = int(key[0])\n",
        "            main_y = int(key[1])\n",
        "            xy_range = Dict_range[key]\n",
        "            \n",
        "            # adjust main_x main_y if sea_lion close to boundary\n",
        "            if(main_x - Sub_Im_Size[0]/2 < 0):\n",
        "                main_x = Sub_Im_Size[0]/2\n",
        "            if(main_x + Sub_Im_Size[0]/2 > ori_image.shape[1]):\n",
        "                main_x = ori_image.shape[1] - Sub_Im_Size[0]/2\n",
        "            if(main_y - Sub_Im_Size[1]/2 < 0):\n",
        "                main_y = Sub_Im_Size[1]/2\n",
        "            if(main_y + Sub_Im_Size[1]/2 > ori_image.shape[0]):\n",
        "                main_y = ori_image.shape[0] - Sub_Im_Size[1]/2\n",
        "            \n",
        "            # get_sub_image\n",
        "            sub_image     = ori_image[int(main_y - Sub_Im_Size[1]/2) : int(main_y + Sub_Im_Size[1]/2), int(main_x - Sub_Im_Size[0]/2) : int(main_x + Sub_Im_Size[0]/2), :]\n",
        "            sub_image_dot = dot_image[int(main_y - Sub_Im_Size[1]/2) : int(main_y + Sub_Im_Size[1]/2), int(main_x - Sub_Im_Size[0]/2) : int(main_x + Sub_Im_Size[0]/2), :]\n",
        "            \n",
        "            # record key as used_key\n",
        "            Used_Key_Set.add(key)\n",
        "            \n",
        "            ### get species\n",
        "            g,b,r = dot_image[int(key[1])][int(key[0])][:]\n",
        "            species = get_species(r,g,b)\n",
        "            if(species == -1):\n",
        "                continue\n",
        "\n",
        "            # get pos info for annotation file\n",
        "            x_pos = float(key[0]-(main_x-Sub_Im_Size[0]/2))/float(Sub_Im_Size[0])\n",
        "            y_pos = float(key[1]-(main_y-Sub_Im_Size[1]/2))/float(Sub_Im_Size[1])\n",
        "            x_len = float(xy_range[0]+xy_range[1])/float(Sub_Im_Size[0])\n",
        "            y_len = float(xy_range[2]+xy_range[3])/float(Sub_Im_Size[1])\n",
        "            element = [x_pos, y_pos, x_len, y_len]\n",
        "            \n",
        "            # save species info in annotation file\n",
        "            ant_file = open(Path_Sealion + '{0}labels/{1}_{2}.txt'.format(AUG_Add_Path, filename[:-4], cnt), 'w')\n",
        "            ant_file.write(str(species) + \" \" + \" \".join([str(x) for x in element]) + '\\n')\n",
        "            \n",
        "            \n",
        "            ### include other sea lion\n",
        "            # max min coordinate for including image based on origin image\n",
        "            x_min = max(main_x - sub_image.shape[1]/2 + 1, 0)\n",
        "            x_max = min(main_x + sub_image.shape[1]/2 - 1, ori_image.shape[1])\n",
        "            y_min = max(main_y - sub_image.shape[0]/2 + 1, 0)\n",
        "            y_max = min(main_y + sub_image.shape[0]/2 - 1, ori_image.shape[0])\n",
        "            \n",
        "            for ex_key in Dict_range.keys():\n",
        "                if(ex_key != key and ex_key[0] > x_min and ex_key[0] < x_max and ex_key[1] > y_min and ex_key[1] < y_max):\n",
        "                    ### coordinate of ex_sea_lion in origin image\n",
        "                    ex_range = Dict_range[ex_key]\n",
        "                    ex_left  = int(ex_key[0] - ex_range[0])\n",
        "                    ex_right = int(ex_key[0] + ex_range[1])\n",
        "                    ex_up    = int(ex_key[1] - ex_range[2])\n",
        "                    ex_down  = int(ex_key[1] + ex_range[3])\n",
        "                    \n",
        "                    ### sub_image's coordinate where ex_sea_lion put  \n",
        "                    Used_Key_Set.add(ex_key)\n",
        "\n",
        "                    ### get species for include sea_lion\n",
        "                    g,b,r = dot_image[int(ex_key[1])][int(ex_key[0])][:]\n",
        "                    species = get_species(r,g,b)\n",
        "            \n",
        "                    # get pos info for annotation file\n",
        "                    x_pos = float(ex_key[0]-(main_x-Sub_Im_Size[0]/2))/float(Sub_Im_Size[0])\n",
        "                    y_pos = float(ex_key[1]-(main_y-Sub_Im_Size[1]/2))/float(Sub_Im_Size[1])\n",
        "                    \n",
        "                    # adjust real size of include sea_lion due to be close to boarder\n",
        "                    ex_left_size  = min(ex_range[0], ex_key[0]-(main_x-Sub_Im_Size[0]/2))\n",
        "                    ex_right_size = min(ex_range[1], (main_x+Sub_Im_Size[0]/2)-ex_key[0])\n",
        "                    ex_up_size    = min(ex_range[2], ex_key[1]-(main_y-Sub_Im_Size[1]/2))\n",
        "                    ex_down_size  = min(ex_range[3], (main_y+Sub_Im_Size[1]/2)-ex_key[1])\n",
        "                    \n",
        "                    x_len = float(ex_left_size+ex_right_size)/float(Sub_Im_Size[0])\n",
        "                    y_len = float(ex_up_size+ex_down_size)/float(Sub_Im_Size[1])\n",
        "                    element = [x_pos, y_pos, x_len, y_len]\n",
        "            \n",
        "                    # save species info in annotation file\n",
        "                    ant_file.write(str(species) + \" \" + \" \".join([str(x) for x in element]) + '\\n')                          \n",
        "            \n",
        "            cv2.imwrite(Path_Sealion + '{0}JPEGImages/{1}_{2}.jpg'.format(AUG_Add_Path, filename[:-4], cnt), sub_image)\n",
        "            cv2.imwrite(Path_Sealion +  '{0}DotImages/{1}_{2}.jpg'.format(AUG_Add_Path, filename[:-4], cnt), sub_image_dot)\n",
        "            #cv2.imwrite('{0}_{1}.png'.format(filename[:-4], cnt),sub_image)\n",
        "            sub_image_names.write(Path_Sealion + '{0}JPEGImages/{1}_{2}.jpg'.format(AUG_Add_Path, filename[:-4], cnt))\n",
        "            sub_image_names.write(\"\\n\")\n",
        "            ant_file.close()\n",
        "    sub_image_names.close()"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "_cell_guid": "52180aee-d484-fef9-6b2c-3cc44866097a"
      },
      "source": [
        "# Run Main Code"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "_cell_guid": "1c0c40e1-372e-ce11-a001-999ac60d4257"
      },
      "source": [
        "## remove Train.txt if exist"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "a73b937c-c9c2-5a61-aa50-c745765471de"
      },
      "outputs": [],
      "source": [
        "if os.path.exists(Path_Sealion + \"{0}Train.txt\".format(AUG_Add_Path)):\n",
        "    os.remove(Path_Sealion + \"{0}Train.txt\".format(AUG_Add_Path))\n",
        "\n",
        "for filename in file_names:\n",
        "    if filename[-3:] == 'jpg':\n",
        "        parse_image_whole(filename)\n",
        "        \n",
        "        \"\"\"\n",
        "        print(\"Parsing {0}\".format(filename))\n",
        "        if(arg[2] == 'Black'):\n",
        "            parse_image_black(filename)\n",
        "        elif(arg[2] == 'Whole'):\n",
        "            parse_image_whole(filename)\n",
        "        else:\n",
        "            print(\"Wrong in argument\")\n",
        "        \"\"\""
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "_cell_guid": "a25b85ac-c9e3-3e8e-7929-941d79ba0a67"
      },
      "source": [
        "# remove sub_image template"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "1c814340-31dc-81ca-8fb0-00f3e63f5627"
      },
      "outputs": [],
      "source": [
        "if(arg[2] == 'Black'):\n",
        "    os.remove('sub_im_template.jpg')"
      ]
    }
  ],
  "metadata": {
    "_change_revision": 0,
    "_is_fork": false,
    "kernelspec": {
      "display_name": "Python 3",
      "language": "python",
      "name": "python3"
    },
    "language_info": {
      "codemirror_mode": {
        "name": "ipython",
        "version": 3
      },
      "file_extension": ".py",
      "mimetype": "text/x-python",
      "name": "python",
      "nbconvert_exporter": "python",
      "pygments_lexer": "ipython3",
      "version": "3.6.0"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 0
}