본문 바로가기
인공지능 개발하기/기술 & 논문 리뷰

[논문 리뷰] YOLOv2(YOLO9000:Better, Faster, Stronger)

by 선의공 2024. 5. 19.

 

논문: https://arxiv.org/pdf/1612.08242
 
이번 포스팅에서는 YOLOv2 논문에 대한 리뷰를 하겠습니다.
부제로서는 YOLO9000, Better,Faster, Stronger를 썼는데
YOLOv1보다 나아진 점, 빨라진 점, 강해진 점을 강조하고 있습니다.
 
 
해당 글을 참고했습니다
https://herbwood.tistory.com/17

YOLO v2 논문(YOLO9000:Better, Faster, Stronger) 리뷰

이번 포스팅에서는 YOLO v2 논문(YOLO9000:Better, Faster, Stronger)을 읽고 리뷰해도록 하겠습니다. 입력 이미지의 크기가 300x300인 SSD300 모델은 detection 속도가 빠르지만 정확도가 낮으며, SSD512 모델은 정

herbwood.tistory.com

https://kikaben.com/yolo-v2-yolo9000/

KiKaBeN - YOLO v2: Better, Faster, Stronger

YOLO v2 became better and faster than Faster R-CNN and SSD

kikaben.com

 

 


 
 

1. Better 

 
논문에서는 Better 파트에서 정확도를 올린 방식에 대해서 설명하고 있습니다.
YOLOv1에 아래의 표를 보면 기술을 추가하면서 mAP를 올렸다고 설명합니다.   
 

 
논문의 저자는 과거의 여러 아이디어를 모아서 YOLO에 결합하며 실험을 진행했다고 합니다.

 
각 아이디어를 살펴보겠습니다.
 
 

1-1. Batch Noramlization(배치 정규화)

 
모든 ConvLayer에 Batch Normalizaion을 추가했습니다.
Batch Normalization은 학습하는 과정 자체를 전체적으로 안정화하는 역할을 합니다.
Drop Out과 마찬가지로 과적합 방지에 많이 사용합니다.
CNN기준으로 1개의 sample이 각 이미지라고 하면
Mini-Batch 자체는 N개의 이미지를 잡습니다.
이 Mini-Batch 만큼의 이미지를 정규화 합니다.

이미지출처: https://theaisummer.com/normalization/

 
아래와 같이 activation 함수를 거쳐 치우친 데이터를
같은 범위로 가져온 후 다음 레이어의 입력데이터로 넣어주게 됩니다.

이미지출처 :https://e2eml.school/batch_normalization

 
논문에서는 Batch Norm을 사용하므로서
mAP는 2% 향상
과적합 방지
드롭아웃 제거
의 이점이 있다고 설명합니다.
 
 

1-2. High Resolution Classifier(고해상도 분류기)

 
YOLOv1에서는 224x224의 ImageNet 이미지로 pre-train 시켰고,
이후 448x448로 높여 detection task를 진행했습니다.
이 때의 문제는 실제 detection task모델이 학습된 스케일과 다른 새로운 해상도의 이미지에 적응해야합니다.
해상도가 두 배 증가하므로 224에서의 학습시 보지못했던 패턴이나 객체의 세부적인 부분을 잘 감지하지 못할 가능성이 있습니다.
또한 효율도 좋지 못한 문제가 있습니다.

 
그래서 YOLOv2에서는 224x224 학습 이미지 자체를 pre-train 시키고 나서
448x448 ImageNet이미지를 10에포 fine-tunnig 해줬습니다.
이 후 동일하게 detection task모델을 훈련시켰습니다.
이 과정을 적용하므로서 mAP가 약 4% 향상되었습니다.
 
 

1-3. Convolutional with Anchor boxes(앵커박스를 이용한 컨벌루션)

 
YOLOv2는 Faster R-CNN과 유사한 Anchor box 개념을 도입하며 recall(예측된 실제 객체의 비율)을 높여
더 많은 객체를 감지할 수 있었습니다.
 
기존 YOLOv1의 문제를 먼저 살펴보겠습니다.
YOLOv1은 grid cell당 2개의 Bounding Box만 예측했습니다.
grid cell이 7x7이였고 따라서 바운딩박스는 98(=7x7x2)개가 생겼습니다.
이는 바운딩박스를 많이 생성해서 객체 탐지했던 Faster R-CNN, SSD 모델에 비해 mAP가 많이 떨어졌습니다. 

 
 또한 7x7이라는 grid cell을 이용한 해상도는 작은 물체를 잘 인지하지 못했고,
