Fast R-CNN의 논문 이름은 모델 이름과 똑같은 Fast R-CNN이다. 저자는 Ross Girshick다.
Fast R-CNN은 이름에서 짐작할 수 있듯이 기본적으로 R-CNN의 느린 속도를 보완하기 위한 모델이다.
Abstract
이 논문은 object detection을 위한 Fast Region-based Convolutional Network (Fast R-CNN)이다. 기존의 deep convolutional network에 기반한 효율적인 object proposals 분류(classify)를 활용하여 몇가지 혁신을 적용했다. 그 혁신은 트레이닝과 테스트 속도를 높이면서 동시에 detection accuracy도 향상시켰다. Fast R-CNN은 VGG16 network에 기반했으며 트레이닝에 있어서는 R-CNN보다 9배 빠른 속도를 지니며 테스트에서는 213배 빠른 속도를 지닌다. PASCAL VOC 2012 데이터의 mAP에 대해서도 좋은 성능을 이루었다. SPPnet과 비교해서도 학습에서는 3배, 테스트에서느 10배 더 빨랐으며 accuracy에서도 더 정확했다. Python과 C++ (Caffe)에 기반하여 코드를 구현했다.
1. Introduction
최근 image classification과 object detection의 정확성에 있어서 deep ConvNets는 의미있는 성과를 내었다. Object detection은 image classification 보다 어려운 문제인데 이는 문제의 해결을 위해 보다 복잡한 방법들이 필요하기 때문이다. 때문에 현재의 접근법들은 multi-stage pipelines를 주로 사용하는데 이는 느리고 매력적이지 못한 방법이다.
Detection 문제의 복잡함은 정확한 object의 localization에서 기인하는데 이는 두 가지 도전과제를 가진다. 첫 번째는 무수히 많은 candidate locations (aka proposals)이며 두 번쨰는 이런 candidates가 정확하지 않고 단지 대략적으로만 localization을 제공하며 추가적인 개선이 필요하다는 사실이다. 이때문에 종종 속도, 정확성, 단순함을 타협한다.
본 논문에서는 이런 문제점을 해결하기 위해서 single-stage 학습 알고리즘을 제안하는데 이는 classify object proposals와 spatial locations의 정제(refine)을 동시에 학습한다. VGG16에 기반하여 학습에서는 R-CNN보다 9배, SPPnet 보다는 3배 빠르며 PASCAL VOC 2012에 대해서 top accuracy를 달성했는데 이는 mAP 66%를 의미한다. (R-CNN은 62%였다.)
Contributions:
- Higher detection quality (mAP) than R-CNN과 SPPnet
- Single-stage 트레이닝이며 이때 multi-task loss 사용
- 모든 네트워크 레이어 업데이트
- Feature caching에 있어서 디스크 저장소가 필요하지 않다.
2. Fast R-CNN architecture and training
Figure 1에서는 Fast R-CNN의 구조를 그리고 있다. Fast R-CNN은 entire image, 즉 cropped나 warped가 아닌 온전한 이미지를 입력으로 받는다. 여러 conv와 pool layers를 거치며 conv feature map을 생성한다. 그 다음 개별 object proposal에 대해 Region of Interest (RoI) pooling layer가 fixed-length feature vector를 conv feature map으로 부터 추출한다. 그 다음 각각의 feature vector를 FC layers에 넣는다. FC layers는 두 갈래의 sibling output layers로 나뉘는데, 첫 번째는 $K$개의 object classes와 catch-all "background" class에 대한 softmax probability estimates를 생성하며, 다른 하나는 $K$개의 object classes에 대한 4개의 실수값을 생성한다. 이 4개의 실수값으로 $K$개 중 하나의 클래스에 대한 bounding-box positions로 정제한다.
2.1. RoI pooling layer
RoI pooling layers는 max pooling을 이용하여 featurs의 region of interest를 찾아서 small feature map으로 전환한다. 이때 fixed spatial extent를 사용하는데 그 크기는 H x W로 7 x 7 등의 크기다. H와 W는 layer hyper-parameters로 다른 RoI끼리 서로 독립적으로 존재한다. 해당 논문에서는 직사각형 모양의 윈도우를 사용하며 Each RoI는 4개 구성요소를 갖는 tuple(r, c, h, w) 로 구성된다. Top-left corner는 (r, c)로, height와 width는 (h, w)로 결정한다. RoI max pooling은 h x w RoI window를 H x W grid of sub-windows로 분할함으로써 동작한다. 이대 sub-windows의 사이즈는 대략적으로 h/H x w/W가 된다. Max pooling에 의한 sub-window의 결과는 그에 부합하는 output grid cell이다. Pooling은 각 channel 별로 독립적으로 적용된다. RoI layer는 spatial pyramid pooling layer의 special case로 오직 하나의 pyramid level만 갖는다. 그외 계산은 SPPnet과 동일하다.
2.2. Initializing from pre-trained networks
ImageNet에 대해 학습된 VGG16을 이용하여 Fast R-CNN을 구성했다. 마지막 max pooling layer를 RoI pooling layer로 대체했으며 VGG16에 대해서 H = W = 7의 사이즈를 설정했다. 마지막 FC layers를 two sibling layers (FC and softmax over $K$+1 categories와 category-specific bounding-box regressors)로 대체했다.
2.3. Fine-tuning for detection
학습 과저에서 SPPnet이 비효율적인 이유는 서로 다른 이미지들 때문으로 RoI 역시 큰 receptive field를 가지고 있기에 비효율적일 수 있다. 이를 해결하기 위해서 SGD를 적용할 때 mini batch의 측면에서 N images를 뽑은 각 이미지에 대해서 R/N RoIs를 뽑는다. 중요한 점은 같은 이미지에 적용된 RoIs는 모두 foward와 backward에 있어서 같은 computation과 memory를 갖는다. N를 작게 만들수록 계산량이 줄어들기 때문에 해당 논문에서는 N을 2로, R은 128로 설정했다.
추가적으로 다른 모델들은 softmax classifier, SVMs, regressors를 각기 다른 stages에서 학습하는데 여기서는 그렇지 않고 한꺼번에 학습시켰다.
Multi-task loss
첫 번째 output인 a discrete probability distribution (per RoI), $p = ( p_0, ..., p_K )$, over $K$+1 categories computed by softmax, 그리고 두 번째 output인 boundig-box regression offesets는 $ {{t}^{k}} = ({{t_x}^{k}}, {{t_y}^{k}}, {{t_w}^{k}}, {{t_h}^{k}})$ for each of the $K$ object classes indexed by $k$. 주어진 $t^k$에 대해 parameterization을 사용했는데 이는 $t^k$이 scale-invariant translation and log-space height/width shift relative to and object proposal이기 때문이다.
매 트레이닝 스텝마다, RoI는 ground-truth class인 $u$와 ground-truth bounding-box regression target인 $v$를 가지고 라벨링 된다. 위 두 가지 loss를 모두 포함한 multi-task loss $L$을 아래와 같이 정의한다.
$L(p, u, t^u, v)$ = ${{L}_{cls}}(p, u) + \lambda (u \geq 1) {{L}_{loc}}(t^u, v)$
이때 ${{L}_{cls}}(p, u)$ = -log$p_u$로 true class $u$에 대한 log loss다. 즉 sotfmax에서 유래한 classification loss다.
For true bounding-box regression target for class $u, v = (v_x, v_y, v_w, v_h) v$ and a predicted tuple $ {{t}^{u}} = ({{t_x}^{u}}, {{t_y}^{u}}, {{t_w}^{u}}, {{t_h}^{u}})$ again for class $u$. The Iverson bracket indicator 함수 [ $u \geq 1$]는 $u$가 1보다 크거나 같으면 1, 아니면 0을 반환하는 함수다. 관례적으로 catch-all background class는 $u = 0$으로 라벨링을 한다.
For bounding-box regression, loss ${{L}_{loc}}$ is deinfed as follows. "loc"은 localization을 뜻한다.
$${{L}_{loc}}(t^u, v) = \sum_{i \in \{ x, y, w, h \}}{{smoth_{L_1}}( {{t}^{u}}_{i} - {{v}_{i}})} $$
$${smoth_{L_1}}(x) =
\begin{cases}
0.5 x^2 & \text{if |x| < 1}\\
|x| - 0.5 & \text{otherwise}
\end{cases} $$
$ L_1 $ loss는 절대값을 기준으로 하기에 제곱을 활용해서 outlier에 민감한 $L_2 $ loss 보다 로버스트 하다.
Hyper-parameter $\lambda$는 두 task loss 사이의 균형을 맞추는 역할로 여기서는 1의 값을 사용했다. 또한 $v_i$는 모두 mean 0, variance 1로 정규화했다.
3. Fast R-CNN detection
추론(테스트) 단계에서 R object proposals의 score를 매긴다. 이때 R은 보통 2000개 내외다. R의 값을 45k만큼 큰 수도 고려하기도 한다. 개별 test RoI r에 대해서 class posterior probaility distribution $p$와 a set of predicted bbox offers relative to $r$을 따라 forward를 수행한다. Detection confidence for each class $k$는 estimated probability를 이용하는데 Pr(class = $k | r) \triangleq p_k$로 표기한다.
3.1. Truncated SVD for faster detection
Network를 압축하기 위해서 원래의 single FC layer를 2개의 FC layers로 대체하는데 이때 사용하는 방법이 truncated SVD다. SVD란 Singular Value Decomposition으로, 직사각형 행렬에 대한 분해다.
SVD는 eigenvalue decomposition에서 유도할 수 있는데 하나의 행렬의 linear transformation을 rotation, scaling, rotation의 변환으로 쪼갠다고 보면 된다. 여기서 scaling은 단순히 상수배 하는 과정이므로 영향력이 강한 몇몇만 남기게 된다.
바로 이를 실행하는 과정이 truncated SVD다.
혹시 SVD와 Egien Decomposition 대한 내용을 자세하고 알고 싶은 사람은 레퍼런스에 있는 3개의 블로그를 참조하기 바란다. 특히 다크 프로그래머님의 블로그는 AI 관련 기초 수학 내용이 잘 나와있어서 강력하게 추천한다.
아래의 식이 바로 $W$를 근사하는 truncated SVD식이다.
$W \approx U \Sigma_t V^T$
첫 번째 layer는 $ U \Sigma_t $를 bias 없이 정의하고, 두 번째 layer는 $V^T$에 원래 matrix인 W와 연관된 bias를 포함한다. 이런 간단한 압축 방법으로 속도를 향상을 달성했다.
4. Main results
Table 1부터 3까지는 Pascal VOC 2007, 2010, 2012에 대한 실험 결과다. 유의미한 성능 향상이 있었음을 알 수 있다.
Class 별 성능도 자세하게 표시했는데 모든 class에 대해서 최고의 성능을 달성하지는 못했지만 대부분의 클래스들에 대해 가장 좋은 성능을 보였다.
6. Conclusion
해당 논문에서 제시한 Fast R-CNN은 깔끔하고 빠른, R-CNN과 SPPnet의 업데이트 버젼이다. Detection에 대해서 SOTA 결과를 달성했으며 소요 시간의 측면에서도 향상이 있었다. 또한 자세한 실험의 결과 새로운 인사이트를 얻을 수 있었는데, sparse object proposals가 detection 질의 향상에 도움이 되는듯 해보인다.
Fast R-CNN의 향상된 버젼은 Faster R-CNN이 있는데 거기서도 Fast R-CNN의 핵심 내용 중 하나인 RoI Pooling이 포함되어 있으면서 PyTorch로 구현이 되어있다. 따라서 이번 코드 구축은 건너 뛰고 Faster R-CNN을 리뷰한 다음 코드를 분석하고자 한다.
References:
https://herbwood.tistory.com/8
https://darkpgmr.tistory.com/105
https://darkpgmr.tistory.com/106
'Computer Vision' 카테고리의 다른 글
ResNet (2016) PyTorch Implementation (0) | 2024.04.24 |
---|---|
ResNet (2016) 논문 리뷰 (0) | 2024.04.15 |
Show and Tell = Neural Image Caption (NIC) (2014) 모델 간단 리뷰 (0) | 2024.04.13 |
SPPNet(2014) PyTorch Implementation (0) | 2024.04.12 |
SPPNet (2014) 논문 리뷰 (0) | 2024.04.09 |