시작하면서..
Fast R-CNN 이후에 당시 SOTA 였던 Faster R-CNN은 Fast R-CNN을 그대로 사용했기 때문에 서로 상당히 비슷합니다. (Faster R-CNN가 Fast R-CNN을 개선시킨 느낌)
그래서 이 게시물 후 바로 리뷰 하려고 합니다 ㅎㅎ,,
한번 공부 하실 때 Fast R-CNN과 Faster R-CNN을 한번에 공부하시는걸 추천드립니다
Abstract
Fast R-CNN은 지난 work(R-CNN)에 대해 deep CNN을 이용하여 효율적인 classify object proposals 작업을 수행합니다.
이전 R-CNN보다 train단계가 9배 빠르고, test는 213배 정도 빠르다고 합니다 ㄷㄷ
Introduction
분류 문제보다 더 복잡한 작업을 동반하는 Object Detection은 이러한 Complexity 때문에, multi stage pipeline을 사용합니다. 이로 인해서 slow, inelegant합니다.
Complexity는 정확한 object의 localization 때문에 일어납니다.
이 정확한 object의 localization은 두가지 기초적인 challenges를 불러일으킵니다.
- Object location의 후보군이 너무 많음.
- 이 후보군들은 rough하게 나와서 refine이 필요함.
그리고 위의 문제들에 대한 solution들은 속도, 정확도, 복잡도에 대해 종종 타협을 합니다. (trade off 관계인 듯.)
그래서 논문에서는 위의 문제들을 해결하기 위해 Single-stage training algorithm을 제시합니다. (object proposals의 classify, refine)
R-CNN and SPPnet
R-CNN에서는 3가지 drawbacks가 있습니다.
- Multi-stage pipeline을 이용한 학습
- 학습하는데 공간과 시간이 너무 많이 든다.
- Object detection 작업이 느리다.
R-CNN이 느린 이유는 각 object proposals를 모두 CNN에 대해 feed forward 시키고, sharing computation 없이 수행하기 때문입니다.
위의 문제들에 대해서 SPPnet이 나와서 시간을 감소시키는데 성공합니다.
하지만 SPPnet 또한 결점이 있습니다.
아직 multi pipeline을 이용하며, fine tuning으로 SPP layer를 update 시키는 것이 불가능 하기 때문에 accuracy에 대해 한계가 있습니다.
Contributions
Fast R-CNN은 R-CNN과 SPPnet의 결점들을 극복합니다.
- Higher Detection quality
- Single stage로의 Training
- 모든 network를 학습시킬 수 있음.
- 저장 disk가 필요하지 않음.
Fast R-CNN architecture and training
Fig. 1.에 Fast R-CNN architecture에 대해 나와있습니다.
여기에서 Fast R-CNN network는 entire image와 set of object proposals를 input으로 받습니다.
논문에서는 network에 대해 순차적으로 나와있습니다.
- whole image를 several convolutional and max pooling layers에 넣어서 feature map을 얻습니다.
- Selective Search로 부터 얻은 RoI에 대해 RoI Pooling을 적용해서 fixed length feature vector를 추출합니다.
- 각 feature vector는 두 개의 fcs에 보내집니다.
- class에 대해 분류하는 softmax (K+1)
- 4개의 value를 갖는 layer (box position)
The RoI pooling layer
RoI pooling layer를 통해 object proposals를 유효한 RoI로 만들어줍니다.
RoI pooling layer는 maxpooling를 이용하여 fixed length feature map을 추출합니다. (\(H\times W\))
\(H\times W\)는 hyper-parameter 입니다.
각 RoI는 4개의 값 (\(r,c,h,w\))을 갖습니다.
\(r,c\) : Bounding box의 좌측 상단 지점 좌표
\(h,w\) : Bounding box의 높이, 넓이
Whole image가 CNNs에 들어가서 feature maps가 나오면 여기에 RoI(여기에서의 RoI는 object proposal 인 것 같다.)를 projection 시켜줍니다.
projection 시켜주면 \(h,w\)가 정해지게 되는데 이 \(h,w\)에 대해 고정된 길이\(H,W\) 의 feature map을 꺼내줘야합니다. 그래서 \(h/H, w/W\)를 이용하여 RoI Pooling 시켜줍니다.
Fine-tuning for detection
학습에 있어서 Back propagation은 굉장히 중요합니다.
SPPnet이 back propagation이 불가능했던 이유를 한번 살펴 봅시다.
그 이유는 각 training sample이 다른 image로 올 때 RoI가 very large receptive field를 갖기 때문에 inefficient하기 때문이었습니다.
그래서 feature sharing의 이점을 잘 살리기 위해 R,N의 hyper-parameters를 지정하여 한번 학습할 때 N개의 이미지와 각 이미지마다 R/N개의 RoI를 사용하기로 합니다.
논문에서는 R=128, N=2를 사용하여 좋은 결과를 얻었습니다.
Multi-task loss
Fast R-CNN은 two sibling output layers를 가지고 있습니다. 첫번째는 K+1 categories를 분류하는 output layer, 두번째는 bounding-box regression offsets에 대한 output layer입니다. bounding-box regression offsets는 \(t^k = (t^k_x,t^k_y,t^k_w,t^k_h)\) 입니다.
Fast R-CNN에서는 classification과 bounding-box regression에 대한 loss를 합칩니다. 이를 multi-task loss : L 이라고 합니다.
$$
L(p,u,t^u,v) = L_{cls}(p,u) + \lambda[u\geq1]L_{loc}(t^u,v),
$$
\(u\) : ground truth class
\(L_{cls}(p,u)=-\log p_u\) 이는 true class \(u\)에 대한 log loss 입니다.
\(v = (v_x,v_y,v_w,v_h)\) : class \(u\)에 대한 ground truth bounding-box regression 입니다.
\(t^u=(t^u_x,t^u_y,t^u_w,t^u_h)\) : u에 대한 predicted bounding-box regression
\([u\geq1]\) : \(u\)가 1보다 크면 1, 아니면 0 (background class는 모두 u = 0) 해당 클래스에 대해서만 reg loss 적용
$$
L_{loc}(t^u,v) = \sum_{i \in{x,y,w,h}}smooth_{L1}(t^u_i-v_i)
$$
보시면 L1 smooth loss를 사용 했는데, L1 loss가 outliers에 대해서 L2보다 덜 민감해서 사용했다고 합니다.
multi-task loss 에서 \(\lambda\)는 두 work에서의 균형을 위한 hyper-parameter입니다. 논문에서는 \(\lambda =1 \)로 지정했습니다.
Fast R-CNN detection
Truncated SVD for faster detection
network를 살펴보면 총 할애되는 시간 중 conv 에서 걸리는 시간과 fcs에서 걸리는 시간이 거의 1 : 1 비율 이라고 합니다. fcs는 작업 중 일부분만 차지하고 있는거에 비해서 시간이 굉장히 많이 할애됨을 알 수 있습니다. 그래서 truncated SVD를 사용해서 compress하고 fcs를 가속화 했다고 합니다.
$$
W \approx U\Sigma_t V^T
$$
위의 식에서 \(W\)는 without non linearity인 two fcs를 의미합니다. 그 two fcs 중 첫번째 fc는 \(\Sigma_{t}V^{T}\)이고 두번째 fc는 \(U\)라고 합니다.
\(U\) : u x t matrix
\(\Sigma_t\) : t x t matrix
\(V\) : v x t matrix
parameters를 \(uv \rightarrow t(u+v)\), (\(t < min(u,v)\)) 로 줄일수 있습ㄴ디ㅏ.