📌 이 글은 권철민님의 딥러닝 컴퓨터 비전 완벽 가이드 강의를 바탕으로 정리한 내용입니다.


목차

  1. Faster RCNN 개요
  2. Faster RCNN 구조
  3. Region Proposal Network
  4. Anchor Box
    1. Anchor Targeting
    2. Prediction
    3. Loss function

Faster RCNN 개요

Faster RCNN은 RPN(Region Proposal Network) + Fast RCNN이 합쳐진 네트워크이다.

 

Faster RCNN의 논문에서 Region Proposal 방법을 GPU를 통한 학습으로 진행하면 확실히 성능이 증가할 것이라고 말한다. Region Proposal 단계도 딥러닝과 같은 네트워크 구조로 만들어 탐지 속도를 높이자는 목표를 설정했다. 따라서 Faster RCNN은 Deep Network를 사용하여 Region Proposal를 진행하는 RPN (Region Proposal Network)을 이용한다.


Faster RCNN 구조

 

  1. CNN을 통과하여 원본 이미지의 Feature Map을 추출
  2. RPN(Region Proposal Network)를 통해 Region Proposal 영역 추출
  3. Feature map과 Region Proposal 이미지들을 맵핑해준다.
  4. 맵핑된 이미지들을 ROI Pooling을 통해 같은 크기로 할당해준다.
  5. Softmax와 Bounding Box Regressor를 통해 학습한다.

Region Proposal Network

RPN이란, Feature Extractor에 입력 이미지를 넣어 나온 Feature Map에다가 컨볼루션을 적용해 해당 Region들에 객체가 있는지 없는지 분류하고 동시에 그 객체가 있을 만한 Region의 바운딩 박스 좌표를 회귀하는 것을 함께 수행하는 네트워크를 의미한다.

 

빨간색 부분이 Region Proposal Network이다. 이 부분과 Selective Search를 제외하면 Fast RCNN과 동일한 구조이다.

즉, Fast RCNN에서 Selective Search 과정을 Faster RCNN에서는 RPN이 한다는 것이다.

 

RPN의 input은 image의 Feature Map이고, output은 Object proposal들의 Sample이다. 

이 Sample들을 Fast RCNN과 동일하게 RoI Pooling을 한 후, Classification, Bounding Box Regression을 진행한다.

 

그래서 네트워크라는 특성으로 인해 GPU 이용이 가능하고 결과적으로 기존의 Selective Search 보다 속도가 빠른 장점이 있다. 

 

RPN은 위 그림에서 보는 것처럼 Feature Map에 Convolution을 2번 사용해 Fully Convolutional Layer를 만든다.

 

하지만 RPN에서는 Feature map에 대한 pixel 값과 Ground Truth Bounding Box만이 데이터로 주어지는데 어떻게 selective search 수준의 높은 Region Proposal을 수행할 수 있을까?

 

이것을 해결하기 위한 것이 바로 Anchor Box 이다. 

Ground Truth 기반으로 데이터를 가지고 Anchor Box를 Loss 기반으로 학습을 시킬 수 있는 네트워크를 만들자!

그것이 바로 RPN이다.


Anchor Box

Anchor Box는 Object가 있는지 없는지에 대한 후보 box이다.

포인트를 기반으로 다른 형태와 다른 스케일의 Anchor Box를 만든다.

총 9개이다. Object 형태가 다 다르기 때문에 여러개를 만든다.

 


Anchor Targeting

Grid cell 별로 맵핑이 되면서 Anchor Box를 만든다.

아주 촘촘하게 포인트마다 9개의 Achor Box를 만들어준다.
위의 그림에서는 총 1900개의 포인트마다 9개의 Achor box를 생성하여 전부 1900x9 = 17100개의 Anchor box가 존재한다.

 

이렇게 만들어낸 17100개의 Anchor box들을 기준으로 그 안에 물체가 있는지 없는지를 학습을 해야 한다!

 

