[논문 리뷰]Fast R-CNN

0

논문리뷰

목록 보기
4/5

1. Introduction

Object Detection task에 대한 현재의 접근법들은 모델을 multi-stage 파이프라인으로 훈련시키는데 이는 느리고 우아하지 않다.

Object Detection의 복잡성은 두 측면에서 나온다. 첫 째는 다수의 후보 object location들이 처리되어야 한다는 것이다. 둘 째는 이 후보들의 위치가 수정되어야 한다는 것이다.

현재의 접근법들과 달리 우리는 object proposal들을 분류하는 작업과 그들의 위치를 수정하는 작업을 동시에 수행하는 single-stage 알고리즘을 제안한다.

1.1 R-CNN and SPPnet

R-CNN은 몇 가지의 문제점을 갖고 있다.

1) 훈련이 multi-stage 파이프라인이다.
R-CNN은 a) log loss를 사용해 ConvNet을 파인튜닝하고 b) 파인튜닝한 ConvNet의 출력 feature에 SVM을 추가해 object detection을 수행한다 c) bounding-box regresor 가 훈련된다.

2) 훈련이 시공간적으로 비싸다
VGG16을 사용하는 R-CNN의 경우 2.5 GPU-days가 소요되고 feature들을 처리할 때 수백 GB의 저장 공간이 요구된다.

3) Object detection이 느리다.
VGG16을 사용하는 모델의 경우 사진 한 장당 47초의 시간이 걸린다.

R-CNN이 느린 이유는 모든 object proposal에 대해 각각 ConvNet forward pass를 수행하기 때문이다. 이 과정에서 computation을 공유하지도 못한다.

SPPnet은 인풋 이미지 전체에 대해서 convolutional feature map을 계산하고, 이 feature map에서 object proposal에 해당하는 부분만을 추출해 object detection을 수행한다. object proposal에 해당되는 부분만을 추출한 후, max pooling을 통해 고정된 크기의 output을 출력(e.g., 6 ×\times 6)한다.

R-CNN에 비해서 SPPnet은 훨씬 빠르지만 여전히 문제점을 갖는다. 학습은 여전히 multi-stage 파이프파인 형태를 띈다. Features는 디스크에 공간을 차지하고, spatial pyramid pooling을 선행하는 convolutional layer들을 update하지 못한다.

2. Fast R-CNN architecture and training


Fast R-CNN은 이미지 전체와 object proposal들을 인풋으로 받는다. 입력된 이미지는 여러 개의 conv layer와 max pooling layer를 거쳐 conv feature map이 된다. 이후 각 object proposal마다 RoI pooling layer가 고정된 길이의 feature vecture를 추출한다. 이 feature vecture는 fully connected layer(fc)들을 거쳐 두 갈래의 output layer로 입력된다. 하나는 K개의 object class에 'background' class를 더한 (K+1)개의 클래스에 대한 확률을 출력하는 softmax 레이어이다. 나머지는 K개의 클래스에 대해 각각 4개의 실수를 출력한다. 4개의 수는 수정된 bounding-box 위치를 나타낸다.

2.1 The RoI pooling layer


RoI pooling은 h ×\times w zmrldml RoI 윈도우를 H×\times W 크기의 sub-windows들로 나누는 작업으로 시작한다. 위 그림에서 좌측 그림은 conv feature map에 h ×\times w 크기의 region proposal을 투영한 그림이다. 위 예시에선 region proposal이 정수로 떨어지고 있지만, 그렇지 않을 땐 반올림을 사용한다. 이후 가운데 그림은 region proposal을 2 ×\times 2의 sub-windows들로 나눈 그림이다.(이 예시에서 H=2, W=2) 이후 각 sub-window에서 max-pooling을 적용하면 2×\times 2 의 고정된 크기의 결과를 얻을 수 있다.

2.2 Initializing from pre-trained networks

pre-trained network가 Fast R-CNN network를 초기화할 때 세 가지 변화를 겪는다.

첫째, pre-trained network의 마지막 max pooling layer가 RoI pooling layer로 대체된다.

둘째, pre-trained network의 마지막 fc와 sofmax가 두 개의 sibling layers로 바뀐다.

셋째, pre-trained network가 두 인풋을 받을 수 있도록 조정된다. 조정된 네트워크는 이미지들의 리스트와 그 이미지들 속의 RoI들의 리스트를 입력받는다.

2.3 Fine-tuning for detection

R-CNN과 SPPnet은 학습 시 다른 이미지들에서 추출한 RoI를 사용한다. RoI는 때때로 이미지 전체 영역을 포괄할만큼 크기가 크기 때문에, 이 방식을 사용하면 인풋의 크기가 커지게 된다.

우리는 학습 시 feature sharing을 가능하게 하는 효율적 방식을 채택한다. 먼저 N개의 이미지를 선택한 후, 각각의 이미지에서 R/N RoI들을 추출해 학습한다. 같은 이미지에서 추출된 RoI는 연산과 메모리를 공유한다. 예를 들어 N=2, R=128로 설정하면 2개의 이미지에서 각각 64개의 RoI를 추출하는 식이다. 각기 다른 128개의 이미지에서 128개의 RoI를 추출해 사용하는 R-CNN과 SPPnet과 비교하면 대략 64배 더 빠른 것이다.

위 이미지(이미지 출처: https://herbwood.tistory.com/8)를 보면 R-CNN은 하나의 이미지에서 추출된 RoI를 하나의 mini-batch에 모아서 학습하지 않기 때문에 하나의 이미지에 여러 번의 ConvNet 연산을 진행해야한다. 반면 Fast R-CNN은 하나의 이미지에서 추출된 RoI를 하나의 mini-batch에서 모두 훈련하기 때문에 이미지 한 장당 한 번의 ConvNet 연산만을 수행하면 된다.

Multi-task loss

Fast R-CNN은 두 개의 sibling output layer를 갖는다. 이 두 output을 동시에 출력하기 위해 multi-task loss를 사용한다

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

LclsL_{cls}는 실제 클래스 uu에 대한 로그 손실 함수 logpu-logp_u이다. Iverson bracket [u1][u\ge 1]u1u\ge 1일 땐 1을 반환하고 이외에는 0을 반환한다. background class는 u=0u=0인 것을 고려하면 배경에 대해선 LlocL_{loc}을 고려하지 않음을 알 수 있다.

bounding box regression에 대해선

Lloc(tu,v)=i{x,y,w,h}smoothL1(tiuvi)L_{loc}(t^u, v)=\sum_{i \in \{x, y, w, h\}} smooth_{L_1}(t_i^u-v_i)

손실함수를 사용한다.

smoothL1(x)={0.5x2if x<1x otherwisesmooth_{L_1}(x)= \begin{cases} 0.5x^2 & \textnormal{if }\mid x \mid \lt 1 \\ \mid x \mid &\textnormal{ otherwise} \end{cases}

이 robust L1L_1 loss는 L2L_2 Loss에 비해 outlier들에 대해 덜 민감하다.

https://herbwood.tistory.com/8
https://herbwood.tistory.com/5
https://deepsense.ai/region-of-interest-pooling-explained/

profile
산업공학과 학부생입니다

0개의 댓글