약초의 숲으로 놀러오세요

R-FCN 논문(R-FCN: Object Detection via Region-based Fully Convolutional Networks) 리뷰 본문

Computer Vision/Object Detection

R-FCN 논문(R-FCN: Object Detection via Region-based Fully Convolutional Networks) 리뷰

herbwood 2021. 1. 4. 21:39

이번 포스팅에서는 R-FCN 논문(R-FCN: Object Detection via Region-based Fully Convolutional Networks) 을 읽고 리뷰해보도록 하겠습니다. 일반적으로 2-stage detector는 서로 다른 task를 수행하는 두 sub-network간에 주로 학습하는 속성에서 차이가 발생하는데 이를 translation invariance 딜레마라고 합니다. 이러한 문제를 해결하기 위해 ResNet 논문의 저자는 모델 설계 시 conv layer 사이에 RoI pooling을 삽입합니다. 하지만 이같은 방법을 사용할 경우 수많은 RoI를 개별적으로 conv, fc layer에 입력시켜야 합니다. R-FCN 논문의 저자는 이로 인해 학습, 추론 시 많은 시간이 소요된다는 점을 지적합니다. R-FCN 모델을 살펴보기에 앞서 논문을 이해하기 위해 필요한 배경 지식부터 가볍게 짚고 넘어가도록 하겠습니다. 


Preview

R-FCN architecture

R-FCN 모델은 backbone networkRPN(Region Proposal Network)로 구성되어 있습니다. backbone network는 feature extract 기능을 수행하며, 논문에서는 ResNet-101 모델을 사용합니다. 원본 이미지를 backbone network와 RPN에 입력하여 각각 $k^2(C+1)$-d channel을 가지는 Position-sensitive score maps과 RoI(Region of Interest)를 얻습니다. 이를 활용하여 Position-sensitive RoI pooling을 수행하여 kxk(x(C+1)) 크기의 feature map을 출력합니다. feature map의 각 channel별로 요소의 평균값을 구하는 voting을 수행하여 (C+1) 크기의 feature vector를 얻고 이에 대하여 softmax 함수를 적용하여 loss를 계산합니다. 

 

Main Ideas

Translation invariance  Dilemma

 

Translation Invariant

Translation invariance는 입력값의 위치가 변해도 출력값은 동일할 경우에 해당하는 함수의 속성입니다. 만약 위치가 서로 다른 동일한 객체, 예를 들어 위의 그림과 같이 석상(statue)의 이미지를 특정 모델에 입력해도 동일하게 석상이라고 인식할 경우, 해당 모델은 translation invariance한 속성을 가지고 있다고 할 수 있습니다. 반대로 입력값의 위치가 변하면 출력값이 달라질 경우 이를 translation variance(=equivalence)라고 합니다. 

 

Image classification task 시, 이미지 내 객체의 위치가 바뀌더라도 동일한 객체로 인식하는 것이 바람직하기 때문에 인식 image classification 모델은 translation invariance 속성을 선호합니다. 반면 Object detection 시에는 객체의 위치가 변화하면 이러한 변화를 잘 포착하는 것이 바람직하기 때문에 학습 시 translation variance 속성을 중요시합니다. 

 

2-stage detector의 경우 feature를 추출하는 역할을 수행하는 backbone network와 detection을 수행하는 network로 구성되어 있습니다. 그중 backbone network는 image classification task를 위해 pre-trained되어 있습니다. R-CNN의 경우 AlexNet, Fast R-CNN과 Faster R-CNN의 경우 VGG16이 backbone network입니다. 즉 원본 이미지를 backbone network에 입력하여 얻은 feature map은 translation invariance한 속성을 띄고 있습니다.

 

