검색
← 모듈 로드맵

객체 검출: 경계 상자 · IoU · NMS · mAP

강의 · 준전문가 · KAITABASE 정리

경계 상자 · 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 한 단계 검출기, 트랜스포머 검출기
먼저 알면 좋은 것합성곱 신경망, 분류의 정밀도 · 재현율, 전이 학습

들어가기 전에

한눈에 보기

  • 경계 상자를 (모서리 두 점) 또는 (중심 · 너비 · 높이)로 나타내고 서로 바꿉니다.
  • 두 상자의 IoU를 직접 계산하고, IoU 기준으로 "맞힌 검출"을 판정합니다.
  • 앵커 상자와 상자 회귀 값이 무엇을 뜻하는지 Faster R-CNN의 식으로 계산합니다.
  • NMS가 중복 상자를 지우는 과정을 상자 4개로 따라갑니다.
  • 검출 7개로 정밀도-재현율 표를 만들어 AP를 계산하고, COCO AP가 무엇을 평균한 것인지 압니다.

1. 경계 상자와 IoU

직관(해설용 비유): 사진 위에 투명 자를 대고 물체를 감싸는 네모를 그리는 일입니다. 네모 하나는 숫자 4개면 정해집니다.

표현숫자 4개쓰임
모서리(corner)(x1,y1,x2,y2)(x_1, y_1, x_2, y_2) 왼쪽 위 · 오른쪽 아래IoU 계산, 그리기
중심(center)(cx,cy,w,h)(c_x, c_y, w, h)상자 회귀, 앵커

바꾸는 식은 cx=(x1+x2)/2c_x = (x_1 + x_2)/2, w=x2−x1w = x_2 - x_1이고 세로도 같습니다. D2L의 경계 상자 절은 이 두 표현 사이를 바꾸는 함수를 먼저 만듭니다.

IoU(Intersection over Union, 겹침 비율):

IoU(A,B)=∣A∩B∣∣A∪B∣=∣A∩B∣∣A∣+∣B∣−∣A∩B∣\mathrm{IoU}(A, B) = \frac{|A \cap B|}{|A \cup B|} = \frac{|A \cap B|}{|A| + |B| - |A \cap B|}
기호뜻
A∩BA \cap B두 상자가 겹친 넓이
A∪BA \cup B둘 중 하나라도 덮는 넓이

숫자로 해 보기(해설용):

  • 상자 A (0,0,4,4)(0, 0, 4, 4), B (2,2,6,6)(2, 2, 6, 6): 겹친 부분은 (2,2)(2,2)~(4,4)(4,4)로 넓이 4, 합집합은 16+16−4=2816 + 16 - 4 = 28. IoU =4/28≈0.143= 4/28 \approx 0.143.
  • 상자 C (1,1,5,5)(1, 1, 5, 5), D (2,1,6,5)(2, 1, 6, 5): 겹친 넓이 3×4=123 \times 4 = 12, 합집합 16+16−12=2016 + 16 - 12 = 20. IoU =0.6= 0.6.

눈으로는 A와 B가 "꽤 겹쳐" 보여도 IoU는 0.14밖에 안 됩니다. 상자를 한 변의 절반만 밀어도 IoU가 빠르게 떨어진다는 점을 기억해 두면 좋습니다. 겹친 부분의 너비 · 높이가 음수가 되면 0으로 자르는 것도 잊지 말아야 합니다.

어디에 쓰나: (1) 예측 상자가 정답과 IoU 0.5 이상이면 "맞힘"으로 보는 평가, (2) 학습 때 앵커에 정답을 배정하는 기준, (3) 중복 예측을 지우는 NMS.

2. 앵커 상자와 상자 회귀

직관: 빈 종이에 상자를 그리라 하는 것보다, 미리 깔아 둔 여러 크기 · 모양의 "견본 상자(앵커)"를 조금씩 밀고 늘리라고 하는 편이 학습하기 쉽습니다.

Faster R-CNN의 영역 제안 네트워크(RPN)는 특징 맵의 각 위치에 기본값으로 크기 3개(넓이 1282,2562,5122128^2, 256^2, 512^2) × 가로세로비 3개(1:1, 1:2, 2:1) = 앵커 9개를 둡니다. 특징 맵이 W×HW \times H면 앵커는 WHkWHk개이고, 논문은 W×HW \times H가 보통 약 2,400이라고 적습니다. 그러면 앵커는 약 2,400×9=21,6002{,}400 \times 9 = 21{,}600개입니다.

학습 때 앵커 라벨(Faster R-CNN 기본값): 어떤 정답 상자와 IoU가 0.7보다 크면 양성, 모든 정답과 0.3보다 작으면 음성입니다. 0.7을 넘는 앵커가 없으면 IoU가 가장 큰 앵커를 양성으로 둡니다. 그 사이는 학습에 쓰지 않습니다.

