Object Detection 정리 1. Localization과 Bounding Box

2022. 11. 29. 22:19개발

AI 딥러닝을 통한 Object Detection에 대해서 간단하게 정리해보자.

1. 분류 모델에서 시작.

 Computer Vision분야로 CNN을 기반으로 한 분류 모델에서 시작한다. 분류모델은 마지막 레이어는 class_num와 동일한 수의 Output Dimension을 가진다. 예를 들어 텐서플로(Tensorflow)에서 제공하는 ImageNet 데이터로 사전 훈련된(Pre-trained on ImageNet) 분류모델 MobileNet은 Output Dimension이 1,000이다.

# jupyter notebook

import tensorflow as tf

model = tf.keras.applications.mobilenet.MobileNet()
model.summary()

# 마지막 레이어 : predictions (Activation)    (None, 1000)
# None은 아직 정해지지 않은 Batch Size, 1000은 Output Dimension.

 2. Localization으로 점프.

 분류 모델에서 위치(Localization) 모델로 넘어가는 문제를 정의하자면, 무엇인지 분류하던 것을 어디있는지 표현하는 것이다. 즉, 무엇의 갯수에 맞췄던 Output Dimension을 위치 정보로 바꿔야 하는데, Object Detection에서는 Bounding Box라는 사각형으로 위치 정보를 표현하며 이때 Output Dimension은 4다.

backbone = tf.keras.applications.mobilenet.MobileNet(
    include_top=False,
    weights=None,
    pooling='avg',
)

head = tf.keras.layers.Dense(
    units=4,
    activation='sigmoid', # sigmoid activation으로 0과 1 사이 값을 Return.
)

model = tf.keras.Model(
    inputs=backbone.input,
    outputs=head(backbone.output)
)
model.summary()

# 마지막 레이어 : dense (Dense)               (None, 4)
# None은 아직 정해지지 않은 Batch Size, 4는 Output Dimension.

# 1. outputs = (x1, y1, x2, y2) # 2개의 모서리
# 2. outputs = (cx, cy, w, h) # 중점, 너비 및 높이

 이 Output Dimension 4로 Bounding Box를 표현하는 방법은 크게 2가지다. 하나는 2개의 모서리로 표현하는 방법이고, 다른 하나는 중점과 너비 및 높이로 표현하는 방법이다.

import cv2
import matplotlib.pyplot as plt

filename = 'IMG_0973.JPG'
img = cv2.imread(filename)

plt.imshow(img)
# cv2는 RGB가 아닌 BGR로 이미지를 불러오기 때문에 이미지 출력이 R채널과 B채널이 바뀌어 된다.

cv2는 RGB가 아닌 BGR로 이미지를 불러오기 때문에 이미지 출력이 R채널과 B채널이 바뀌어 된다.

# cv2.cvtColor를 이용해서 BGR 포맷을 RGB 포맷으로 Convert.
img1 = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
cv2.rectangle(img1, (130,180), (380,400), (255,0,0), 3)

cv2.circle(img1, (130,180), 10, (255,0,0), -1)
cv2.putText(img1, '(x1, y1)', (80,160), cv2.FONT_HERSHEY_SIMPLEX, 1, (255,0,0), 3)

cv2.circle(img1, (380,400), 10, (255,0,0), -1)
cv2.putText(img1, '(x2, y2)', (330,440), cv2.FONT_HERSHEY_SIMPLEX, 1, (255,0,0), 3)

img2 = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
cv2.rectangle(img2, (130,180), (380,400), (255,0,0), 3)

cv2.circle(img2, (255,290), 10, (255,0,0), -1)
cv2.putText(img2, '(cx, cy)', (205, 330), cv2.FONT_HERSHEY_SIMPLEX, 1, (255,0,0), 3)

cv2.arrowedLine(img2, (130,150), (380,150), (255,0,0), 3)
cv2.arrowedLine(img2, (380,150), (130,150), (255,0,0), 3)
cv2.putText(img2, 'w', (255,140), cv2.FONT_HERSHEY_SIMPLEX, 1, (255,0,0), 3)

cv2.arrowedLine(img2, (400,180), (400,400), (255,0,0), 3)
cv2.arrowedLine(img2, (400,400), (400,180), (255,0,0), 3)
cv2.putText(img2, 'h', (410,290), cv2.FONT_HERSHEY_SIMPLEX, 1, (255,0,0), 3)

# subplot 이용해서 이미지 2개를 1 figure에 출력.
plt.figure(figsize=(12,4))

plt.subplot(1,2,1)
plt.imshow(img1)

plt.subplot(1,2,2)
plt.imshow(img2)

Bounding Box를 표현하는 방법. 2개의 모서리로 표현하는 방법(left), 중점과 너비 및 높이로 표현하는 방법(right)

 데이터셋을 이용하여 구성한 모델을 훈련(train)한 후, 예측(inference)을 수행하면 위치 정보를 얻을 수 있을 것이다. (단, sigmoid 덕에 모델 output 값이 0~1이기 때문에 위치정보 값을 정규화하여 데이터셋을 준비해야 한다.) 다음 정리에서는 현 모델의 문제와 그 해결을 다뤄보자.  

728x90
반응형