Fully connected Layer를 사용했기에 grid cell 자체의 수를 늘리면 연산량이 늘어나서 훈련 시간이 길어지는 문제가 있었습니다.

 
YOLOv1의 또 다른 문제는 grid cell 위치 별로 클래스의 확률을 예측하면서 
하나의 grid cell 안에 하나의 클래스만 예측할 수 있었습니다.
즉, 아래의 그림에서 버스와 사람 중 확률이 더 큰 객체만 탐지 할 수 있었습니다. 

 

 
 
 
 
YOLOv2에서는 448x448 크기의 이미지를 입력이미지를 416x416으로 줄여 
13x13크기의 feature maps를 생성해주었습니다.
이는 최종 output feature map의 크기가 홀수(13)가 되도록해서 feature map 내에 하나의 중심 cell이 존재할 수 있도록 하기 위함입니다.
보통 객체의 크기가 크면 이미지 내의 중심을 차지하기 때문에 하나의 중심 cell이 있으면 
이를 잘 포착할 수 있습니다.
 
또한 FCL로 구성된 레이어들을 Conv레이어로 대체했습니다.
이는 커널 크기가 작고 입력 해상도에 관계없이 고정되어 있어 연산 수가 증가하는 문제를 해결합니다.
이를 통해 grid cell당 많은 anchor box를 생성할 수 있습니다.
Anchor box는 bounding box를 예측할 수 있습니다. 이에 대한 방법론적인 설명은 아래서 진행하겠습니다.
 
Anchor box를 도입하며
bounding box 예측 총 수가 크게 증가하였습니다.
또한 모델은 엥커 박스당 다수의 객체성과 클래스 확률을 예측합니다.
recall이 81% -> 88%로 증가했습니다.
 
그러나 mAP는 69.5에서 69.2로 떨어졌습니다.
그렇다면 엥커박스를 왜 사용할까요?
recall이 증가했기 때문입니다.
recall은 전체 예측 결과 중 실제 맞춘 값을 나타냅니다. 
이는 모델이 개선할 여지가 더 많다는 것을 의미한다고 저자는 설명합니다.
 
 
 

1-4. Dimension Clusters(차원 클러스터)

 
기존 Anchor box는 크기와 aspect ratio를 미리 정의했습니다.
이렇게 하면 합리적인 사전 설정으로 시작이 가능하지만 좋은 값을 직접 선택하는 것은 어렵습니다.
그래서 YOLOv2에서는 차원 클러스터 방식를 사용해주었습니다.
무작위로 생성된 k-boungind box과 실제 데이터셋의 ground truth box의 width, height 값을
사용해서 k-means clustering을 수행합니다.
 
일반적인 k-means clustering은 두 중심 점 사이의 직선 거리를 측정하는 유클리디안 거리(Euclidean distance)를
사용하지만 이 방식은 bounding box가 클수록 큰 error가 발생됩니다.

그래서 IOU를 사용해서 새로운 k-means clustering distance metric을 사용합니다. 
위의 제안된 수식에서 보면 box와 centroid의 IoU값이 클수록 겹치는 영역이 크기 때문에 거리가 가깝다고 판단할 수 있습니다.
 

 
저자는 centroid k의 수를 늘리면 결과가 더 좋아지게 된다고 합니다.
k(anchor box의 개수)를 10을 줬을 때가 5를 줬을때 보다 clustering이 더 잘 된다고 합니다.
다만, 상자가 많아지면 과적합이 발생할 수 있고 
위의 그래프와 같이 k가 증가한다고 IoU가 선형적으로 증가하지 않았습니다.
clusters를 5를 줬을때 recall과 복잡도 사이의 trade-off 균형을 잘 맞춰, 일반적으로 anchor box를 5를 사용했다고 합니다.
 
 
 
 

1-5. Direct location prediction
 

 

YOLO에서 Anchor box를 적용하면 bounding box regressor 계수를 통해
위의 공식으로 bounding box의 위치를 조절해 나갑니다.
수식의 xa와 ya는 엥커박스의 중심이고
wa와 ha는 각각 엥커박스의 너비와 높이를 나타냅니다.
tx만큼 엥커 박스에서 좌우로 이동하고
ty만큼 엥커 박스에서 상하로 이동합니다. 
 
