하지만 딥러닝 이미지 분류기는 인풋 이미지 안의 객체를 분류만 할 뿐, 이미지의 어느 부분에 어떤 객체가 있는지까지는 알려주지 않습니다.
아래의 이미지처럼 이미지의 어느부분에 어떠한 객체가 있는지를 알아내는 모델을 객체 탐지(object detection) 모델이라고
부릅니다.
YOLO를 이용한 Object Detection
물체가 있을것 같은 구역을 감지(Region proposal)하고, 분류(classify)하는 과정이 나누어져 있는 모델을 two-stage object detection이라고 하고, 두 과정이 동시에 이루어지는 모델을 one-stage object detection이라고 합니다.
이번 포스팅에서는 one-stage detection 모델이 어떻게 위 사진과 같은 아웃풋 이미지를 생성하는지 알아보도록 하겠습니다.
YOLO의 대략적인 프로세스는 다음과 같습니다.
각 단계별로 이해해보도록 하겠습니다.
먼저 이러한 이미지가 인풋으로 들어왔다고 하면,
먼저 그리드 셀을 생성해줍니다. 이해를 돕기 위한 예시로 3x3 크기의 그리드 셀을 생성하였습니다.
이제 각 그리드 셀마다 B개(예시에서는 2개)의 앵커박스를 생성해주고, 각 앵커박스에 다섯가지 정보(x,y,w,h,C) 와 각 클래스일 확률정보를 나타냅니다. 이것은 벡터 표현으로 나타냅니다.
총 3개의 클래스 (train, car, motocycle)를 가지는 경우를 살펴보겠습니다.
가운데 그리드 셀을 예시로, 두개의 앵커박스가 있고 각 앵커박스마다 좌표정보와 confidence score C, 각 클래스일 확률이 담겨있습니다.
- p_c는 물체가 박스내에 있는지 없는지를 결정하는 값 (물체가 없으면 0, 있다면 1) - b_x는 앵커박스 중심점의 x좌표 (비율이므로 0~1의 값) - b_y는 앵커박스 중심점의 y좌표 (비율이므로 0~1의 값) - b_h는 앵커박스의 세로 길이 (이미지 전체의 세로 길이를 1로 둔 상대 길이) - b_w는 앵커박스의 가로 길이 (이미지 전체의 가로 길이를 1로 둔 상대 길이)
confidence score 계산법
confidence score C 계산법
- Pr(Object) (물체의 중심 좌표가 해당 그리드에 속한다면 Pr(Object)=1, 속하지 않는다면 Pr(Object)=0)
- IoU(Intersection over Union) IoU(Intersection of Union)
교집합/합집합이라는 뜻으로, ground truth(실제 object가 있는 box)와의 합집합 영역을 분모로 하고 교집합 영역을 분자로 한 값이다.
이러한 벡터가 각 그리드마다 생성되어, 그림의 경우 총 3*3=9 개의 벡터가 출력됩니다.
3*3*(2*(5+3)) 크기의 출력 텐서가 이와 같은 과정을 통해 만들어지게 됩니다.
9개의 그리드 셀을 가지므로 총 18개의 앵커박스를 가지는 셈인데요, 예시를 9개의 그리드 셀과 2개의 앵커박스로 들었지만 실제 활용되는 모델의 그리드 셀과 앵커박스의 개수는 훨씬 많습니다.
YOLO structure
위 사진은 욜로의 구조인데, 짧게 설명하자면 컨볼루션과 풀링을 거친후 Fully connected layer를 거쳐 최종적으로 7*7*30의 앞서 설명했던 예시보다 큰 텐서가 출력으로 나오게 되죠.
그로 인해 물체가 아니거나 관심밖의 엉뚱한 물체까지 앵커박스가 감지하는데, 이를 방지하기 위해 NMS(Non-Maximum Suppression)을 진행합니다.
NMS는 같은 객체를 탐지하는 박스 중 confidence score가 가장 높은 박스를 제외한 나머지 bounding box를 제거하는 알고리즘입니다.
NMS 예시
NMS 알고리즘
1. 우선 일정 confidence score 이하의 bounding box는 제거합니다.
2. 남은 bounding box중 confidence score가 가장 높은 박스를 기준으로 하여 해당 박스와 다른 bounding box들과의 IoU를 구합니다. 이 때 IoU threshold를 정해주고 그 이상의 IoU를 가지는 박스는 같은 객체를 탐지한 박스라고 간주하여 제거합니다.
3. 다음으로 confidence score가 높은 박스를 기준으로 과정 2. 를 반복합니다.
마지막으로 yolo의 손실함수를 살펴보도록 하겠습니다.
yolo's multi loss
수식을 살펴보면 기본적으로 MSE(Mean Square Error) 베이스라는 것을 알 수 있습니다.
바운딩 박스와 관련된 좌표손실, confidence score 손실, classification손실, No object penalty(객체인 것을 객체가 아니라고 감지했을 시 페널티)이 4가지를 고려하는데 각각의 밸런싱 웨이트를 설정해주어 각 항목들이 잘 반영될 수 있도록 설정하였습니다.
One-stage object detection 모델은 이러한 방법으로 바운딩 박스를 만들고 그 객체가 무엇인지 분류한 결과를 표시합니다.
Region Proposal과 classify 과정이 동시에 진행되므로 two-stage 모델보다 빠르다는 장점이 있습니다.