상세 컨텐츠

본문 제목

[3주차 / 임정준 / 논문 리뷰] Fast R-CNN

방학 세션/CV

by Imjjun 2023. 1. 31. 23:20

본문

#0 Abstract

 

 16기 임정준_R-CNN보다 Fast R-CNN을 보고자 했던 이유는 더 정교해진 Multi-task Loss를 기반으로 더 좋은 성능을 보인 비교적 최신 모델이기 때문이었다. 더불어, RoI(Region of Interest) Pooling 이나 Truncated SVD와 같은 Method들을 총체적으로 이해하는데 그 주안점이 있었다.

 

 논문에서 나타난 알고리즘의 주요한 변화들은 다음과 같다.
- 더 높아진 Detection Quality(mAP)
 - Multi-task Loss 기반의 Single Stage training
 - 모든 Network layers 업데이트 가능
 - Feature Caching을 위한 디스크 공간 불필요

 

 Fast R-CNN은 기존 R-CNN 대비 VGG16 network에서 9배 빠르게, Test Time에서는 213배 빠르면서도 더 높은 mAP를 달성하였다. 당대 최신 모델이었던 SPPnet과 비교했을때에도, VGG16보다 3배 빠르게, Test Time에서는 10배 빠르고 정확하게 detection을 수행하였다.

 

#1 R-CNN & SPPnet

 

 Fast R-CNN의 탄생은 R-CNN이 가지고 있었던 문제점에서 출발한다. 첫째, 너무나도 많은 Region Proposals 때문에 Detection 속도가 느려질 수 밖에 없다. SelectiveSearch의 Fast 모드를 적용하더라도 약 2000장 정도의 Proposal들을 모두 CNN 모델에 입력해야 하기해 실시간 영상처리로 접근하기에는 무리가 따를 수 밖에 없다. 둘째, 이러한 Proposal들은 소위 'rough'한 Proposals들만 제공하기 때문에 localization의 정확도를 높이기에는 한계가 존재할 수 밖에 없다. 따라서, 속도와 정확도의 향상을 위해서는 이 'Region Proposal'에 대한 고민을 하지 않을 수 없었을 것이다.

 

 1) 학습이 'Multi-stage'로 구성되어 있다.

    R-CNN은 3가지의 모델(AlexNet, Linear SVM, Bounding Box Regressor)를 독립적으로 학습시키다보니, 아키텍처가 하나로 묶이지 못하고 연산을 공유하거나 가중치를 한번에 업데이트하기 어렵다는 문제가 있었다. 

 

 2) 시간/공간 복잡도 측면에서 학습이 굉장히 '비싸다'

   SVM이나 Regressor의 트레이닝의 경우, 각 이미지마다 Feature Caching을 진행하야하기에 공간 소요가 크며, VGG-16과 같은 당대 최신 모델들을 기반으로 학습을 시키기에는 상대적으로 너무 긴 시간이 소요된다(VOC07 데이터셋 기준 2.5 GPU-days, n*100 Gigabytes)

 

 3) 느린 객체 탐지

   상기된 이유들과 연결되어, Test Time 간 이미지 한장당 47초의 탐지 시간이 소요된다.

 

 또한, SPPnet(Spatial pyramid pooling networks) 역시 R-CNN의 연산을 공유하면서 시간을 향상시켜보려고 했으나, Multi-Stage Pipeline이라는 점(R-CNN의 1) 단점)은 아직까지 실시간 객체 탐지 수준까지 그 성능을 끌어올릴 수 없었음을 시사한다. 또한, SPP에도 불구,  Convolution layers들까지 가중치들이 제대로 업데이트되지 않아 깊은 네트워크에서는 정확도의 향상에 분명한 한계가 있음이 드러났다.

 

 

#2 Fast R-CNN Architecture and Training

 

