이미지의 바운딩 박스 영역으로 패치 만들기.

  • 바운딩 박스 좌표와 이미지를 입력으로 받아, 패치 사이즈를 지정해 패치를 만듬.
  • 새로운 좌표에서의 바운딩 좌표가 그려져 이미지 생성.
  • 가로 세로 지정가능.
  • 잘못된 바운딩 박스 좌표 입력시 예외 처리 기능.


import numpy as np

import pandas as pd

import cv2

import random

import os


def make_patch():

    # csv 파일 경로.

    csv_path_dir = r"C:\Users\User\연구\sa\csv_file"

    csv_list = os.listdir(csv_path_dir)

    # img 파일 경로.

    img_path_dir = r"C:\Users\User\연구\sa\img_file"

    img_list = os.listdir(img_path_dir)

    # csv파일에 있는 오브젝트 개수

    object_num = 0

    # csv 파일 만큼 불러오기.

    for csv_name in csv_list:

        file_name = csv_name.split('.')

        origin_csv = pd.read_csv('./csv_file/{}.csv'.format(file_name[0]))

        img_name = img_list[object_num]

        counting = 0

        object_num +=1

        # csv 파일 values 값 돌기.

        for origin_data in origin_csv.values: 

            # 이미지 파일 가져오기

            img = cv2.imread('./img_file/{}'.format(img_name))

            print(origin_data)            

            # 기존 이미지 좌표

            origin_x_min = 0

            origin_x_max = origin_data[1]

            origin_y_min = 0

            origin_y_max = origin_data[0]


            # 바운딩 박스 이미지 좌표.

            object_x_min = origin_data[2]

            object_x_max = origin_data[3]

            object_y_min = origin_data[4]

            object_y_max = origin_data[5]

            object_width = object_x_max - object_x_min

            object_height = object_y_max - object_y_min

            object_x_center = int(object_x_min + object_x_max )/2

            object_y_center = int(object_y_min + object_y_max )/2


            # csv 저장할 데이터 리스트

            bounding_box = []

            # 패치 개수 조정.

            patch_num = 0

            

            while(True):

                # 패치 개수에 따라서 종료.

                if (patch_num == 1):  break

                # patch 좌표 - (센터에서 +150 -150) 300 x 300 사이즈

                patch_x_min = int(object_x_center - 150)

                patch_x_max = int(object_x_center + 150)

                patch_y_min = int(object_y_center - 150)

                patch_y_max = int(object_y_center + 150)

                patch_width = int(patch_x_max - patch_x_min)

                patch_height = int(patch_y_max - patch_y_min)


                # object의 width와 height 더 클시 100씩 추가.

                while(object_width > patch_width):

                    patch_x_min = patch_x_min - 50

                    patch_x_max = patch_x_max + 50

                    patch_width = patch_x_max - patch_x_min

                    print(object_width,patch_width)


                # object의 width와 height 더 클시 100씩 추가.

                while(object_height > patch_height):

                    patch_y_min = patch_y_min - 50

                    patch_y_max = patch_y_max + 50

                    patch_height = patch_y_max - patch_y_min

                    print(object_width,object_height)

                    

                # 사각방향에 대한 예외처리. 패치 좌표가 원본 이미지보다 클시.

                if(patch_x_min < origin_x_min):

                    patch_x_min -= patch_x_min

                if(origin_x_max < patch_x_max):

                    val = patch_x_max - origin_x_max

                    patch_x_max -= val

                if(patch_y_min < origin_y_min):

                    patch_y_min -= patch_y_min

                if(origin_y_max < patch_y_max):

                    val = patch_y_max - origin_y_max

                    patch_y_max -= val

                # 갱신된 오브젝트 좌표.

                new_x_min = object_x_min - patch_x_min 

                new_x_max = object_x_max - patch_x_min 

                new_y_min = object_y_min - patch_y_min 

                new_y_max = object_y_max - patch_y_min 

                #리스트 추가.

                bounding_box.append([patch_width, patch_height,new_x_min,new_x_max,new_y_min,new_y_max,origin_csv['category'][0]])

                print(counting+1,img_name ,patch_x_min, patch_x_max,patch_y_min,patch_y_max,object_x_min,object_x_max

                      ,object_y_min,object_y_max,new_x_min,new_x_max,new_y_min,new_y_max,patch_height,object_height)

                #패치 사이즈로 이미지 자르고 저장.

                img_trim = img[patch_y_min:patch_y_max, patch_x_min:patch_x_max]

                cv2.rectangle(img_trim, (new_x_min, new_y_min), (new_x_max, new_y_max), (0,255,0), 1)

                print(object_num)

                cv2.imwrite('./patch_img/{}_{}.png'.format(file_name[0],counting+1), img_trim)                                        

                # 패치 개수 카운팅.

                patch_num += 1

                counting += 1


'Study > Deep Learning' 카테고리의 다른 글

Backpropagation  (0) 2018.12.27
MNIST Data 랜덤 추출.  (3) 2018.11.15
Visiualizing t-SNE(Stochastic Neighbor Embedding)  (0) 2018.09.03
Softmax fuction 소프트맥스 함수  (0) 2018.08.08
Gradient Descent Optimiztion  (0) 2018.07.18

+ Recent posts