반면 detection을 수행하는 network는 translation variance한 속성을 가져 객체의 위치 변화에 민감하게 반응하는 것이 바람직합니다. 하지만 원본 이미지를 backbone network에 입력하여 얻은 feature map은 위치 정보가 소실된 채로 detection network로 입력됩니다. detection network는 객체에 대한 위치 정보가 부재한 feature map이 입력되어 적절하게 학습이 이뤄지지 않습니다. 이처럼 두 network간에 충돌이 발생하는 경우를 translation invariance dilmma라고 하며, 이로 인해 mAP값이 하락하게 됩니다. 

 

ResNet + Faster R-CNN

ResNet 논문의 저자는 위와 같은 문제를 해결하기 위해 두 conv layer 사이에 RoI pooling layer를 추가합니다(ResNet은 classification task 외에도 object detection task용으로도 활용될 수 있습니다). Object detection task를 위해 설계된 ResNet의 구조는 backbone network로 ResNet을 사용하며, 전체적인 구조는 Faster R-CNN 모델과 유사합니다. 하지만 backbone network 이후 conv1~4라는 conv layer가 있으며, RoI pooling 이후 conv5라는 conv layer가 있다는 점에서 차이가 있습니다. ResNet+Faster R-CNN 모델은 두 conv layer 사이에 RoI pooling을 삽입하여 region specific한 연산을 추가했습니다. 이는 network가 서로 다른 위치에 있는 객체를 서로 다르게 인식한다는 것을 의미합니다. 이를 통해 RoI pooling layer 이후 conv layer는 translation variance한 속성을 학습하는 것이 가능해집니다. 

 

하지만 본 논문의 저자는 ResNet+Faster R-CNN 모델과 같은 방법을 사용할 경우 성능은 높일 수 있지만 모든 RoI를 개별적으로 conv, fc layer에 입력하기 때문에 학습 및 추론 속도가 느려진다는 점을 지적합니다. 이러한 문제를 해결하기 위해 R-FCN 모델은 RPN을 통해 추출한 RoI끼리 연산을 공유하면서 객체의 위치에 대한 정보를 포함한 feature map을 사용하는 구조를 가지고 있습니다. 

Backbone Network

R-FCN 모델은 backbone network로 ResNet-101 network를 사용합니다. 논문의 저자는 pre-trained된 ResNet-101 모델의 average pooling layer와 fc layer를 제거하고 오직 conv layer만으로 feature map을 연산하도록 학습시킵니다. 마지막 feature map의 channel은 2048-d이며, 1x1 conv 연산을 적용하여 channel 수를 1024-d로 줄입니다. 

Position sensitive score maps & Position-sensitive RoI pooling

RoI divided by k grid

RPN을 통해 얻은 각각의 RoI에 대하여 class별로 위치 정보를 encode하기 위하여 RoI를 $k \times k$ 구간의 grid로 나눠줍니다. RoI의 크기가 $w \times h$인 경우, 각 구간의 크기는 대략적으로 ${w \over k} \times {h \over k}$입니다. 논문에서는 $k=3$으로 지정합니다. 

 

R-FCN architecture

앞서 얻은 feature map의 channel 수가 $k^2(C+1)$가 되도록 마지막 conv 연산을 적용하여 Position-sensitive score map을 생성합니다. 여기서 $C$는 class의 수를 의미합니다(배경을 포함하기 때문에 1을 더해줍니다). 이같은 경우 RoI를 9($k^2=9$)개의 구간으로 나눠 class별로 위치 정보인 {top-left, top-center, top-right, ..., bottom-right}에 해당하는 정보를 encode하고 있다고 볼 수 있습니다. Position-sensitive score map과 RoI를 활용하여 $(i, j)$번째 구간에서 오직 (i, j)번째 score map만 pooling하는 Position-sensitive RoI pooling을 수행합니다. pooling한 결과를 구하는 수식은 아래와 같습니다. 

 

$$r_c\left({i, \ j}|{\theta }\right)\ = \ \sum_{\left(x, y\right)\in bin\left(i, j, \right)}^{ }z_{i, j, c}\left({x+x_0, \ y+y_0}|{\theta }\right)\ /\ n$$

 

  • $r_c(i, j)$ : c번째 class의 $(i, j)$번째 구간의 값이 pooling된 결과
  • $z_{i, j, c}$ : $k^2(C+1)$ score map 중 하나의 score map
  • $n$ : 구간 내의 픽셀의 수
  • $\theta$ : 네트워크 내의 모든 학습 가능한 파라미터 

