YOLO v2(YOLO9000: Better, Faster, Stronger) 요약
Object Detection 모델이 딥러닝에 접목되면서 정확도와 속도 모든 측면에서 꽤 많은 발전이 있었지만, 여전히 Detection 모델을 학습시키기 위한 데이터셋은 모자라고 성능도 만족스럽지 않았다.
YOLOv2는 PASCAL VOC 2007 데이터셋에서 67FPS, 76.8 mAP의 성능을 보였고, 40FPS에서는 78.6 mAP로 SOTA를 달성하였다.
또한, 이 논문에서는 Classification을 위한 데이터셋을 활용하여 Detection 모델을 학습시키는 방법을 제안하였는데, 이를 통해 ImageNet 데이터셋에서 학습된 YOLO9000 모델은 실시간으로 9000개의 클래스를 detection 할 수 있게 되었다.
논문은 제목처럼 YOLOv2의 개선점을 Better(정확도), Faster(속도), Stronger(더 많은 클래스) 관점에서 소개하였는데, 하나씩 따라가 보자.
Better: 더 나은 정확도
Batch Normalization
모든 합성곱 계층 뒤에 Batch Normalization을 추가하였다. YOLO에 단순히 Batch Normalization을 적용하기만 해도 mAP가 2% 올랐는데, batch normalization이 효과적으로 overfitting을 방지하기 때문에 regularization의 필요성이 줄어들고, dropout도 적용하지 않아도 된다.
High Resolution Classifier
기존의 SOTA Object Detector들은 대부분 ImageNet에서 학습된 사전학습 모델을 이용했다.
그런데, ImageNet을 비롯해 작은 해상도에서 사전학습된 모델들을 이용해서 고해상도 이미지에서의 detection을 학습시키려고 하니 모델이 높은 해상도에 재적응하는 과정이 필요했다.
YOLOv2에서는 detection을 학습시키기 전에 우선, ImageNet을 고해상도$(448\times 448)$에서 classification을 하도록 10 epoch 학습시키고, 그다음 본격적으로 detection을 학습시켰다.
이를 통해 거의 4%의 mAP 향상이 있었다.
Convolutional with Anchor Boxes
Faster R-CNN은 YOLO처럼 예측을 완전 연결 계층으로 수행하는 대신, 사람이 미리 정의한 anchor box들을 활용하여, 합성곱 계층을 이용하여 수행했다. 합성곱 계층만을 이용해 예측을 수행하면서 Faster R-CNN은 bounding box의 좌표$(x_\min, y_\min, x_\max, y_\max )$가 아닌 offset$(cx, cy, w, h)$을 예측하게 되었는데, 덕분에 모델이 학습하기에 문제가 더 쉬워졌다.
YOLOv2에서는 YOLO에 있었던 완전 연결 계층이 제거되었고, anchor box를 도입했다.
우리는 입력 이미지의 크기를 $416 \times 416$으로 맞춰 주었는데, 이는 우리의 feature map이 홀수인 높이와 너비를 갖게 하기 위함이다. 이를 통해 feature map의 중앙 cell이 생기게 되는데, 물체들, 특히 큰 물체들은 이미지의 중앙에 위치하는 경우가 많으므로 중앙에 4개의 cell이 있는 것보다 1개의 cell이 있는 것이 좋다.
모델은 이미지의 크기를 32로 나누어, $13 \times 13$ feature map을 만든다.
YOLO에 anchor box를 도입함으로써 예측의 개수가 크게 증가한다. 기본 YOLO는 98개의 예측 box를 만들지만, Anchor box를 도입하면 수천 개의 예측을 만들게 된다. 이로 인하여 mAP가 소폭 감소하였으나(69.5 -> 69.2), recall은 상승하였다.(81% -> 88%)
비록 정확도는 감소하였지만, recall이 크게 증가한 것은 모델에 발전 가능성이 있음을 시사한다.
Dimension Clusters
Anchor Box를 직접 정의해 주는 대신, 모델이 학습하게 하면 데이터와 Task에 더욱 적합한 box들을 얻을 수 있다. 다만, 모델이 탐색을 시작할 Anchor box를 적절히 골라주면 좋은데, 학습 데이터에서의 K-means 군집화를 통해 적절한 Anchor box들을 골라주었다.
우리는 IOU score를 기준으로 K-means를 수행하여 좋은 box들을 골랐다.
$$ d(\text{box}, \text{centroid}) = 1- IOU(\text{box}, \text{centroid})$$
우리는 여러 $k$들에 대해 군집화를 수행했는데, 이 중 평균 IOU가 높으면서도 anchor box의 수가 적절한 $k=5$를 골랐다. 이렇게 선택된 Anchor box들은 사람이 생성한 box에 비해 길고 얇은 상자가 많았다.
이런 방식으로 선정된 5개의 box들은 전체 GT box에 대해 평균 60.09의 IOU를 가진 반면, 사람이 사전 정의한 9개의 box들을 사용하면 61.0의 IOU를 보였다.
Direct Location Prediction
YOLO에 Anchor box를 적용하는 과정에서, 특히 학습 초반에서 학습이 불안해지는 문제가 있었다.
이는 모델이 박스의 $(x,y)$ 좌표를 예측하기 어려워하여 발생하였는데, anchor box는 상자의 좌표를 다음과 같이 예측한다.
$$ x=(t_x * w_a) -x_a\\
y=(t_y * h_a) -y_a $$
예를 들어 $t_x=1$일 때, 상자는 anchor box의 오른쪽으로 박스 하나만큼 이동하 좌표를 갖는다. $t_x, t_y$의 변화에 따라 상자는 해당 anchor 주변이 아니라 이미지 어디에든 위치할 수 있기 때문에, 랜덤 하게 초기화된 상태에서 학습이 불안정하게 된다.
이런 문제를 극복하기 위해 YOLOv2는 각 grid cell에 상대적인 위치를 예측한다. 우리는 로지스틱 활성화 함수를 이용해 좌표가 0~1의 값을 갖도록 제한한다. 위 이미지의 식에서 bounding box 예측 $(t_x, t_y)$에 시그모이드 함수$(\sigma)$를 적용하여 범위를 제한함으로써, 모델이 안정적인 학습을 진행토록 하였다.
Dimension Clustering과 Direct Location Prediction을 통해 recall이 약 5% 향상되었다.
Fine-Grained Features
YOLOv2는 $13\times 13$ feature map으로 예측을 수행한다. 이는 큰 물체들을 탐지하기에는 충분하지만, 작은 물체들을 탐지하려면 더 미세한(fine) feature map이 더 좋을 수도 있다.
Faster R-CNN이나 SSD는 다양한 크기의 객체를 탐지하기 위해 여러 feature map을 사용하였지만, YOLOv2는 그 대신 초반의 $26 \times 26$ 레이어로부터 feature를 가져오는 passthrough layer를 사용하였다.
passthrough layer는 인접한 feature들을 채널 단위로 쌓음으로써 공간 정보를 유지하면서 고해상도 feature map과 저해상도 feature map을 합친다. 이는 ResNet의 identity mapping과 비슷하다.
$26\times 26\times 512$ 크기의 feature map은 이 과정을 통해 $13 \times 13\times 2048$ 크기로 변환되어, $13\times 13$ 크기의 feature map과 합쳐진다. 이런 과정을 통해 모델은 1%의 성능 향상을 이뤘다.
Multi-Scale Training
YOLOv2는 anchor box를 적용하기 위해 $416 \times 416$ 크기의 입력 이미지를 사용하였지만, 모델 전체가 합성곱 계층과 풀링 계층으로 이루어져 있기 때문에 입력 해상도를 조절할 수 있다.
YOLOv2가 다양한 크기의 이미지에 대해서 강건해지도록, 매 10 batch iteration마다 모델이 랜덤하게 선택된 크기의 이미지를 입력으로 받도록 하였다. 모델이 입력 사이즈를 32로 나누기 때문에, 입력 이미지의 크기가 ${320, 352, \dots , 608}$의 범위를 갖도록 하였다.
이를 통해 모델이 다양한 크기의 입력을 받을 수 있게 되었고, 입력 크기를 조정하여 속도와 정확도 tradeoff를 쉽게 조절할 수 있게 하였다.
가장 낮은 해상도의 $288 \times 288$ YOLOv2는 90FPS에 Fast R-CNN과 비슷한 mAP를 내는 가벼우면서도 정확한 성능을 내었고, 가장 높은 해상도의 YOLOv2는 VOC 2007에서 78.6 mAP를 달성하여 SOTA급의 성능을 보이면서도, 실시간 detection을 수행할 수 있는 속도를 내었다.
Further Experiments
논문에서는 당시 SOTA 경쟁자였던 SSD, Faster R-CNN과 PASCAL VOC 데이터셋에서 비교를 진행하였고, 아래 표와 같은 결과를 얻었다.
Faster: 더 빠른 속도
Detection 모델은 로보틱스나 자율주행차 등에 응용되기 위하여 정확하면서도 빠른 성능을 내어야 한다.
대부분의 Detection 모델이 사용하는 VGG-16 backbone 모델은 강력하지만, 필요 이상으로 복잡하다.
VGG-16은 $224 \times 224$ 이미지 한 장을 순전파하는데 약 306억 번의 플로팅 포인트 연산을 수행한다.
한편, YOLO는 Googlenet 구조 기반의 커스텀 모델을 사용하여, 약 85억 번의 연산만을 통해 VGG-16보다 정확도가 조금 떨어지지만 빠른 성능을 내었다. (YOLO의 커스텀 모델은 ImageNet에서 88%의 top-5 정확도를 낸 반면, VGG-16은 90%)
Darknet-19
YOLOv2에서는 일반적으로 backbone으로 사용되는 VGG가 아닌, Darknet이라는 독자적인 backbone network를 사용한다. 이 모델은 VGG와 비슷하게 대부분 $3\times 3$ 합성곱으로 구성되어 있으며, 매 pooling 단계마다 채널을 두 배로 늘린다.
Darknet은 global average pooling과 $1\times 1$ 합성곱 등을 통해 feature를 압축하고, batch normalization을 사용하여 안정적인 학습을 지원한다.
Darknet-19는 19개의 합성곱 계층과 5개의 max pooling 계층으로 구성된다. Darknet-19는 약 56억 번의 연산만을 수행하면서도 ImageNet에서 72.9%의 top-1 정확도와 91.2%의 top-5 정확도를 낼 수 있다.
Training for classification
우리는 먼저 신경망을 ImageNet 1000 class 분류 데이터셋에서 160 epoch 학습시킨다. (SGD, lr=0.1, polynomial rate decay with power of 4, weight decay=0.0005, momentum=0.9) 이 과정에서 랜덤 크롭, 회전, 색조, 채도, 노출 변환 등 일반적인 데이터 증식 기법을 적용한다.
위에서 언급한 것처럼, $224 \times 224$ 크기의 이미지로 첫 학습을 진행하고, 더 큰 사이즈의 이미지(448)에서도 작동하도록 모델을 파인튜닝한다. 파인튜닝은 위와 같은 조건에서 10 epoch, lr=0.001로 진행된다.
Training for detection
이제 학습된 신경망을 detection을 위한 신경망으로 변환한다. 마지막 합성곱 계층을 제거하고, 세 개의 1024개의 출력 채널을 갖는 $3 \times 3$ 합성곱 계층으로 대체한다. 그리고 마지막 $1\times 1$ 합성곱을 진행하여 detection에 필요한 출력을 만들도록 한다.
VOC 데이터셋에서, 우리는 5개의 좌표값들을 갖는 5개의 박스를 20개의 클래스(background를 포함하면 21개)에 대해 만드므로, $(20+1) \times 5 + 5 = 125$개의 출력 채널을 갖는다.
마지막으로 마지막 $3\times 3\times 512$ 계층에서 마지막 계층으로 전달되는 passthrough 계층도 만든다.
이제 신경망을 lr=0.001로 160 epoch 학습시키며, 10,60,90 에포크마다 lr을 10씩 나눈다.
(weight decay=0.0005, momentum=0.9, YOLO/SSD와 비슷한 데이터 증식)
Stronger: 더욱 많은 클래스
YOLO9000 논문에서는 classification과 detection 데이터를 함께 사용하는 학습 방법을 제안한다.
detection dataset의 label을 classification과 더불어 detection-specific 한 정보(bounding box 좌표, object의 존재 여부 등)들을 학습하는 데 사용하고, classification 데이터셋에의 label에서는 class를 예측하는데 필요한 정보들을 학습한다.
학습 과정에서 detection 데이터셋과 classification 데이터셋을 섞어 사용하는데, detection 이미지를 학습할 때는 기본 YOLOv2의 loss function을 사용하고, classification 이미지를 학습할 때는 classification과 관련된 부분의 loss만 역전파한다.
이런 접근에는 풀어야 할 문제가 몇 개 있는데, detection 데이터셋은 객체들의 일반적인 라벨들을 주로 가지고 있다. 예를 들어, "강아지"는 있으나 "요크셔테리어", "불독" 등은 없는 식이다. 한편, classification 데이터셋은 이런 상세한 label을 가지고 있다.
이렇게 다른 두 데이터셋을 함께 사용하려면, 두 데이터셋의 label들을 합칠 수 있는 좋은 방법이 필요하다.
일반적으로 classification 모델은 softmax 함수를 모든 클래스에 대해 적용한다. 이는 각 클래스가 상호 배타적(e.g. 강아지와 고양이)이라고 가정한다. 그런데 이런 방법을 통해서는 두 데이터셋을 합칠 수 없다. 예를 들어, ImageNet 데이터셋의 "요크셔테리어"와 COCO 데이터셋의 "강아지"는 상호 배타적이지 않기 때문이다.
우리는 대신 각 class가 상호 배타적이라 가정하지 않는 멀티-라벨 모델을 사용해 두 데이터셋을 합친다.
Hierarchical classification
ImageNet 데이터셋의 라벨은 WordNet이라는 언어 데이터베이스에서 추출되었다. WordNet에서, "노퍽 테리어"와 "요크셔테리어"는 하위어인 "테리어"의 하위어이다. "테리어"는 "사냥개"의 하위어이며, "사냥개"는 다시 "개"의 하위어이다.
WordNet은 유향 그래프 형태로 되어있는데, 이는 언어가 굉장히 복잡한 구조를 만들기 때문이다. 우리는 ImageNet을 위해 이를 단순한 트리 형태로 단순화했다.
우리는 ImageNet의 라벨들을 담는 트리를 만들기 위한 루트 노드로 "physical object"를 사용하고, 각 클래스로 이어지는 간선들을 가지치기하였다. 만약 어떤 클래스에서 루트 노드로 향하는 간선이 여러 개라면, 가장 짧은 경로를 갖는 간선 하나를 취하였다.
최종적으로 우리는 클래스의 계층적 구조를 나타낼 수 있는 WordTree를 얻었다.
모델은 WordTree의 각 노드에 대한 확률을 예측하는데, 하위 노드들의 확률의 합은 상위 노드의 확률이 된다.
예를 들어, "강아지"의 자식노드가 "요크셔테리어", "노퍽 테리어"라면, 이미지가 "강아지"일 확률은 "요크셔테리어"와 "노퍽 테리어"의 확률의 합이다.
ImageNet의 1000개 클래스에 대하여 만들어진 WordTree는 1369개의 노드를 가졌다.
Dataset combination with WordTree
우리는 이렇게 생성된 WordTree의 각 노드에 클래스를 매핑하여 각기 다른 데이터셋을 합칠 수 있었다.
WordTree를 적용하여 우리는 전체 클래스에 대한 Softmax를 적용하는 대신, 상위어가 같은 클래스끼리 묶어 softmax를 수행하였다.
Joint classification and detection
이렇게 detection 데이터와 classification 데이터를 합쳐서 학습할 수 있게 되었다.
우리는 이 방법으로 ImageNet 9000 클래스 데이터와 COCO 데이터를 합쳐 엄청난 크기의 데이터로 모델을 학습시키고 평가하여야 했는데, 이 데이터 조합으로 생성된 WordTree는 9418개의 노드를 가졌다. ImageNet 데이터가 COCO에 비해 훨씬 컸기 때문에, 우리는 COCO를 오버샘플링하여 비율을 4:1로 맞추었다.
YOLO9000에서, 우리는 출력 크기를 제한하기 위해 YOLOv2의 anchor box를 5개에서 3개로 줄였다. 모델이 detection 이미지를 학습할 때는 loss를 일반적으로 역전파하고, classification을 학습할 때는 해당 label의 상위어에 해당하는 부분만 loss를 역전파하였다. 예를 들어, 만약 라벨이 "개"라면, 물체가 "요크셔테리어"인지 "져먼 셰퍼드"인지는 정보가 없기 때문에 하위어에 대해서는 에러를 계산하지 않았다.
이 같은 Joint training 방식을 통해 YOLO는 detection 데이터셋인 COCO에 포함되지 않은 더 많은 클래스의 객체들을 분류할 수 있었다.
결론
이 논문에서는 SOTA급 퍼포먼스의 실시간 detector인 YOLOv2와 분류 데이터셋과의 joint training을 통해 9000개의 클래스를 분류할 수 있는 YOLO9000을 소개했다.
YOLOv2를 위해 기존의 다양한 시도들과 더불어 새로운 방법들(K-means를 통한 Anchor box 추출 등)을 적용한 것이 인상 깊었고, YOLO9000을 위한 Joint Training이 매우 창의적이라는 생각이 들었다.
연구자를 목표로 하며 점점 문제 정의의 중요성을 깨닫고 있는데, 9천 개나 되는 클래스를 분류도 아니고 detection 하는 상상조차 어려운 문제를 정의하고, 풀어내기까지 한 것이 대단하다.
Reference
- YOLO9000: Better, Faster, Stronger - Redmon et al.
- YOLO v2 논문(YOLO9000:Better, Faster, Stronger) 리뷰 - herbwood님 tistory
'Deep Learning > 공부 노트' 카테고리의 다른 글
M2Det: SSD based on Multi-Level FPN 요약 (0) | 2023.02.02 |
---|---|
FPN (Feature Pyramid Network) 요약 (1) | 2023.02.01 |
FPPI, LAMR, MR: Object Detection을 위한 지표들 (0) | 2023.01.26 |
R-FCN: Object Detection via Region-based Fully Convolutional Networks 요약 (0) | 2023.01.20 |
SSD: Single Shot MultiBox Detector 요약 (0) | 2023.01.11 |
댓글
이 글 공유하기
다른 글
-
M2Det: SSD based on Multi-Level FPN 요약
M2Det: SSD based on Multi-Level FPN 요약
2023.02.02 -
FPN (Feature Pyramid Network) 요약
FPN (Feature Pyramid Network) 요약
2023.02.01 -
FPPI, LAMR, MR: Object Detection을 위한 지표들
FPPI, LAMR, MR: Object Detection을 위한 지표들
2023.01.26 -
R-FCN: Object Detection via Region-based Fully Convolutional Networks 요약
R-FCN: Object Detection via Region-based Fully Convolutional Networks 요약
2023.01.20