YOLO9000: Better, Faster Stronger

cvpr
cvpr2017
fast-inference
sota
detection
singleshot-detector
semi-supervised

(Curtis Kim) #1

Abstract

At 67 FPS, YOLOv2 gets 76.8 mAP on VOC 2007. At 40 FPS, YOLOv2 gets 78.6 mAP, outperforming state-of-the-art methods like Faster R- CNN with ResNet and SSD while still running significantly faster.

YOLO라는 Object Detection을 위한 모델링/네트워크가 있었습니다. end-to-end로 multi object detection이 되고, 속도가 빨랐던 모델입니다. 성능은 당시 SOTA가 아니었지만, end-to-end 모델링을 깔끔하게 보여주었고, one-shot inference로 detection이 가능하다는 것을 보여주었습니다.

이 논문에서는 몇가지 구성으로 나누어 YOLO를 업그레이드했습니다.

  • 성능과 속도를 높인다 : Yolo-v2
  • Weak-Labeled Supervised Learning을 통해 Detection Class 를 늘린다 : Yolo9000

YOLOv2 : 성능과 속도를 높이기

기존 YOLO의 한계는 일단… recall이 무지하게 떨어진다는 겁니다. 두번째로는 localization error가 좀 있다는 건데, 바운딩 박스가 다른 디텍션 파이프라인에 비해 좀 정확하지 않습니다.

YOLOv2 에서는 기본적으로 아래의 내용을 먼저 적용 했습니다.

  • Batch Norm
  • Input Resolution 높이기 (기존 224x224 -> 448x448)

여기까진 특별할건 없는데 이제부터 좀 Hard 한 Engineering이 느껴집니다.

a. Convolution with Anchor boxes

예전에는 7x7 Grid에 각각에서 1개의 Bounding Box(x,y,w,h)를 Output으로 내고, N개의 클래스에 대한 Probability를 출력했었습니다. 해서 7x7x(4+N) 의 Tensor가 아웃풋이 되는 형태였어요.

기존 모델링 방법에서 몇가지 문제점이 있는데, 일단 prediction되는 bounding box 개수가 49개로 좀 적다는 점, L2 Norm으로 단순한 Loss Function이었다는 점, 크기나 offset의 다양성에 대해 조금 둔감한 점 등등이 있을 것으로 예상이 되었죠.

이 논문에서는 FC Layer를 제거해버리고, Fully Convolutional 한 형태로 Feature Map 에서부터 Offset을 추정하도록 랬습니다. 그러면서 YOLO와 달라진건 모든 Anchor Box바다 Class Prediction이 되었다는 점도 있겠네요.

예상가능하다 싶이 Anchor Box로 이동하면서, Prediction Box의 수가 늘어서(수천개 수준으로) Recall이 81%->88% 로 증가했다고 합니다. mAP는 69.5%->69.2% 로 다소 줄었다고 합니다.

참고로 Detection 관련한 논문에서 Anchor Box 을 어떻게 사용했는지에 대해서 꼭 나오는데요, 간단히 정리만 하면…

  • Distance를 IOU를 통해 정의한 후( d(box, centroid) = 1 - IOU(box, centroid) ) 가지고 있던 데이터셋에서 Clustring해서 Anchor Box를 5개 만들었다. 아래에서 5개를 사용한 Cluster IOU 를 보면. 9개를 사용한 Hand-Picked Anchor Box 에 와 거의 유사한 성능이라고 보여지고 클러스터를 9개로 늘리면 성능이 많이 올라간다. 하지만 논문에서는 5개 짜리를 사용.

image

  • Offset 등의 값은 0~1 사이의 값으로 나오도록 모델링했음. Logistic Activation으로 0~1로만 나오도록 제약. 이런 테크닉은 Model Stability에 영향을 끼쳐서 학습을 용이하게 합니다.
  • 근데 GT와 Anchor box 간의 Matching Strategy는 논문에 소개가 안되어 있는 것 같습니다. 아마 Best Matched One과 일정 수준 이상의 Threshold 위의 모든 Anchor Box에 대해서 Maching 했을 것 같다는 추측입니다.

b. Find-Grained Features

또 빠질 수 없는 포인트가 요건 것 같은데요. R-FCN이나 SSD같은 애들이 간단한 모델링으로 좋은 퍼포먼스를 낸 것은 아무래도 낮은 레벨의 Feature Map 정보도 잘 사용했다는 점에서 공통점이 있는 듯요. Resnet과 비슷하게 아래 레이어에서 올려서 Concatenate 합니다.

