객체 검출: 경계 상자 · IoU · NMS · mAP
경계 상자 · IoU · 앵커와 상자 회귀 · NMS · AP/mAP를 손계산하고 R-CNN과 YOLO를 비교하는 수업
먼저 알아야 할 것
다루는 내용
객체 검출의 기본 부품을 손계산으로 익힙니다. 상자 표현과 IoU, Faster R-CNN의 앵커 9개와 상자 회귀 식, 상자 4개로 따라가는 NMS, 검출 7개로 계산하는 AP와 COCO AP의 정의(IoU 0.5~0.95, 101점)를 다룹니다. R-CNN · Fast/Faster R-CNN · YOLO · RetinaNet · DETR를 원 논문이 보고한 특징으로 비교합니다.
해설
객체 검출: 경계 상자 · IoU · NMS · mAP
분류는 "이 사진에 고양이가 있다"까지만 답하지만, 검출은 "고양이가 여기(상자)에 있고, 개가 저기에 있다"까지 답합니다. 이 수업은 경계 상자를 숫자로 나타내는 법, 두 상자가 얼마나 겹치는지 재는 IoU, 겹친 예측을 정리하는 NMS, 검출기 성적표인 AP · mAP를 손계산으로 익히고, R-CNN 계열(두 단계)과 YOLO 계열(한 단계)이 어떻게 다른지 정리합니다.
| 항목 | 내용 |
|---|---|
| 참고 자료 | D2L '객체 검출과 경계 상자' 절 · d2l.ai/chapter_computer-vision/bounding-box.html, R-CNN · Fast/Faster R-CNN · YOLO · RetinaNet · DETR 원 논문(arXiv), COCO 평가 코드(pycocotools) |
| 트랙 · 수준 | 딥러닝 기초 · 중급 |
| 이 수업의 범위 | 경계 상자 표현, IoU, 앵커 상자와 상자 회귀, NMS, 정밀도-재현율 곡선, AP · mAP · COCO AP, 두 단계 vs 한 단계 검출기, 트랜스포머 검출기 |
| 먼저 알면 좋은 것 | 합성곱 신경망, 분류의 정밀도 · 재현율, 전이 학습 |
들어가기 전에
- 전이 학습과 자기지도 학습 — 검출기는 거의 항상 사전학습한 분류 모델을 몸통으로 가져와 씁니다.
- 모델 평가와 과적합 — 정밀도 · 재현율과 임곗값을 바꿀 때의 맞바꿈을 알고 오면 AP 계산이 쉽습니다.
한눈에 보기
- 경계 상자를 (모서리 두 점) 또는 (중심 · 너비 · 높이)로 나타내고 서로 바꿉니다.
- 두 상자의 IoU를 직접 계산하고, IoU 기준으로 "맞힌 검출"을 판정합니다.
- 앵커 상자와 상자 회귀 값이 무엇을 뜻하는지 Faster R-CNN의 식으로 계산합니다.
- NMS가 중복 상자를 지우는 과정을 상자 4개로 따라갑니다.
- 검출 7개로 정밀도-재현율 표를 만들어 AP를 계산하고, COCO AP가 무엇을 평균한 것인지 압니다.
1. 경계 상자와 IoU
직관(해설용 비유): 사진 위에 투명 자를 대고 물체를 감싸는 네모를 그리는 일입니다. 네모 하나는 숫자 4개면 정해집니다.
| 표현 | 숫자 4개 | 쓰임 |
|---|---|---|
| 모서리(corner) | 왼쪽 위 · 오른쪽 아래 | IoU 계산, 그리기 |
| 중심(center) | 상자 회귀, 앵커 |
바꾸는 식은 , 이고 세로도 같습니다. D2L의 경계 상자 절은 이 두 표현 사이를 바꾸는 함수를 먼저 만듭니다.
IoU(Intersection over Union, 겹침 비율):
| 기호 | 뜻 |
|---|---|
| 두 상자가 겹친 넓이 | |
| 둘 중 하나라도 덮는 넓이 |
숫자로 해 보기(해설용):
- 상자 A , B : 겹친 부분은 ~로 넓이 4, 합집합은 . IoU .
- 상자 C , D : 겹친 넓이 , 합집합 . IoU .
눈으로는 A와 B가 "꽤 겹쳐" 보여도 IoU는 0.14밖에 안 됩니다. 상자를 한 변의 절반만 밀어도 IoU가 빠르게 떨어진다는 점을 기억해 두면 좋습니다. 겹친 부분의 너비 · 높이가 음수가 되면 0으로 자르는 것도 잊지 말아야 합니다.
어디에 쓰나: (1) 예측 상자가 정답과 IoU 0.5 이상이면 "맞힘"으로 보는 평가, (2) 학습 때 앵커에 정답을 배정하는 기준, (3) 중복 예측을 지우는 NMS.
2. 앵커 상자와 상자 회귀
직관: 빈 종이에 상자를 그리라 하는 것보다, 미리 깔아 둔 여러 크기 · 모양의 "견본 상자(앵커)"를 조금씩 밀고 늘리라고 하는 편이 학습하기 쉽습니다.
Faster R-CNN의 영역 제안 네트워크(RPN)는 특징 맵의 각 위치에 기본값으로 크기 3개(넓이 ) × 가로세로비 3개(1:1, 1:2, 2:1) = 앵커 9개를 둡니다. 특징 맵이 면 앵커는 개이고, 논문은 가 보통 약 2,400이라고 적습니다. 그러면 앵커는 약 개입니다.
학습 때 앵커 라벨(Faster R-CNN 기본값): 어떤 정답 상자와 IoU가 0.7보다 크면 양성, 모든 정답과 0.3보다 작으면 음성입니다. 0.7을 넘는 앵커가 없으면 IoU가 가장 큰 앵커를 양성으로 둡니다. 그 사이는 학습에 쓰지 않습니다.
상자 회귀(box regression): 앵커 를 예측 상자 로 바꾸는 값 4개를 학습합니다.
| 기호 | 뜻 |
|---|---|
| 상자 중심 좌표 | |
| 상자 너비 · 높이 | |
| 아래 첨자 | 앵커 상자 |
| 네트워크가 예측하는 이동 · 크기 조정 값 |
숫자로 해 보기(해설용): 앵커 중심 (100, 100), 크기 128×128, 정답 상자 중심 (116, 92), 크기 160×96이면 , , , 입니다.
왜 이렇게 나누고 로그를 쓰나: 이동량을 앵커 크기로 나누면 큰 물체와 작은 물체의 오차를 같은 눈금으로 볼 수 있습니다. 크기는 비율이 중요하므로 로그를 씌워 "2배 크게"와 "절반 크기"가 로 대칭이 되게 합니다.
3. NMS: 겹친 예측 정리하기
직관: 검출기는 고양이 한 마리에 비슷한 상자를 여러 개 냅니다. 가장 자신 있는 상자 하나만 남기고, 그것과 많이 겹치는 나머지는 같은 물체로 보고 지웁니다.
단계 (클래스마다 따로)
- 상자를 점수 높은 순으로 정렬합니다.
- 가장 높은 상자를 결과에 넣습니다.
- 남은 상자 중 방금 넣은 상자와 IoU가 임곗값(예: 0.5) 이상인 것을 지웁니다.
- 남은 상자가 없을 때까지 2~3을 반복합니다.
숫자로 해 보기(해설용, 임곗값 0.5):
| 상자 | 좌표 | 점수 |
|---|---|---|
| A | (10, 10, 50, 50) | 0.9 |
| B | (12, 12, 52, 52) | 0.8 |
| C | (60, 60, 100, 100) | 0.7 |
| D | (30, 30, 70, 70) | 0.6 |
- A를 남깁니다. IoU(A, B) ≈ 0.822 → B 삭제. IoU(A, C) = 0, IoU(A, D) ≈ 0.143 → 유지.
- 남은 C, D 중 C를 남깁니다. IoU(C, D) ≈ 0.032 → D 유지.
- D를 남깁니다. 결과: A, C, D.
Faster R-CNN은 제안 영역을 줄일 때 NMS 임곗값 0.7을 씁니다. 임곗값이 낮으면 붙어 있는 서로 다른 물체(사람 무리)까지 지우고, 높으면 중복이 남습니다. DETR(2020)은 트랜스포머로 상자 집합을 한 번에 예측해 NMS와 앵커 생성 같은 손으로 설계한 부품을 없앴습니다.
flowchart LR
A[입력 이미지] --> B[사전학습 몸통 CNN]
B --> C[특징 맵]
C --> D{두 단계?}
D -- 예: Faster R-CNN --> E[RPN: 앵커마다 물체 점수 + 상자 회귀]
E --> F[제안 영역 NMS · 상위 선택]
F --> G[영역 특징 잘라내기 → 클래스 + 상자 다듬기]
D -- 아니오: YOLO · RetinaNet --> H[격자 · 앵커마다 클래스 + 상자 바로 예측]
G --> I[클래스별 NMS]
H --> I
I --> J[최종 상자 · 클래스 · 점수]4. 검출 성적표: AP와 mAP
직관: 검출 결과를 점수 높은 순으로 줄 세우고, 위에서부터 하나씩 받아들이며 정밀도와 재현율이 어떻게 바뀌는지 기록합니다. 그 곡선 아래 넓이가 AP(평균 정밀도)입니다.
단계
- 한 클래스의 모든 검출을 점수 순으로 정렬합니다.
- 위에서부터 각 검출이 정답 상자와 IoU ≥ 임곗값(예: 0.5)이고 아직 짝이 없는 정답과 맞으면 TP, 아니면 FP로 표시합니다. 정답 하나에는 검출 하나만 짝지을 수 있습니다.
- 누적 TP · FP로 정밀도 , 재현율 를 계산합니다.
- 정밀도를 "오른쪽에서 본 최댓값"으로 보간한 뒤 재현율 축으로 넓이를 구합니다.
- 클래스별 AP를 평균하면 mAP입니다.
숫자로 해 보기(해설용): 정답 상자 4개, 검출 7개의 판정이 점수 순으로 TP, TP, FP, TP, FP, FP, TP입니다.
| 순위 | 판정 | 누적 TP | 누적 FP | 정밀도 | 재현율 | 보간 정밀도 |
|---|---|---|---|---|---|---|
| 1 | TP | 1 | 0 | 1.000 | 0.25 | 1.000 |
| 2 | TP | 2 | 0 | 1.000 | 0.50 | 1.000 |
| 3 | FP | 2 | 1 | 0.667 | 0.50 | 0.750 |
| 4 | TP | 3 | 1 | 0.750 | 0.75 | 0.750 |
| 5 | FP | 3 | 2 | 0.600 | 0.75 | 0.571 |
| 6 | FP | 3 | 3 | 0.500 | 0.75 | 0.571 |
| 7 | TP | 4 | 3 | 0.571 | 1.00 | 0.571 |
재현율이 늘어나는 구간마다 (늘어난 재현율 × 보간 정밀도)를 더합니다.
COCO 방식처럼 재현율 0, 0.01, …, 1의 101개 점에서 보간 정밀도를 평균하면 약 0.832입니다(python으로 계산한 해설용 값). 계산 방식에 따라 소수점 아래가 조금 다를 수 있으니, 논문끼리 비교할 때는 같은 평가 코드를 썼는지 확인해야 합니다.
COCO AP가 평균하는 것 (pycocotools 기본값):
| 설정 | 값 |
|---|---|
| IoU 임곗값 | 0.50, 0.55, …, 0.95의 10개 — 주 지표 AP는 이 10개 평균 |
| 재현율 점 | 0.00~1.00, 0.01 간격 101개 |
| 이미지당 최대 검출 수 | 1, 10, 100 |
| 물체 크기 구간 | 작음 넓이 , 중간 ~, 큼 픽셀 |
AP50(IoU 0.5 기준)은 "대충 맞는 위치"를, AP75는 "꽤 정확한 위치"를 요구합니다. 0.5~0.95 평균은 상자를 정확하게 그리는 능력까지 봅니다.
5. 두 단계 검출기와 한 단계 검출기
| 계열 | 대표(연도) | 구조 | 원 논문이 보고한 특징 |
|---|---|---|---|
| R-CNN | Girshick 외(2013) | 영역 제안 → 영역마다 CNN 특징 → 분류 | PASCAL VOC 2012 mAP 53.3%, 이전 최고보다 30% 넘는 상대 향상 |
| Fast R-CNN | Girshick(2015) | 이미지 전체에 CNN 한 번, 영역 특징을 잘라 분류 · 회귀 | VGG16 기준 R-CNN보다 학습 9배, 테스트 213배 빠름 |
| Faster R-CNN | Ren · He · Girshick · Sun(2015) | 제안까지 신경망(RPN)으로, 몸통 특징 공유 | VGG-16으로 GPU에서 전체 과정 초당 5프레임 |
| YOLO | Redmon · Divvala · Girshick · Farhadi(2015) | 이미지를 한 번 보고 격자마다 상자 · 클래스 동시 예측 | 기본 모델 초당 45프레임, Fast YOLO 초당 155프레임 |
| RetinaNet | Lin 외(2017) | 한 단계 + 초점 손실(focal loss) | 밀집 검출기의 전경-배경 극심한 불균형을 정확도 차이의 핵심 원인으로 지목 |
| DETR | Carion 외(2020) | CNN + 트랜스포머, 상자 집합을 한 번에 예측 | NMS · 앵커 생성 없이 끝에서 끝까지 학습 |
왜 두 갈래가 생겼나: 두 단계 방식은 "물체가 있을 만한 곳"을 먼저 추리고 그곳만 자세히 보니 정확도에 유리했고, 한 단계 방식은 제안 단계를 없애 속도에 유리했습니다. 한 단계 방식의 약점은 배경 앵커가 압도적으로 많다는 점이었는데, RetinaNet의 초점 손실이 쉬운 배경 예의 손실 비중을 줄여 이 문제를 겨냥했습니다.
고르는 법(경험칙): 실시간 영상 · 엣지 기기는 한 단계 계열, 작은 물체나 정밀한 위치가 중요한 일은 두 단계 계열이나 최신 트랜스포머 검출기를 먼저 검토합니다. 결정은 대상 데이터의 AP와 실제 지연 시간을 함께 재서 합니다.
연습 문제
1. 상자 과 의 IoU는?
풀이: 겹친 넓이 , 합집합 , IoU 입니다.
2. 모서리 표현 을 중심 표현으로 바꾸면?
풀이: , , , 입니다.
3. 3절 예에서 NMS 임곗값을 0.1로 낮추면 결과는?
풀이: A를 남긴 뒤 B(0.822)와 D(0.143)가 0.1 이상이라 지워지고, C만 남습니다. 결과는 A, C입니다. 실제로 다른 물체였을 D까지 사라질 수 있습니다.
4. 4절 예에서 7번째 검출이 FP였다면 AP는?
풀이: 재현율이 0.75에서 멈추므로 입니다(이 경우 보간 정밀도는 순위 3~4에서 0.75).
스스로 점검
- IoU 0.5를 "맞힘" 기준으로 쓰면 어떤 오류는 잡지 못하나요?
- 답: 상자가 물체를 대충만 덮어도 맞힘으로 칩니다. 위치 정확도까지 보려면 AP75나 COCO의 0.5~0.95 평균 AP를 봅니다.
- NMS를 클래스마다 따로 하는 이유는?
- 답: 사람 위에 앉은 고양이처럼 다른 클래스 물체는 많이 겹쳐도 둘 다 남아야 하기 때문입니다.
- 상자 회귀에서 크기를 로 예측하는 이유는?
- 답: 크기 변화를 비율로 다뤄 확대 · 축소를 대칭으로 만들고, 물체 크기에 상관없이 비슷한 눈금으로 학습하기 위해서입니다.
용어 정리
| 용어 | 쉬운 뜻 |
|---|---|
| 객체 검출(object detection) | 사진 속 물체의 위치(상자)와 종류를 함께 찾기 |
| 경계 상자(bounding box) | 물체를 감싸는 네모, 숫자 4개로 표현 |
| IoU(Intersection over Union) | 두 상자의 겹친 넓이 ÷ 합친 넓이 |
| 앵커 상자(anchor box) | 미리 깔아 둔 견본 상자, 예측의 출발점 |
| 상자 회귀(box regression) | 앵커를 정답 상자로 옮기고 늘리는 값을 예측하기 |
| 영역 제안 네트워크(RPN) | 물체가 있을 만한 영역을 신경망으로 제안하는 부분 |
| NMS(non-maximum suppression) | 많이 겹친 중복 상자 중 최고 점수만 남기기 |
| AP(average precision) | 정밀도-재현율 곡선 아래 넓이 |
| mAP(mean AP) | 클래스별 AP의 평균 |
| 두 단계 · 한 단계 검출기 | 제안 후 분류 · 한 번에 예측하는 검출기 |
| 초점 손실(focal loss) | 쉬운 예의 손실 비중을 줄여 어려운 예에 집중하는 손실 |
더 깊이 보려면
D2L 컴퓨터 비전 장은 경계 상자 → 앵커 상자 → 다중 크기 검출 → SSD → R-CNN 계열 순서로 코드를 따라가며 설명합니다. COCO 평가 규칙은 pycocotools의 cocoeval.py 기본값에서 직접 확인할 수 있습니다. 검출 위에 픽셀 단위 마스크를 더하는 다음 단계는 이미지 분할 수업에서 다룹니다.
다음에 볼 것
- 이미지 분할: 의미 분할 · 인스턴스 분할 · U-Net — 상자 대신 픽셀마다 클래스를 정하는 과제와 Mask R-CNN을 봅니다.
- 비전 트랜스포머 · CLIP · 멀티모달 모델 한 번에 보기 — DETR처럼 트랜스포머를 비전에 쓰는 흐름을 이어 봅니다.
라이선스
이 글은 원문 번역이 아니라 KAITABASE가 직접 쓴 해설이며, 숫자 예는 설명용입니다(IoU · NMS · AP 손계산은 python으로 재확인). 참고 자료 D2L은 CC BY-SA 4.0입니다. 논문 수치는 각 arXiv 초록 · 본문에서 확인한 것만 옮겼습니다.
출처
- 참고: d2l.ai/chapter_computer-vision/bounding-b… (D2L 경계 상자 절)
- 원문: arxiv.org/abs/1311.2524 (2013 · Ross Girshick 외, R-CNN)
- 원문: arxiv.org/abs/1504.08083 (2015 · Ross Girshick, Fast R-CNN)
- 원문: arxiv.org/abs/1506.01497 (2015 · Shaoqing Ren 외, Faster R-CNN — 앵커 9개, 0.7/0.3 라벨, NMS 0.7, 상자 회귀 식)
- 원문: arxiv.org/abs/1506.02640 (2015 · Joseph Redmon 외, YOLO)
- 원문: arxiv.org/abs/1708.02002 (2017 · Tsung-Yi Lin 외, RetinaNet · 초점 손실)
- 원문: arxiv.org/abs/2005.12872 (2020 · Nicolas Carion 외, DETR)
- 참고: github.com/cocodataset/cocoapi/blob/maste… (COCO 평가 기본값)
AI 원리부터 이해하기 · 딥러닝 기초 모듈
딥러닝 기초 모듈 학습
이 글은 딥러닝 기초 모듈의 학습 자료입니다. 전체 29개 자료 중 21번째입니다.
출처·원문
원문 보기요약만