Fast R-CNN 논문 리뷰

김상현·2021년 4월 8일
3

논문 제목: Fast R-CNN

Fast R-CNN 개요

먼저 이전 모델인 R-CNN의 문제점을 알아보자

  1. 학습이 multi-stage pipeline으로 이뤄진다.
  2. 학습에서 공간(메모리)과 시간 비용이 비싸다
  3. 객체 탐지(object detection)가 느리다.

이러한 R-CNN의 문제들과 함께 이후 발표된 SPPnet의 문제를 해결하기 위해 Fast R-CNN이 제안되었다. 저자들이 밝힌 해당 모델의 이점들은 다음과 같다

  1. R-CNN, SPPnet보다 높은 detection quality(mAP)를 보인다.
  2. multi-task loss를 사용해 single stage 학습을 한다.
  3. 네트워크의 모든 layer들을 갱신(update)할 수 있다.
  4. feature caching을 위한 disk storage가 필요 없다.

Architecture and Training

사진1. Fast R-CNN 모델 구조

Fast R-CNN 모델의 구조는 위의 사진1과 같다.

  1. input image와 multiple regions of interset(RoIs)가 입력으로 사용된다.
  2. 각각의 RoI는 ConvNet 연산을 통해 고정된 크기의 feature map으로 pooling되고, FCs을 통해 feature vector로 매핑(mapping)된다.
  3. RoI별 두 개의 output을 갖는다. 하나는 softmax probabilities이고, 다른 하나는 per-class bounding-box regression offsets이다.

모델은 multi-task loss로 end-to-end 학습된다.
Fast R-CNN은 R-CNN과 마찬가지로 selective search로 RoIs(regions of interest = region proposals)를 먼저 찾은 후 딥러닝을 사용하는 2-stage detector이다.


1. RoI pooling layer

사진2. RoI pooling

Conv연산 후 얻어지는 feature vector는 fc layer의 입력으로 사용되므로 고정된 길이(크기)의 feature vector가 필요하다. R-CNN에서는 이러한 문제 때문에 하나의 입력 image에서 selective search를 통해 구한 2000개의 RoI를 warp하여 크기를 맞춘 뒤 각각 Conv연산을 수행했다. 즉 2000번의 Conv연산을 수행한다.

먼저 SPPnet에 대해 설명하자. SPPnet에서도 selective search를 통해 2000개의 RoI를 구한다. 하지만 R-CNN과 다르게 각각의 RoI를 Conv연산 하는 것이 아닌 입력 image 자체를 Conv연산을 수행한다. 따라서 한번의 Conv연산만 수행하고, pooling 연산을 수행할 feature map을 얻는다. 이때, 입력 image의 크기보다 작아진 feature map에서 RoI의 영역을 알기 위해 RoI projection을 한다. RoI의 위치(좌표 및 높이,너비)와 입력 image와 feature map의 크기의 비율을 고려해 feature map에서 RoI 영역을 지정한다.(사진2 참조) 이렇게 feature map에 축소된 RoI에 Spatial pyramid pooling을 수행하게 된다. 해당 pooling을 통해 고정된 길이(크기)의 feature vector를 얻을 수 있게 된다.

Spatial pyramid pooling

사진3. Spatial pyramid pooling

위 사진과 같이 하나의 feature map에 대해 오른쪽부터 전체에 대한 max-pooling을 수행하여 길이가 1인 벡터를 얻고, 같은 feature map을 2x2로 분할한 후 각 분할마다 max-pooling을 수행하여 길이가 4인 벡터를 얻고, 맨 왼쪽은 위와 같은 방법으로 길이가 16인 벡터를 얻는다. 옆에 곱해진 256은 feature map의 개수이다. 각 분할마다 오른쪽부터 pyramid level 0,1,2 이다. 이렇게 해서 얻어진 1x256,4x256,16x256의 벡터를 concat하여 길이가 21x256인 벡터를 얻는다.
기존의 max-pooling은 (pooling)kernel size와 stride를 정의해 pooling을 수행한다. 반면, Spatial pyramid pooling은 feature map을 고정된 분할(위의 예에서는 1x1,2x2,4x4)로 나눈 후 각 분할에 대해 pooling을 진행한다. 따라서 feature map의 크기가 달라도 고정된 길이의 vector를 얻을 수 있다.

RoI pooling은 RoI projection까지 Spatial pyramid pooling과 같다. 하지만 Spatial pyramid pooling와 같이 다수의 pyramid level을 사용하지 않고 하나의 level만을 사용한다. 또한 RoI pooling은 feature map을 7x7로 분할한다.

cf) spatial pyramid pooling에서 하나의 level만 사용하는 경우

#pytorch에서 사용법
torch.nn.adaptivemaxpool2d

2. Initializing from pre-trained networks

