AI/컴퓨터비전(CV)

[CV 논문] Fast R-CNN

CSE 2026. 1. 10. 09:00

 

아래 글에서 이 블로그에서 리뷰한 논문들의 흐름과 분야별 분류를 한 눈에 볼 수 있다.

읽은 논문들 정리

 

읽은 논문들 정리

[목차]1. Computer Vision 분야 논문Classification 모델들의 발전Detection 모델들의 발전2. Natural Language Processing 분야 논문3. 유명한 딥러닝 논문들 지속적으로 업데이트 중1. Computer VisionAlexNet → VGGNet → Goo

april2901.tistory.com

 

 

이전에 포스팅한 R-CNN을 개선한 Fast R-CNN에 대한 논문이다.

이후 Faster R-CNN이 같은 해에 바로 나왔기 때문에 이 논문은 중요한 부분을 메인으로 살펴보고, 서론 등은 건너뛰고 넘어가자.


1. R-CNN의 문제

R-CNN은 매우 비효율적이다.

 

1. 후보영역 개수

이미지 한 장에서 2,000개의 후보 영역을 뽑은 뒤, 각각을 모두 CNN에 넣는게 너무 낭비가 심하다.

영역들이 서로 겹치는 부분이 많음에도 불구하고 특징 추출을 공유하지 않는 구조였기 때문이다.

2. 긴 학습 과정

이건 공감이 되는게, R-CNN을 읽으면서 뭘 자꾸 계속 학습시키나 하는 생각이 들었었다.
CNN을 파인튜닝 후 SVM을 따로 학습시키고, 또 Bounding box Regressor(BB)를 따로 학습시켜야 했다.

3. 저장 공간 문제

SVM과 Regressor 학습을 위해 2,000개 영역의 특징 벡터를 모두 디스크에 저장해야 했으며, 이는 수백 GB의 공간을 차지했다.

 

하여튼 성능은 좋아졌을지 몰라도 여러모로 비효율적인 R-CNN이었다.


2. Fast R-CNN의 구조

 

먼저 Fast R-CNN은 전체 이미지와 object proposal을 입력으로 받는다.

이미지는 CNN을 통과해 feature map을 출력한다.

 

object proposal의 박스에 해당하는 부분을 feature map에서 가져와서 고정된 크기로 변환한다.

이 동작이 RoI pooling layer에서 이루어진다.

RoI는 Region of Interest의 약자로 R-CNN에서도 다룬 관심있는 지역을 의미한다.

 

RoI pooling layer의 결과를 FC층에 넣어 feature vector를 만든다.

여기서 두 가지 갈래로 나눠지는데, 하나는 이 RoI에 있는 이미지가 어떤 카테코리에 속하는지를 계산하고, 다른 하나는 박스 보정을 어떻게 할지 정한다.


3. 해결책 1 : RoI Pooling Layer

이 부분이 R-CNN과 차이점이다.

R-CNN은 각 지역제안마다 CNN을 돌리지만 fast R-CNN에서는 전체이미지에 대해 CNN을 한번만 돌린다.

 

RoI는 정확히 얘기하면 feature map의 사각형을 의미한다.

$(r,c,h,w)$의 네 개의 값으로 이 사각형이 표시된다.

($r,c$)는 왼쪽 위 점의 좌표이고, $h,w$는 높이와 너비를 얘기한다.

 

RoI pooling은 이 다양한 크기의 RoI를 고정된 크기 $H\times W$로 바꾼다.

 

RoI의 크기가 $h \times w$라고 하면, 이 영역을 $H \times W$의 grid로 나눈다.

즉 각 격자의 크기는 대략 $\frac{h}{H} \times \frac{w}{W}$이 된다.

대략이라고 한 이유는 나눠떨어지지 않을 수도 있기 때문이다.

이 grid에 대해 최댓값을 대표값으로 가져오는 max pooling을 한다.

 

<구현>

기존이 ImageNet으로 훈련된 CNN에 대해 마지막 max pooling을 RoI pooling으로 바꾸고,

마지막에 softmax로 1000개 분류를 하는 것을 제거하고 K+1개의 클래스 분류를 하는 softmax층과 BB층을 넣는다.

 

 


