R-CNN & Fast R-CNN & Faster R-CNN

박주용·2025년 1월 10일

오늘은 컴퓨터 비전 분야 중 한 축을 차지하는 object detection (객체 감지) 분야에서 시초 격의 모델인 R-CNN 시리즈에 대해 알아보자.
위 그림은 object detection 분야에서 발표된 대표적인 모델들인데, 축을 기준으로 위쪽은 2-stage detector, 아래는 1-stage detector 구조이다. 둘의 특성은 명확히 다른데, 오늘 알아볼 R-CNN 시리즈는 모두 2-stage detector에 해당한다.

0. one-stage detector VS two-stage detector

Object detection task에서는 두 가지를 예측해야 한다. Regression을 통한 객체의 위치 (bounding-box), 그리고 classification을 통한 객체의 종류 (class).

그래서...
1) 일단 객체가 있을만한 위치를 찾는 region proposal
2) 객체를 분류하고 box 위치를 조정하는 과정이 진행된다.

이때 이 과정을 한 번에 end-to-end로 할 것인지, 아니면 2단계에 걸쳐 해결할 것인지에 따라 모델의 구조가 나뉘게 된다.

1) One-stage Detector

작동 방식:

  • 입력 이미지를 한 번의 pipeline를 통해 처리하여 객체의 위치와 클래스 정보를 동시에 예측
  • 이미지 전체를 격자(grid) 형태로 나누고, 각 셀에서 객체의 b-box와 class 확률을 직접 계산
  • 예측은 일반적으로 앵커 박스(anchor box)의 regression 기반으로 수행
  • backbone 네트워크(예: ResNet, Darknet)와 detection head가 결합되어 있어 단일 구조로 동작.

대표 모델: YOLO(You Only Look Once), SSD(Single Shot MultiBox Detector)

장점:

  • 빠른 처리 속도
  • 모델 구조가 간단하고 경량화 가능

단점:

  • 작은 객체나 복잡한 배경에서의 성능 저하
  • 높은 정확도보다는 속도에 초점

2) Two-stage Detector

작동 방식:

  • 1단계 - Region Proposal 생성:
    Region Proposal Network(RPN) 또는 Selective Search 알고리즘을 사용하여 입력 이미지에서 객체가 있을 가능성이 높은 후보 영역(region proposal)을 생성.
    이 단계는 객체의 정확한 분류보다는 객체가 존재할 위치를 대략적으로 찾는 데 초점.
  • 2단계 - classification 및 b-box 조정:
    후보 영역을 잘라서(ROI pooling) 개별적으로 네트워크에 입력.
    각 영역에 대해 객체의 클래스와 정교한 경계 상자 위치를 예측.

두 단계가 연속적으로 수행되며, region proposal을 먼저 생성하고 이를 바탕으로 객체 분류와 경계 상자 regression을 수행한다.

대표 모델: R-CNN, Fast R-CNN, Faster R-CNN

장점:

  • 복잡한 장면과 작은 객체에서도 우수한 성능
  • 더 정교한 탐지 가능

단점:

  • 처리 속도가 느림
  • 모델 구조가 복잡
  • 더 많은 계산 자원 필요

1. R-CNN

그렇다면 오늘 알아볼 2-stage detector의 시조, R-CNN이란 무엇인가? 풀네임은 Region-Based CNN, 즉 기본적으로 ConvNet을 활용하는 구조이다. 전체 구조는 다음과 같다.
전체 과정을 5단계로 나눠 알아보자.

1) Region Proposal

Selective Search 라는 알고리즘을 사용하여 RoI를 2000여 개 정도 선정한다. 즉, '예비' bounding box를 만드는 과정이다. 이때 selective search는 CPU에서 작동하는데 상당히 빠르다. 이미지를 작은 조각(superpixels)으로 나눈 후, 색상, 텍스처, 크기 등의 유사성을 기준으로 영역을 병합하며 후보 영역을 생성하는 방법이다.

2) Image Resizing

이후 각 region을 227x227 사이즈로 resize(warping)한다. 각 region의 크기가 다를 수 밖에 없는데, 다음 단계인 CNN에 넣기 위해서는 사이즈를 전부 통일하여야 한다.

3) CNN

크기가 조절된 bounding box들을 이제 이미지넷 데이터로 사전학습된 AlexNet에 '각각' forward 시킨다.
물론 완전히 동일하지는 않고 object detection에 맞게 약간씩 조정을 했다.

4) Image Classification

이제 CNN의 output을 linear SVM으로 classify하는 과정이다. 즉, 각 bounding box들은 어떤 물체일 확률 값을 갖게 된다.
근데 일반적으로 CNN에서는 classifier로 softmax를 사용하는데 왜 여기서는 기계학습 분야에서 많이 사용되는 SVM을 썼는가?
음... 단순히 성능이 더 좋아서다.

5) Bounding Box Regression

마지막으로 bounding box regression으로 box의 위치를 교정한다. 단순한 선형회귀 모델로, ground truth 위치인 G에 초기 bounding box 위치 P가 맞춰지도록 'transform'하는 것을 학습한다.

2. Fast R-CNN

R-CNN은 당시 획기적인 모델로 높은 성능을 자랑했지만, 치명적인 문제가 있었다. 1) 모든 region을 독립적으로 CNN에 통과시킨다는 점에서 상당히 속도가 느렸다. 2) 또한 모델을 한 번에 학습이 불가능했다.
따라서 R-CNN의 여러 단점을 보완하고 속도를 높인 Fast R-CNN이 등장한다. 전체 구조는 다음과 같다.
R-CNN과 달리 각 bounding-box 별로 CNN을 적용하는게 아니라 하나의 이미지를 통으로 CNN에 넣게 된다. 이때 사용하는 네트워크는 VGG16이며, conv5 단계까지만 적용한다. 결과적으로 feature map이 추출된다.

