앎을 경계하기

Machine Learning/For CV

[YOLO 정독] YOLO v2 (YOLO 9000)

양갱맨 2021. 6. 14. 09:26

YOLO v1에 이어 v2에 대한 정리글을 쓴다.

YOLO v2 논문 구조가 매우 신박하다.

intro, conclusion 사이에 Main Idea에 대해 Better, Faster, Stronger로 나눠서 설명한다. (보통 intro, related work, method, experiment, conclusion 순)

오히려 좋아

 

지난 v1과 비교했을 때 달라지는 부분들이 몇 개 있기 때문에 이러한 부분들에 집중해서 포스팅을 해야겠다.


먼저 달라진 점은 v1에서는 20개의 카테고리를 대상으로 Object Detection을 진행하였다.

하지만 객체검출이라하면.. 일반적으로 매우 많은 사물에 대해서도 잘 동작해야한다.

예를 들어, 나무, 사람은 검출하면서 컵은 검출못한다면..? 검출할 수 있는 객체 집합이 매우 한정되어 있다는 것이다.

그래서 v2에서는 검출 카테고리 수를 확 늘려(무려 9000개 ㄷㄷ) 다양한 객체에 대해 잘 작동하는 YOLO를 만들고자 함.

보통 detection 데이터셋은 수천, 수십만 장의 이미지에 수십, 수백개의 태그로 구성되고 classification 데이터셋은 수백만 장 이미지에 수만, 수십만 개의 카테고리로 구성된다.

detection 데이터셋을 classification용 데이터셋의 규모 수준으로 확장시키기엔 detection 데이터셋을 만드는 라벨링 작업이 classification 데이터셋 만들기보다 더 많은 작업이 필요하기 때문에 시간, 비용적으로 매우 소모가 크다.
왜냐면 classification 데이터는 단순히 이미지 저장해서 폴더별로 또는 파일 이름을 클래스 분류용으로 바꿔주면 되지만 detection용은 직접 각 객체에 대해 바운딩박스 위치와 크기 잡아주고 클래스 정보도 남겨줘야하는 작업이 필요하기 때문이다.
YOLOv2 저자들은 object detection 데이터셋을 당장 scale up 할 수 없으니 기존의 classification 데이터셋을 활용해서 detection 시스템을 확장시키겠다고 함.

뭐.. 아무튼 이번 v2의 목표는 9000개의 카테고리에 대해서 실시간으로 객체 검출을 할 수 있는 YOLO로 확장시키는 것이다.


Better

R-CNN 계열은 box regression과 classification을 따로 하는 two-stage detector이고, YOLO는 그걸 CNN으로 한 번에 해버리자 하는 one-stage detector 이다.

YOLO가 Fast R-CNN에 비교했을 때, localization errors가 상당하다(바운딩박스 예측이 좋지 못하다는 뜻).
게다가 상대적으로 region proposal 기반의 방법들보다 recall이 낮다.

recall은 TP/TP+FN = 정답이라고 예측한 것들 중에서 진짜 정답의 비율이다.

YOLO가 R-CNN 모델에 비해 localization error가 높고 recall이 떨어진다는 것은 즉, 이미지에 있는 객체에 대한 경계 예측을 잘 못하고 객체에 대한 클래스 판단을 잘 못했다는 뜻인데.. (한마디로 성능 안좋다는거네..ㅠ)

v2에서는 이 localization error와 low recall 개선에 집중하겠다고 한다. 그리고 빠르기와 정확도를 함께 유지하기 위해서 무작정 모델을 크게 만들거나 여러개의 모델 앙상블을 하지 않고 좀 학습이 쉬운 형태로 표현하기 위해 여러가지 시도를 한다.

1. Batch Normalization

- 배치 정규화는 과적합 방지를 위해 사용하는 여러 형태의 regularization 기법을 넣을 필요성을 없애면서 수렴을 크게 개선시킨다.

- 모든 conv layer 다음에 BN을 추가했을 때 mAP가 2% 개선되었음을 확인하였다.

- BN 넣으니까 과적합 방지 효과가 있어서 dropout 없애도 됐음.

2. High Resolution Classifier

- v1에서는 224x224로 classifier를 학습시키고 detection을 위해서 448로 해상도를 높인다. 이 말은 분류기 학습 후 detection 전환과 해상도 조정이 동시에 이루어져야 한다는 것.

