이미지의 비율을 맞추려면 padding으로 정사각형을 만드는 방법이 있다.
일반적으로 resize하게 되면 비율이 다 망가지는데, 딥러닝 돌릴 때 이런 것들을 그냥 무시하고 정해진 size대로 resize하는 경우가 있다. 생각보다 이 방법만으로도 모델이 예측하는 성능을 높일 수 있다.
연구는 별 거 없다. 생각보다 간단한 경우에서부터 성능을 향상할 수 있는 것이다.
이런 모든 것이 개선된 다음에야 더 세부적으로 들어가는 거라고 생각한다.
사실 이미 Pillow로 구현된 것이 있고, 그걸 그대로 OpenCV 방식으로 바꾼 것이다.
검색하면 Pillow로 된 것이 먼저 나올 것이다.
input은 opencv Mat 형태이며, background_color는 Scalar로 쉽게 말해서 그냥 BGR 튜플 넣어주면 된다
예를 들어,
image = cv2.imread("test.png")
background_color = (255,0,0)
이렇게 알아서 custom 해주고,
나는 지금 경계 채우는 것을 BORDER_REPLICATE로 하였는데, 이미 이정도를 검색하시는 분들은 다 아시겠지만 cv2.BORDER_CONSTANT 였나 이거든지 Custom 해서 사용하자
def expand2square(image,background_color):
height, width,channel = image.shape
if width == height:
return image
elif width > height:
dif = width - height
image = cv2.copyMakeBorder(image, dif//2, dif//2, 0, 0, cv2.BORDER_REPLICATE, background_color )
return image
else:
dif = height - width
image = cv2.copyMakeBorder(image,0,0, dif//2, dif//2, cv2.BORDER_REPLICATE, background_color )
return image