Two-Stage Object Detectors
2단계 객체 탐지기는 후보 영역을 제안한 다음 각 영역을 분류하고 정제합니다. Faster R-CNN의 작동 방식, R-CNN 계열, 장단점을 살펴봅니다.
2단계 객체 탐지기는 작업을 두 단계로 나누는 객체 탐지 모델입니다. 첫 단계에서는 이미지에 객체가 있을 만한 영역을 제안하고, 두 번째 단계에서는 각 영역을 분류한 다음 바운딩 박스를 보정합니다. R-CNN 계열은 2014년부터 2018년까지 이 설계를 정립했으며, 수년간 객체 탐지 및 인스턴스 분할 벤치마크를 선도했습니다. 1단계 객체 탐지기는 제안 단계를 건너뛰고 조밀한 그리드에서 한 번에 모든 박스를 예측합니다. 따라서 대부분의 실시간 시스템은 1단계 객체 탐지기를 사용합니다.
2단계 탐지기의 작동 방식#
백본 합성곱 신경망은 전체 이미지의 특징 맵을 한 번 계산하며, 대개 그 위에 특징 피라미드 네트워크(FPN)를 추가합니다. 첫 단계의 영역 제안 네트워크(RPN)는 특징 맵의 각 위치에서 앵커 박스 집합의 객체 여부 점수를 계산하고, 앵커의 형태를 조정하는 오프셋을 회귀합니다. Faster R-CNN은 위치마다 앵커 9개, 즉 크기 3개와 종횡비 3개를 사용합니다. 비최대 억제(NMS)는 겹치는 제안을 제거하며, 원 논문에서는 테스트 시 이미지당 점수가 가장 높은 영역 300개를 두 번째 단계로 전달했습니다. 두 번째 단계에서는 RoI 풀링 또는 더 정밀한 후속 기법인 RoIAlign이 각 제안 영역의 특징을 고정 크기 그리드로 자릅니다. 그런 다음 작은 헤드가 배경 클래스를 포함한 클래스를 예측하고, 각 크롭에 대해 클래스별 박스 오프셋을 예측합니다.
torchvision의 Faster R-CNN에서 RPN의 순전파 훅을 사용하면 두 번째 단계에 전달되는 작업량을 확인할 수 있습니다.
import urllib.request
from PIL import Image
from torchvision.models.detection import FasterRCNN_ResNet50_FPN_V2_Weights, fasterrcnn_resnet50_fpn_v2
# Load Faster R-CNN with a ResNet-50 FPN backbone, pretrained on COCO
weights = FasterRCNN_ResNet50_FPN_V2_Weights.DEFAULT
model = fasterrcnn_resnet50_fpn_v2(weights=weights).eval()
image = Image.open(urllib.request.urlopen("https://ultralytics.com/images/bus.jpg"))
# Report how many regions the first stage, the region proposal network, passes on
model.rpn.register_forward_hook(lambda module, inputs, output: print(f"Stage 1: {len(output[0][0])} proposals"))
# The second stage classifies and refines every proposal
detections = model([weights.transforms()(image)])[0]
labels = detections["labels"][detections["scores"] > 0.5]
print(f"Stage 2: {len(labels)} objects {[weights.meta['categories'][i] for i in labels]}")다음 결과가 출력됩니다: Stage 1: 1000 proposals 및 Stage 2: 6 objects ['person', 'bus', 'person', 'person', 'person', 'tie']. torchvision은 추론 시 이미지당 제안 영역 1,000개를 유지하며, 두 번째 단계는 이 영역에서 신뢰도 높은 탐지 결과 6개를 생성합니다.
R-CNN 계열#
- R-CNN(2014): 선택적 탐색으로 약 2,000개의 영역을 제안하고, 각 영역의 크기를 조정해 CNN에 개별 입력한 다음 서포트 벡터 머신으로 특징을 분류했습니다. 그 결과 VGG-16 백본을 사용한 탐지는 GPU에서 이미지당 47초가 걸렸습니다.
- Fast R-CNN(2015): 특징 맵을 한 번 계산하고 RoI 풀링으로 각 제안 영역의 특징을 추출해 풀링함으로써, VGG-16의 학습 속도를 R-CNN보다 9배, 테스트 속도를 213배 높였습니다.
- Faster R-CNN(2015): RPN이 선택적 탐색을 대체하고 백본의 특징을 공유하므로 제안 생성 비용이 거의 들지 않았으며, 전체 탐지기는 초당 5프레임으로 실행됐습니다.
- Mask R-CNN(2017): 세 번째 분기가 각 영역의 픽셀 마스크를 예측해 탐지기를 인스턴스 분할 모델로 확장합니다. 또한 RoIAlign은 RoI 풀링이 반올림하던 위치에서 정확한 소수점 좌표의 특징을 샘플링합니다.
- Cascade R-CNN(2018): IoU 임계값을 0.5, 0.6, 0.7로 높이며 학습한 두 번째 단계의 헤드 3개가 각각 앞 단계의 박스를 보정해 위치를 더 정밀하게 추정합니다.
2단계 탐지기와 1단계 탐지기 비교#
RPN은 분류기가 보기 전에 대부분의 배경을 제거하므로, 두 번째 단계는 객체가 일정 비율을 차지하도록 샘플링한 영역을 학습합니다. Fast R-CNN의 경우 그 비율은 25%이며, 각 영역을 정확한 위치에서 풀링한 특징으로 분류합니다. 1단계 탐지기는 조밀한 그리드의 모든 위치에 점수를 매기며, RetinaNet의 경우 이미지당 후보가 약 100,000개에 이릅니다. 2017년 초점 손실이 쉬운 배경 후보의 가중치를 낮추기 전까지 1단계 탐지기의 정확도는 2단계 탐지기보다 낮았습니다. 현재 1단계 모델은 훨씬 낮은 지연 시간으로 2단계 모델과 같거나 더 높은 정확도를 달성합니다. 단일 네트워크는 엣지 하드웨어로 내보내기도 더 간단하므로, 이제 2단계 모델은 주로 연구 기준 모델이나 Detectron2와 같은 라이브러리에서 사용됩니다. Ultralytics의 auto_annotate은 데이터 주석에 두 모델을 사용하는 동일한 제안 후 보정 방식을 적용합니다. YOLO26 탐지기가 박스를 제안하고, 각 박스를 프롬프트로 받은 Meta의 Segment Anything Model(SAM)이 박스 내부의 객체를 분할해 분할 라벨을 작성합니다.
실제 적용 사례#
- 의료 영상: Mask R-CNN 변형 모델은 현미경 이미지와 CT 스캔에서 개별 세포, 세포핵, 병변을 탐지하고 윤곽을 표시합니다. 계수와 측정을 위해 각 인스턴스마다 별도의 마스크가 필요합니다.
- 문서 레이아웃 분석: 360,000개가 넘는 페이지 이미지가 포함된 PubLayNet 벤치마크로 Faster R-CNN 및 Mask R-CNN 모델을 학습해 텍스트 인식에 앞서 텍스트 블록, 제목, 목록, 표, 그림을 찾았습니다.
- 항공 이미지: Oriented R-CNN은 RPN을 확장해 회전된 영역을 제안하므로, 두 번째 단계에서 DOTA 데이터 세트의 선박, 비행기, 차량에 대한 회전 경계 상자를 출력합니다.