- v2에서는 ImageNet에서 10 epochs 동안 해상도 448에서 분류 네트워크를 fine tune시킨다. 이 과정이 고해상도 입력에서 잘 작동하도록 필터를 조정할 수 있는 시간을 준다고 함. 고해상도 분류 네트워크를 사용해서 mAP 4%가 상승했다.

3. Convolutional With Anchor Boxes

  • YOLO와 R-CNN의 큰 차이점 중 하나가 앵커박스를 쓰냐 안쓰냐였는데, v2에서는 앵커박스를 쓴다.
  • Faster R-CNN에서는 앵커박스의 위치(offsets)과 confidences 값을 예측하는 RPN을 사용한다. RPN은 Convolutional하기 때문에 feature map에서 모든 위치의 offsets을 예측한다. 직접적인 좌표 예측 대신 offset 정보를 예측하는 것이 문제를 쉽게 만들고 네트워크가 학습하는 것을 더 쉽게 만들어준다.
    사전에 정의한 anchor box로부터 객체 바운딩박스 예측을 위한 offset을 예측하는 것이 기존 v1에서 단순 바운딩 박스 위치를 예측하는 것보다 더 쉽게 네트워크가 학습할 수 있게 되는 것이다.
  • 그래서 박스 위치 예측을 위해 anchor boxes를 도입하고 FC layer들을 없애버린다.
  • 첫 번째로 하나의 Pooling layer를 제거한다.
  • 두 번째로 input을 448 대신 416으로 변경한다.
    왜냐하면, 최종 feature map을 홀수 크기로 만들기 위해서이다. 굳이 홀수로 만들고자 하는 이유는 큰 물체 같은 건 주로 이미지 중앙에 위치하는 경우가 많아서 이미지 중앙에 하나의 셀이 딱 생기게끔 하기 위함이다.
  • 세 번째는 앵커 박스를 움직이는 과정에서 모든 앵커박스에 대해서 objectness와 class를 예측하는 것 대신에 classification 과정을 따로 분리시킨다.

앵커 박스 도입으로 정확도는 약간 낮아졌다.

하지만, v1에서 각 셀당 2개의 bounding box를 예측하여 7*7*2 = 98개의 바운딩박스를 생성하던 방식에서 anchor box를 사용하니 천 개 이상의 예측이 가능해졌다.
앵커박스 사용 전에는 69.5 mAP, recall 81%였는데, 사용 후 69.2 mAP, recall 88%가 되었다. 0.3 mAP 감소에 비해 recall이 7%가 올랐으니 앵커박스를 적용하는게 더 낫다고 봄.

4. Dimension Clusters

그런데 YOLO에서 앵커박스를 사용하려고하면 2가지 문제가 생긴다.

첫번째는 faster R-CNN에서 처럼 단순히 anchor box 정보를 직접 설정해서 적용하는 것보다 네트워크를 사용해서 앵커박스의 첫 시작을 설정하는 것이 더 좋을 것이라고 판단함.
그래서 사람이 직접 설정하지 않고 k-means clustering을 써서 시작부터 좋은 위치점을 주자!라는 것이다.
k-means를 간단히 설명하자면, 데이터끼리의 유클리디안 거리를 측정해서 가까운 k개씩 데이터를 묶는 클러스터링 모델이다.
YOLO에서 anchor box 정보를 결정하기 위해 k-means clustering을 쓸 때, 유클리디안 거리를 사용하게 되면 작은 박스보다 큰 박스에서 더 오차가 크게 발생한다. (큰 GT와 큰 anchor box가 비슷한 위치에 있어도 거리가 크게 계산되고, 큰 GT에 작은 anchor box가 비슷한 위치에 있는 경우 완전 잘못된 앵커가 클러스터링 될 수 있다는 것이다.)
아래 그림에서 L2 distance(L2 norm)을 계산한다는 것이다.


그래서 박스 크기에 상관없는 방식을 적용하기 위해 IOU 값을 이용해서 클러스터링 기준을 만든다.
d(box, centroid) = 1 - IOU(box, centroid)

실험에서 모델 복잡도와 높은 recall값 사이의 trade off가 k=5 일 때 좋았다고 함

5. Direct location prediction

앵커박스를 YOLO에서 사용할 때 발생하는 문제 두 번째는 초기 iteration 동안에는 특히 모델이 불안정하기 때문에 box의 중심점을 예측하는 것도 불안정하다는 것이다.

