Faster R-CNN 개요
-
Fast R-CNN은 R-CNN에 비해 속도와 성능을 향상시켰지만, 여전히 Region Proposal(Selective Search)에 시간이 많이 걸리는 한계가 있으며 이를 해결하기 위해 Faster R-CNN은 RPN(Region Proposal Netwrok)을 도입해 속도를 대폭 개선함.
-
RPN은 Region proposal을 보다 정교하게 추출하기 위해 다양한 크기와 가로세로비를 가지는 bounding box인 Anchor box를 도입함.
-
Paper : Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks
Key-Points

Anchor box
- Anchor box는 feature map의 각 위치에서 미리 정의된 다양한 크기와 비율의 박스로, RPN이 이 anchor를 기준으로 물체 존재 여부와 박스 좌표를 학습 및 보정하기 위해 사용된다.
- 다양한 크기의 객체를 감지하기 위해 지정한 위치에 사전에 정의한 서로 다른 크기(scale)와 가로세로비(aspect ratio)를 가지는 bounding box인 Anchor box를 생성하여 다양한 크기의 객체를 포착하는 방법을 제시함.
- 이때, anchor box는 네트워크가 bbox regression을 예측할 기준(anchor) 일 뿐, 원본 이미지에서 해당 박스를 투영하여 픽셀을 가지고와 연산에 사용하거나 하지 않음. (anchor의 좌표는 단지 회귀 수식의 기준값(anchor reference) 으로 쓰임)

- 논문에서는 3가지 sacle과 aspect ratio를 가지는 총 9개의 서로 다른 Anchor box를 사전에 정의함.
- 여기서 scale은 anchor box의 width, height의 길이를, aspect ratio는 width, height의 길이의 비율을 의미하며, aspect ratio가 1:1일 때의 anchor box의 넓이를 유지한 채 나머지 ratio를 설정함.

- anchor box는 원본 이미지의 각 grid cell의 중심을 기준으로 생성하며, 원본 이미지에서 sub-sampling ratio를 기준으로 gird를 구성하고, anchor box를 생성하는 기준점인 anchor를 고정한다.
- 예를 들어, 원본 이미지의 크기가 600x800이고 sub-sampling ratio가 1/16이라 할 때, 생성되는 anchor의 수는 아래와 같다.
- grid cell 개수 : 600/16 x 800/16 = 1900
- anchor box (9종) 개수 : 1900 x 9 = 17100
RPN (Region Proposal Network)

- RPN은 객체가 있을 법한 영역(Region proposal)을 찾는 네트워크로, 아래와 같이 동작한다.
- Feature Map 추출
- 입력 이미지를 CNN(예: VGG16)에 통과시켜 feature map을 얻는다.
- 예 8x8x512 feature map
- Anchor Box 생성
- feature map의 각 위치(cell)에 대해 다양한 크기와 비율의 anchor box를 원본 이미지에 설정함.
- Feature Map의 한 셀 → 원본 이미지의 9개 후보 박스 : 8x8x9 = 576개 anchor box.
- anchor box는 외부에서 미리 정의되어 테이블로 가지고 있다가, bounding box를 예측하고 loss를 계산할 때 사용됨.
- class score 계산
- 위에서 얻은 feature map에 대하여 3x3 conv 연산을 적용하며, 이때 feature map의 크기가 유지될 수 있도록 padding을 추가한다.
- 3x3 conv 연산의 출력에 1x1 conv 연산을 적용하여 객체가 포함되어 있는지 여부를 출력함.
- 예: 8x8x512 feature map 을 입력받아 8x8x2(객체 여부)x9(후보 anchor box)이 출력됨.
- box 보정값 계산
- 3x3 conv 연산의 출력에 1x1 conv 연산을 적용하여 anchor box에 따른 box 보정 좌표 4개를 얻는다.
- 예: 8x8x512 feature map 을 입력받아 8x8x4(box 보정 좌표)x9(후보 anchor box)이 출력됨.
- RPN을 통해 출력된 grid cell 마다 anchor 개수만큼의 region proposal들은 이후 class score에 따라 상위 N개만 추출하여 NMS를 적용 후 최적의 proposal만을 Fast R-CNN에 전달하게 된다.
Multi-task loss
- RPN은 Fast R-CNN에서 제안된 multitask loss 구조를 활용하여, anchor별로 objectness 분류와 박스 회귀를 동시에 학습함.
- Fast R-CNN 파트에서는 기존 Fast R-CNN 에서 제안한 multitask loss를 그대로 이용하여 학습함. (Fast R-CNN : Multi-task loss)
- RPN에서는 객체의 존재 여부만을 분류하는 반면, Fast R-CNN에서는 배경을 포함한 class를 분류한다는 점에서 차이가 있음.
- : mini-batch 내의 anchor box의 index
- : anchor 에 객체가 포함되어 있을 확률 (score)
- : 정답 라벨 (1 = 객체 있음, 0 = 배경)
- : 예측된 bounding box 회귀값 (anchor 대비 offset)
- : GT box 좌표
- : mini-batch 내 anchor의 개수
- : positive anchor의 개수
- : 두 손실 간 가중치 (논문에서는 10)
- : 분류 손실
- anchor가 객체인지 배경인지 예측함
- binary cross-entropy (log loss)
- : 회귀 손실
- positive anchor의 위치 보정 (bounding box regression)
- Smooth L1 loss :
Faster R-CNN 구조 및 학습
- Faster R-CNN의 학습 과정은 두 개의 네트워크(RPN + Fast R-CNN)를 순차적으로, 그리고 부분적으로 공유하며 학습하는 방식이다.

