{"cells":[{"cell_type":"markdown","metadata":{"_cell_guid":"d3750610-4c38-fabf-8610-7c126e40399d"},"source":"# import module"},{"cell_type":"code","execution_count":null,"metadata":{"_cell_guid":"52d586e1-42a8-ad96-a50a-cbdef6fe620a"},"outputs":[],"source":"import numpy as np\nimport pandas as pd\nimport os\nimport cv2\nimport matplotlib.pyplot as plt\nimport skimage.feature\n#%matplotlib inline\n\n#from subprocess import check_output\n#print(check_output([\"ls\", \"../input\"]).decode(\"utf8\"))"},{"cell_type":"code","execution_count":null,"metadata":{"_cell_guid":"df86021c-fcf6-5496-a4b4-e7844b18130f"},"outputs":[],"source":"if not os.path.exists(\"./labels\"):\n    os.makedirs(\"./labels\")\nif not os.path.exists(\"./JPEGImages\"):\n    os.makedirs(\"./JPEGImages\")"},{"cell_type":"markdown","metadata":{"_cell_guid":"e8abd447-dbf7-f5a5-5564-b761e8b642ad"},"source":"# read files"},{"cell_type":"code","execution_count":null,"metadata":{"_cell_guid":"abc287c5-1332-747a-34de-1bfb32a73be1"},"outputs":[],"source":"Path_Sealion = \"./\" # \"/home/paperspace/Project/Sealion/\" # \nPath_Train  = \"../input/Train/\" # \"/home/paperspace/Project/Sealion/TrainSmall2/Train/\"  # \nPath_Dotted = \"../input/TrainDotted/\" # \"/home/paperspace/Project/Sealion/TrainSmall2/TrainDotted/\"  # \nfile_names = os.listdir(Path_Train)\nfile_names = sorted(file_names, key=lambda \n                    item: (int(item.partition('.')[0]) if item[0].isdigit() else float('inf'), item))\n\n# select a subset of files to run on\nfile_names = file_names[0:1]"},{"cell_type":"markdown","metadata":{"_cell_guid":"c6ca869f-867f-130b-b8d3-f4e7ebf7ea9c"},"source":"# generate sub_image_template"},{"cell_type":"code","execution_count":null,"metadata":{"_cell_guid":"123808d2-82f4-9b26-e45b-945b55ccb2b4"},"outputs":[],"source":"Sub_Im_Size = (416,416)\n\nimage_tmp = cv2.imread(Path_Train + file_names[0])\nimage_tmp = image_tmp[:Sub_Im_Size[1],:Sub_Im_Size[0],:]\nimage_tmp = cv2.absdiff(image_tmp,image_tmp)\n\nplt.imshow(cv2.cvtColor(image_tmp, cv2.COLOR_BGR2RGB))\ncv2.imwrite('sub_im_template.png',image_tmp)"},{"cell_type":"markdown","metadata":{"_cell_guid":"5940031e-b3da-8558-dc61-10a2e91dc8f7"},"source":"# parse image"},{"cell_type":"code","execution_count":null,"metadata":{"_cell_guid":"a82dd339-1b80-d0f1-af9f-7477bef1ad06"},"outputs":[],"source":"def get_blobs(filename):\n    # read the Train and Train Dotted images\n    image_1 = cv2.imread(Path_Dotted + filename)\n    image_2 = cv2.imread(Path_Train + filename)\n    \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":"2c3bd04b-9dbb-41c9-6f8e-1f53b2324aac"},"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":"90b5a0f2-953b-c27b-9c4e-2896ac2386dd"},"outputs":[],"source":"# classes = [\"adult_males\", \"subadult_males\", \"adult_females\", \"juveniles\", \"pups\"]\n\ndef 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"},{"cell_type":"code","execution_count":null,"metadata":{"_cell_guid":"2114c97a-bec4-b8c1-8a59-00feb5bd088b"},"outputs":[],"source":"def parse_image(filename):\n    ## open sub_image_names file\n    sub_image_names = open(Path_Sealion + \"Train.txt\", 'w')\n    \n    ### get original image\n    ori_image = cv2.imread(Path_Dotted + filename)\n    dot_image = cv2.imread(Path_Train + filename)\n    cnt = 0\n    \n    ### get coordinate of all sea lions\n    Dict_range = {}\n    blobs = get_blobs(filename)\n    \n    for blob in blobs:\n        # get the coordinates for each blob\n        y, x, s = blob\n        \n        xy_range = get_xy_range_basic(x=x, y=y, x_max=ori_image.shape[1], y_max=ori_image.shape[0], size=16)\n        Dict_range[(x,y)] = xy_range\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            \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 + 'labels/{0}_{1}.txt'.format(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 + 'JPEGImages/{0}_{1}.jpg'.format(filename[:-4], cnt),sub_image)\n            #cv2.imwrite('{0}_{1}.png'.format(filename[:-4], cnt),sub_image)\n            sub_image_names.write(Path_Sealion + 'JPEGImages/{0}_{1}.jpg'.format(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":"6492925d-7911-3450-0a1f-924ee95d1086"},"outputs":[],"source":"parse_image(file_names[0])"},{"cell_type":"markdown","metadata":{"_cell_guid":"6f8b8b91-9f58-cc7f-8a4c-2434d5f4ccc4"},"source":"# remove sub_image template"},{"cell_type":"code","execution_count":null,"metadata":{"_cell_guid":"ecbff625-7df7-29ce-bb1d-b616f5630adc"},"outputs":[],"source":"os.remove('sub_im_template.jpg')"},{"cell_type":"code","execution_count":null,"metadata":{"_cell_guid":"fd43c44f-1261-b631-0d5c-2cbb23072e05"},"outputs":[],"source":""},{"cell_type":"code","execution_count":null,"metadata":{"_cell_guid":"ba4d4915-01eb-4568-16d9-65bbd274e15d"},"outputs":[],"source":""},{"cell_type":"code","execution_count":null,"metadata":{"_cell_guid":"9f6dd282-1640-9004-bc73-c5eb0de1143d"},"outputs":[],"source":""},{"cell_type":"code","execution_count":null,"metadata":{"_cell_guid":"d4a7e062-5143-e7e7-9072-1221d1f45a0e"},"outputs":[],"source":""},{"cell_type":"code","execution_count":null,"metadata":{"_cell_guid":"15d7b5eb-9b34-012a-6aec-8a3d43910c4d"},"outputs":[],"source":""},{"cell_type":"code","execution_count":null,"metadata":{"_cell_guid":"0781d97f-4661-c7e6-3f36-1973d6a69a76"},"outputs":[],"source":""},{"cell_type":"code","execution_count":null,"metadata":{"_cell_guid":"1efa6099-f0f6-4965-ffee-f30636446fcc"},"outputs":[],"source":""},{"cell_type":"code","execution_count":null,"metadata":{"_cell_guid":"297aaa94-780a-f625-f69a-dee59f313155"},"outputs":[],"source":""},{"cell_type":"code","execution_count":null,"metadata":{"_cell_guid":"536bf2ba-7249-4cae-d5f1-1992e4c72acf"},"outputs":[],"source":""}],"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}