Paper/2D

[논문 리뷰] R-CNN, Fast R-CNN, Faster R-CNN

shvtr159 2022. 6. 12. 17:07

R-CNN


Girshick, Ross, et al. "Rich feature hierarchies for accurate object detection and semantic segmentation." 
Proceedings of the IEEE conference on computer vision and pattern recognition. 2014.

R-CNN은 object detection의 시작이라고 할 수 있는 논문으로 이 이후 더 발전된 다양한 R-CNN 계열 network들이 제안되었습니다. R-CNN의 방법과 순서는 다음과 같은 3개의 module으로 구성됩니다. 

  • Category에 독립적인 region proposal : detector에 사용될 영역 후보를 제안합니다.
  • Large convolutional neural network : proposal 된 각 region에서 고정된 크기의 feature vector를 추출합니다.
  • Class-specific 선형 SVM 집합 : feature vector를 기반으로 SVM을 이용해 해당 영역의 class를 예측합니다.

R-CNN의 구조

R-CNN이 object detection을 수행하는 순서는 다음과 같습니다.

  1. Input image에 selective search 방법을 이용해 input image 속 2000개의 영역(RoI)을 선택합니다.
  2. 선택된 영역들을 크기와 비율에 상관없이 모두 227$\times$227 크기로 바꾸고(warp) AlexNet을 detection task에 맞게 변형한 CNN 네트워크에 넣어줍니다. 그 결과로 4096차원의 feature vector를 얻습니다.
  3. 이 feature vector을 SVM의 input으로 이용하여 해당 object의 class를 예측합니다. 많이 겹쳐지는 box에 대해서는 greedy non-maximum suppression을 이용하여 높은 score의 bbox만을 남깁니다.
  4. Selective search로 제안된 bbox의 위치를 더 정확하게 하기 위해 bounding box regression을 수행해 box의 위치를 조절합니다.

 

단점

  • 모든 이미지에 대해 Selective search를 통해 얻은 2000개의 영역 이미지 모두 CNN 네트워크를 통과시키기 때문에 시간이 매우 오래 걸립니다.
  • CNN, SVM, Bounding box regression 3가지의 모델을 사용해서 전체 모델이 크고 복잡합니다.
  • 위 3개의 모델을 모두 따로 사용하기 때문에 SVM과 Bounding box regression의 학습 결과를 CNN에 적용할 수 없습니다. 
  • 크기를 모두 227$\times$227로 바꾸면서 원래 object의 형태 등이 보존되지 않는 문제가 있습니다.

본 글에서는 생략하지만 R-CNN과 Fast R-CNN 사이에 SPPNet이라는 detection 네트워크에서 RoI의 형태를 유지하고 convolution 할 수 있도록 하였습니다.

 

Fast R-CNN


Girshick, Ross. "Fast r-cnn." Proceedings of the IEEE international conference on computer vision. 2015.

R-CNN의 저자는 SPPNet의 아이디어를 참고하여 기존 R-CNN의 성능을 크게 높인 Fast R-CNN을 제안하였습니다. 기존의 R-CNN은 위에서 이야기했던 것과 같이 다음과 같은 큰 단점이 있었습니다.

  1. Training이 multi-stage pipeline으로 이루어집니다. R-CNN은 먼저 log loss를 사용하는 ConvNet을 fine-tuning 하고 SVM을 ConvNet의 feature에 fitting 합니다. 마지막 세 번째 training stage에서 bounding-box regressor를 학습합니다.
  2. Training에 소모되는 공간과 시간이 매우 큽니다. SVM과 bounding-box regressor 학습의 경우 각 이미지의 object proposal로부터 feature를 추출하고 disk에 기록해둡니다.  VGG16과 같이 매우 깊은 네트워크를 사용하면 문제가 더 심해집니다.
  3. Detection 속도가 매우 느립니다. Test 단계에서 VGG를 이용한 detection은 GPU를 사용하더라도 이미지당 47초의 시간이 소모됩니다.