1) Feature extraction
- pre-trained된 VGG16 모델에 800x800x3 크기의 원본 이미지를 입력하여 50x50x512 크기의 feature map을 얻는다.
- 여기서 sub-sampling ratio는 1/16이 된다.
2) Generate Anchors
- region proposals를 추출하기에 앞서 원본 이미지에 대하여 anchor box를 생성하는 과정이 필요하며, feature extraction으로 부터 나온 50x50의 grid cell을 기준으로 원본 이미지에 50x50개의 grid cell이 생성되고, 각 cell 마다 9개의 anchor box가 생성된다.
- 이 과정은 Anchor generation layer에서 수행되며, 총 22500(50x50x9)개의 anchor box가 생성된다.
3) Class score and Bounding box regressor
- RPN은 feature map을 입력 받아 anchor에 대한 class score, bounding box regressor을 반환한다.
- class score는 50x50x2x9 사이즈가 되고, bounding box regressor는 50x50x4x9 사이즈가 반환된다.
4) Select anchors for training RPN
- Anchor target layer에서 RPN이 학습하는데 사용할 수 있는 anchor를 선택한다.
- 2번 과정에서 생성한 총 22500(50x50x9)개의 anchor box에서 원본 이미지의 경계를 벗어나지 않는 anchor box를 선택하고, ground truth box와 IoU값이 0.7 이상인 경우를 positive sample로, 0.3 이하인 경우 negative sample로 구성한다.
- IoU값이 0.3~0.7인 anchor box는 무시하며, 이러한 과정을 통해 RPN을 학습시키는데 사용할 데이터셋을 구성하게 된다.
5) Region proposal
- Proposal layer에서 2번 과정에서 생성된 anchor box들과 RPN에서 반환한 class scores와 bounding box regressor를 사용하여 region proposals를 추출하는 작업을 수행한다.
- NMS를 적용하여 필터링을 적용한 후 class score 상위 N개의 anchor box를 추출한다.
- regression coefficients를 anchor box에 적용하여 anchor box가 객체의 위치를 더 잘 감지하도록 조정한다.
6) Select anchors for training Fast R-CNN
- Proposal target layer에서 proposal layer에서 나온 region proposals 중에서 Fast R-CNN 모델을 학습시키기 위한 sample을 선택한다.
- region proposals와 ground truth box와의 IoU를 계산하여 0.5 이상일 경우 positive, 0.1~0.5 사이일 경우 negative sample로 label 된다.
- 여기서 선택된 region proposals는 1번 과정을 통해 출력된 feature map에 RoI pooling을 수행하게 된다.
7) Max pooling by RoI pooling
- 1번 과정에서 얻은 feature map과 6번 과정을 통해 얻은 sample을 사용하여 RoI pooling을 수행한다.
- RoI pooling 참고: Fast R-CNN : RoI Pooling
- 이를 통해 고정된 크기의 feature map (7x7x512) 이 출력된다.
8) Train Fast R-CNN by Multi-task loss
- 나머지 과정은 Fast R-CNN 과 같이 7x7x512의 feature map을 flatten한 후 fc layer에 입력하여 fc layer를 통해 4096 크기의 feature vector를 얻는다.
- 이후 feature vector를 Classifier와 Bounding box regressor에 입력하여 각각 (K+1), (K+1) x 4 크기의 feature vector를 출력하고, 출력된 결과를 사용하여 Multi-task loss를 통해 Fast R-CNN 모델을 학습시킨다.
Alternating Training
- 저자는 Faster R-CNN 모델을 학습시키기 위해 RPN과 Fast R-CNN을 번갈아가며 학습시키는 Alternating Training 방법을 사용한다.
- 아래 그림에서, 빨간색 영역이 학습되는 영역, 보라색 영역이 freeze된 영역이다.

- Anchor generation layer에서 생성된 anchor box와 원본 이미지의 ground truth box를 사용하여 Anchor target layer에서 RPN을 학습시킬 positive/negative 데이터셋을 구성하고, 이를 활용하여 RPN을 학습 시킨다. 이 과정에서 pre-trained VGG16 역시 학습된다.
- RPN은 freeze 시키고, RPN의 결과를 이용하여 추출된 positive/negative 데이터셋(Proposal target layer)을 통해 Fast R-CNN을 학습 시킨다. 이 과정에서 pre-trained VGG16 역시 학습된다.
- 앞서 학습시킨 RPN과 Fast R-CNN에서 RPN에 해당하는 부분만 학습(fine tune) 시킨다.
- 학습시킨 RPN을 활용하여 추출한 region proposals를 활용하여 Fast R-CNN을 학습(fine tune) 시킨다.
Inference

- 실제 inference 시에는 Anchor target layer와 Proposal target layer는 사용되지 않음. (두 layer 모두 네트워크를 학습시키기 위한 데이터셋을 구성하는데 사용되기 때문)
- Fast R-CNN은 Proposal layer에서 추출한 region proposals를 활용하여 detection을 수행하며, 최종적으로 얻은 predicted box에 Non maximum suppression을 적용하여 최적의 bounding box만을 결과로 출력한다.
정리

참고
- Faster R-CNN 논문(Faster R-CNN: Towards Real-Time ObjectDetection with Region Proposal Networks) 리뷰
- Pytorch로 구현한 Faster R-CNN 모델
- [Object Detection] Faster R-CNN (NIPS2016) 엄밀한 리뷰
- [딥러닝] Object detection (2)(R-CNN / Fast R-CNN / Faster R-CNN 총정리)
- Object Detection and Classification using R-CNNs | Telesens
- PR-012: Faster R-CNN : Towards Real-Time Object Detection with Region Proposal Networks - YouTube