이 논문은 R-CNN과 SPP-Net에서 조금 더 advanced한 architecture인 Fast R-CNN의 method를 제안합니다. previous work는 R-CNN을 말하는 것 같으며, R-CNN보다 VGG16 Network를 9배 더 빨리 training한다고 하며 inference(test)할때에는 213배가 더 빠르다고 한다.
또한, SPP-Net보다는 training할때는 3배가 더 빠르고 inference할때는 10배가 더 빠르다고 한다.
Image classification보다는 Object Detection을 하는 task가 더 complexity가 높아진다고 한다. 이러한 complexity의 문제를 Multi-Stage의 pipeline architecture에서 찾아냈는데 multi-stage는 느리다고 한다.
느린 이유를 2가지로 설명하였는데, 엄청나게 많은 후보 영역(Region Proposal)들을 처리해야하며, 후보영역의 위치가 정확하지 않기 때문에 더 정확한 localization을 해줘야하는 작업을 거쳐야 한다.
그래서 저자는, multi-stage를 single-stage로 전환하였으며 classfication과 localization을 함께 learning(training)하는 algorithm을 제안한다.
여기서부터 R-CNN와 SPPnet의 단점들을 말하고 이러한 단점들을 극복하였다고 말합니다.
먼저 R-CNN의 단점들을 말합니다.
Model이 training하는데 multi-stage의 pipeline을 가지고 있는 것을 지적합니다.
fine-tuning하는데, log loss(cross entropy)를 사용하고, Convnet의 features(weight)들을 SVM에 fit시켜주고, bounding box regression까지 해줘야합니다.
(개인적인 생각은 first-fine tuning과정은 어쩔 수 없는 것 같기는 합니다,,)
어쨋든, 핵심적인 이유는 SVM의 fit하는 과정, bouding box regression이 분리되어서 learning(training)하는 것을 지적하는 것 입니다. 그래서 앞에서 single-stage의 장점을 내세운거겠죠
두번째 이유는 space(저장 공간)과 time을 너무 많이 필요로 합니다.
각각의 image에서 후보 영역을 검출하여야하고 거기에 feature까지 뽑아야하기 때문에 매우 오랜 시간이 걸리게 됩니다. 즉, 1개씩 img를 넣어 2000개의 후보군을 detection과 localization을 해야하니 매우 오랜 시간이 걸리게 됩니다. 그래서 VOC07 dataset의 5000개의 img를 학습하는데 GPU로 2.5일의 시간이 걸렸다고 합니다.
세번째 이유는 너무 느리다는 것 입니다.
1개의 image를 inference하는데, 47초가 걸리는 것은 실시간 탐지에서는 못쓰겠죠. 만약 video의 frame을 처리로해야한다면 R-CNN은 실제로는 쓰이지 못하는 성능임을 알 수 있습니다.
어쨋든, R-CNN은 위의 두번째 이유에서 input image의 후보군을 forward-pass를 해야하기 때문에 computation의 값을 공유하지 않습니다. 그러나 SPPnet에서는 Spatial Pyramid Pooling을 통하여 computation의 값을 공유하기도 하고 속도도 올라가게 됩니다. 왜냐하면 input image에서 Convnet을 적용하고 SPP를 적용하니, feature map에서 후보군을 추출하면 되는 것입니다. (localization)
하지만, SPPnet도 R-CNN과 마찬가지로 동일한 단점들이 존재하며 SPP를 사용하기 전, convolution의 weight들이 backpropagation과정에서 학습이 되지 못하는 단점을 내세웁니다. (이는 뒤에서 자세히 설명)
Fast R-CNN은 R-CNN과 SPPnet의 단점들을 보안하였으며 adavantage는 다음과 같습니다.
위의 Figure 1은 Fast R-CNN의 architecture이며, input data로 entire image와 object proposal을 받게 됩니다.(2개의 input) 이때 entire image는 필자도 헷갈렸는데 잘려진 부분이 없는 전체 image를 의미합니다.(640x480의 이미지가 있으면 640x480의 이미지가 input data로 들어가게 되는 것)
Convolution과 Max Pooling을 적용하여 feature map을 생성하여서 FC layer로 가기위해서는 vector값을 받아야하기 때문에 ROI Pooling으로 고정된 feature vector를 얻는다고 합니다.
figure 1을 보면 알겠지만, 2개의 output이 있습니다.
1개는 k+1(k는 class개수, 1은 background)로 classification을 담당하고, 나머지 1개는 bounding box의 position을 말하는 것으로 4개의 number(position의 값)을 추출하게 됩니다.
RoI Pooling은 이 논문에서 고정된 feature vector를 받기 위해서 사용된다고 한다.
algorithm을 자세히 살펴보자
먼저 HxW의 output을 이야기하고 있는데, 이때 H는 Height, W는 width로 이 값은 사용자가 지정할 수 있는 hyperparameter값이다. 각각의 RoI는 4개의 값을 가지게 되는데 좌/상단의 position값인 (r, c)와 height와 width의 크기인 (h, w)의 값을 가지게 된다.
그러면 HxW의 output값을 가지려면 어떻게 해야할까?
먼저 feature map의 kernel만으로 RoI pooling을 적용하게 된다. hxw의 kernel이 HxW로 되게 하기 위해서는 x 로 grid를 나누게 된다. 그런 다음 각각의 grid안에서 MaxPooling을 적용하여 response가 가장 큰 값을 얻고 그 값을 hxw로 mapping하게 됩니다. 이러한 연산을 C개의 channel을 가지고 있으면 kernel별로 c번을 반복해줘야합니다.
Fast R-CNN을 3가지의 transformation을 거쳤다고 하는데 살펴보자
첫번째로 conv layer의 마지막 max pooling을 RoI pooling으로 바꾸었으며, 이는 FC로 가기위해서 고정된 feature vector를 얻어야하기 때문이다.
두번째로 마지막 FC의 output layer는 2개가 있으며 1개는 classification을 위해 k + 1(class개수 + background)이며 나머지 1개는 Bbox Regression의 output값이다.
세번째로 2개의 data를 input으로 받게 되며 1개는 전체 이미지(헷갈리면 위에 자세히 설명했음)와 list of RoIs라고 했는데 이는 Selective Search로 region proposal이다.
내가 생각했을때는 제일 중요한 부분이다.
weight를 update하기 위해서는 backprop과정이 매우 중요한데, SPPnet에서는 backprop과정이 매우 효과적이지 않다고 이야기한다.
이러한 이유를 img에서 각각의 RoI가 매우 큰 receptive field를 가지고 있기 때문이라고 하는데, 위에서 architecture를 보았을때 img에서 한 남자의 object만 있을때 매우 큰 RoI를 가지는 것도 하나의 예시가 될 수 있다.
Fast R-CNN에서는 더 효과적인 method를 제안하는데, SGD에서의 mini-batch를 group by group으로 세분화하여 sampling하고 N개의 img들을 뽑아 이 각각의 img에서 의 RoI들을 sampling한다고 한다.
논문에서 예시를 든 것은 다음과 같다.
N = 2, R = 128이면, mini-batch가 2이고 이 2개의 각각의 img에서 개, 즉 64개의 RoI를 뽑는다고 한다.
이는 64배가 더 빠르다고 한다.
저자가 걸리는 문제가 있었다고 하는데, 같은 img에서 나온 RoI끼리 연관이 있어 수렴속도가 느려질거라고 우려가 있을거라고 생각했지만, 이는 일어나지 않았다고 한다.
이러한 우려가 나온 이유는, 같은 img에서 추출된 RoI끼리 서로 중복된 정보를 가질 수 있기 대문에 이는 학습속도에 영향을 끼칠 수 있다고 한다 -> 이는 R-CNN에서도 동일한 문제가 일어난다고 생각함
제일 어려운 부분,, 암튼 차근차근 알아보자
Fast R-CNN은 2가지의 output인 classification과 Regression이 있다고 했다. Fast R-CNN은 loss function을 1개로 통합하였고 의 수식이 loss function이다.
는 classification, 는 regression, λ는 hyperparameter, [u≥1]은 Iverson으로 u가 1보다 크면 1, 그 외에는 0의 값을 가지게 된다.
먼저 classification이다.
cross entropy와 비슷한 수식을 가지고 있으며 로 정의된다. 이때 u는 target이고 는 u에 대한 predict값이다.
regression은 중심점(x, y), 높이와 너비(w, h)를 알아내야하며, 가 predict, v가 target값이다.
Inverson은 object의 유/무에 따라 값이 바뀌게 되며, 만약 u≥1이라면 object가 있는 것으로 판단하고 값이 1로 바뀌게 되고 u<1이라면 object가 없는것으로 바뀌게 되며 regression을 하지 않게 된다.
즉, 1이면 object있다고 판단, 0이면 object가 아닌 background로 판단하게 된다.
regression의 수식이 loss function 다음에 나와있게 되는데, 위의 는 L1 Loss를 의미하게 된다. 이 값은 R-CNN과 SPPnet에서 outlier에 sensitive하지 않으며 L2 Loss 대신에 사용한다고 한다. (당연히 L2는 제곱이 들어가므로 outlier에 sensitive하지 않음)
λ는 classification과 regression의 balance를 조절하고 1로 고정시켜놓았다고 합니다.
mini-batch를 2가 되게 img를 sampling하고 R=128이므로 각 img마다 64개의 RoI를 뽑게 됩니다.(앞에서 설명한 것 그대로,,) 또 RoI안에서 전처리 과정을 거치게 되는데 IoU가 0.5인 이상인 RoI를 25%를 뽑고 이 RoI를 positive라고 간주하게 됩니다.
그러면 이 의미는 u = 1이라는 말이 된다. 왜냐하면 앞의 Inverson에서 u가 1보다 크거나 같으면 object가 있다고 판단했으니, 그러면 반대고 Negative라고 판단하면 u<1이므로 object가 아닌 background로 판단하게 된다.
data augmentation은 horizontal flip을 사용하였으며 default값인 0.5만 설정해두고 다른 data augmentation기법은 쓰지 않았다고 한다.