- Today
- Total
작심삼일
[YOLOv2 리뷰] YOLO9000: Better, Faster, Stronger (CVPR 17) 본문
[YOLOv2 리뷰] YOLO9000: Better, Faster, Stronger (CVPR 17)
yun_s 2022. 8. 2. 15:11My Summary & Opinion
YOLOv1과 Faster RCNN의 여러 장단점을 결합하고 WordTree라는 hierarchy 구조를 사용해서 그 성능을 더 높였다.
아래 표 왼쪽에 있는 것들이 기존 YOLO에서 수정한 것이다.
- Batch Normalization
- Dropout 제거 & model regularize 더 잘하도록
- High-resolution Classifier
- 448x448 크기로 학습
- Convolution with Anchor Boxes
- 448x448 말고 416x416으로 학습 -> center cell이 하나만 존재하도록
- Anchor box별로 class를 예측
- Dimension Clusters
- K-means를 사용해 hand-picked box가 아닌 최적의 box를 사용
- Direct local prediction
- Offset이 아닌 정확한 좌표를 예측하도록 함
- Fine-Grained Features
- 26x26 feature map을 사용
- 후에 26x26x512를 13x13x2048로 바꿔 기존의 feature map과 합쳐지도록 함
- Multi-Scale Training
- Various input size
- Darknet-19
- VGG-16보다 가벼우며 GoogLeNet보다 성능이 좋음
- Hierarchical Classification
- WordTree
- 모든 노드에 대해 conditional probability를 계산
Introduction
대부분의 detection 방법들은 몇몇 종류의 물체만 탐지할 수 있다.
그리고, detection을 위해 image를 라벨링 하는 일은 classification을 라벨링하는 것보다 그 cost가 더 크다.
그래서 우리는 이미 가지고 있는 많은 양의 classification data를 detection으로 확장시키는 방법을 제안한다.
그 방법은 Object classification의 hierarchical view를 사용해 별개의 데이터셋을 묶는 것이다.
또한, Ojbect detector를 detection과 classification 데이터 모두에 대해서 학습하는 방법을 제안한다.
그 방법은 classification image를 활용해 vocabulary와 robustness를 높이는 동시에 detection image를 활용해 객체의 위치를 정확하게 찾는 방법을 학습시키는 것이다.
Better
Batch Normalization
BN을 사용해서 model이 regularize를 더 잘 하게 하고, dropout도 제거하게 했다.
YOLO의 모든 conv layer에 BN을 추가해 성능면에서 mAP가 2% 이상 증가했다.
High Resolution Classifier
YOLO는 $224 \times 224$로 classifier를 학습시키고 $448$로 사이즈를 키워서 detection을 한다.
YOLOv2는 classification network를 먼저 $448 \times 448$크기로 10epoch 학습시킨다.
그럼으로써 네트워크는 더 큰 이미지에 대해서 그 성능이 더 좋다.
이로 인해 성능면에서 mAP가 약 4% 증가했다.
Convolutional With Anchor Boxes
YOLO는 convolutional feature extractor 바로 뒤에 fully connected layor를 쌓아서 bounding box의 좌표를 바로 예측했다.
Faster R-CNN은 FC layer로 이루어진 Region Proposal Network를 이용해 사람이 미리 골라놓은 각 anchor box별로 offset과 confidence를 예측한다.
우리는 YOLO에서 FC layer를 제거하고, anchor box를 이용해서 bounding box를 예측했다.
그리고 $448 \times 448$이 아닌 $416 \times 416$에 대해 실행하도록 했는데, 그 이유는 center cell이 단 하나만 존재하게 하기 위해서였다.
왜냐하면 보통 큰 물체들은 이미지의 중간에 오기 때문이다.
또한, spatial location에서 class를 예측하지 않고, 각 anchor box별로 class와 objectness를 예측하도록 했다.
Anchor box별로 따로 계산하는 방법을 사용해서 정확도면에서는 약간의 성능 감소가 있었다.
이런 방식을 사용하지 않았을 때는 69.5 mAP & 81% recall인데, 이 방식을 사용했을 때는 69.2 mAP & 88% recall이다.
mAP가 감소했지만 recall이 증가했으므로 성능 개선의 여지가 있다고 본다.
Dimension Clusters
위에서 언급한 것처럼 hand picked anchor box를 사용하면 생기는 문제가 두가지 있는데, 첫번째는 사람이 정한 것이기 때문에 이 anchor box가 최선인지에 대한 확신이 없다는 것이다. (두번째 문제는 아래에 있음)
그 문제를 해결하기 위해 k-means 알고리즘을 사용했다.
다만, k-means를 그대로 사용하지 않고 IOU 점수가 크게 나오는 box를 고르기 위해 다음과 같이 distance metric을 수정했다.
$d(box, centroid) = 1 - IOU(box, centroid)$
여러 k에 대해 진행했을 때, k=5일 때, Faster R-CNN에서 anchor box를 9개 사용했을 때와 비슷한 성능이 나왔다.
그래서 model complexity와 recall을 다 고려해서, k=5로 정했다.
Direct location prediction
Anchor box를 사용했을 때 생기는 두번째 문제는 model instability다.
Region Proposal Network는 $(x, y)$를 중심으로 두고 다음에 해당하는 $t_x$와 $t_y$를 예측한다.
$t_x$로 좌우 이동을, $t_y$로 상하 이동을 한다.
$x = (t_x * w_a) - x_a$
$y=(t_y * h_a) -y_a$
이렇게하면 생기는 문제는, anchor box가 이미지의 어느 점으로도 갈 수 있고, 적절한 offset을 구하기 까지 시간이 많이 걸린다는 것이다.
그래서 이처럼 offset을 예측하지 않고, YOLO처럼 grid cell에 기반해서 location을 예측하기로 했다.
이 방법을 사용해서 약 5%의 성능 향상이 있었다.
Fine-Grained Features
우리가 사용하는 modified YOLO는 $13 \times 13$ feature map에서 detection을 진행한다.
이는 큰 물체에는 효과적이지만 작은 물체에는 효과적이지 않다.
그래서 우리는 더 앞에 있는 layer에서 $26 \times 26$ 크기의 feature를 가져오는 passthrough layer를 추가했다.
이는 $26 \times 26 \times 512$ feature map을 $13 \times 13 \times 2048$ feature map으로 바꿔서 기존의 feature와 합칠 수 있게 한다.
이 방법을 사용해서 약 1%의 성능 향상이 있었다.
Multi-Scale Training
YOLO는 $448 \times 448$ 크기의 이미지를 입력으로 받았지만, 우리는 anchor box도 수정하면서 해상도를 $416 \times 416$으로 수정했다.
우리는 conv layer와 pooling layer만 사용하기 때문에 이미지 크기를 바로 바꿀 수 있다.
우리는 YOLOv2가 다양한 크기의 이미지들로 학습되기를 원했다.
그래서 input image size를 고정하지않고, 몇 iteration마다 input image size를 수정했다.
우리가 사용하는 모델은 32의 배수로 downsampling하기 때문에 32의 배수로 진행했다: $\{320, 352, ..., 608\}$
Faster
우리는 모델이 정확하면서도 빠르기를 원했다.
대부분의 detection framework는 VGG-16을 feature extractor로 사용한다.
VGG-16은 뛰어나지만 너무 크다.
YOLO는 GoogLeNet을 사용했는데, 이는 VGG-16보다 빠르지만 그 성능이 너무 낮다.
Darknet-19
우리는 YOLOv2의 기본이 되는 새 classification model을 만들었다.
VGG처럼 대부분 $3 \times 3$크기의 필터를 사용하며, 매 pooling 단계 이후에 channel의 수를 두배로 늘린다.
그리고 $3 \times 3$ conv 사이에 $1 \times 1$ filter를 사용해서 feature representation을 압축했다.
또한, Batch Normalizationㅇ르 사용해서 학습이 안정적으로 학습되고, 빠르게 수렴되도록 했다.
Training for Classification
ImageNet 1000 class에 대해서 $224 \times 224$ 크기로 처음 160epoch를 학습했다.
그 후에 $448 \times 448$크기로 10epoch를 학습시켜 fine-tuning을 진행했다.
Training for detection
Detection 용도로 사용하기 위해 모델의 마지막 conv layer를 제거하고 $1024$ filter를 가진 $3 \times 3$ conv layer + $1 \time 1$ conv를 사용했다.
Stronger
classification data와 detection data를 같이 학습에 사용하는 방법을 제안한다.
Detection data가 들어오면 YOLOv2 loss function 전체를 이용해 packpropagation을 진행한다.
Classification data가 들어오면 classification 부분만 backpropagation을 진행한다.
하지만 이렇게 하면 문제가 좀 있다.
Detection data는 "개"나 "배"처럼 흔한 물체와 일반화된 label을 가지고, classification data는 "요크셔테리어", "베들링턴테리어"처럼 좀 더 정확한 label을 가진다.
이를 해결하기 위해 multi-label model을 사용했다.
Hierarchical classification
ImageNet label은 flat structure를 가지고 있는 WordNet에서 따왔다.
우리는 이를 이용해 hierarchical 구조를 가지고 있는 WordTree를 만들었다.
WordTree를 이용해 classification을 진행하기 위해서는 모든 노드에 대해서 conditional probability를 계산해야한다.
예를 들면 이 물체가 "개"인 것은 아는데 어떤 종류의 개인지 모른다면 모델은 "개"라고 예측할 것이다.
이 데이터셋을 이용해 YOLO9000을 학습시켰다.
Conclusion
YOLOb2는 다른 detection systen보다 더 빠르며 SOTA다.
YOLO9000은 9000가지 이상을 실시간으로 classification할 수 있는 framework다.
Reference
Redmon, Joseph, and Ali Farhadi. "YOLO9000: better, faster, stronger." Proceedings of the IEEE conference on computer vision and pattern recognition. 2017.