SPPNet에 남아있던 가장 큰 문제점은 multi-stage pipeline 학습과 SPP(Spatial Pyramid Pooling) 이전의 covolution layer를 업데이트할 수 없는 것이었습니다. Fast R-CNN에서는 multi-task loss를 사용하여 single-stage로 학습하고 모든 네트워크의 layer들을 학습을 통해 업데이트할 수 있도록 하였습니다.

Fast R-CNN의 구조

Fast R-CNN이 object detection을 수행하는 순서는 다음과 같습니다.

  1. 이미지 전체를 ConvNet을 통과하여 feature map을 얻습니다.  
  2. 이제는 Selective Search를 통해 찾아진 모든 RoI들에 대해 Convolution을 수행하지 않고 전체 이미지를 통해 얻어진 feature map의 해당 영역들을 사용합니다. 이렇게 얻어진 각 RoI에 RoI pooling을 수행하여 모든 RoI들이 고정된 크기의 feature vector를 가지게 됩니다.
  3. 각 feature vector들은 FC layer를 통과한 뒤 두 output layer로 전달됩니다.
    1. SVM을 더 이상 사용하지 않고 softmax를 사용하여 object의 class를 예측합니다.
    2. Bounding-box regressor를 이용하여 bounding box의 위치를 조정합니다.

 

RoI pooling

RoI pooling

각각의 RoI에서 고정된 크기의 feature vector를 추출하기 위해서 RoI를 정해진 개수로 나누고 각 grid에 maxpooling을 수행합니다. 그림에서와 같이 $h=5, w=7$이고 $H, W=2$인 경우 4개의 grid가 생성되고 각 grid에는 해당 grid 내의 최댓값이 입력됩니다. 이는 SPPNet의 pyramid pooling을 하나의 pyramid level에 대해 수행하는 것과 동일합니다. 이렇게 하여 크기가 다른 RoI들에 대해서도 항상 같은 크기의 feature vector를 생성할 수 있습니다.

 

Back propagation

Fast R-CNN은 모든 layer를 학습을 통해 업데이트한다고 하였으니 ROI pooling 이전의 input에 대해서도 계산이 가능해야 합니다. $x_i$가 RoI pooling layer에 입력된 $i$번째 activation input이라고 하고, $y_{rj}$가 $r$번째 RoI가 input으로 들어왔을 때 layer의 $j$번째 output이라고 했을 때 식은 다음과 같습니다.

$x_i$계산하는 Back propagation

간단히 말하면 $x_i$는 feature map의 한 pixel값이고 이 값이 RoI를 $H\times W$로 나눈 grid(sub-window) 내부의 값들 중 최댓값이라면 max pooling을 수행하는 RoI pooling에서 살아남아 $y_{rj}$값에 영향을 줄 수 있습니다. 위 식에서 indicator function 내부의 $i^*(r, j)$는 $i^*(r,j)=\mathrm{argmax}_{i' \in \mathcal{R}(r,j)}x_{i'}$이고 $\mathcal{R}(r,j)$는 아래와 같이 $y_{rj}$값이 되는 sub-window 내부 값들의 인덱스 set입니다. 즉 $i^*(r,j)$는 RoI와 sub-window가 정해졌을 때 해당 sub-window값들 중 최댓값의 index이므로 위 식은 $i=i^*(r, j)$일 때, 다시 말해 위에서 이야기했던 것처럼 $x_i$가 sub-window의 최댓값일 때만을 합해 계산을 하게 되는 것입니다. 아래 이미지를 참고하시면 좀 더 이해하기 쉽습니다.

https://yeomko.tistory.com/15?category=888201

 

덕분에 R-CNN에 비해 속도와 성능면에서 매우 좋아졌지만 아직까지는 RoI를 찾는데 selective search 방법을 사용하여 해당 부분의 시간 소모가 매우 크다는 문제가 남아있었습니다.

 

Faster R-CNN


Ren, Shaoqing, et al. "Faster r-cnn: Towards real-time object detection with region proposal networks." Advances in neural information processing systems 28 (2015).

Fast R-CNN에서 selective search 방법을 사용하여 시간이 오래 걸렸던 문제를 해결하기 위해 Region Proposal 단계를 Network를 이용해 Object detection을 수행하였습니다. Training 단계에서 RPN(Region Proposal Network)의 output region을 Non-maximum suppression(NMS) 한 결과 region의 개수가 약 2000개로 이전 Fast R-CNN의 selective search 결과 개수와 비슷하지만 속도와 정확도에서 훨씬 좋은 결과를 보입니다.

