YOLOv2는 YOLOv1의 속도를 유지하면서 recall과 위치 정확도를 높이기 위해 anchor를 데이터에서 고르고, box 중심을 cell 안으로 제한하며, 고해상도 특징과 여러 입력 크기를 함께 학습합니다. 성능 향상은 anchor 하나의 효과가 아니라 Batch Normalization, 고해상도 분류기 적응, dimension cluster, passthrough가 서로 다른 실패를 줄인 결과입니다. 실제 선택에서는 입력 해상도와 anchor 수가 속도, 메모리, 작은 물체 recall에 주는 영향을 함께 비교해야 합니다.
YOLOv2는 recall을 어떻게 올렸나: Anchor Box, 좌표 제약, Multi-Scale의 역할
YOLOv1의 두 문제를 어디서부터 고쳤나
YOLO는 bounding box 위치와 class를 한 네트워크에서 동시에 예측하므로 region proposal과 별도 분류기를 잇는 방식보다 빠릅니다. 그러나 YOLOv1은 검출율이 낮고 localization error가 많았습니다. YOLO9000 논문은 네트워크를 무작정 크게 만드는 대신 표현과 학습 방법을 바꾸는 쪽을 택합니다.
먼저 모든 convolution layer에 Batch Normalization을 추가해 convergence를 개선하고, dropout 없이도 과적합을 줄였습니다. 원문 기록에서는 이 변경으로 mAP가 2% 이상 올랐습니다. ImageNet 분류기는 224×224에서 바로 detection으로 옮기지 않고 448×448 해상도로 10 epoch 더 fine-tuning해 고해상도 입력에 적응시켰고, 이 과정은 약 4% mAP 향상으로 이어졌습니다.
또 fully connected layer를 없애고 convolution 기반 anchor box를 사용합니다. 입력을 448이 아닌 416으로 둔 이유는 32배 downsampling 뒤 13×13의 홀수 feature map을 얻기 위해서입니다. 중앙 cell 하나가 생기므로 화면 중심을 차지하기 쉬운 큰 물체를 네 개의 중앙 cell 사이에 걸치게 하지 않습니다.
Anchor를 직접 고르지 않고 데이터에서 찾는 법
Anchor를 도입하면 box 수가 늘어 recall은 81%에서 88%로 올랐지만, 원문 수치에서 mAP는 69.5에서 69.2로 조금 낮아졌습니다. anchor 자체가 모든 문제를 해결한 것이 아니라, 어떤 크기와 비율을 쓸지 결정하는 다음 단계가 필요했습니다.
YOLOv2는 ground-truth box에 k-means clustering을 적용해 prior를 정합니다. 단순한 Euclidean distance는 큰 box의 오차를 더 크게 만들기 때문에 box 크기와 무관하게 겹침 품질을 반영하는 IoU 기반 거리로 바꿉니다.
k가 커질수록 label과 cluster의 평균 IoU가 올라 recall에 유리하지만, predictor 수와 모델 복잡도도 증가합니다. 논문은 이 trade-off에서 k=5를 선택했습니다. 사람이 임의로 정한 anchor보다 데이터에서 얻은 cluster가 더 좋은 결과를 냈다는 점이 핵심입니다.
Anchor offset을 제한 없이 예측하면 학습 초기에 box 중심이 이미지 어디로든 튀어 불안정해집니다. YOLOv2는 tx, ty에 sigmoid를 적용해 중심을 해당 grid cell 내부의 0~1 범위에 둡니다. 폭과 높이는 prior pw, ph에 지수 함수를 적용합니다.
1
2
3
4
bx = sigmoid(tx) + cx
by = sigmoid(ty) + cy
bw = pw * exp(tw)
bh = ph * exp(th)
tx, ty, tw, th가 0에 가까우면 box는 cell 중심과 anchor 크기에서 시작합니다. 위치 제약과 dimension cluster를 함께 사용한 기록에서는 mAP가 5% 올랐습니다.
작은 물체와 여러 해상도를 다루는 두 장치
13×13 feature map은 큰 물체에는 충분하지만 작은 물체의 세부 위치를 잃기 쉽습니다. YOLOv2의 passthrough layer는 앞쪽 26×26×512 feature를 13×13×2048 형태로 재배열해 뒤쪽 13×13 feature와 연결합니다.
이 방식은 여러 scale에 별도 검출 head를 두는 대신 고해상도 정보를 한 번 전달하며, 원문에서는 약 1% 향상을 보였습니다. 다만 작은 물체 문제가 완전히 사라졌다는 뜻은 아닙니다. 최종 예측은 여전히 13×13 grid를 중심으로 이뤄집니다.
fully connected layer가 없으므로 입력 크기도 고정할 필요가 없습니다. 학습 중 10 batch마다 32의 배수인 320, 352, …, 608 중 하나로 입력을 바꾸는 multi-scale training을 사용합니다. 같은 모델을 낮은 해상도에서는 빠르게, 높은 해상도에서는 더 정확하게 운용할 수 있습니다. 기록상 288×288에서는 90 FPS로 동작하면서 Fast R-CNN에 가까운 mAP를 보였습니다.
특징 추출기 Darknet-19는 19개 convolution layer와 5개 max-pooling layer로 구성되고, 3×3 filter, pooling 뒤 channel 두 배, global average pooling, Batch Normalization을 사용합니다. VGG-16보다 불필요한 복잡성을 줄이면서 detection 속도를 지키려는 선택입니다.
YOLO9000의 범위와 남는 한계
YOLO9000은 detection 데이터와 classification 데이터를 함께 학습하기 위해 WordNet에서 계층적 WordTree를 구성합니다. class를 서로 완전히 배타적인 하나의 softmax 목록으로 두지 않고, 루트에서 하위 개념까지 조건부 확률을 곱합니다. 세부 견종을 확신하지 못해도 상위 개념인 “개”까지는 예측할 수 있는 구조입니다.
COCO와 ImageNet 상위 class를 합친 WordTree에는 9418개 class가 포함됐고, 큰 ImageNet 쪽으로 학습이 기울지 않도록 COCO를 4:1로 oversampling했습니다. 출력 크기를 줄이기 위해 prior는 5개가 아니라 3개를 사용합니다. classification 이미지는 box 정답이 없으므로 가장 높은 확률의 box에서 class loss를 계산하고, ground truth와 0.3 IoU 이상 겹칠 때만 objectness loss를 역전파합니다.
이 결합은 동물의 세부 class에는 강했지만 옷이나 장비 같은 범주는 잘 학습하지 못했습니다. 따라서 “9000개를 분류한다”는 숫자만으로 모든 범주를 같은 품질로 검출한다고 보면 안 됩니다. 모델을 고를 때는 다음 trade-off를 함께 봐야 합니다.
- 더 큰 입력은 정확도에 유리하지만 속도가 낮아집니다.
- anchor 수가 늘면 recall이 오르지만 계산과 출력이 커집니다.
- passthrough는 작은 물체 정보를 보완하지만 구조적 한계를 모두 없애지 않습니다.
- 계층적 class 결합은 label 관계의 이점을 얻지만 범주별 학습 품질은 다릅니다.
YOLOv2의 개선은 하나의 비법이 아니라 정규화, 해상도 적응, 데이터 기반 anchor, 안정적인 좌표식, 고해상도 feature, multi-scale 학습이 같은 실패 지점을 나눠 맡은 결과입니다.
어떤 개선이 어떤 오류를 줄이는가
분류기에서 detection으로 옮길 때 입력 해상도가 갑자기 커지면 앞쪽 feature도 새 스케일에 적응해야 합니다. 고해상도 fine-tuning은 이 간극을 줄이고, Batch Normalization은 각 layer의 학습 흐름을 안정화합니다. 두 장치는 box 표현 자체보다 네트워크를 학습하기 좋은 상태로 만드는 쪽에 가깝습니다.
Dimension cluster와 direct location prediction은 box 초기값과 위치 범위를 다룹니다. 데이터의 실제 폭, 높이 분포에서 prior를 얻고 중심 offset을 cell 안으로 제한하므로 학습 초기에 box가 이미지 전체로 튀는 문제를 줄입니다. Anchor 개수는 많을수록 무조건 좋은 값이 아니라 평균 IoU와 출력량 사이에서 골라야 합니다.
Passthrough와 multi-scale은 해상도 문제를 서로 다른 방식으로 보완합니다. Passthrough는 앞쪽의 세밀한 feature를 뒤쪽에 전달하고, multi-scale은 같은 가중치가 여러 입력 크기에 적응하게 합니다. 높은 해상도는 작은 물체에 유리할 수 있지만 계산량과 지연도 늘기 때문에 배포 장치에서 실제 속도를 함께 측정해야 합니다.
함께 읽으면 이해가 이어지는 글
- YOLOv2에 Anchor Box를 넣었는데 mAP가 떨어진 이유: Recall부터 다시 보기 — YOLOv2에서 anchor box가 recall은 높였지만 초기 mAP는 소폭 낮춘 이유와 k-means anchor, direct location prediction, passthrough, multi-scale 학습의 역할을…
- YOLOv3는 왜 3개 Scale과 BCE를 쓸까? 출력 Tensor 계산법 — YOLOv3가 세 해상도에서 anchor를 나누고 softmax 대신 독립 BCE를 쓰는 이유를 출력 tensor 식, Darknet-53, 작은 객체 개선과 localization 한계까지 설명합니다.
- DarkNet Detection Layer 출력 배열 읽는 법: class, objectness, box — DarkNet의 구형 Detection Layer가 셀별 클래스, 박스별 objectness와 좌표를 한 배열에 배치하고 담당 박스를 고르는 학습, 디코딩 흐름을 설명합니다.
자주 묻는 질문
YOLOv2는 anchor box만 추가해 성능을 높였나요?
아닙니다. Anchor 도입만으로 recall은 올랐지만 mAP는 소폭 낮아졌고, 데이터 기반 dimension cluster와 중심 좌표 제약을 함께 적용해 위치 예측을 안정화했습니다.
왜 YOLOv2 입력 크기는 416을 기준으로 하나요?
32배 downsampling 뒤 13×13의 홀수 feature map을 얻어 중앙 cell 하나를 만들기 위해서입니다. 화면 중심을 차지하는 큰 물체가 중앙 네 cell 사이에 걸리는 상황을 피하려는 선택입니다.
Multi-scale training을 하면 작은 물체 문제가 사라지나요?
사라지지 않습니다. 여러 입력 해상도에 적응하고 높은 해상도에서 세부 정보를 더 얻을 수 있지만, 최종 grid와 검출 구조의 제약 및 속도, 메모리 trade-off는 남습니다.
←→ 키와 좌우 스와이프를 지원합니다. 읽던 페이지는 이 기기에 저장됩니다.