Faster R-CNN은 2-stage object detection의 대표적인 기술 입니다.
Faster R-CNN의 학습부터 테스트까지의 과정을 순서대로 설명하겠습니다.
논문에 나와있지 않은 디테일은 제 임의로 작성했습니다.
1. Preprocessing
우선 학습을 위한 데이터셋을 가공합니다. 입력 이미지의 가장 짧은 변은 600, 가장 긴 변은 1000을 넘지 않도록 resize 시켜줍니다. 이때의 정확한 값은 최소 592, 최대 992로 정해주었습니다. 이 수들은 16으로 나누어 떨어지는 수 인데, 이렇게 정한 이유는 아래에서 설명하겠습니다. resize된 이미지에 맞춰 bounding box또한 변형해줍니다. resize된 이미지를 normalize하고, random flip을 적용시켜줍니다.
2. Extract Feature
전처리된 이미지를 VGG-16 network에 태웁니다.
이때, VGG-16 network의 일부를 사용합니다. FC layer 이전의 convolution layer 5_3 까지를 사용합니다. 그러면 이미지가 1/16 scale로 다운 샘플링 됩니다. 이렇게 만들어진 Feature map을 RPN과 Fast R-CNN에 사용합니다.
3. RPN
VGG-16을 통해 추출된 Feature map에 3×3 사이즈의 window를 이동시키며 RoI(Region of Interest)를 생성합니다. 방법은 다음과 같습니다. 3×3 convolution layer를 통과시키고 나온 feature map을 다시 location을 예측하는 1×1 conv layer와 confidence를 예측하는 1×1 conv layer에 태웁니다. RPN이 예측하는 값이 RoI 입니다. RoI는 이미지에서 물체가 있을 후보지를 의미하는데, 이미지 전역을 커버할 Anchor의 offset과 label을 예측합니다. 이때 location은 feature map의 anchor의 수 * 4(offset), confidence는 anchor의 수 * 2( object가 존재하거나 존재하지 않거나) 개의 예측을 하게됩니다.
4. Anchor
Anchor는 RPN이 예측하는 후보지의 기준이 되는 박스입니다. RPN은 미리 만들어져 있는 Anchor를 기준으로 하여 각 Anchor의 offset과 각 Anchor의 물체 존재 여부르 예측 한다고 설명 했는데, Anchor를 만드는 방법은 다음과 같습니다.
2과정에서 추출한 Feature map을 기준으로 각 셀마다 3개의 ratio( 1/1, 1/2, 2/1와 3개의 scale(8, 16, 32)을 가진 총 9개의 anchor를 만듭니다. 그렇기 때문에 총 (feature map의 width와 height) W * H * 9 개의 anchor가 만들어집니다. 이 Anchor는 Feature map을 기준으로 만들어 졌고, 최종적으론 Input image의 크기로 rescale 되어야 하는데, feature map 추출과정에서 반올림이 이루어지면 rescale 과정에 오차가 발생할 수 있기 때문에 1과정에서 width와 height를 16의 배수로 resize 하게 된 것입니다.
5. RoI sampling
생성된 Anchor에, RPN이 예측한 offset을 적용하면 W * H * 9개의 box가 만들어 집니다. 이 RoI는 너무 많기 때문에, 학습의 최적화를 위해 sampling을 진행합니다. 우선 RPN이 object가 있다고 예측한 Box들로 추립니다. 그리고 그 예측 정도가 높은 순서로 12000개(test엔 6000개)의 Box만을 사용합니다. 그 12000개의 box들 간의 thresh hold 0.7의 NMS를 처리하고남은 box들을 최종적으로 sampling 하여 6000개(test엔 2000개)개의 RoI( = Anchor box)를 남겨줍니다.
6. Prepare for Fast R-CNN
이렇게 예측한 RoI을 통해 Fast R-CNN로 학습을 진행하고, 각 RoI에 다시 offset을 적용하면 최종적인 예측 Box가 됩니다. 하지만 학습 초기 RPN은 무작위에 가까운 RoI를 만들기때문에, 이를 학습하는것은 아무런 효과가 없거나, 학습시간이 아주 길어지게 됩니다. 따라서 Fast R-CNN을 학습하기 앞서 sampling된 RoI를 좀 더 처리하여 최대 128개를 추출합니다.
RoI를 GT와 비교하여 IoU가 0.7이 넘는 box만을 추출합니다. 128의 일정 비율(25%)이 넘는다면 랜덤으로 128*0.25 만큼의 box를 선별하고, gt의 label또한 적용하여 positive로 사용합니다. 합니다. 남은 75%는, box는 채택하되 label은 0으로 주어 negative로 사용합니다. 이렇게 선별된 최대 128개의 RoI와 GT box간의 offset을 구하여 Fast R-CNN 과정의 GT로 사용합니다.
7. Fast R-CNN
RPN이 예측한 RoI로 물체가 있는 정확한 위치를 예측하는 네트워크 입니다. 앞의 RPN이 1-stage이고 여기가 2-stage입니다. 이름이 Fast R-CNN인 이유는 Faster R-CNN의 이전 논문인 Fast R-CNN과 완벽히 동일하기 때문입니다.
위에서 Sampling한 RoI는 이미지 마다 위치도 모양도 개수도 제각각 입니다. 이를 convolution layer에 태워 학습하는것은 불가능하기 때문에 RoI pooling을 거쳐 Feature map을 Sampled RoI의 수 * 7*7*512 의 feature로 만듭니다. 7*7*512인 이유는 이후로 VGG-16의 FC layer를 이용하기 때문입니다. 이때 FC layer 의 input 차원이 7*7*512 이기때문에 수를 맞춰주면 FC layer를 통과시킬수 있습니다. 그렇게 최종적으로 각 RoI의 offset과 label을 예측합니다.
7. Loss
RPN의 location loss는 GT box와의 offset을 Loss의 GT로 사용하고, Loss function으로 smooth l1 loss 를 사용합니다. prediction은 cross entropy loss를 사용합니다.
Fast R-CNN은 6과정에서 만든 GT를 사용하고 location과 prediction의 loss function은 RPN과 같습니다.
8. Test
테스트 과정은 6번 과정이 빠집니다. 학습에 GT가 관여해서는 안됩니다. 학습과정과는달리 RPN이 충분히 학습되어 RoI또한 유의미한 것들일 가능성이 크니 해당과정은 빠져도 됩니다. Sampling 된 2000개의 RoI과 Fast R-CNN을 통과한 offset을 각 RoI에 적용해주고 NMS를 처리하면 최종적인 예측 box가 됩니다. label은 Fast R-CNN의 predict 결과에 soft max를 적용한 값이 label이 됩니다. NMS에 함께 사용하고, 선별된 최종 Box의 label이 됩니다.