Reference: Ross Girshick, "Fast R-CNN", 2015, arXiv:1504.08083v2

 Fast R-CNN network는 전체 이미지와 Proposal set들을 input으로 받는다. 즉 이미지 데이터셋에서 Feature Extraction(특징 추출)을 위해 ConvNet에 이미지 set을 넣는 동시에, RoI Pooling을 위하여 SelectiveSearch에 마찬가지로 이미지 데이터셋을 넣는다. 그리고 SS에서 나온 Feature map으로부터 각 object proposal마다 고정된 길이의 피처 벡터를 추출하여 FC layers들에 들어가는 sequence에 이를 적용한다(RoI Feature Vector 생성). 그 다음, Classification을 위해 Softmax에, Regression을 위해 Bounding Box Regressor에 각각 피처 벡터를 넣어 K+1개(K object classes + 1[background])의 softmax 확률값과 4개의 bounding box positions을 계산한다.

 

 1) RoI Pooling Layer

   

   RoI Pooling layer는 고정된 사이즈 H * W에 벡터를 매핑하기 위해서 지정한 크기의 Grid로 이미지를 분할한 후 Max Pooling을 적용한다. H와 W는 Hyperparameter이며, RoI는 Convolution Feature Map의 사각형 window로 좌측 최상단 좌표 및 너비, 높이 (r, c, h ,w), 4-Tuple로 정의된다.

   Grid는 h/H * w/W 형태의 sub-windows로 분할하여 각각의 피처 맵 채널에 독립적으로 Pooling을 적용한다. 그리고 나머지 계산은 SPPnet의 one pyramid level의 연산과 동일하게 적용한다.

 

  이에 대한 참조적인 설명은 다음과 같다.

 

 

 

Reference: herbwood, Fast R-CNN 논문 리뷰, '약초의 숲으로 놀러오세요' https://herbwood.tistory.com/8

 

      [1] 원본 이미지를 CNN에 통과시켜 Feature Map을 얻는다.

         : Sub-sampling ratio=1/100이라 할 때, 8*8 size의 Feature Map을 얻을 수 있다

 

      [2] 동시에 해당 이미지에 대해서 Selective Search를 적용하여 Region Proposals을 얻는다.

        : 원본 이미지에 SS를 적용하여 500*700의 Region Proposals를 얻는다.

 

      [3] Feature Map에서 RoI Projection을 통해 영역 추출을 한다. Region Proposals의 크기를 Sub-sampling ratio에 맞추어 중심 좌표와 그 크기를 변경한다.

       : Feature Map에서 해당되는 5*7 영역으로 비율을 변경하여 영역 추출을 얻는다.

 

      [4] RoI Feature Map을 Sub-window의 크기에 맞게 Grid로 나누어 준다.

      : 5*7 Size의 RoI Feature Map을 2*2 Size에 맞게 Grid를 나누어 준다.

   

      [5] 각 Grid마다 Max Pooling을 수행하여 고정된 크기의 Feature Map을 얻는다.

  ==> 최종적으로 Max Pooling 수행을 통해 고정된 크기의 Feature Map 확보, Region Proposal의 크기가 달라도 궁극적으로 Grid를 같은 비율로 나누기 때문에 Max Pooling을 진행하면 Size가 고정된다.

 

 

  2) Initialization from pre-trained networks

 

   ImageNet network의 pre-trained network를 활용하였으며, 마지막 Max Pooling layer와 Fully Connected Layer(*nn.Linear or Dense)의 H와 W Size를 맞추기 위해 이를 조정하였다(ex. H=W=7 for VGG16). 또한, 마지막 Fully Connected Layer와 Softmax Function의 경우, 이전에 언급된 두 개의 layer들로 대체되었다(Fc & Softmax / Bounding Box Regressor). 그리고 image의 리스트와 RoI의 리스트, 두 개의 input을 받을 수 있도록 수정되었다.

 

 첫번째 Fc layer의 경우 Background를 포함한 (K+1) 개의 class의 output unit을 가지며, 두번째 Fc layer는 (K+1)*4의 output unit을 가진다. 또한, Convolution layer 3까지 가중치 값을 고정(freeze)하고, 이후 layer들의 가중치까지 함께 update될 수 있도록 Fine tuning하였다.

 

  3) Fine-Tuning for detection: Mini-batch Sampling

   

   Training 간 모든 가중치를 Update할 수 없었던 R-CNN과 SPPnet의 문제점은 역전파 간 training sample이 다르기 때문에 오는 비효율성, 그리고 이는 각 RoI가 매우 큰 Receptive Field를 가진다는 것에 기인한다. 따라서 본 논문에서는 Feature Sharing의 장점을 살리기 위하여 Stocahstic Gradient Descent(SGD) mini-batch들을 계층적으로 샘플링하여 N개의 이미지와 각 이미지의 R/N 만큼 샘플링하였다. 따라서 같은 이미지로부터의 RoI들이 Computation과 Memory를 공유할 수 있도록 한다.

 

  예를 들어 N=2 & R=128이라면, 2개의 이미지에서부터 각각 64개의 RoI들을 추출해낸다. 그리고, Ground-truth Bounding Box와 IoU(intersection of Union)이 적어도 0.5가 넘는 proposal로부터 25%의 RoI를 취한다. 남은 RoI들중 [0.1,0.5) 구간 사이의 IoU에서 가장 큰 object proposals만 샘플링하였다. 25%를 취한 RoI는 Positive Sample, 나머지는 Negative Sample이라 할 수 있겠다.

 

   하지만 Slow Training Convergence에 대한 우려가 있을 수 있는데, 본 논문의 저자는 Practical level에서는 이러한 현상이 나타나지 않았다고 언급하였다. 또한, Data Augmentation의 경우, 랜덤하게 50% 확률로 수직 방향으로의 Flip이 일어나며 그외 다른 Augmentation은 적용되지 않았다고 설명되었다.

 

 4) Multi-task Loss

 

  본 논문의 핵심이라고 생각하는데, Loss에 대한 정의가 결국 Optimization에 직/간접적으로 Back propagation을 하는데 연관되는 것이기에 Loss에 대한 Design이 중요하다고 생각했고 본 논문에서 그 효과가 잘 드러난다고 생각한다.

  

