상태: 초안 (2026-10-13), 일부 실측. IoU·앵커·NMS 예제는 노트북 CPU 에서 직접 돌린 값입니다(
code/05_boxes.py, 1초 안). 논문 수치는 원문을 열어 조건과 함께 옮겼습니다. 하드웨어는 등급으로 적었습니다. 작성 규칙: 실측 데이터가 기본이고, 못 잰 것은 「미실측」으로 표시합니다.
목차
- 1. 검출이란, 그리고 IoU
- 2. R-CNN(2014): 후보마다 CNN
- 3. Fast R-CNN(2015): CNN 은 그림 전체에 한 번
- 4. Faster R-CNN(2015): 후보 찾기도 망이 한다
- 5. 그다음: FPN
- 6. 한계
- 7. 우리 프로젝트와의 연결
- 참고 문헌
1. 검출이란, 그리고 IoU
분류는 「이 그림에 무엇이 있나」, 검출은 「무엇이 어디에 몇 개 있나」입니다. 출력은 물체마다 상자 (x1, y1, x2, y2) 와 클래스, 그리고 신뢰도입니다.
상자가 얼마나 맞았는지는 IoU(Intersection over Union)로 잽니다. 두 상자의 겹친 넓이를 합친 넓이로 나눈 값으로, 완전히 겹치면 1, 안 겹치면 0 입니다. 손으로 계산하면 이렇습니다(실측).
| 정답 상자 | 예측 상자 | IoU |
|---|---|---|
| (0, 0, 10, 10) | (5, 0, 15, 10) 반만 겹침 | 0.333 |
| (0, 0, 10, 10) | (5, 5, 15, 15) 모서리만 겹침 | 0.143 |
| (0, 0, 10, 10) | (1, 1, 11, 11) 1칸 어긋남 | 0.681 |
| (0, 0, 10, 10) | (20, 20, 30, 30) 떨어짐 | 0.000 |
「반만 겹쳐도」 IoU 는 0.5 가 아니라 0.33 입니다. 1칸만 어긋나도 0.68 로 떨어집니다. 작은 물체일수록 몇 화소의 오차에 IoU 가 크게 흔들린다는 점은 탁구공처럼 작은 물체에서 상자 검출이 어려운 이유 중 하나입니다. 검출 논문의 「AP」·「mAP」는 IoU 문턱(보통 0.5, COCO 는 0.5–0.95 평균)을 넘은 것을 맞힌 것으로 치고 계산한 정밀도-재현율 곡선의 넓이입니다(계산은 6편에서 직접 해 봅니다).
검출의 근본 어려움은 물체의 개수와 크기를 미리 모른다는 것입니다. 분류처럼 출력 칸 수를 고정할 수 없습니다. 두 단계 검출기는 이렇게 답합니다. 「먼저 물체가 있을 만한 후보를 넉넉히 뽑고, 후보마다 분류기를 돌리자.」
2. R-CNN(2014): 후보마다 CNN
Girshick 등의 R-CNN 은 1편의 AlexNet 이 보여 준 CNN 특징을 검출로 가져온 첫 성공입니다.
- 후보 상자: 색·질감이 비슷한 영역을 합쳐 가는 고전 알고리즘(selective search)으로 그림당 약 2,000개의 후보를 뽑습니다.
- CNN 특징: 후보마다 그림을 잘라 227×227 로 늘려(주변 16px 여백 포함) CNN 에 넣습니다.
- 분류와 보정: 클래스마다 선형 SVM 으로 판정하고, 상자 위치를 조금 고치는 회귀를 따로 학습합니다. 상자 보정만으로 mAP 가 3–4점 올랐습니다.
결과(논문): PASCAL VOC 2010 mAP 53.7%, VOC 2012 53.3%(이전 최고보다 상대적으로 30% 넘게 높음), ILSVRC2013 검출 31.4%(OverFeat 24.3%). 그러나 그림 한 장에 GPU 로 13초, CPU 로 53초가 걸렸습니다. 2,000개 후보마다 CNN 을 따로 돌리기 때문입니다. 겹치는 후보들이 같은 화소를 2,000번 다시 계산하는 셈입니다.
3. Fast R-CNN(2015): CNN 은 그림 전체에 한 번
해법은 순서를 바꾸는 것입니다. 그림 전체를 CNN 에 한 번 통과시켜 특징 지도를 만들고, 후보 상자는 그 특징 지도 위에서 잘라 냅니다.
- RoI 풀링: 크기가 제각각인 후보 영역을 특징 지도 위에서 고정 크기(VGG16 의 경우 7×7)로 나눠 칸마다 최댓값을 뽑습니다. 그래야 뒤의 완전 연결층에 넣을 수 있습니다.
- 다중 과제 손실: 분류 손실과 상자 보정 손실(smooth L1: 오차가 1 보다 작으면 제곱, 크면 절댓값)을 더해 한 망에서 함께 학습합니다. SVM 과 회귀를 따로 학습하던 R-CNN 의 여러 단계를 하나로 합쳤습니다.
결과(논문, VGG16, 데이터센터 GPU 한 장): 학습 9.5시간(R-CNN 84시간), 시험 그림당 0.32초(R-CNN 대비 213배 빠름). VOC 2007 mAP 66.9%(07 데이터)·70.0%(07+12), VOC 2012 65.7%·68.4%. 그런데 이제 남은 병목은 CNN 이 아니라 후보 상자를 뽑는 selective search 였습니다. 다음 논문(Faster R-CNN)의 표에서 selective search + Fast R-CNN 은 그림당 1,830ms 인데, Fast R-CNN 본체가 0.3초 남짓이니 나머지 대부분이 후보 찾기입니다.
4. Faster R-CNN(2015): 후보 찾기도 망이 한다
Ren 등은 후보 찾기 자체를 CNN 특징 위의 작은 망, RPN(Region Proposal Network)으로 바꿨습니다. RPN 은 검출기와 같은 특징 지도를 나눠 쓰므로 후보를 거의 공짜로 얻습니다.
앵커
RPN 은 특징 지도의 각 칸마다 미리 정해 둔 기준 상자(앵커) k 개를 둡니다. 기본은 넓이 128²·256²·512² × 가로세로비 1:1·1:2·2:1 = 9개입니다. 모델은 앵커마다 두 가지를 냅니다.
- 이 앵커에 물체가 있나(물체/배경 점수)
- 앵커를 얼마나 옮기고 늘이면 물체에 맞나(보정값 4개)
상자를 처음부터 맞히는 대신 「기준 상자에서 얼마나 고칠까」를 맞히게 하는 것이 핵심입니다. 큰 물체·작은 물체·긴 물체가 각자 비슷한 앵커에서 출발하니 학습이 쉽습니다.
직접 해 보기: 앵커 깔기와 라벨 붙이기
1000×600 그림, 특징 지도 보폭 16 으로 앵커를 깔아 보았습니다(실측).
| 항목 | 우리 계산 | 논문 |
|---|---|---|
| 특징 지도 칸 수 | 62×37 = 2,294 | 약 2,400(60×40) |
| 앵커 수 | 20,646 | 약 20,000 |
| 그림 밖으로 안 나가는 앵커 | 8,044 | 약 6,000(학습에 쓰는 것) |
마지막 줄은 앵커의 중심·크기를 정하는 세부 규칙(반올림, 중심을 칸의 어디에 두나)에 따라 달라지는 것으로 보이며, 원인은 따로 확인하지 않았습니다.
라벨 규칙은 IoU 0.7 초과면 양성(물체), 0.3 미만이면 음성(배경), 그 사이는 학습에서 뺍니다. 가로 180 × 세로 240 짜리 물체(예: 화면 속 선수의 상반신) 하나를 놓고 라벨을 붙여 보았습니다.
IoU>0.7 양성 0개, IoU<0.3 음성 7,502개, 사이(무시) 542개, 가장 잘 맞는 앵커 IoU 0.659
가장 잘 맞는 앵커 [232, 168, 488, 424] → 보정값 tx,ty,tw,th = [0.117, 0.016, -0.352, -0.065]
양성이 0개입니다. 앵커 9종의 크기·비율이 이 물체와 딱 맞지 않으면 0.7 을 넘는 앵커가 없을 수 있습니다. 그래서 논문은 「정답 상자마다 IoU 가 가장 높은 앵커도 양성으로 친다」는 규칙을 함께 둡니다. 이 규칙이 없으면 이 물체는 학습에서 통째로 빠집니다. 앵커 설계(크기·비율)가 데이터의 물체 모양과 맞아야 한다는 것, 그리고 맞지 않을 때 생기는 구멍을 규칙으로 메운다는 것을 보여 주는 예입니다.
보정값은 tx = (정답 중심 x − 앵커 중심 x) / 앵커 너비, tw = log(정답 너비 / 앵커 너비) 꼴입니다. 앵커 크기로 나누고 로그를 써서, 큰 물체와 작은 물체의 오차가 비슷한 크기의 숫자가 되게 합니다.
NMS: 겹친 후보 지우기
한 물체에 비슷한 후보가 여럿 나오므로 비최대 억제(NMS)로 정리합니다. 점수가 가장 높은 상자를 남기고, 그것과 IoU 가 문턱을 넘는 나머지를 지운 뒤 반복합니다. 선수 둘이 반쯤 겹쳐 선 장면의 후보 넷(선수 A 에 0·1, 선수 B 에 2·3)으로 해 보았습니다(실측).
| NMS 문턱 | 남은 후보 | 결과 |
|---|---|---|
| 0.3 | [0] | 선수 B 를 놓침(A 와 B 의 IoU 가 0.33) |
| 0.5 | [0, 2] | 정답 |
| 0.9 | [0, 2, 1] | 선수 A 가 두 번 잡힘(0 과 1 의 IoU 0.86) |
문턱 하나로 「겹친 서로 다른 물체」와 「같은 물체의 중복」을 함께 가를 수 없습니다. 사람이 몰린 장면에서 NMS 가 약한 이유이고, 8편의 DETR 이 NMS 를 없애려 한 동기이기도 합니다.
결과(논문)
RPN 은 후보를 NMS(문턱 0.7)로 약 2,000개로 줄이고, 시험 때는 300개만 씁니다. selective search 의 2,000개보다 적은 후보로 더 정확했습니다.
| 항목 | 값 | 조건 |
|---|---|---|
| 속도 | 그림당 198ms(약 5fps) | VGG-16, 데이터센터 GPU 한 장. selective search + Fast R-CNN 은 1,830ms |
| VOC 2007 | mAP 73.2% | 07+12 학습 |
| VOC 2012 | mAP 70.4% | 07++12 학습 |
| COCO test-dev | AP@0.5 42.7, AP@[.5,.95] 21.9 | VGG-16, trainval 학습 |
5. 그다음: FPN
물체 크기가 다양하면 특징 지도 한 장으로는 부족합니다. FPN(Feature Pyramid Network, 2017)은 깊은 층의 특징을 2배씩 키워 내려오며(위에서 아래로) 같은 해상도의 얕은 층 특징을 1×1 합성곱으로 맞춰 더하는 피라미드를 만듭니다. 작은 물체는 고해상도 층에서, 큰 물체는 저해상도 층에서 찾습니다. 3편의 U-Net 과 생각이 닮았습니다. Faster R-CNN 에 FPN(ResNet-101)을 붙이면 COCO test-dev AP 36.2 였습니다(한 모델).
6. 한계
- 느리다. 두 단계(후보 → 판정)는 정확하지만 실시간에는 무겁습니다. 5fps 는 초당 60장인 탁구 영상에 한참 모자랍니다. 6편의 한 단계 검출기가 이 문제를 겨냥합니다.
- 손으로 정한 것이 많다. 앵커의 크기·비율, IoU 0.7/0.3 문턱, NMS 문턱 모두 사람이 정합니다. 4절 실험처럼 이 값들이 데이터와 안 맞으면 조용히 구멍이 생깁니다.
- 작은 물체. 보폭 16 특징 지도의 한 칸은 16×16 화소입니다. 지름 3–12px 인 탁구공은 한 칸보다 작습니다.
7. 우리 프로젝트와의 연결
TT Score 는 공을 상자로 찾지 않고 히트맵으로 찾습니다(3편). 위의 한계 셋이 모두 탁구공에 해당하기 때문입니다. 대신 상자 검출기는 사람을 찾는 데 씁니다. 정밀 자세 분석은 사람 검출기(RTMDet)로 사람 상자를 먼저 찾고, 그 상자를 잘라 관절을 찾는 「위에서 아래로(top-down)」 방식입니다(TT Score 모델 해부 4편). 검출기 → 잘라서 정밀 판정이라는 구조가 두 단계 검출기의 생각과 같습니다.
티티 한마디. 반만 겹쳐도 IoU 는 0.33 이에요. 상자 맞히기는 생각보다 깐깐한 시험이에요.
참고 문헌
- Girshick, R., Donahue, J., Darrell, T., Malik, J. (2014). Rich Feature Hierarchies for Accurate Object Detection and Semantic Segmentation. CVPR 2014. https://arxiv.org/abs/1311.2524
- Girshick, R. (2015). Fast R-CNN. ICCV 2015. https://arxiv.org/abs/1504.08083
- Ren, S., He, K., Girshick, R., Sun, J. (2015). Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks. NeurIPS 2015. https://arxiv.org/abs/1506.01497
- Lin, T.-Y. et al. (2017). Feature Pyramid Networks for Object Detection. https://arxiv.org/abs/1612.03144
- 예제 코드와 출력: 이 폴더의
code/05_boxes.py,code/05_boxes.out.txt