상자 회귀(box regression): 앵커 (xa,ya,wa,ha)(x_a, y_a, w_a, h_a)를 예측 상자 (x,y,w,h)(x, y, w, h)로 바꾸는 값 4개를 학습합니다.

tx=x−xawa,ty=y−yaha,tw=log⁡wwa,th=log⁡hhat_x = \frac{x - x_a}{w_a}, \quad t_y = \frac{y - y_a}{h_a}, \quad t_w = \log\frac{w}{w_a}, \quad t_h = \log\frac{h}{h_a}
기호뜻
x,yx, y상자 중심 좌표
w,hw, h상자 너비 · 높이
아래 첨자 aa앵커 상자
tt네트워크가 예측하는 이동 · 크기 조정 값

숫자로 해 보기(해설용): 앵커 중심 (100, 100), 크기 128×128, 정답 상자 중심 (116, 92), 크기 160×96이면 tx=16/128=0.125t_x = 16/128 = 0.125, ty=−8/128=−0.0625t_y = -8/128 = -0.0625, tw=ln⁡1.25≈0.223t_w = \ln 1.25 \approx 0.223, th=ln⁡0.75≈−0.288t_h = \ln 0.75 \approx -0.288입니다.

왜 이렇게 나누고 로그를 쓰나: 이동량을 앵커 크기로 나누면 큰 물체와 작은 물체의 오차를 같은 눈금으로 볼 수 있습니다. 크기는 비율이 중요하므로 로그를 씌워 "2배 크게"와 "절반 크기"가 ±ln⁡2\pm \ln 2로 대칭이 되게 합니다.

3. NMS: 겹친 예측 정리하기

직관: 검출기는 고양이 한 마리에 비슷한 상자를 여러 개 냅니다. 가장 자신 있는 상자 하나만 남기고, 그것과 많이 겹치는 나머지는 같은 물체로 보고 지웁니다.

단계 (클래스마다 따로)

  1. 상자를 점수 높은 순으로 정렬합니다.
  2. 가장 높은 상자를 결과에 넣습니다.
  3. 남은 상자 중 방금 넣은 상자와 IoU가 임곗값(예: 0.5) 이상인 것을 지웁니다.
  4. 남은 상자가 없을 때까지 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
  1. A를 남깁니다. IoU(A, B) ≈ 0.822 → B 삭제. IoU(A, C) = 0, IoU(A, D) ≈ 0.143 → 유지.
  2. 남은 C, D 중 C를 남깁니다. IoU(C, D) ≈ 0.032 → D 유지.
  3. D를 남깁니다. 결과: A, C, D.

Faster R-CNN은 제안 영역을 줄일 때 NMS 임곗값 0.7을 씁니다. 임곗값이 낮으면 붙어 있는 서로 다른 물체(사람 무리)까지 지우고, 높으면 중복이 남습니다. DETR(2020)은 트랜스포머로 상자 집합을 한 번에 예측해 NMS와 앵커 생성 같은 손으로 설계한 부품을 없앴습니다.

mermaid
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(평균 정밀도)입니다.

단계

  1. 한 클래스의 모든 검출을 점수 순으로 정렬합니다.
  2. 위에서부터 각 검출이 정답 상자와 IoU ≥ 임곗값(예: 0.5)이고 아직 짝이 없는 정답과 맞으면 TP, 아니면 FP로 표시합니다. 정답 하나에는 검출 하나만 짝지을 수 있습니다.
  3. 누적 TP · FP로 정밀도 =TP/(TP+FP)= TP/(TP+FP), 재현율 =TP/(정답 수)= TP/(\text{정답 수})를 계산합니다.
  4. 정밀도를 "오른쪽에서 본 최댓값"으로 보간한 뒤 재현율 축으로 넓이를 구합니다.
  5. 클래스별 AP를 평균하면 mAP입니다.

숫자로 해 보기(해설용): 정답 상자 4개, 검출 7개의 판정이 점수 순으로 TP, TP, FP, TP, FP, FP, TP입니다.

순위판정누적 TP누적 FP정밀도재현율보간 정밀도
1TP101.0000.251.000
2TP201.0000.501.000
3FP210.6670.500.750
4TP310.7500.750.750
5FP320.6000.750.571
6FP330.5000.750.571
7TP430.5711.000.571

재현율이 늘어나는 구간마다 (늘어난 재현율 × 보간 정밀도)를 더합니다.

AP=0.25×1+0.25×1+0.25×0.75+0.25×0.571≈0.830\mathrm{AP} = 0.25 \times 1 + 0.25 \times 1 + 0.25 \times 0.75 + 0.25 \times 0.571 \approx 0.830

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
물체 크기 구간작음 넓이 <322< 32^2, 중간 32232^2~96296^2, 큼 >962> 96^2 픽셀

AP50(IoU 0.5 기준)은 "대충 맞는 위치"를, AP75는 "꽤 정확한 위치"를 요구합니다. 0.5~0.95 평균은 상자를 정확하게 그리는 능력까지 봅니다.