Reference: Ross Girshick, "Fast R-CNN", 2015, arXiv:1504.08083v2

  Loss Function에 대한 Notation은 다음과 같다. Hyperparameter Λ의 경우,  두개의 loss의 균형을 맞추기 위한 초모수이다. L_cls는 -log p_u로 true class u에 대하여 log loss를 적용한 것이다. 즉, Cross-Entropy Loss로 이해할 수 있다. 본 Loss에서는 클래스의 개수를 (K+1)로 정의하는데, 이는 '+1'을 Background Class로 구분하기 위해서입니다.

 

  두번째 Loss는 true bounding-box regression targets (v_x, v_y, v_w, v_h)와 클래스 u에 대해 예측된 tuple (t_x, t_y, t_w, t_h)을 아울러 정의된다. Indicator function [u>=1]은 u가 1보다 크거나 같을 때는 1, 나머지에는 0을 적용하여 모든 Background class에는 label 0을 적용한다. 그리고 L_loc, Bounding-box Regression에는 다음과 같은 loss를 적용한다.

 

Reference: Ross Girshick, "Fast R-CNN", 2015, arXiv:1504.08083v2

  robust L1 Loss를 활용하면서, SPPnet & R-CNN보다 이상치에 덜 민감하도록 설계하였다. 뿐만 아니라, smooth L1을 활용하여 Gradient가 폭발하는 경우가 없도록 유연하게 설계되었다고 할 수 있다.

  

Reference: Ross Girshick, "Fast R-CNN", 2015, arXiv:1504.08083v2

  

  또한, RoI pooling layers을 통한 Back-propagation은 상기 공식으로 수행되는데 y_rj를 RoI Pooling Layer의 r-th RoI의 j-th output이라고 하자. 이때 RoI layer는 y_rj=x_i*(r,j)를 계산하는데, 이는 i*(r,j)=argmax x_i * R(r,j)로 정의되며 output unit y_rj가 max pooling한 sub-window의 set가 input으로 들어간 것에 해당한다. 

 

 같은 말로, mini-batch RoI r과 pooling output unit y_rj에 대하여, i가 max pooling된 y_rj의 argmax로 선택되었을 때, 편미분 dL/dy_rj가 축적되는 것을 의미한다. 실제로도, Back-Propagation에서 본 편미분은 backward function을 통해 RoI pooling layer의 top 부분에서 미리 계산된다.

 

 

  +) SGD hyper-parameters 및 Scale Invariance에 대한 Experiment도 실행되었으며(SGD: momentum=0.9 & parameter decay = 0.0005, Scale: "brute force"=pre-defined pixel size & "image pyramids"=approximate scale normalize) 

 

 5) Training with Dimension

