Perception/Object Detection

[Object Detection] YOLOv2 (YOLO9000:Better, Faster, Stronger)

고집호랑이 2024. 3. 29. 16:49

이전 포스팅에서 설명한 YOLOv1은 inference 속도는 빠르지만 크기가 작은 object는 잘 detect하지 못하고 새로운 형태의 Bounding Box의 경우 정확히 예측하지 못하는 등 detection 성능이 떨어진다는 큰 단점이 있었습니다. YOLOv2는 그 당시 나왔던 여러 기술들을 합쳐 YOLOv1에 비해 수행 시간과 성능 모두 개선시킨 모델입니다. 이번 포스팅에서는 YOLOv2와 함께 성능을 향상시킨 방법들에 대해서 YOLOv1과 비교하면서 설명하도록 하겠습니다.  

 

성능 향상 방법

1. Batch Normalization

 

배치 정규화는 다른 regularization의 필요성을 없애고 학습하는 과정 자체를 전체적으로 안정화하여 학습 속도를 가속 시키는 역할을 합니다. YOLOv2는 모든 컨볼루션 레이어(Convolution Layer)에 이 배치 정규화(Batch Normalization)를 추가해 mAP에서 2%의 성능 향상을 얻었습니다. 또한 이를 통해서 과적합(overfitting)없이 dropout도 제거할 수 있었다고 합니다. 

 

dropout: 과적합(overfitting)을 방지하기 위해서 Layer에서 0부터 1 사이의 확률로 뉴런을 제거(drop)하는 기법

과적합, 배치 정규화, 드롭아웃과 같은 딥러닝 기본 개념은 기회가 될 때 따로 포스팅하도록 하겠습니다.

 

2. High Resolution Classifier

 

YOLOv1 모델은 Classifier Network를 224x224 크기로 pre-train시켰지만 detection task 시에는 448x448 크기의 이미지를 입력으로 사용합니다. 이는 네트워크가 object detection task를 학습하면서 동시에 새로운 입력 이미지의 resolution(해상도)에 적응해야 함을 의미합니다. 학습시킨 이미지와 detect 수행 시 입력하는 이미지의 크기가 다르니 당연히 성능이 떨어질 수 밖에 없는 것이죠.

 

YOLOv2 모델은 처음부터 Classifier Network를 448x448 크기로 ImageNet에서 10 epoch 동안 fine-tuning하여 높은 해상도의 이미지에 더 잘 적용되도록 필터를 조정할 시간을 제공합니다. 이러한 방법을 통해 4% 정도의 mAP 값이 향상됐다고 합니다. 

 

※ fine tuning: 기존에 학습되어져 있는 모델을 기반으로 아키텍쳐를 새로운 목적에 맞게 변형하고 이미 학습된 모델의 가중치를 미세하게 조정하여 학습시키는 방법

 

3. Convolutional With Anchor Boxes

 

YOLOv1 모델은 convolution feature extractor 바로 뒤에 fullly connected layers를 사용하여 각 grid cell 당 2개의 Bounding Box 좌표를 직접적으로 예측했습니다. YOLOv2는 Faster R-CNN 모델의 anchor box 개념을 도입하여 각 grid cell 당 고정된 크기와 사이즈를 가진 5개의 anchor box의 offset을 예측하는 방식으로 객체의 위치를 detect합니다. 

 

또한 큰 객체는 이미지의 중심에 있을 가능성이 높다는 점을 고려해 output feature map의 크기를 홀수로 지정해주기 위해서 448 x 448이 아닌 416 x 416 크기의 입력 이미지를 사용했습니다. 

(32배 downsampling을 하기 때문에 입력 이미지의 크기가 448 x 448이면 14 x 14 크기의 feature map이 얻어지고 중심에 4개의 grid cell이 오게 되지만, 416 x 416이면 13 x 13 크기의 feature map이 얻어지기 때문에 중앙에 하나의 grid cell이 위치하게 됩니다.)

 

YOLOv1의 경우 7 x 7의 각 grid cell 당 2개의 bounding box를 예측하고 Confidence Score가 더 높은 책임 Bounding Box에 대해서만 Pascal VOC 20개의 클래스 확률을 예측했지만 YOLOv2는 다음 그림과 같이 13 x 13의 각 grid cell 당 5개의 anchor box로 Bounding Box를 예측하고 모든 anchor box에 대해서 20개의 클래스 확률을 예측합니다. 즉 YOLOv2의 경우 출력 feature map의 depth는 125(4(Bounding Box offset) + 1(객체가 있을 확률($P_o$)) + 20(Pascal VOC 각 class 별 확률) = 25 x 5(Anchor  box 개수) = 125)가 되고 전체 feature map의 크기는 13 x 13 x 125가 되는 것이죠. 

 

Anchor Box 별로 Class 확률 예측

 