이후 가장 중요한 개념인 RoI Pooling이 등장한다. 먼저 R-CNN과 마찬가지로 처음에(CNN 전) 약 2000개의 RoI를 selective search로 찾아놓는다. 그 후 이 RoI들을 추출된 feature map 크기에 맞춰서 매핑하는데, 당연히 사이즈가 맞지 않을 것이다. Feature map의 사이즈는 원본보다 훨씬 작기 때문.
바로 여기서 RoI pooling을 사용하여 해결한다. 위 과정처럼 원본 이미지와 RoI를 일정 크기의 격자로 나누고, max pooling 하는 원리이다. 결과적으로 그 다음 단계인 FC layer에 들어가기 전, 모든 RoI를 고정된 크기의 feature vector로 변환할 수 있는 것이다.

이제 이 벡터를 flatten 한 뒤 4096 output의 FC layer에 통과시킨다.
그 이후, 두 분기로 나눠서 각각 (k+1) / (k+1) x 4 크기의 feature vector를 출력하는 FC layer에 입력한다. (k개의 객체 클래스 + 배경 1개, 4개의 bounding box 좌표)
전자는 객체 클래스 분류, 후자는 bounding box 회귀를 위해 사용된다.

최종적으로, 이 두 output을 입력받는 multi-task loss를 loss function으로 쓰기 때문에 한 번에 학습이 가능하다.

놀라운 점은 RoI pooling 덕분에 classification과 b-box regression이 한 feature map을 공유할 수 있게 됐다는 점이다. 다시 말해, 분류 문제와 회귀 문제를 end-to-end로 해결할 수 있게 됐다는 것이다!

정리하자면, Fast R-CNN은 R-CNN의 두 가지 문제를 해결하였다.
1) 2000번 연산하던 CNN을 단 한 번으로 줄였고,
2) RoI pooling을 활용해 분류와 회귀를 한 번에 학습할 수 있게 했다.
Fast R-CNN이 R-CNN의 속도를 훨씬 능가한다는 것을 볼 수 있다!

3. Faster R-CNN

이제 R-CNN 시리즈의 마지막, Faster R-CNN이다. Fast R-CNN은 빨랐지만, 여전히 특정 단계에서의 병목 현상을 해결하지 못했다. 바로 첫 단계에서 selective search를 통해 region proposal 하는 것이 문제였다. Selective search는 CPU에서만 연산이 가능했기 때문이다.
그렇다면 이 region proposal 단계를 GPU에서 가능하도록 할 수는 없을까?

바로 여기서 RPN(Region Proposal Network)가 등장한다. Region proposal 자체도 CNN 네트워크 안에서 학습 가능하게 만든 것이다!
전체 구조는 위와 같고, RoI를 RPN으로 뽑은 다음, RoI pooling 등의 이후 과정은 Fast R-CNN과 동일하다.

그렇다면 RPN에 대해 자세히 알아보자.
먼저 anchor box를 제시한다. 논문에서는 9가지 다양한 크기의 bounding box를 사전에 정의하여 다양한 크기의 객체를 감지하도록 한다.
이처럼 먼저 각 grid cell 마다 k (=9)개의 anchor box를 매핑해놓는다.

RPN의 CNN 네트워크는 두 단계로 구성돼있는데, 위 그림의 왼쪽 부분인 3x3 conv와 두 분기의 1x1 conv이다. 맨 처음 사전학습된 CNN layer에서 나온 feature vector는 RPN에서 3x3 conv를 먼저 거친다. 이후 두 분기의 1x1 conv가 적용되어 두 출력으로 연결된다.

  • classification score map: W x H x 2k (k=9)
    각 anchor box에 대해 객체 여부를 나타냄
  • bounding box regressor score map: W x H x 4k (k=9)
    각 anchor box의 위치를 보정하는 값

이후 class score과 NMS(non maximum suppression)을 통해 최적의 region proposal만을 남긴다.

그 다음은 Fast R-CNN과 동일하게 RoI pooling, FC layer 등의 과정을 거친다. 마찬가지로 클래스 분류를 위해 (k+1), 그리고 b-box 회귀를 위해 4 x (k+1) 크기의 feature vector를 출력하여 multi-task loss를 사용해 학습한다.

Faster R-CNN이 정말 faster 하다는 것을 볼 수 있다!

마무리

대표적인 2-stage dectector 모델인 R-CNN 시리즈에 대해 알아보았다. 현재는 YOLO를 시작으로 한 1-stage detector 및 트랜스포머 기반의 모델이 더 많이 쓰이는 추세인 것 같지만, 그래도 초기 컴퓨터 비전 연구자들의 뛰어나고 기발한 인사이트를 배울 수 있었다.
특히 이 R-CNN 시리즈에서 모델의 단점을 파악하고 이를 효과적으로 해결해 나간 과정이 인상 깊었다. 다음 글은 yolo v1으로 돌아오겠다.

참고자료

Girshick, et al. "Rich feature hierarchies for accurate object detection and semantic segmentation". CVPR 2014.

Girshick. "Fast R-CNN". ICCV 2015.

Ren, et al. "Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks". NIPS 2015.

한땀한땀 딥러닝 컴퓨터 비전 백과사전

Fast R-CNN 논문 리뷰

Faster R-CNN 논문(Faster R-CNN: Towards Real-Time ObjectDetection with Region Proposal Networks) 리뷰

R-CNN, Fast R-CNN, Faster R-CNN, YOLO — Object Detection Algorithms

profile
이것저것 씁니다.

0개의 댓글