Position-sensitive RoI pooling

간단하게 살펴보면 각 class별로 ${w \over k} \times {h \over k}$만큼의 RoI grid에 대하여 average pooling을 수행한 것이라고 볼 수 있습니다. 이를 통해 RoI별로 크기가 $k \times k$이며 channel 수가 $(C+1)$인 feature map이 생성됩니다. 

 

 

이후 각 class별로 $k \times k$ 크기의 feature map의 각 요소들의 평균을 구합니다. 논문에서는 이 과정을 voting이라고 언급합니다. $k=3$일 경우, channel별로 9개의 요소의 합의 평균을 구하면 됩니다. 이를 통해 $(C+1)$ 크기의 feature vector를 얻을 수 있고, softmax function을 통해 loss를 계산합니다.위의 그림은 position-sensitive RoI pooling과 voting을 수행하는 과정을 보여주고 있습니다. 

 

논문에서는 bounding box regression 역시 비슷한 방법으로 수행합니다. $k^2(C+1)$-d feature map 외에도 $4k^2$-d feature map을 추가하여 bounding box regression을 수행합니다. 이에 대한 내용은 아래 Training 파트에서 살펴보도록 하겠습니다. 

Loss function

$$L(s, t_{x, y, w, h}) = L_{cls}(s_{c*}) + \lambda[c^* > 0]L_{reg}(t, t^*)$$

Loss function은 Fast R-CNN 모델과 같이 cross-entropy loss와 bounding box regression loss의 합으로 구성되어 있습니다. 여기서 $c^*$은 RoI의 ground truth label에 해당하며, IoU 값을 기준으로 0.5 이상일 경우 $c^*=1$, 그 이외의 경우에는 $c^*=0$입니다. 두 loss 사이의 가중치를 조절하는 balancing parameter인 $\lambda=1$로 설정했습니다. Loss function에 대한 자세한 설명은 Fast R-CNN 논문 리뷰 포스팅을 참고하시기 바랍니다. 

Training

Training R-FCN

1) feature extraction by pre-trained ResNet-101

원본 이미지를 pre-trained된 ResNet-101 모델에 입력하여 feature map을 얻습니다. 

 

  • Input : image
  • Process : feature extraction
  • Output : feature map

2) Position-sensitive score maps by conv layer

앞서 얻은 feature map을 channel 수가 $k^2(C+1)$이 되도록 하는 conv layer에 입력하여 Position-sensitive score maps를 얻습니다. 논문에서 $k=3$, $C=20$으로 지정했습니다. bounding box regression 역시 이와 같은 방법으로 수행합니다. 다만 앞서 얻은 feature map을 channel이  $4k^2$가 되도록 하는 conv layer에 입력합니다. 이를 통해 RoI의 각 구간별로 bounding box의 offset이 encode된 $4k^2$-d feature map을 얻습니다. 

 

  • Input : feature map
  • Process : 3x3(x$k^2(C+1)$) conv layer, 3x3(x$4k^2$) conv layer
  • Output : $k^2(C+1)$-d feature map(position-sensitive score map), $4k^2$-d feature map

3) Region proposal by RPN

원본 이미지를 pre-trained된 ResNet-101 모델에 입력하여 얻은 feature map을 RPN(Region Proposal Network)에 입력합니다. 이를 통해 RoIs를 얻을 수 있습니다. 자세한 과정은 Faster R-CNN 논문 리뷰 포스팅을 참고하시기 바랍니다. 

 

  • Input : feature map from pre-trained ResNet-101
  • Process : region proposal
  • Output : RoIs

4) Average pooling by Position-sensitive pooling

