TT Lab
요금제

한국어

시작하기
블로그

블로그

물체 검출 1: 두 단계 검출기 R-CNN 에서 Faster R-CNN 까지, 그리고 앵커

상태: 초안 (2026-10-13), 일부 실측. IoU·앵커·NMS 예제는 노트북 CPU 에서 직접 돌린 값입니다(code/05_boxes.py, 1초 안). 논문 수치는 원문을 열어 조건과 함께 옮겼습니다. 하드웨어는 등급으로 적었습니다. 작성 규칙: 실측 데이터가 기본이고, 못 잰 것은 「미실측」으로 표시합니다.

목차

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편에서 직접 해 봅니다).

검출의 근본 어려움은 물체의 개수와 크기를 미리 모른다는 것입니다. 분류처럼 출력 칸 수를 고정할 수 없습니다. 두 단계 검출기는 이렇게 답합니다. 「먼저 물체가 있을 만한 후보를 넉넉히 뽑고, 후보마다 분류기를 돌리자.」

두 단계 검출기: 무엇을 한 번만 하게 되었나 R-CNN (2014) 후보 2,000개 CNN 후보마다 SVM 상자 보정 장당 13초(GPU) Fast R-CNN (2015) 후보 상자 CNN 한 번 그림 전체 RoI 풀링 분류·보정 시험 213배 빠름 Faster R-CNN (2015) CNN 한 번 RPN 후보 = 앵커 RoI 풀링 분류·보정 약 5fps 앵커: 한 칸마다 크기 3 × 비율 3 = 9개 모델은 앵커마다 「물체인가」와 「얼마나 옮기고 늘일까」를 낸다
그림: R-CNN, Fast R-CNN, Faster R-CNN 의 단계 비교와 한 칸에 깔리는 앵커 9개

2. R-CNN(2014): 후보마다 CNN

Girshick 등의 R-CNN 은 1편의 AlexNet 이 보여 준 CNN 특징을 검출로 가져온 첫 성공입니다.

  1. 후보 상자: 색·질감이 비슷한 영역을 합쳐 가는 고전 알고리즘(selective search)으로 그림당 약 2,000개의 후보를 뽑습니다.
  2. CNN 특징: 후보마다 그림을 잘라 227×227 로 늘려(주변 16px 여백 포함) CNN 에 넣습니다.
  3. 분류와 보정: 클래스마다 선형 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 에 한 번 통과시켜 특징 지도를 만들고, 후보 상자는 그 특징 지도 위에서 잘라 냅니다.

결과(논문, 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개입니다. 모델은 앵커마다 두 가지를 냅니다.

  1. 이 앵커에 물체가 있나(물체/배경 점수)
  2. 앵커를 얼마나 옮기고 늘이면 물체에 맞나(보정값 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. 한계

7. 우리 프로젝트와의 연결

TT Score 는 공을 상자로 찾지 않고 히트맵으로 찾습니다(3편). 위의 한계 셋이 모두 탁구공에 해당하기 때문입니다. 대신 상자 검출기는 사람을 찾는 데 씁니다. 정밀 자세 분석은 사람 검출기(RTMDet)로 사람 상자를 먼저 찾고, 그 상자를 잘라 관절을 찾는 「위에서 아래로(top-down)」 방식입니다(TT Score 모델 해부 4편). 검출기 → 잘라서 정밀 판정이라는 구조가 두 단계 검출기의 생각과 같습니다.

티티 한마디. 반만 겹쳐도 IoU 는 0.33 이에요. 상자 맞히기는 생각보다 깐깐한 시험이에요.

참고 문헌

로그인하면 좋아요를 누를 수 있습니다

댓글

아직 댓글이 없습니다.

로그인하면 댓글을 쓸 수 있습니다