5. 두 단계 검출기와 한 단계 검출기

계열대표(연도)구조원 논문이 보고한 특징
R-CNNGirshick 외(2013)영역 제안 → 영역마다 CNN 특징 → 분류PASCAL VOC 2012 mAP 53.3%, 이전 최고보다 30% 넘는 상대 향상
Fast R-CNNGirshick(2015)이미지 전체에 CNN 한 번, 영역 특징을 잘라 분류 · 회귀VGG16 기준 R-CNN보다 학습 9배, 테스트 213배 빠름
Faster R-CNNRen · He · Girshick · Sun(2015)제안까지 신경망(RPN)으로, 몸통 특징 공유VGG-16으로 GPU에서 전체 과정 초당 5프레임
YOLORedmon · Divvala · Girshick · Farhadi(2015)이미지를 한 번 보고 격자마다 상자 · 클래스 동시 예측기본 모델 초당 45프레임, Fast YOLO 초당 155프레임
RetinaNetLin 외(2017)한 단계 + 초점 손실(focal loss)밀집 검출기의 전경-배경 극심한 불균형을 정확도 차이의 핵심 원인으로 지목
DETRCarion 외(2020)CNN + 트랜스포머, 상자 집합을 한 번에 예측NMS · 앵커 생성 없이 끝에서 끝까지 학습

왜 두 갈래가 생겼나: 두 단계 방식은 "물체가 있을 만한 곳"을 먼저 추리고 그곳만 자세히 보니 정확도에 유리했고, 한 단계 방식은 제안 단계를 없애 속도에 유리했습니다. 한 단계 방식의 약점은 배경 앵커가 압도적으로 많다는 점이었는데, RetinaNet의 초점 손실이 쉬운 배경 예의 손실 비중을 줄여 이 문제를 겨냥했습니다.

고르는 법(경험칙): 실시간 영상 · 엣지 기기는 한 단계 계열, 작은 물체나 정밀한 위치가 중요한 일은 두 단계 계열이나 최신 트랜스포머 검출기를 먼저 검토합니다. 결정은 대상 데이터의 AP와 실제 지연 시간을 함께 재서 합니다.

연습 문제

1. 상자 (0,0,10,10)(0, 0, 10, 10)과 (5,0,15,10)(5, 0, 15, 10)의 IoU는?

풀이: 겹친 넓이 5×10=505 \times 10 = 50, 합집합 100+100−50=150100 + 100 - 50 = 150, IoU =1/3≈0.333= 1/3 \approx 0.333입니다.

2. 모서리 표현 (20,30,60,90)(20, 30, 60, 90)을 중심 표현으로 바꾸면?

풀이: cx=40c_x = 40, cy=60c_y = 60, w=40w = 40, h=60h = 60입니다.

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에서 멈추므로 0.25+0.25+0.25×0.75=0.68750.25 + 0.25 + 0.25 \times 0.75 = 0.6875입니다(이 경우 보간 정밀도는 순위 3~4에서 0.75).

스스로 점검

  1. IoU 0.5를 "맞힘" 기준으로 쓰면 어떤 오류는 잡지 못하나요?
    • 답: 상자가 물체를 대충만 덮어도 맞힘으로 칩니다. 위치 정확도까지 보려면 AP75나 COCO의 0.5~0.95 평균 AP를 봅니다.
  2. NMS를 클래스마다 따로 하는 이유는?
    • 답: 사람 위에 앉은 고양이처럼 다른 클래스 물체는 많이 겹쳐도 둘 다 남아야 하기 때문입니다.
  3. 상자 회귀에서 크기를 log⁡(w/wa)\log(w/w_a)로 예측하는 이유는?
    • 답: 크기 변화를 비율로 다뤄 확대 · 축소를 대칭으로 만들고, 물체 크기에 상관없이 비슷한 눈금으로 학습하기 위해서입니다.

용어 정리

용어쉬운 뜻
객체 검출(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 기본값에서 직접 확인할 수 있습니다. 검출 위에 픽셀 단위 마스크를 더하는 다음 단계는 이미지 분할 수업에서 다룹니다.

다음에 볼 것

라이선스

이 글은 원문 번역이 아니라 KAITABASE가 직접 쓴 해설이며, 숫자 예는 설명용입니다(IoU · NMS · AP 손계산은 python으로 재확인). 참고 자료 D2L은 CC BY-SA 4.0입니다. 논문 수치는 각 arXiv 초록 · 본문에서 확인한 것만 옮겼습니다.

출처

AI 원리부터 이해하기 · 딥러닝 기초 모듈

딥러닝 기초 모듈 학습

이 글은 딥러닝 기초 모듈의 학습 자료입니다. 전체 29개 자료 중 21번째입니다.

AI 기초 과정은 현재 진도 저장을 지원하지 않습니다.

출처·원문

원문 보기

요약만

본문 자체 작성 · 참고 자료 D2L(CC BY-SA 4.0)