Anchor Box를 사용하면서 YOLOv1에 비해서 mAP는 다소 감소했지만 recall 값이 상승했다고 합니다. Recall 값이 높다는 것은 모델이 실제 Object들을 빠뜨리지 않고 정확히 detect한 비율이 높다는 뜻입니다. 2개의 Bounding Box만을 예측하는 YOLOv1에 비해서 YOLOv2는 grid cell도 더 세세하게 나눴을 뿐더러(7 x 7 => 13 x 13) 5개의 Anchor Box를 사용해 더 많은 수의 Bounding Box를 예측하기 때문에 recall 값이 상승한 것은 어찌보면 당연한 결과라고 할 수 있습니다. 

 

Yolov1과 Yolov2의 출력 feature map 비교

 

4. Dimension Cluster

 

YOLOv2는 Anchor box를 수정하면서 Bounding Box를 예측한다고 했습니다. Faster R-CNN의 경우 사전에 미리 정해진 크기와 비율을 가지는(1:1, 1:2, 2:1의 비율) 9개의 anchor box를 사용하죠. 하지만 만약 Object들의 모양 경향에 맞는 초기 anchor box 크기를 선택할 수 있다면 성능은 더 좋아질 것을 예상할 수 있습니다.

 

YOLOv2는 이를 위해 K-Means Clustering을 적용하여 학습 데이터 세트의 이미지 크기와 Shape Ratio 따른 5개의 군집화 분류로 초기 Anchor Box의 모양을 결정합니다. 이를 통해서 5개의 anchor box로 9개의 anchor box를 사용하는 Faster R-CNN과 비슷한 평균 IoU값을 얻을 수 있었다고 합니다.

k값과 평균 IoU 값의 관계K-평균 클러스터링
k가 커지면 모델의 복잡도가 상승하는 트레이드 오프 관계가 있기 때문에 YOLOv2는 k = 5 를 선택

 

 

5. Direct Location Prediction

 

Anchor box를 활용한 Bounding Box offset 예측법은 Bounding Box의 위치를 제한하지 않아서 초기 학습시 불안정하다는 단점이 있습니다. 예측값의 범위를 제한하지 않으면 anchor box가 이미지의 어느 점으로도 갈 수 있고, 적절한 offset을 구하기까지 시간이 많이 걸린다는 것입니다. 

 

따라서 기존의 YOLOv1이 Object의 중심점을 예측한 것과는 달리 YOLOv2는 예측 Bounding Box의 중심 좌표가 Cell 내에서 벗어나지 않도록 예측 결과인 $t_x$, $t_y$에 sigmoid 함수를 적용하여 offset의 범위를 0에서 1로 제한합니다. Offset 값인 σ($t_x$), σ($t_y$)은 Object의 중심점이 grid의 left top 꼭짓점으로부터 얼만큼 이동하는지를 나타냅니다.

위치 예측

 

이 방법으로 mAP가 5% 정도 상승했다고 합니다. 

 

6. Fine-Grained Features

 

지난번 SSD에 대해서 포스팅할 때, Feature Map의 size는 줄어들수록 점점 원본 이미지의 축약적이고 핵심적인 정보를 담고있기 때문에 큰 Object에 대한 detection에 용이하고, size가 커질수록 추상적인 이미지의 형태로 변하게 되면서 비교적 작은 Object에 대한 detection에 유리하다고 설명한 바 있습니다. 그렇다면 점점 feature map의 크기가 작아지는 CNN 모델의 특징상 크기가 작은 object에 대한 detect 성능이 떨어질 수 밖에 없습니다.

 

SSD의 경우 여러 scale의 feature map을 모두 사용하는 방식으로 이러한 문제점을 해결했습니다. YOLOv2는 이러한 문제를 Passthrough Layer를 도입함으로써 해결하고자 하였습니다.

 

아래 그림과 같이 Passthrough Layer을 사용하여 상위 Layer의 26x26x256 크기의 feature map을 13x13x2048로 rescaling을 해준 뒤 하위 Layer의 feature map에 합쳐 13x13x3072 feature map을 만들어 내는 것을 볼 수 있습니다. 이 방법을 통해 1%의 mAP 향상을 이뤄냈다고 합니다. 

 

패스스루 레이어

 

7. Multi-Scale Training

 

YOLOv1Classification Layer인 Dense Layer(FC Layer)의 입력 사이즈가 무조건 고정되어야 하기 때문에(flatten를 했을 때의 크기가 정해져 있음) 448 x 448 크기의 입력 이미지만을 사용하여 학습을 해야 했습니다. 하지만 YOLOv2Dense Layer 대신 Fully Convolution을 사용했기 때문에 여러 scale의 이미지를 학습할 수 있게 되었습니다. 

 