Fast R-CNN의 대략적인 구조

Region Proposal Network의 순서는 다음과 같습니다.

  1. 먼저 Region Proposal Network 이전에 Conv layers를 통과해 얻은 feature map을 사용합니다.
  2. 이 Feature map을 $n\times n$(논문에서는 $n=3$) kernel을 이용하여 convolution을 수행(intermediate layer)하여 256차원의 채널을 가지는 feature map을 다시 얻습니다.
  3. 새로 얻은 feature map을 box-regression layer($reg$)와 box-classification layer($cls$)에 보내는데 이때 각각 $reg$용 $1\times 1$ convolution layer와 $cls$용 $1\times 1$ convolution layer를 거쳐 regressioni과 classification을 수행하도록 합니다.
  4. 아래 방법으로 각 anchor box에 대한 정보를 계산합니다. 1번에서 얻은 convolution featrue map이 $W\times H$이고 anchor box의 종류가 $k$개일 때, 만들어진 전체 anchor box의 수는 $WHk$개가 됩니다.
    1. classification : class의 분류가 아니라 object가 있는지 없는지를 분류합니다. $1\times 1$ covolution layer를 거쳐 $k$개의 서로 다른 anchor box마다 object가 있는지, 없는지에 해당하는 총 $2k$개의 channel이 생성됩니다.
    2. regression : $1\times 1$ covolution layer를 거쳐 $k$개의 서로다른 anchor box마다 anchor box의 위치와 크기를 조절하기 위한 4개의 parameter를 계산합니다.
  5. 4번에서 얻은 값들을 이용해 RoI를 결정합니다. RPN의 classification 결과를 이용해 NMS를 수행하고, 이때 IoU의 threshold는 0.7으로 설정합니다. 이후 남은 것들 중 top-N rank의 proposal region을 detection에 사용하게 됩니다. 이때 N값에 따라 training시에는 이미지당 약 2000개, test시에는 약 300개의 proposal region을 사용하였습니다.

Regioni Proposal Network(RPN)의 순서

마지막으로 이렇게 얻은 RoI를 feature map에 projection 하여 RoI pooling을 수행하고 Fast R-CNN과 같이 class classification을 수행하여 최종 detection 결과를 얻습니다.

 

Training

RPN이 제안한 RoI가 정확하지 않다면 detection을 제대로 수행할 수 없습니다. 저자들은 Alternating training이라는 방법을 통해 RPN과 classifier를 번갈아가며 학습시켜 성능을 높이고, RPN과 classifier가 서로 분리된 network를 학습하여 사용하는 대신 하나의 network를 같이 사용하도록 하였습니다. 그 방법은 다음 4단계로 이루어집니다.

  1. ImageNet으로 pre-train 된 model을 불러오고 region proposal을 위해 RPN을 end-to-end 방식으로 fine tuning 합니다.
  2. 1단계에서 학습된 RPN이 제안하는 RoI를 이용해 Fast R-CNN의 detection network를 학습시킵니다.
  3. 이제 처음 convolution layer는 고정시킨 상태로 RPN만을 학습시킵니다. 여기서부터 두 network가 conovlution layer를 공유하게 됩니다.
  4. 마지막으로 covolution layer는 여전히 고정시킨 상태로 Fast R-CNN의 detection network를 학습시킵니다.

실험 결과 높은 속도와 성능을 얻었고 Fast R-CNN이 당시 detection task에 널리 쓰이면서 좋은 network임을 증명하였습니다. 또, 다양한 ablation study를 통해 각각의 부분이 기여하는 내용을 실험적으로 확인하였습니다. 

 

R-CNN부터 단점을 고쳐가며 end-to-end 방식으로 높은 속도와 정확도를 얻는 Fast R-CNN까지 2 stage 네트워크들을 정리해보았습니다. 이후 Yolo와 SSD 같은 다른 detection network에 대해서도 정리하며 어떤 방법을 사용하고 어떻게 발전해왔는지 정리해볼 예정입니다.