저번 포스팅에 이어서 이번에는 Yolov3에 대해서 살펴보도록 하겠습니다.
위 그림은 v1부터 v3까지 YOLO를 버전 별로 비교한 표입니다. YOLOv2의 경우 YOLOv1의 detection 성능을 높이기 위해서 그 당시의 다양한 기술들을 도입해 많은 변화가 있었다는 것을 표만 봐도 알 수 있습니다. 이에 비해 YOLOv3는 YOLOv2와 비교해 향상된 Backbone(Feature Extractor), FPN(Feature Pyramid Network) 기법의 적용만으로, 큰 변화는 주지 않고 성능과 속도를 올렸습니다. 그럼 거두절미하고 YOLOv3에 대해서 설명하도록 하겠습니다.
Prediction Across Scales
YOLOv2와 비교해 달라진 YOLOv3의 가장 큰 특징은 바로 FPN(Feature Pyramid Network)과 유사한 기법을 적용하여 3개의 Output Feature Map으로 Object를 예측하는 점입니다. 이 부분을 잘 이해하기 위해서는 Feature Pyramid Network에 대한 간단한 이해가 필요합니다.
먼저 Pyramid란 위 그림과 같이 Convolutional Network에서 얻을 수 있는 서로 다른 해상도의 feature map을 쌓아올린 형태를 뜻하고 level은 피라미드의 각 층에 해당하는 feature map을 뜻합니다. 일반적으로 입력층에서 가까운 곳에서 뽑아낸 feature map을 Low-level feature map이라하며 깊은 layer에서 얻을 수 있는, 크기가 작아진 feature map을 High-level feature map이라고 합니다.
Low-level feature map은 높은 해상도(high resolution)을 가지며, 가장자리, 곡선 등과 같은 저수준 특징(low-level feature)을 보유하고 있습니다. 반대로 High-level feature map은 낮은 해상도(low resolution)을 가지며, 질감과 물체의 일부분 등 class를 추론할 수 있는 고수준 특징(high-level feature)을 가지고 있습니다.
따라서 YOLOv1과 같이 마지막 layer의 high-level feature map만을 사용해 객체를 예측한다면 low-level feature는 대부분 무시되어 검출 성능이 떨어질 수 밖에 없는 것이죠.
이를 위해서 SSD의 경우 위 그림의 (c)와 같이 미리 지정한 convolution layer마다 feature map을 추출하여 predict을 수행한다는 것을 배웠습니다. 이 때 feature map 간의 해상도 차이로 학습하는데에 문제가 생기는 것을 막기 위해서 SSD는 low-level feature map을 사용하지 않고, 전체 convolutional network의 중간 지점부터 feature map을 추출하여 사용합니다. 즉 SSD는 Low-level feature map을 사용하지 않을 뿐만 아니라 High-level로 갈수록 각 Layer들이 가지는 특징들이 소실되기 때문에 detect 성능이 떨어진다는 문제가 있습니다.
반면에 FPN은 위 그림의 (d)와 같이 HIgh-level feature map을 upsampling하여 크기를 맞춘 후 하위 level에 있는 feature map과 합친 결과 feature map들을 가지고 객체를 predict합니다. 즉 low-level feature부터 high-level feature까지 모든 특징들이 포함된 feature map으로 predict을 함으로써 다양한 크기의 객체를 더 잘 predict할 수 있는 것이죠.
이러한 FPN을 적용하여 YOLOv3은 위 그림과 같이 High-level feature map을 upsampling하여 하위 level의 feature map과의 크기를 맞춘 후 합치는 일련의 과정을 거치면서 최종적으로 3개의 feature map들을 뽑아냅니다. 이 과정을 더 자세히 살펴보면 아래 그림과 같습니다.
최종적으로 small, medium, large Object를 위한 13 x 13 x 255, 26 x 26 x 255, 52 x 52 x 255 크기의 총 3개의 Output feature map들을 생성하는 것을 확인할 수 있죠.
13 x 13, 26 x 26, 52 x 52의 의미는 위 그림을 보면 단번에 알아차릴 수 있듯이 입력 이미지를 grid cell로 나눈 방법들입니다. 입력 이미지를 13 x 13, 26 x 26, 52 x 52의 grid cell로 나눠 각 grid cell에서 객체를 predict하고 그 값이 저장되어 있는 것이죠. YOLOv3는 각 output feature map의 grid cell 당 3개의 Anchor Box를 사용하여 객체를 predict 합니다. 이때 Anchor Box는 YOLOv2와 동일하게 K-Means Clustering을 적용하여 학습 데이터 세트의 이미지 크기와 Shape Ratio에 따라서 각각의 Output Feature Map당 3개의 Anchor Box, 총 9개의 서로 다른 크기와 스케일의 Anchor Box를 사용합니다. 논문에서는 COCO 데이터셋에 맞게 아래와 같이 (10×13), (16×30), (33×23), (30×61), (62×45), (59× 119), (116 × 90), (156 × 198), (373 × 326)의 Anchor Box를 사용했다고 합니다.
Output Feature Map들의 depth는 모두 동일하게 255인 것을 확인할 수 있는데 앞의 YOLOv1,2의 포스팅을 자세히 보고 왔고 COCO dataset의 총 Class 수가 80개라는 것을 인지하면 255라는 depth에 다음과 같은 predict값이 저장되어 있다는 것을 쉽게 이해할 수 있을 것입니다. 4(Bounding Box offset) + 1(객체가 있을 확률($P_o$)) + 80(COCO 데이터셋의 각 class 별 확률) = 85 x 3(Anchor box 개수) = 255
Bounding Box Prediction
YOLOv2의 경우 모델의 결과로 나온 예측 bounding box의 offset값($t_x, t_y, t_w, t_h$)을 이용해 위의 식을 통해 실제 bounding box의 center 좌표와 너비, 높이($b_x, b_y, b_w, b_h$)를 계산한 뒤 Ground truth bounding box($b_x^*, b_y^*, b_w^*, b_h^*$)와의 오차를 이용해 Localization Loss를 구해줬습니다.
반면에 YOLOv3은 b값들을 이용해 Loss를 구하지 않습니다. 대신 Groung truth bounding box 정보를 역산하여 구한 t 값($t_x^*, t_y^*, t_w^*, t_h^*$)과 예측한 bounding box의 offset값($t_x, t_y, t_w, t_h$)의 오차를 이용해 Localization Loss를 구해줍니다.
또한 이전 버전의 YOLO(v1,v2)의 경우 객체 별로 하나의 책임 bouding box(responsible bounding box)를 정하고 이 Anchor box에 대해서만 Classification Loss, Objectnes Loss, Localization Loss를 계산하고 나머지 모든 Anchor box에 대해서는 No Objectness Loss만 계산했었습니다.
※ 책임 bouding box(responsible bounding box): 각 객체의 center가 속해있는 grid cell에서 ground truth와 IoU가 가장 높은 하나의 Anchor box
YOLOv3의 경우 객체 별로 책임 bouding box(responsible bounding box)를 정하고 이에 대해서만 Classification Loss, Objectnes Loss, Localization Loss를 계산하는 것은 동일하나 Faster-RCNN 방법을 사용하여, ground truth와의 IoU가 설정한 threshold인 0.5보다는 크지만 최고는 아닌 Anchor box의 경우에는 No Objectness Loss 계산도 해주지 않으며 무시하고 0.
5보다 낮은 Anchor box에 대해서만 No Objectness Loss를 계산해줍니다.
Class Prediction
YOLOv2는 Softmax 함수를 사용하여 각 예측 bounding box 별 class를 예측했습니다. 하지만 Softmax 함수는 결과값의 합이 무조건 1이 되어야 하기 때문에 정답 class 확률이 커지면 나머지 class의 확률값은 작아질 수 밖에 없습니다. YOLOv3은 하나의 예측 bounding box 안에 복수의 객체가 존재하는 경우 하나의 class만 정답이라고 학습하는 것이 아닌 다양한 정답이 있도록 학습하기 위해서, 즉 Multi Label Classification 방법을 적용하기 위해서 Softmax 함수 대신 Sigmoid 기반의 logistic classifier를 사용하게 됩니다.(해당 객체가 cat인가요 아닌가요, person인가요 아닌가요를 판단) 따라서 실제 classification 학습시에도 binary cross-entropy loss를 사용합니다. 이런 방식은 복잡한 domain에서 Classification 문제를 해결할 경우에 도움이 되었다고 합니다.
지금까지의 내용을 종합하면 YOLOv3의 전체 Loss Function은 아래 그림과 같다는 것을 알 수 있습니다.
이전의 YOLO와 달리 Multi Label Classification을 반영하기 위해서 Objectness Loss와 Classification Loss를 계산할 때 Sum Squared Error (SSE)가 아닌 Binary Cross Entropy Loss를 사용하는 것을 확인할 수 있습니다. 위 식에서 $Mask_{ig}$는 ground truth와의 IoU가 0.5보다 낮은 Anchor box에 대해서만 no objectnes loss를 계산하기 위해 masking을 해주는 tensor입니다.(IoU가 0.5보다 큰 Anchor box에 대해서는 무시)
Feature Extractor
YOLOv3에서는 53개의 convolutional layer로 이루어져 있는 Darknet-53을 backbone network(feature extractor)로 사용합니다. Darknet-53은 YOLOv2의 Darknet-19에 ResNet에서 적용됐던 Shortcut Connections을 사용(아래의 표에서 Residual라고 적혀있는 부분)하여 성능을 향상시켰습니다.
그 결과 Darkenet-53은 아래 그림처럼 ResNet-101보다 1.5배 빠르고, ResNet-152와 비슷한 성능을 보이지만 2배 이상 빠른 성능을 보여줍니다. 또한 당시 초당 가장 높은 floating point operation 속도(BFLOPS/s)를 보여주면서, GPU를 효율적으로 사용함을 보여줬습니다.
YOLOv3 성능
YOLOv3의 성능 비교 표는 위와 같습니다. 빠른 수행 속도를 과시하듯이 좌표 축까지 뚫고 나오는 그래프가 흥미롭습니다. Detect을 성공했다고 판단하는 IoU가 0.5일 때만을 기준으로 하면 YOLOv3은 RetinaNet과 수행 성능은 비슷하고 수행 속도는 훨씬 빠른 것을 확인할 수 있습니다.(오른쪽 그림)
반면 IoU가 0.5~0.95로 설정할 경우 YOLOv3은 RetinaNet에 비해서 수행 속도는 여전히 빠르지만 수행 성능은 조금 떨어지는 것을 볼 수 있습니다.(왼쪽 그림)
YOLOv3은 빠른 수행 속도와 준수한 수행 성능으로 나온 이후에 한동안 실시간 Object Detection의 대명사로 자리 잡게 되었습니다. 하지만 이 논문의 저자는 detection 기술이 전쟁에 사용되는 것을 우려하며 v3를 마지막으로 computer vision 분야에 몸을 담지 않겠다고 선언하게 됩니다,,, 이후 YOLO는 다른 사람에 의해 이후의 버전들이 만들어지게 되지만 개발자로써 기술의 발전이 초래할 수 있는 피해를 고려하고 악용을 방지할 방법에 대해서도 함께 고안할 필요가 있다고 생각합니다.
위 성능 비교 그래프를 봤다면 유추할 수 있듯이 YOLOv3의 성능 비교 대상이었던 RetinaNet은 실시간으로 사용하기에는 애매한 수행 속도를 가졌지만 수행 성능만큼은 다른 모델들에 비해 월등히 높은 것을 확인할 수 있습니다. 다음 포스팅에서는 RetinaNet이 어떻게 수행 성능을 저렇게 높일 수 있었는지에 대해서 살펴보도록 하겠습니다.
Reference
● https://www.inflearn.com/course/딥러닝-컴퓨터비전-완벽가이드/dashboard - 인프런 강의
● https://herbwood.tistory.com/18
● https://ffighting.net/deep-learning-paper-review/object-detection/yolo-v3/
● https://csm-kr.tistory.com/11
'Perception > Object Detection' 카테고리의 다른 글
[Object Detection] EfficientDet: Scalable and Efficient Object Detection (0) | 2024.04.17 |
---|---|
[Object Detection] YOLOv2 (YOLO9000:Better, Faster, Stronger) (0) | 2024.03.29 |
[Object Detection] YOLOv1 (You Only Look Once:Unified, Real-Time Object Detection) (0) | 2024.03.19 |
[Object Detection] SSD(Single Shot Multibox Detector) (1) | 2023.07.12 |
[Object Detection] Faster R-CNN (0) | 2023.07.01 |