그러기 위해선 이미지와 그에 대한 Ground Truth Box가 들어왔을 때 각 Anchor마다 이 Anchor가 물체를 감싸고 있는지... Background를 감싸고 있는지... Labeling을 해줘야 한다.

 

IoU

각 17100개의 Anchor들과 Ground Truth Box의 IoU를 모두 계산하여 IoU가 0.7보다 크면 1 (Positive)IoU가 0.3보다 작으면 0 (Negative) 으로 두고 나머지는 -1로 둬서 신경 안쓰도록 한다.

 

 

 

Ground Truth Bounding Box와 1x1 Convolution의 아웃풋의 IoU 값을 비교

 

IoU > 0.7 이면 Positive Anchor Box,

IoU < 0.3 이면 Negative Anchor Box 로 분류한다.

 

 

 

 

 

 

 


Prediction

Softmax로 이진 분류 (Region에 Object가 있는지 없는지)하고, Bounding Box Regression도 동시에 진행한다.

 

 

def rpn(base_layers,num_anchors):

    x = Convolution2D(512, (3, 3), padding='same', activation='relu', 
    		kernel_initializer='normal', name='rpn_conv1')(base_layers)

    x_class = Convolution2D(num_anchors, (1, 1), activation='sigmoid', 
    		kernel_initializer='uniform', name='rpn_out_class')(x)
    x_regr = Convolution2D(num_anchors * 4, (1, 1), activation='linear', 
    		kernel_initializer='zero', name='rpn_out_regress')(x)

    return [x_class, x_regr, base_layers]

 

40x50x512 크기의 Feature Map을 3x3 Conv layer를 한번 거치고,

 

  1. Classfication Layer (40x50x51240x50x9)와
    • 9은 Anchor box(9개) x Class 개수(2개)
  2. 1x1 conv인 Bounding Box Regression Layer (40x50x51240x50x36)을 통해
    • 36은 Anchor box(9개) x bounding box 좌표(4개)

 

Bounding box 위치와 Class(물체가 있는지 없는지)를 prediction을 완료한다.

 

참고로 위와 같이 RPN에서 2번의 Convolution을 거치는 이유 1x1 Convolution을 거쳐야 Anchor Box별로 학습된 클래스와 Bounding Box 좌표를 쉽게 추출할 수 있기 때문이다.

 

중간에 1x1 Convolution을 사용하는 이유는 Channel 개수를 2개, 4개로 맞추어 주기 위해 사용한다.(참고로 1x1 Convolution은Convolution 이전의 높이, 너비는 동일하되 Channel을 마음대로 조절하기 위해 사용된다.)

 

 

따라서 output은 RPN Network 그림과 같이

Anchor 총 수와 맞춰서

(40x50x9x1) = (18000 , 1)  :  40x50x9x1 = 18000개의 Anchor Box 별로 Object이냐, 아니냐 판별
(40x50x9x4) = (18000 , 4)  :  40x50x9x4 = 72000개의 Anchor Box 별로 x,y,w,h 를 학습

가 된다.

 

이렇게 2)Prediction한 값으로 아까 1)에서 구했던 이미지의 1)Ground Truth Label과 함께 Loss Function을 통해 RPN을 학습하게 된다.

 

그와 동시에, 2)Prediction 된 두 값 ( Class, bbox reg )은 NMS를 거쳐서 특정 개수의 RoI로 Sampling 된 후, Fast-RCNN에 쓰이게 된다.

 

Predicted Anchor Box를 최대한 Positive Anchor box와 가깝게 하는 방향으로 Bounding Box Regression을 진행한다.


여기서 주의할 점은 Ground Truth Box를 따라가는 것이 아니라는 점이다.

 

 

  • Classification을 통해 Positive box를 구해준다.
  • Bounding Box Regression은 Positive Anchor box와의 간격을 줄인다.

 

복사했습니다!