c. Multi-Scale Training

요건 좀 신기했는데… 10 배치마다 네트워크 Input dimension size를 변경합니다.
{320, 325, …, 608) 중에 고르도록 되어 있고, 네트워크를 해당 dimension에 맞게 리사이즈해서 트레이닝한다고 합니다. 해서 같은 네트워크가 여러 레졸루션에 강하도록 하는 효과가 있다고하고, YOLOv2는 속도를 원하면 low res로, 성능을 원하면 high res로 이용할 수 있게 됩니다.

아래는 여기까지 적용된 성능입니다.


속도를 위해서 여러 실험도 소개가 되어 있습니다. VGG-16이 좋긴한데 속도도 느리고 Computation이 많으니 욜로에서는 Custom Network을 썼었는데, 여기서도 Darknet-19라는 네트워크를 만들어서 씁니다. VGG와 Inception에서 아이디어를 좀 가져왔는데, 요것도 좀 더 볼 필요가 있을듯…

Operations(Billion Floating Point) ImageNet Top-5
VGG16 30.69 90.0%
YOLOv1 8.52 88.0%
YOLOv2 5.58 91.2%

요약하면 더 빠른데 성능도 좋은 놈을 써서 YOLOv2 속도와 성능을 업했다 정도… YOLOv1때와 마찬가지로 Learning Rate 등등 트레이닝 파라미터들도 아주 세심하게 결정하면서 트레이닝 한 흔적들도 보입니다.


YOLO9000 : Stronger

이제 논문에서 Weak-Labeled Data인 Classification Dataset을 통해 Detection Class의 수를 9000개로 늘리는 방법을 소개합니다.

요약하면, 트레이닝 과정에서 Detection Dataset과 Classification Dataset을 섞어쓰는데,

  • Detection Dataset의 경우에는 기존 YOLOv2 Loss Function으로 Back Prop하고
  • Classification Dataset의 경우에는 Bounding Box에 대한 부분은 고정하고 Class Prediction에 대한 부분만 Back Prop 합니다.

자칫하면 학습을 완전히 망칠 것 같기는 한데, Detection Dataset이 충분히 General한 Object Proposal이라는 가정이 있고, 둘의 비율과 각종 파라미터들이 적절하면 학습이 잘 될 것도 같다는 느낌적인 느낌…

아무튼 요렇게 하기 위해서 Class 를 Hierachical 하게 정의를 했습니다. 예를 들어서 강아지의 경우에 테리어라는 종이 있고 그 안에 요크셔테리어도 있을 거고 등등… 트리구조로 정의가 되었다고하면, Back Prop 하는 시점에 해당 있는 정보부문 에서만 Back Prop 하는 구조입니다.

강아지 데이터로 Back Prop 할때는 강아지 위치에서만 BAck Prop하고, 더 자세한 정보인 요크셔테리어 데이터로 Back Prop할 때는 해당 위치에서 Back Prop 하는 형태…

해서 Prediction Output을 아래처럼 정의하고

Training/Inference 할 때에는 아래처럼 Conditional Probability를 이용하여 관계를 정의했습니다…

  • Pr(Norfolk terrior) = Pr(Norfolk terrier | terrier) * Pr(terrier | hunting dog) * ... Pr(animal | physicalobject)

  • Pr(Physical Object) = 1

뭐 데이터셋 비율을 얼마로해서 어떻게 샘플링하고 어떤 파라미터로 학습하고 하는 내용들이 논문에 소개되어 있습니다. 그리고 Matching 할 때는 Top1 Bounding Box에만 매칭해서 Back Prop 했다고 하네요.

결과를 보면 동물같은건… 워낙 그전에도 generalization이 잘 되었을테니 성능이 웬만큼 나오는데, 그렇지 않은 기저귀 같은 애들은… 그냥 학습이 안되네요. Detection Dataset 의 한계일 것 같네요. Detection Dataset 쪽만 더 넣어줘도 전반적으로 성능올라갈듯.


  • 속도 더 빨라짐
  • 성능 SOTA임
  • 게다가 클래스 9000개로 늘렸음
  • 원하는 클래스 만큼으로 유연하게 프리딕션해도됨(예를들어, 난 강아지인지 사람인지 정도만 아웃풋으로 원하면 그만큼만, 아니면 강아지 종이나 사람의 눈 위치까지도 더 자세하게 내줘 등등)

YOLOv3: An incremental Improvement
Pelee: A Real-Time Object Detection System on Mobile Devices