4. 해결책 2: Multi-task Loss 

Fast R-CNN은 분류기와 위치 보정기를 하나의 네트워크로 통합해 학습시켰다.

손실 함수는 분류 손실($L_{cls}$)과 회귀 손실($L_{loc}$)을 더해서 사용한다.

 

<손실 함수>

$L(p, u, t^u, v) = L_{cls}(p, u) + \lambda [u \ge 1] L_{loc}(t^u, v)$

 

<식 설명>

●$L_{cls}(p,u)$ : 우리가 아는 $L_{cls}(p, u) = -\log p_u$이다.

즉 정답 클래스 $u$에 대해 모델이 예측한 확률 $p_u$에 대해 로그를 씌우고 마이너스한 것이다.

 

●$\lambda$ : 두 손실 사이의 균형을 맞추는 하이퍼파라미터이다.

 

●$[u \ge 1]$ : $u$가 1보다 크거나 같을 때는 1, 아닐때는 0이라는 수학기호이다.

배경 클래스를 0번 클래스로 정했기 때문에 $u=0$, 즉 배경으로 판단된 이미지에 대해서는 BB에 대한 손실을 계산하지 않겠다는 것이다.

●$L_{loc}$: 위치 보정 시 R-CNN이 썼던 $L_2$ Loss 대신, 이상치(Outlier)에 덜 민감한 Smooth $L_1$을 사용해 안정성을 높였다.
이 손실 함수는 클래스 $u$에 대해 예측된 4개의 값($t^u$)과 실제 정답 값($v$) 사이의 차이를 계산한다.

$v = (v_x, v_y, v_w, v_h)$: 실제 물체 박스의 위치와 크기에 대한 정답이다.

$t^u = (t_x^u, t_y^u, t_w^u, t_h^u)$: 모델이 예측한 해당 클래스 $u$에 대한 박스 조정값이다.

$x, y, w, h$ 각 성분에 대해 오차를 구한 뒤 이를 모두 더한다.

$L_{loc} (t^u, v) = \sum_{i \in x,y,w,h} \text{smooth}_{L1} (t^u_i - v_i)$

 

Fast R-CNN은 단순히 차이의 제곱($L_2$)을 구하지 않고, $\text{smooth}_{L1}$이라는 특수한 함수를 사용한다.

$$\text{smooth}_{L1}(x) = \begin{cases} 0.5x^2 & \text{if } |x| < 1 \\ |x| - 0.5 & \text{otherwise} \end{cases}$$
 

오차가 작을 때 ($|x| < 1$): $L_2$ Loss처럼 제곱($0.5x^2$)으로 작동하여, 정답에 가까워질수록 아주 정밀하게 수렴하도록 돕는다.

오차가 클 때 (그 외): $L_1$ Loss처럼 직선($|x| - 0.5$)으로 작동한다.

 

 

 


5. 해결책 3: 효율적인 미니배치 샘플링

R-CNN은 서로 다른 이미지에서 영역을 무작위로 뽑아 학습 효율이 낮았다.

Fast R-CNN은 이를 계층적 샘플링이라는 방법으로 해결했다.

  • Hierarchical Sampling: 한 배치($R=128$)를 만들 때 이미지 $N=2$개를 먼저 고르고, 각 이미지에서 64개의 RoI를 뽑는다.
  • 장점: 같은 이미지에서 나온 RoI들은 연산 과정에서 메모리와 계산을 공유할 수 있어 학습 속도가 비약적으로 빨라진다.

6. Truncated SVD

classification일 때는 이미지 하나를 입력받아 FC layer에 넣지만, detection일 때는 RoI 2000장 정도를 연산해야한다.

아래의 왼쪽 그래프에서 볼 수 있듯 이 FC층에서 소요되는 시간이 길다.

따라서 truncated SVD를 사용해 파라미터 수를 줄이면 오른쪽 그래프처럼 시간이 많이 줄어드는 것을 볼 수 있다.


7. 결과

압도적인 속도: R-CNN 대비 학습 시간은 9배, 테스트 시간은 213배 단축.
정확도 향상: PASCAL VOC 2012 기준 66%의 mAP를 달성하여 기존 모델보다 높은 성능을 기록.