이 방식은 x와 y가 grid cell 내부,외부 어디에나 있을 수 있으며
t의 범위가 없이 무한한 값이므로 anchor box가 어디에서나 생성될 수 있습니다.
 
이런 이유때문에 훈련 초기에 YOLO에서 잘 작동되지 않았고 
무작위로 초기화된 가중치에서 안정된 예측값을 찾기까지
시간이 오래 걸렸다고 합니다.
 

 

그래서 grid cell에 상대적인 위치 좌표를 예측하는 방식의 위의 수식을 사용해서 anchor box로부터
bounding box를 예측합니다.
 
Cx, Cy는 그리드 셀의 중심 좌표를 나타냅니다.
Pw,Ph는 엥커 박스의 폭과 높이를 나타냅니다. 해당 엥커박스는 위의 k-means clustering을 통해 생성됩니다.
bx,xy, bw, bh는 예측된 bounding box 중심좌표와 크기입니다.
tx,ty,tw,th는 엥커박스를 조정하기 위한 값들입니다. tx,ty는 엥커박스 위치, tw,th는 엥커박스 크기를 조정합니다.
t값들에 시그모이드를 줘서 0~1 사이의 값으로 제한합니다.
 
bx,by는 셀 중심에서 상대적인 변화값을 나타내며
bw,bh는 엥커박스의 크기에 지수함수를 적용한(0~양의 무한대 사이 범위 제한) tw,th를 곱하여 조정합니다.
 
Direct location prediction를 사용해 
모델의 학습을 안정적으로 만들었으며
Dimension Clusters와 같이 사용하므로서
mAP를 약5% 향상시켰다고 합니다.
 
 
 
 

1-6. Fine-Grained Features

YOLOv2는 최종적으로 13x13 feature map을 출력합니다.
이 feature map의 크기가 작은 경우 큰 객체를 예측하기는 용이하지만
작은 객체는 예측하기 어렵습니다.

때문에 작은 객체와 큰 객체를 모두 잘 예측하도록
중간에 conv를 덜 거친 26x26x512 feature map을 13x13x2048로 전환해 가지고 있다가
conv레이어를 모두 거친 13x13x1024 feature map과 결합(concat)해줍니다.
최종적으로 13x13x3037의 feature map을 얻습니다.

 
추가로 최종적인 feature map은 125의 channel을 갖습니다.
grid cell마다 5개의 bounding box개의 정보가 있으며,
각 bounding box에는 20개의 class score + confidence, x, y, w, h 정보가 있기 때문입니다.
(=25(bounding box 정보 개수) * 5(bounding box 개수) = 125) 
Fine-Grained Features 방식을 적용하므로서 1%의 성능 향상을 가져왔습니다.
 
 
 

1-7. Multi-Scale Training

 
저자는 다양한 해상도의 이미지로 YOLOv2를 훈련했다고 합니다.
배치 10개마다 무작위의 해상도 이미지를 선택해 학습했습니다.
모델은 이미지를 1/32배로 dowmsample (1-3의 내용 중 416 -> 13 변경) 하기 때문에 
입력 이미지 크기는 32배수 ({320, 352,..., 608}) 을 사용했습니다.
아래의 표는 논문에서 Pascal VOC 2007을 사용한 테스트 결과입니다.

 
 
차트 버전도 보여주고 있습니다

 
 
 


 

2. Faster 

 
YOLOv1은 특징 추출기의 Cov 네트워크에 GoogleNet 기반의 커스텀모델을 사용했습니다.
YOLOv2는 모델의 속도를 더 높이기 위해 다음 모델을 사용했다고 합니다.
 
 
 

2-1 . Darknet-19

 

 
해당 네트워크는 VGG 모델과 유사하게 필터를 두배로 늘리기 위해 3x3 컨볼루션을 반복하고
feature map 해상도를 downsample하기 위해 Maxpool을 반복합니다.
또, 채널 크기를 압축하기 위해 1x1 컨볼루션도 사용합니다.
각 Conv는 훈련의 안정화 하기위해 위에서 설명한 Batch Normalization을 사용합니다.
 
마지막에는 global average pooling을 사용해서 fc layer를 제거해서
파라미터 수를 감소시키고 detection 속도를 향상시켰습니다.
 
 
 