Reference: herbwood, Fast R-CNN 논문 리뷰, '약초의 숲으로 놀러오세요' https://herbwood.tistory.com/8

  상기 이미지는 training간의 각 layer들에 대한 Dimension을 나타낸 자료이다. Implementation 시 차원적인 부분에 대하여 고민해볼 수 있을 것이다.

 

#3 Fast R-CNN detection

 

 1) Truncated SVD

   

  많은 수의 RoI들을 detection을 위해 처리할 때, Fully Connected Layer에서 다른 Convolution layer와 비교해서 많은 computing이 소요된다. 따라서 본 논문에서는 Truncated SVD를 통해 비교적 큰 Fc layer를 손쉽게 가속시킬 수 있도록 하였다.

Reference: herbwood, Fast R-CNN 논문 리뷰, '약초의 숲으로 놀러오세요' https://herbwood.tistory.com/8
Reference: Ross Girshick, "Fast R-CNN", 2015, arXiv:1504.08083v2

   SVD란 특잇값 분해로, m*n 행렬 W를 각각 Dimension에 맞추어 m*m U, m*n Σ, n*n V^T로 각각 분해하는 것을 의미한다. 이때, Truncated SVD는 Full SVD로 근사시키는 것으로, u*t U, t*t Diagonal Matrix Σ, v*t V matrix로 분해하는 것을 의미하는데, 이때 t는 W의 singular Value들로 이루어진 것(즉, 특잇값이 0이 부분이 제거됨)이라고 할 수 있다. 이러한 network 압축을 통해, parameter의 개수를 uv에서 t(u+v)까지 줄여 연산의 효율성을 높였다. Fc의 첫번째 layer에서는 ΣV^T(no bias)가 활용되고, 두번째에서는 U(W의 original bias와 함께)가 활용된다.

 

 2) Detection with Dimension

Reference: herbwood, Fast R-CNN 논문 리뷰, '약초의 숲으로 놀러오세요' https://herbwood.tistory.com/8

   상기된 이미지는 Training 때와 마찬가지로 Detection 시에 모델 구조이다. Fc layer에 Truncated SVD가 적용되고, 예측 이후 NMS를 거쳐서 최종 Prediction이 진행되는 것이 Training과의 차이점이라고 할 수 있다. Non Maximum Suppression 알고리즘을 통해 최적의 bounding box를 출력하도록 하는 것인데, 간단히 설명하면 Bounding Box들에 대하여 Confidence Score 순으로 내림차순으로 정렬한 다음 IoU threshold 및 Confidence threshold에 근거하여 겹쳐진 box를 제거하는 알고리즘을 의미한다.

 

#4 Experiment in VOC Dataset

 

Reference: Ross Girshick, "Fast R-CNN", 2015, arXiv:1504.08083v2

 

 상기된 테이블에서 S/M/L은 각각 Backbone model의 Depth 크기를 의미한다. train time, test rate 모두 속도 향상이 일어난 것을 볼 수 있으며, mAP의 경우에도 다른 모델들에 비해 성능이 향상된 것을 확인할 수 있다. 이는 본 논문 저자가 적용한 Truncated SVD, Multi-task Loss, layer Fine-tuning 등의 방법들이 어느정도 작용한 결과라고 설명될 수 있겠다.

 

 본 모델의 의의는 Softmax를 활용하고, 가중치를 한번에 업데이트할 수 있도록 Architecture를 묶은 점, Two-stage Detection 모델에서 시간 단축을 유의하게 성공시켰다는 것에 있을 것이다. 그러나 아직까지 SelectiveSearch 알고리즘이 적용되어 2000장의 RoI에 대해 계산이 필요하다는 점에서 본 모델이 하나의 '신경망'이라고 언급하기 애매하다는 것, 실시간 Detection으로 활용하기에는 그 성능이 부족하다는 점에서 새로운 모델에 대한 연구가 진행되어야 함을 본 논문의 저자 역시 시사하였다. 그리고 이후, Faster R-CNN 모델 및 Yolo와 같은 One stage Model들이 이 자리를 메꾸기 시작했다.

관련글 더보기

댓글 영역