즉, 처음에 어느 위치에 뭐가 있는지도 모르는데 box의 중심 좌표를 랜덤하게 정해서 학습을 시작하면 당연히 학습이 어려울 것임.

 

시작도 좋은 위치에서 시작하면 좋다.

 

RPN에서는 t_x, t_y 값을 예측해서 x, y 중심 좌표를 계산한다.

이 식으로 x, y 좌표를 계산한다면 어떤 앵커박스든 이미지 어디에나 위치할 수 있다.

YOLO에서는 grid cell이라는 시스템이 사용되었기 때문에 이 grid cell의 위치에 상대적인 앵커박스의 위치좌표를 예측한다.

이미지 좌측상단을 기준으로 상대좌표 (cx, cy)를 통해 해당 셀의 위치를 알 수 있고, 그 셀 안에서 sigmoid를 사용하여 0~1로 앵커박스의 중심 좌표 위치를 표현할 수 있게 된다.

네트워크는 각 셀 당 5개 바운딩박스를 예측하고 이 바운딩 박스 당 5개의 좌표를 예측한다. 

이렇게 위치 예측을 파라미터화하는 것은 학습을 더 쉽게하기 위함이고 네트워크를 좀 더 안정적으로 만든다고 함.

YOLO v1에서 바운딩박스 좌표위치를 직접 예측했던 것보다 앵커박스를 사용한 버전이 5% 이상 성능 개선이 되었다.

6. Fine-Grained Features

Fine-Grained Features라는 용어는 낱낱이 세세하게 나눠서 작업하는 것을 말한다. 반대 개념으로 Coarse-Grained가 있다. Coarse는 대충 거칠게 한다는 의미다.

YOLO v2는 최종 13*13 feature map에서 객체 검출을 수행한다. 이것이 큰 객체를 검출하는 데에는 충분하지만 더 작은 물체를 localizing하는 것은 더 세밀하게 얻은 feature map에서 잘 작동하게 된다.

Faster R-CNN와 SSD에서는 다양한 해상도의 범위에서 proposal networks를 실행한다.

YOLOv2에서는 단순하게 26*26 크기의 단계에서 이전 레이어의 feature를 가져오는 passthrough layer를 추가한다.

passthrough layer는 고해상도 features와 저해상도 features를 concat하는 역할이다.

따라서 26*26 단계에서 얻은 featrue를 그냥 13*13과 concatenate할 수 없기 때문에 13*13*2048로 변환해서 붙인다.

이런 작업을 해서 1% 성능이 좋아졌다고함.

7. Multi-Scale Training

YOLO v1은 input 해상도 448*448 하나만 사용했다.

YOLOv2에서는 앵커박스를 추가하였고, 이미지 중간에 셀이 생기도록 416*416으로 해상도를 변경하였다. 

그러나 YOLO가 여러 장의 Conv, pooling layer를 사용하기 때문에 바로 리사이징되어버린다.

논문 저자들은 다른 사이즈들의 이미지에서도 잘 동작하는 모델을 만들기 위해 Multi-scale training을 도입함.

고정된 크기의 이미지로 학습하는 것 대신, 10번 배치마다 랜덤하게 새로운 해상도를 선택해서 학습하게 된다.

32씩 다운샘플링되어 320, (320+32)352, (320+32*2)384, ... , 608까지 사이즈 조정이 일어난다.

아래에서 YOLOv2에 각 해상도에 따른 성능을 확인할 수 있다.


Faster

YOLOv2는 높은 성능을 보이면서 속도는 빠르기를 목표로 한 모델이다.

대개 검출기들의 base feature extractor로 사용되는 VGG-16은 성능은 좋지만 쓸데없이 복잡함.

224*224 사이즈 이미지 한장 처리하는데 30.69 billion floating point operations가 필요함.

그래서 새로운 classification model을 만들었는데 그게 Darknet-19다.

19개의 conv, 5개의 maxpooling으로 되어있다. 


Stronger

YOLO v2는 9000개 클래스에 대한 객체 검출을 시도하는 모델이다. 많은 데이터셋을 구축하기 위한 방법과 어떻게 클래스에 대해 처리하는지에 대한 내용들이 들어있는데, 이건 필요하면 읽어보면 될 듯..