https://herbwood.tistory.com/17
https://deep-learning-study.tistory.com/433
https://arxiv.org/pdf/1612.08242.pdf
이번 포스팅에서는 YOLO_V2에 대해서 다뤄볼 것이다. 이전 버전과는 네트워크 면에서는 크게 다르지 않지만, 학습 방법을 다르게 하여 높은 성능을 이끌어 냈다. 다양한 방식을 적용했기에 잘 이해하면 많은 것을 얻어 갈 수 있다고 생각한다.
YOLO_v1 은 rpn방식보다 상대적으로 낮은 recall과 많은 localization error가 났다. 네트워크가 커질수록 더 좋은 성능을 보이는데 반해, 이 논문에서는 오히려 네트워크를 더 단순하게 하고 쉽게 학습하게 만들어 좋은 성능을 보였는데 이에 대해서 알아보자.
Batch Normalization을 모든 conv layer뒤에 진행해주어서 mAP가 2%상승하는 효과를 보여주었다. 또한 이 작업을 통해 모델을 정규화하는데 도움을 주고, overfitting없이 dropout을 할 수 있게 해준다.
이 당시 SOTA 모델들은 ImageNet에서 pretrain된 classifier를 사용하였다. 보통 ALexNet을 사용하였고 256 X 256 의 입력크기를 사용하였다. YOLO_v1에서는 224 X 224를 classifier에 사용하였고 detection을 할 때는 448로 사이즈를 올려서 사용하였다. 이 말은 네트워크가 학습을 하면서 resolution을 조절한다는 뜻이다. 이 논문에서는 처음에 ImageNet에서 448 X 448로 10 epoch이 학습된 네트워크를 가져와 finetuning한다. 그렇게하면 네트워크가 높은 resoluion의 image에 대해서도 잘 작동할수 있게 한다. 이를 통해 대략 4%의 mAP성능을 향상시켰다.
앞선 버전에서는 마지막 conv layer로 추출된 featuremap을 fc layer를 통해 bounding box의 좌표를 예측했다. 그러나, 사전에 미리 정해둔 anchor box의 offset을 구하는 것이 좌표를 구하는 것보다 쉽게 학습이 된다. YOLO_v2는 v1에서 몇가지 방법을 다르게 하여 쉽게 학습을 하였다.
첫째로, conv layer의 output이 high resolution layer를 갖도록 한 개의 pooling layer 제거를 하였다. 또한, fc layer를 제거하고 bounding box를 예측하기 위해 anchor box를사용했다.
두번째로는 448 X 448 이미지의 input을 416사이즈의 이미지로 줄인다. 왜냐면 가운데 하나의 중심 cell이 있도록 하기위해서이다. 큰 물체가 있을경우 보통 이미지의 중심부에 존재한다. 448을 downsample ration(32)로 나누면 14 X 14가 되고 , 416일 경우는 13 X 13이 된다. 중심부에 존재한다 생각하면 홀수 일 때 feature map 중심에 object의 정보가 담기지만 전자일 경우 인접한 4개의 cell에 담기게 된다. 또한, 전자는 cell 당 2개의 bounding box 를 예상하기에 image 당 (7X7X2) 98 개의 box를 예상한다. 하지만, 이 모델일 경우 훨씬 더 많은 box를 예상한다. anchorbox가 없이 학습이 될 경우 69.5mAP와 81%의 recall을 보였다면, 이 모델은 69.2mAP 와 88%의 recall을 보여준다. mAP는 살짝 떨어진 반면, recall에서는 높은 향상을 보여주었다.
anchor box를 사용하면 사전에 얼마나 잘 만들어났는지가 중요하다. 여기서는 training set의 바운딩박스에 k-means clustering을 사용하여 얻어냈다. 일반적인 k-means는 Euclidean distance를 사용한다. 그러면 중심좌표가 짧은 anchor box가 선택되고, 큰 박스일 경우 잘 못된 박스를 선택하므로 이는 곧 에러율을 높인다. 여기서 제안한 방법은
를 사용하였고 이는 IOU가 높을수록 거리가 가깝다고 생각한 것이다. k가 높아지면 성능은 좋아지나, 속도가 느려지는데 여기서는 5로 정하였다.
anchor box를 활용한 바운딩박스 offset 예측법은 바운딩박스의 위치를 제한하지 않아서 초기 학습시 불안정하다는 단점이 있다. 예측값의 범위를 제한하지 않으면 바운딩 박스가 이미지 어디에도 나타날 수 있습니다. 안정적으로 바운딩박스를 예측하기 까지 모델이 학습되는데에는 많은 시간이 걸리게 됩니다. 위 문제를 해결하기 위해 activation function을 사용하여 offset의 범위를 0~1로 제한하였다. 네트워크는 5개의 변수를 예상한다.
예측한 값을 통해 위의 변수들을 계산한다.
clustering 과 이 방법을 통해 5%의 성능 향상을 이끌어냈다.
최종적으로 13 X 13 크기의 feature map 출력한다. 이처럼 feature map의 크기가 작은 경우 큰 객체를 예측하기 용이한 반면 작은 객체는 예측하기 어렵다는 문제가 있다.
이러한 문제를 해결하기 위해 마지막 pooling을 수행하기 전에 feature map을 추출하여 26x26(x512) 크기의 feature map을 얻는다. 그 다음 위의 그림과 같이 feature map을 channel은 유지하면서 4개로 분할한 후 결합(concat)하여 13x13(x2048)크기의 feature map을 얻는다. 이러한 feature map은 보다 작은 객체에 대한 정보를 함축하고 있다. 이를 13x13(x1024) feature map에 추가하여 13x13(x3072) 크기의 feature map을 얻는다.
이 과정을 통해 1%의 성능 향상을 이끌어 내었다고 한다.
다양한 크기의 입력에 robust하기 위하여 10batch마다 다른 랜덤한 크기의 이미지를 넣어 학습을 하였다. 이를 통해 정확도와 속도사이의 tradeoff를 조절하였다.
YOLO_v2의 목표는 정확도도 좋아야하지만 로보틱스나 자율주행에서도 쓰일 빠른 네트워크를 설계하는 것이다. 보통의 detection architecture로 VGG-16을 사용한다. 이 모델은 정확하지만 30.69 billion FLOPs연산을 한다. 그러나 YOLO에서 사용하는 Googlnet 기반의 Darknet은 8.52 billion FLOPs연산을 한다. 연산량이 많이 줄었음에도 불구하고 성능은 약간 낮아졌을 뿐이다. 어떻게 이렇게 하였는지 살펴보자.
Darknet은 위의 보이는 사진과 같이 19개의 conv layer와 5개의 max pooling layer가 존재한다. 1x1 conv와 마지막에 FC layer를 제거하고 Global AVGPooling을 통해 연산량을 크게 줄일 수 있었다고 한다.
classification을 하기 위해서 ImageNet 1000 데이터셋을 활용하여 학습을 시켰다고 한다. 전형적인 data augmentation 작업을 한 후 앞서 다뤘던 448 x 448로 10 epoch학습된 네트워크를 가져와 fine-tuning을 했다. 그 결과 top-1 은 76.5%의 정확도를 얻었고, top-5는 93.3%의 정확도를 얻었다.
detection을 할 때는 마지막 conv layer를 제거하고 3 x 3 conv layer 와 1 x 1 conv layer를 추가했다고 한다. 이 때, 1 x 1 conv layer의 채널 수는 detection 해야할 수를 뜻한다. 한 박스당 5개의 좌표와 20개의 class를 예측하므로 총 25개의 filter가 필요하며, 여기서는 5개의 박스를 사용하였으므로 125개의 filter를 사용했다고 한다.
여기서 선택한 방식은 detection을 하기 위해 label된 이미지를 사용하는 것이다. 학습을 하는 데 있어서 detection과 classification 데이터셋을 합치는 방식을 쓰는데 classification부분은 그 부분만 backpropagation을 하는게 쉬운 작업이 아니다. detection 데이터셋은 일반적이고 범용적인 객체에 대한 정보를 가지고 있는 반면, classification 데이터셋은 보다 세부적인 객체에 대한 정보를 가지고 있다. 예를 들어 detection 데이터셋은 모든 개 이미지를 "개"라는 하나의 class로 분류하는 반면, classification 데이터셋은 "요크셔 테리어", "불독" 등 개를 종류별로 세부적인 class로 분류한다. 이처럼 두 데이터를 섞어 학습시킬 경우 모델이 "개"와 "요크셔 테리어"를 별개의 배타적인 class로 분류할 가능성이 있다. 그러므로 multi-label model을 사용하여 배타적인 분류가 하지 않도록 하였다고 한다.
ImageNet에서의 label은 WordNet에서 가지고 왔다고 한다. WordNet은 트리구조가 아니고 directed graph의 구조이다. 이러면 "canine"과 "domestic animal"을 "dog"라고만 인식을 한다. 여기서는 hierarchical tree구조를 통해 이러한 문제를 해결했다.
WordTree에서 각 노드는 범주를 의미하고 하위 범주는 자식 노드가 되는 구조가 가지고 있습니다. 먼저 물리적 객체(physical object)를 루트 노드로 두고, 하위 범주는 자식 노드가 되고, 자식 노드의 하위 범주는 자식 노드가 되어 점차 뻗어나간다. 예를 들어 "요크셔 테리어"라는 범주 혹은 노드는 "물리적 객체 - 동물 - 포유류 - 사냥개 - 테리어" 노드를 거쳐 도달할 수 있습니다. ImageNet 데이터셋을 통해 WordTree를 구성할 경우, 최상위 노드부터 최하위 노드까지 총 범주를 합치면 1369개의 범주가 존재한다.
이러한 트리에서 특정 범주에 속할 확률은 루트 노드로부터 해당 범주의 노드까지의 조건부 확률의 곱으로 표현할 수 있다. 입력으로 들어온 이미지가 요크셔 테리어일 확률은 위와 같이 계산할 수 있다.
COCO dataset과 ImageNet 9000개 클래스를 결합하여 9418개 클래스를 지닌 워드트리를 생성한다. ImageNet이 COCO보다 데이터가 훨씬 많기 때문에 COCO 데이터셋을 4:1 비율로 oversampling 한다. 출력 사이즈의 한계 때문에 5개가 아닌 3개의 prior을 사용하여 YOLO9000을 학습한다.
detection 이미지를 보면 평소대로 loss를 계산하고 classification loss는 해당 클래스와 그것의 상위 클래스에 대해서만 back propagation을 진행한다. 예를 들어 label이 'dog'이면 트리의 더 아래쪽에 있는 예측에도 오류를 할당하여 더 아래로 내려갈 수 있도록 한다. 이렇게 결합 학습으로 YOLO9000은 COCO data를 사용하여 객체를 찾아내고 ImageNet data를 사용하여 이 객체를 classification 한다.
YOLO_v2에 대해서 간단하게 알아보았고, 직접 코드 구현을 하면서 어떤 구성인지 자세히 살펴볼 계획이다. 그 후 다음 포스팅에서는 다른 모델들에 대해 다뤄볼 예정이다.