대부분의 Object Detection 방법이 여전히 작은 물체를 감지하는데 어려움을 겪고 있다. 최근 Object Detection의 Dataset이 다른 Task 모델의 Dataset과 다르게 제한적이다. 물체의 level에 따라 크기를 Detect 하고 싶지만 Classification이나 Tagging에 비해서 라벨링을 할 때 더 많은 연산이 요구된다.
그래서 기존에 가지고 있던 Classification Data를 사용해서 Detection 체계로 범위를 확장해서 사용한다.
Joint 학습 알고리즘을 적용해서 물체의 위치를 정확하게 학습함과 동시에 해당 물체의 Classification 또한 진행할 수 있다.
실시간 Object Detector로 9000개의 다른 물체를 감지할 수 있다. 기존의 YOLO Detection 모델을 바탕으로 YOLOv2 모델을 만들었다.
YOLO는 최근 Detection 모델보다 큰 결함을 가지고 있는 데 Region Proposal 방법을 사용하는 Fast R-CNN 모델보다 낮은 recall 값을 가지는 것을 확인했다. 그래서 Classification 정확도를 유지한 채로 recall 값과 localization 값을 높이는 것을 집중적으로 연구했다.
최근 컴퓨터 비전의 트랜드는 더 크고 깊은 네트워크를 사용하는 것이지만 해당 모델은 빠른 속도를 유지하면서 더 정확한 성능을 내기를 원했다. 그래서 네트워크의 크기를 키우는 대신 간단하게 만들고 학습하기 쉽게 변형을 하였다.
Batch Norm을 Conv Layer에 추가함으로써 기존 YOLO 모델보다 2% 높은 mAP를 얻었다. Batch Norm은 모델을 정규화하는테 도움을 준다. 또한 이는 Overfitting 없이 dropout을 모델에서 제거할 수 있게 해준다. (첫 문장이 무슨말.?)
모든 최신 Detection 모델들은 ImageNet을 학습한 Classifier를 사용한다. AlexNet으로 시작하는 Classifier는 256 x 256 이미지보다 작은 해상도를 입력 받는다. YOLO 같은 경우 입력 이미지의 Resolution은 224 x 224 이고 448 x 448 까지 키우게 되는데 이는 새로운 입력 이미지 해상도에 적응을 해야함을 의미한다. 처음에 Classification 네트워크를 448 x 448 크기로 10 epoch 학습을 진행하고 Detection 네트워크에 대해서 fine tuning을 적용했다.
제일 상단의 Conv Layer를 거쳐서 나온 Feature에 FC Layer를 적용시켜 BB의 좌표를 예측하는데 이는 해당 네트워크가 더 쉽게 학습하도록 만들어줬다. (Prediction Coordinate directly와 Predict BB using hand-picked의 차이점...?)
YOLO 모델에 있는 FC Layer를 제거하고 Anchor Box를 사용한다. Pooling Layer를 하나 제거해서 높은 Resolution을 유지시켰고 Input Image의 크기를 416으로 조절했는데, 이는 Output feature map의 크기를 Odd Number로 맞춰서 하나의 Center cell을 만들기 위함이다.
Anchor Box를 도입하면서 Class를 에측하는 Classification 매커니즘과 Localization 을 분리해야 했다. 그리고 모든 Anchor Box가 아닌 Proposed된 Box에 대한 IOU를 예측한다.
Anchor Box를 사용하면서 정확도의 감소가 있었다.
Anchor Box를 사용하면서 두 가지 문제점이 생겼는데 그 중 첫 번째가 Box 차원이 Hand picked 된다는 것이다. 적절한 Box를 찾도록 학습할 수 있지만 우리가 더 좋은 지점을 제공하면 해당 네트워크가 더 쉽게 학습하도록 만들 수 있다는 것이다.
직접 후보를 선택하는 것 대신, k-means clustering 알고리즘을 적용시켜서 자동적으로 좋은 후보를 선택하도록 학습을 시켰다.만약 기존의 유클리디안 거리를 사용하여 k-means 알고리즘을 적용시켯다면 작은 Box에 대한 에러가 더 컸을 것이다. 하지만 우리는 Box의 크기와 관련없이 좋은 IOU 값을 얻어내는 것이었기에 다음과 같은 식으로 조정을 했다. k 값을 5로 선정하면서 복잡도와 높은 recall 값 사이의 균형을 잘 맞추었다.
Clustering 알고리즘과 hand-picked를 사용한 Anchor Box의 평균 IOU를 비교했다.
Anchor Box를 사용했을 때 발생한 두 번째 문제점은 Model Instability 이다. 대부분의 불안정성 문제는 Box의 x,y 좌표를 예측하는 것으로부터 온다. Region Proposal 네트워크에서는 다음과 같은 수식으로 좌표가 계산이 된다.
예를 들어 tx 의 값에 따라서 Box가 오른쪽, 왼쪽으로 Shift할 수도 있게 된다. 이런 수식은 제약적이지 않아서 어느 Anchor Box가 이미지의 아무런 지점에서 끝날 수도 있다. 랜덤하게 초기화되는 이 문제는 Offset을 예측하는 것의 안정성을 찾기에 긴 시간이 걸린다.
기존 YOLO와 같이 Offset을 예측하는 것이 아니라 Grid Cell의 상대적 좌표를 예측하는 것으로 변경했다. 이는 GT의 경계값을 0에서 1로 조정시키고 logistic activation 함수를 사용해서 해당 범위로 떨어지도록 예측값을 조정해야 한다.
Output Feature Map에서 5개의 Bounding Box를 예측하고 다음과 같은 5개의 t 값을 가진다.
YOLOv2 모델은 13 x 13 feature map으로부터 물체를 Detection 한다. 이는 큰 물체를 감지하지만 작은 물체의 locality를 살리는 것이 어렵다. 그래서 이전 26 x 26 Resolution feature를 가져와서 더하는 방식을 사용한다.
ResNet 처럼 Identity Mapping 방식을 사용한다고 보면된다. 1% 성능 향상을 가져왔다.
기존의 YOLO 모델은 448 x 448 Input Size였지만 Anchor box를 사용하면서 416 x 416 으로 해상도를 낮췄다. 하지만 다른 크기의 이미지에 대해서 적응할 수 있는 모델을 만들고 싶었다. 10 배치 마다 다른 크기의 이미지를 선택해서 적용시켰으며 32배 Downsample까지 적용을 시켜 output Feature를 뽑아냈다. 가장 작은 크기는 320 x 320 이며 가장 큰 크기는 608 x 608 이다.
이런 방법은 네트워크가 다양한 Input 크기에 맞춰 예측을 하도록 학습을 도우며 속도와 정확도 사이의 Trade off를 잘 조절했다.
YOLOv2 모델과 다른 모델의 속도와 성능을 비교한 표는 아래와 같다.
정확도를 유지하면서 빠른 속도의 모델을 얻고자 했다. 대부분 Detection의 프레임 워크는 VGG-16에 기반한다. 하지만 VGG-16에 기반한 224 x 224 이미지는 30.60 billion floating point에 해당하는 많은 연산량을 요구한다.
YOLO의 경우 Googlenet 구조를 기반으로 만들어진 프레임 워크이다. 이는 VGG-16보다 빠르지만 정확도가 좋지 못하다.
YOLOv2를 기반으로 하는 새로운 Classification 모델을 제안한다. 3x3 filter를 사용하고 Pooling 이후 Channel을 2배 늘리는 작업을 VGG 모델과 유사하게 진행한다. Batch Norm도 사용하여 학습 간의 안정성을 늘리고, 수렴 속도를 늘리는 것에 신경을 썼다.
Darknet-19라고 불리는 최종 모델은 19개의 Conv layer와 5개의 Max-Pooling layer를 사용한다.
1000개 클래스를 가지고 있는 ImageNet 데이터셋으로 SGD 방식을 사용해서 학습한다. Learning rate = 0.1, decay = 4, weight decay = 0.0005, momentun = 0.9 사용. Data augmentation도 진행.
Detection 모델을 위해서 마지막 Conv Layer를 제거하고 1x1 Conv Layer 뒤에 3개의 3x3x1024 Conv Layer를 추가했다. VOC 데이터셋에서 5개의 좌표와 20개의 Class prediction 값을 포함하는 각 Box 5개를 예측했다. 그리고 마지막 3x3x512 Layer에서 마지막에서 2 번째 Layer를 통과하는 Layer를 추가했다. (Fine Grain Feature 를 사용하기 위함이라는 것은 무슨 뜻일까...?)
160 에폭으로 학습을 했고 다음과 같은 방법으로 학습을 돌렸다.
Classification Data와 Detection Data를 섞어서 학습시키는 매커니즘을 제공한다.
Detection을 위해 labeling 된 이미지를 볼 때는 YOLOv2 의 loss function을 사용해서 Backpropagate를 할 수 있다. 그리고 Classification 이미지를 볼때는 특정 부분의 Loss를 구해서 학습을 해야 한다.
해당 접근 방식은 몇 개의 문제점을 갖고 있다. Detection 데이터 셋은 일반적인 물체에 대해 Labeling을 갖고 있다. Classification 데이터 셋의 경우 더 넓고 자세한 범위의 label이 되어잇다. ImageNet 의 경우 개의 품종 100개에 대한 구분이 가능하다. 만약 두개의 데이터 셋을 같이 사용하기 위해서 이러한 label을 병합하는 과정을 거쳐야 했다.
Classification을 위해서는 Softmax Later를 모든 가능한 카테고리의 확률 분포를 계산하기 위해 사용이 되었다. (Softmax를 사용한다는 것은 클래스들이 상호 배타적이라는 것을 가정한다.. 이거는 무슨 뜻일까..?) 하지만 이는 문제를 야기하는 데 얘를 들어 요크셰테리어와 강아지는 상호 배타적이지 않기 때문에 ImageNet과 COCO를 병합하고 싶지 않을 것이다.
대신 우리는 상호 배타적임을 가정하지 않게 Multi-label 모델을 사용할 수 있다. 해당 접근은 우리가 데이터에 대해 알고 있는 모든 구조 데이터를 무시한다. (잘 모르겠다..)
ImageNet 데이터 셋은 WordNet으로부터 추출되었는데, 데이터들이 얼마나 연관되어 있는지를 바탕으로 구조가 이루어져있다. 대부분의 Classification을 하기위해서는 Label에 단순한 구조를 가정하지만 Dataset을 합치기 위해서는 해당 구조가 정확해야 한다.
WordNet은 Directed Graph 구조로 되어있는데 언어 모델이 복잡하기 때문이다. Full Graph를 대신 Directed Graph를 사용하므로써 문제를 단순화할 수 있다.