2-2 . Training for classificaion

 
해당 모델은 classification을 위해서 1000개의 class를 가진 224x224 해상도의 ImageNet 데이터셋을 이용해 학습합니다.
 
적용한 하이퍼 파라미터 세팅입니다.

 
55억 8천만번의 연산으로 top-1정확도 76.5%, top-5 정확도 93.3 성능을 보였다고 합니다.
(비교를 위해 살펴보자면 Faster R-CNN이 특징 추출에 사용한 VGG-16은 306억 9천만의 연산, top-5 정확도는 88이었다고 합니다)
 
 
 

2-2 . Training for detection

 
객체 탐지를 위해서는 Darknet-19의 마지막 conv layer를 제거하고 3x3x1024 conv layer로 대체하였고
그 다음 1x1 conv layer를 추가합니다. conv layer에서의 channel수는 
각 cell의 bounding box 개수(5) * bounding box data(25)  = 125입니다.
 
아래의 그림에서 노란색 layer가 변경된 레이어입니다.

 
 
또한 고해상도 feature map를 수용하기 위해 pass through layer를 추가했다고 합니다.

 
적용한 하이퍼파라미터 세팅입니다.

 
 
 


 

3. Stronger 

Pascal VOC와 MS COCO 데이터셋이 제공하는 것보다
훨씬 더 많은 클래스를 감지하기 위해 Stronger에 해당하는 YOLO9000 이라는 모델을 제안했습니다.
 
classification에 데이터셋과 detection에 데이터셋을 섞어 학습시킨다면 더 많은 클래스를 감지할 수 있겠지만 detection 데이터셋에는 범용적인 객체정보, classification에는 세부적인 객체정보가 담겨있다면 잘못된 예측이 됩니다.
 
예를들어 Classification 데이터셋에는 여러 개 품종이 있고 
detection 데이터셋에는 개라는 큰 범주가 있다면
이미지에서 '요크셔테리어'를 분류하려고 하는데
범주의 차이로 더 큰 범주의 '개'라고 분류되면 잘못된 예측이 됩니다.
 
 

3.1 classification with WordTree

 
논문에서는 이런 문제를 해결하기 위해 계층적인 트리(Hierarchical tree)인 Word Tree 구성 방식을 제안합니다.
WordTree는 각 노드는 범주를 의미하고 
해당 노드의 하위 범주는 자식 노드가 되는 구조입니다.

 

 
 
 

3.2 WordTree 1k

 
접근 방식을 검증하기 위해 저자는 ImageNet의 1000개 클래스를 사용해서 구축된 
WordTree로 Darknet-19를 훈련했습니다.
Tree구조에 ImageNet을 적용하면 1000개의 하위 노드, 369개의 최상위 노드가 생겨
1369개의 범주가 존재하게 됩니다.
구조적으로 상위 범주와 하위 범주에 대한 분류를 해야하므로
1369개의 범주에 한번에 softmax를 적용할 수 없습니다.
이미지가 "포유류", "개", "요크셔테리어" 일 수도 있기 때문입니다.
따라서 각 수준에서 소프트맥스 연산을 수행한다고 합니다.
각 수준의 소프트맥스 후 가장 높은 노드의 하위 노드로 이동해서 반복하게 됩니다.

 
 

 

3.3 Dataset Combination with WordTree

 
저자는 COCO 데이터셋과 ImageNet을 통합해서 WordTree를 만들었습니다.
해당 WordTree에는 9418개의 클래스가 있습니다.
여기서 ImageNet과 COCO 데이터셋의 비율은 4:1로 맞춰준다고 합니다.
 

 

 

 
3.4 Joint Classification and Detection
 

YOLO9000은 아키텍쳐 출력 수를 제한하기 위해 grid cell당 3개의 엥커박스를 사용합니다.
 
네트워크가 detection 데이터셋을 처리할때
detection loss는 기존 YOLOv2모델과 동일하게 역전파 시키며, classification loss의 경우
특정 범주와 상위 범주에 대해서만 loss를 계산합니다.
예를들어 '개'라는 범주에 대한 detection loss 계산은 상위범주와 특정범주인
"동물", "포유류", "개" 까지만 진행합니다.
 
네트워크가 classification 데이터셋을 처리할때
classification loss에 대해서만 ground truth box와의 IoU값이 0.3 이상인 경우 역전파 수행합니다.