R-CNN과 마찬가지로 ImageNet으로 pretrained된 CNN모델을 사용한다. 해당 논문에서는 VGG16을 사용한다. Object detection을 위해 VGG16모델에 3가지 변형을 준다.

  1. CNN에서 마지막 pooling layer를 RoI pooling layer로 바꾼다.
  2. 마지막 softmax layer의 output 개수를 K+1(category의 개수 + 배경)로 바꾸고, category별 bounding-box regressor를 추가한다.
  3. input으로 images와 해당 images의 RoIs를 입력받을 수 있게 변형한다.

3. Fine-tuning for detection

역전파(back-propagation)를 통해 네트워크의 모든 가중치를 학습하는 것은 Fast R-CNN의 중요한 점이다. 이와 반대로 SPPnet은 spatial pooling layer의 상단인 Conv layers는 학습하지 못한다. 이는 각각의 RoI가 다른 image에서 올 때 역전파가 비효율적으로 수행되기 때문이다.
효율적인 학습을 위해 Fast R-CNN에서는 hierarchical sampling을 사용한다. 이러한 sampling 방법 이외에 Multi-task loss를 이용해 softmax classifier와 bounding-box regressors를 한번의 fine-tuning으로 학습시킨다.

Hierarchical sampling

Hierarchical sampling을 통해 SGD mini-batch를 구성하는 방법은 다음과 같다.
먼저 N개의 image를 sampling 한 후, 각각의 image에서 R/N개의 RoIs를 sampling 한다. 같은 image에서 온 RoIs는 순전파와 역전파시 computation와 memory를 공유할 수 있다. N을 작게하면 mini-batch의 연산을 줄인다.

본 논문에서는 N=2, R=128로 설정했다. 즉, 논문의 예시에서는 64개의 RoI를 각 image에서 sampling 한다. 이때, 총 64개의 RoI 중에서 25%(16개)은 ground truth와 IoU(Intersection of Union)값이 0.5 이상인 sample에서 추출하고, 나머지 75%(48개)는 IoU값이 0.1~0.5 사이의 sample에서 추출한다. 전자의 경우는 positive sample(객체), 후자는 negative sample(배경)이다.

Multi-task loss

위의 설명처럼 softmax classifier와 bounding-box regressors를 한번에 학습하기 위해 multi-task loss를 사용한다. loss는 다음과 같다.

L(p,t,tu,v)=Lcls(p,u)+λ[u1]Lloc(tu,v)L(p,t,t^u,v) = L_{cls}(p,u) + \lambda [u\ge1]L_{loc}(t^u,v)

p=(p0,...,pk)p = (p_0,...,p_k): K+1개의 class score
uu : class ground truth
tu=(txu,tyu,twu,thu)t^u = (t^u_x,t^u_y,t^u_w,t^u_h) : u 클래스의 bounding box 좌료를 조정하는 값
(R-CNN에서 regressor output처럼 해당 좌표가 아니라 ground truth 좌표를 계산할 수 있게 해주는 값)
v=(vx,vy,vw,vh)v = (v_x,v_y,v_w,v_h): bounding box 좌표값의 ground truth
λ\lambda: hyperparameter(논문에서 λ=1\lambda = 1)

LclsL_{cls}는 cross-entropy error로 계산된다.

LlocL_{loc}는 다음과 같이 정의된다.
Lloc(tu,v)L_{loc}(t^u, v) == Σi{x,y,w,h}\Sigma_{i\in\{x,y,w,h\}}smoothL1(tiuvi)smooth_{L1}(t^u_i - v_i)
smoothL1(x)smooth_{L1}(x) = 0.5x20.5x^2 if x<1|x| <1
smoothL1(x)smooth_{L1}(x) = x0.5|x| - 0.5 otherwiseotherwise

L1L_1 loss가 outlier에 대해 L2L_2 loss 보다 덜 민감하기 때문에 smoothL1smooth_{L_1}을 사용한다.

[u1][u\ge1]는 indicator function으로 해당 클래스에 속할때만 loss를 계산하게 한다.


Fast R-CNN detection

사진4

학습을 마친 Fast R-CNN 모델로 object detection을 수행할 때 위의 사진과 같이 수행한다. 학습때와 다른 점은 2 가지이다.

  1. Truncated SVD를 이용해 fully connected layers의 연산을 빠르게 한 것
  2. Non maximum suppression으로 최적의 bounding box만 출력

Conclusion

Fast R-CNN은 기존의 모델들(R-CNN, SPPnet)보다 깔끔하고 빠른 학습을 한다. 또한 당시 state-of-the-art의 detection result를 보여줬다.

References

Fast R-CNN 논문 https://arxiv.org/abs/1504.08083
https://herbwood.tistory.com/9?category=867198
https://yeomko.tistory.com/15
https://89douner.tistory.com/90
Fast R-CNN youtube 강의 영상(by Cogneethi)
코드참조

profile
Mucha Suerte

0개의 댓글