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