2)번 과정에서 얻은 $k^2(C+1)$-d feature map(position-sensitive score map), $4k^2$-d feature map과 3)번 과정에서 얻은 RoIs를 사용하여 Position-sensitive pooling을 수행합니다. 이 과정을 통해 각각 $k \times k(\times (C+1))$ feature map과 $k \times k(\times 4)$ 크기의 feature map을 얻을 수 있습니다. 

 

  • Input : $k^2(C+1)$-d feature map(position-sensitive score map), $4k^2$-d feature map and RoIs
  • Process : position-sensitive pooling
  • Output : $k \times k(\times (C+1))$ sized feature map, $k \times k(\times 4)$ sized feature map

5) Voting

Voting

4)번 과정을 통해 얻은 feature map에 대하여 각 channel의 요소들의 평균을 구하는 voting 과정을 수행합니다. 이를 통해 $k \times k(\times (C+1))$ 크기의 feature map으로부터 class score에 해당하는 $(C+1)$ 크기의 feature vector를, $k \times k(\times 4)$ 크기의 feature map으로부터 bounding box regressor에 해당하는 길이가 4인 feature vector를 얻을 수 있습니다.

 

  • Input : $k \times k(\times (C+1))$ sized feature map, $k \times k(\times 4)$ sized feature map
  • Process : Voting
  • Output : $(C+1)$-d sized feature vector, 4-d sized feature vector 

6) Train R-FCN network by loss function

마지막으로 앞선 과정에서 얻은 feature vector를 사용하여 각각 cross-entropy, smooth l1 loss를 구한 후 backward pass를 통해 network를 학습시킵니다. 실제 학습 시에는 RPN과 R-FCN을 번갈아가며 학습하는 4-step alternating training 방식을 사용했다고 합니다. 

Inference

detection 시에는 최종적으로 얻은 예측값에 Non maximum suppression을 수행합니다. 이 때 nms threshold=0.7, IoU threshold=0.5로 설정합니다. 


R-FCN 모델은 class별로 객체의 위치 정보를 encode한 position-sensitive score & pooling을 통해 translation invariance dilemma를 효과적으로 해결했습니다. 이를 통해 PASCAL VOC 2007 데이터셋을 사용했을 때, 83.6%라는 높은 mAP값을 보였습니다. R-FCN 모델은 이름 그대로 fully convolutional network이며, 오직 conv layer로만 구성되어 있습니다. 또한 position-sensitive pooling 이후 학습 가능한 layer가 없기 때문에 region-wise 연산량이 많지 않아(cost free) 학습 및 추론 속도가 빠르다는 장점이 있습니다. detection 시 이미지 한 장당 170ms 정도 소요되며 이는 ResNet + Faster R-CNN 모델보다 0.5~20배 이상 빠른 속도라고 합니다. 

 

개인적으로 이해하기 힘든 논문이었던 것 같습니다. 논문의 서론부터 언급하는 translation invariance에 대한 지식이 부족하여 초반부터 어렵게만 느껴졌습니다. 무엇보다 참고할만한 블로그나 컨텐츠 자체가 많이 부재해서 이해하는데 더 많은 시간이 소요되었던 것 같습니다. 최대한 여러 번 읽고, 여러 매체를 참고해서 글을 열심히 썼지만 내용 면에서 조금 아쉽다는 생각이 듭니다😰. 시간이 있을 때 공개된 구현 코드까지 공부한 후 조금 더 보강해보도록 하겠습니다. 다음 포스팅에서는 YOLO v2 논문을 읽고 리뷰해도록 하겠습니다. 

 

Reference

R-FCN 논문(R-FCN: Object Detection via Region-based Fully Convolutional Networks)

cool24151님의 R-FCN 논문 리뷰

translation invariance에 대한 설명

ganhee-lee님의 translation invariance에 대한 설명

라온피플님의 ResNet 모델 구조에 대한 설명

ResNet 논문(Deep Residual Learning for Image Recognition)

Fast R-CNN 논문 리뷰

Comments