이를 활용하여 YOLOv2는 모델을 보다 강건하게 만들고 작은 물체들을 잘 잡아내기 위해서 다양한 입력 이미지를 사용하여 네트워크를 학습시킵니다. 논문에서는 {320, 352, ..., 608}와 같이 32픽셀 간격으로(32배 downsampling을 사용하기 때문) 매 10batch마다 입력 이미지의 크기를 랜덤하게 선택하여 학습하도록 설계했습니다. 

 

이를 통해 네트워크는 다양한 크기의 이미지를 입력받을 수 있고, 속도와 정확도 사이의 trade-off를 제공합니다. 아래 표에서 확인할 수 있듯이 입력 이미지의 크기가 작은 경우 더 높은 FPS를 가지며, 입력 이미지의 크기가 큰 경우 더 높은 mAP 값을 가지게 됩니다. 

 

입력 이미지 크기에 따른 속도 정확도 trade-off

 

이렇듯 YOLOv2는 그 당시의 최신 아이디어를 적극적으로 도입하여 YOLOv1의 mAP 성능을 크게 끌어올렸습니다.

 

mAP 성능이 크게 증가한 Yolov2

 

Loss Function (손실 함수)

YOLOv2 Loss의 계산 방식은 YOLOv1과 거의 유사하기 때문에 논문에 Loss 함수에 대해서는 따로 언급되어 있지 않습니다. 다른 점이라면 YOLOv1Object의 중심 좌표와 높이, 너비 값 등을 직접 예측하는 반면에 YOLOv2offset값을 예측한 후 이를 이용해 Object의 중심 좌표, 높이, 너비 값 등($b_x, b_y, b_w, b_h$)을 계산하기 때문에 아래 그림의 빨간 사각형 박스의 값만 달라진 것을 확인할 수 있습니다.

 

Yolov1과의 Loss 함수 차이점

 

YOLO9000

YOLOv2 논문에서 또 찾아볼 수 있는 흥미로운 부분은 바로 YOLO9000입니다. 논문에서는 YOLOv2를 classification 데이터와 detection 데이터를 함께 사용하여 학습시킴으로써 9000개의 class를 예측할 수 있도록하는 YOLO9000을 만들었다고 합니다. 

 

이를 위해서 저자는 계층적인 트리(Hierarchical tree)인 WordTree를 구성하여 COCO dataset과 ImageNet dataset을 합리적인 방법으로 결합하고, Classification을 수행할 때 하나의 큰 softmax를 사용하는 대신에 WordTree 상에서 공동 하위어에 속하는 class끼리만 softmax를 적용함으로써 분류 작업을 수행했다고 합니다.

 

가령 ImageNet 데이터를 보면 개라는 대분류 안에 웰시코기니, 요크 셔테리어와 같은 Label들이 속합니다. 이 점에 착안하여 저자는 아래의 오른쪽 그림과 같이 Softmax 연산을 수행할 때 전체 클래스에 대해서 한번에 수행하지 말고, 각 대분류 별로 Softmax를 수행하면서 Classification을 수행한다는 것입니다.

 

WordTree와 대분류 별로 softmax 적용 그림
WordTree로 합쳐진 dataset(좌)과 대분류 별로 softmax를 적용하는 그림(우)

 

YOLO9000은 전반적으로 19.7 mAP를 달성하고, 라벨링된 detection data를 학습에 사용하지 못한 156개의 객체 Class에 대해서는 16.0mAP라는 정확도를 달성합니다. 이렇듯 성능이 썩 좋지는 않다는 것을 알 수 있지만 9000개나 되는 Class를 학습시키고 실시간으로 예측할 수 있다는 점은 혁신적인 결과라고 생각합니다.

 

 

Yolov2 성능 비교

 

YOLOv2는 위 그림과 같이 PASCAL VOC 데이터셋 기준으로 SSD이나 Faster R-CNN과 비슷한 mAP 성능, 입력 이미지의 크기에 따라서는 더 좋은 성능을 보였으며 detection 속도 측면에서는 크게 앞섰습니다. 하지만 MS-COCO dataset에 대해서는 detect을 성공했다고 판단하는 IoU 기준이 달라서 그런건지 SSD나 Faster R-CNN에 비해 mAP 성능이 약간 떨어지는 것을 확인할 수 있습니다. 

 

Detection 성능이 SSD에 비해 크게 떨어졌던 YOLOv1에 비해서 빠른 detection 속도는 유지한 채 성능은 SSD만큼이나 끌어올렸다는 점이 대단하다는 생각이 듭니다. 다음 포스팅에서는 YOLOv2의 다음 버전인 YOLOv3에 대해서 설명하도록 하겠습니다. 

 

Reference

 https://www.inflearn.com/course/딥러닝-컴퓨터비전-완벽가이드/dashboard - 인프런 강의

 

https://blog.firstpenguine.school/47

 

https://arxiv.org/pdf/1612.08242.pdf

 

https://wikidocs.net/173926