안녕하세요~


이번글에서는 RCNN의 단점과 SPP-Net의 단점을 극복한 Fast RCNN이라는 모델에 대해서 설명할게요~




<1. Motivation>



1) Three stage pipeline (RCNN, SPP-Net)


RCNN과 SPP-Net의 공통적인 학습방식은 아래와 같아요.


①CNN 모델을 사용할 때 ImageNet에 학습된 pre-trained 모델을 쓴다. 이때 pre-trained 모델을 Pascal VOC 이미지 데이터셋에 finetuning 시킨다.

②Fine tuning을 마친 후, CNN의 softmax layer를 제거해주고 SVM을 설치한다. Pascal VOC 데이터셋을 CNN의 뒷 부분에 해당하는 SVM을 학습시켜준다.

③classification 학습이 마무리되었으면 bounding box regression을 학습시켜준다.  


결국 학습을 세 번을 나눠서 하는꼴이 되는건데, 이런 과정들이 굉장한 시간을 소요하게 만들어요.




2) Feature vectors stored in hard disk


RCNN은 Conv layer를 통해 얻은 feature map을 hard disk에 저장시켜요. 그리고 hard disk에 저장된 feature map정보를 bounding box regression or SVM 학습을 할때 갖다 쓰는방식이에요.


그런데 메모리가 아닌 하드디스크에 접근하려면 CPU와 hard disk간의 물리적거리로 인해 많은 시간이 소요되요. 또한 데이터가 하드 디스크에 기록되는 시간도 추가가 되겠죠? 그런데 이것이 굉장히 많은 RoI (Selective search에서는 보통 2000개의 RoI를 제시)에 진행된다고 하면 정말 많은 시간들이 걸릴거에요.

 




3) Slow test time


RCNN과 SPP-Net의 test time은 아직도 real-time을 실행하는데 있어서 많이 부족해요. 


<사진1>








<2. Architecture>


Fast RCNN이 어떻게 구성되었는지 알아보도록 할게요.



1) RoI pooling layer


Fast RCNN의 가장 큰 특징은 RoI pooling layer라고 할 수 있겠어요. Conv layer를 통해 뽑아낸 feature map에서 RoI pooling을 적용하게 되는데 순서는 아래와 같아요.


①Conv layer를 통해 추출된 feature map에 selective search를 적용하여 RoI들을 선별한다

②선별된 RoI를 모두 HxW(=7x7) size로 만들어주기 위한 작업을 시작한다.

③먼저 RoI가 h x w 크기를 갖고 있을때,  "window size=(h/H x w/W)", "적절한 stride 값", "max pooling"을 적용해주면  H x W (=7x7) feature map이 만들어 진다. (이러한 방식은 SPP-Net에서 설명한 "special case of spatial bin : 7x7 spatial bin"이라 할 수 있다)

④ 이렇게 생성된 H x W (=7x7) feature map이 flatten되어 2개의 FC layer를 거친다. 

⑤ 2개를 거쳐 생성된 feature들은 softmax, bbox regressor에 각각 사용된다.







2) Single bin


SPP-Net에서 사용했던 1x1, 2x2, 4x4 3가지 spatial bin을 이용하는 것보다, 위에서 언급한 7x7 spatial bin 을 쓰면 아래와 같은 장점이 있어요.


먼저 SPP-Net과 같은 방식으로 학습을 시킨다고 하면 아래와 같이 하나의 객체를 3개의 resolution으로 학습하는것과 같아요. 이렇게 되면 하나의 객체(아래 '사진2')를 지나치게 학습하는 꼴이될 수 있기 때문에 overfitting 문제가 발생할 수 있어요. 


         


만약에 아래그림에서 다른 이미지에서 다른 모양의 눈('사진3')이 입력된다면 자신들이 학습했던 것과 다르다고 판단해 '사진3'이 눈이 아니라고 말할 가능성이 높게 됩니다.


<사진2>


<사진3>






Fast RCNN처럼 단 하나의 7x7 spatial bin을 쓰게 되면 SPP layer에서 발생시키는 overfitting 문제를 피할 수 있게 되요.






3) Truncated SVD (SVM이 아니에요!!!!)


Fast RCNN에는 마지막 FC layer에 Truncated SVD 기법이 적용되어 있어요.


Classification을 위해 사용되는 CNN 구조를 보면 FC layer에서 소요되는 시간보다 Con layer에서 걸리는 시간이 상대적으로 더 많다고 할 수 있어요 (가중치 개수는 FC layer가 더 많지만 연산에 소요되는 시간은 Conv layer가 당연히 더 오래 걸려요!). 



하지만 Fast RCNN 같은 경우에는 단 한 번의 CNN 과정만 거치고 그 위에서 대략 2000개의 RoI가 선별됩니다. 이 후, 2000개의 RoI에 대해서 FC layer를 진행하기 때문에 FC layer에서 소요되는 시간이 더 많아 지게 됩니다. 



그래서 무수히 많은 FC layer 의 연산들이 truncated SVD 기법으로 인해 compression 되어 parameter 수를 줄이게 되고, test 시간도 굉장히 줄여줄 수 있게되요. 이 부분은 논문에서 너무 명확하게 잘 설명해주고 있어서 논문표현을 그대로 빌리도록 하겠습니다.


  













<3. Training>


1) A single training stage (streamline)


1-1) One loss function with two multi-task


먼저 RCNN, SPP-Net에서는 bounding box와 classification이 따로 학습이 되었어요. 하지만 Fast RCNN은 bounding box와 classification을 동시에 학습시키도록 만들었어요. 즉 하나의 loss function을 통해서 multi-task (classification and localization)을 수행하도록 만들었어요. 


<사진4>


Multi-task loss function는 아래와 같이 계산이되요.





1-1) Classification loss function


Classification 문제이다 보니 cost function 자체는 log loss function을 취하고있어요 (자세한 설명은 여기 링크를 참고하세요).


(log loss for true clss u)



1-2) Localization loss function


우선 localization loss function에 필요한 인자는 t, v에요. v는 특정클래스(u)에 대한 ground truth를 의미하고, t는 특정 클래스(u)에 대한 RoI (candidate bounding box)에요.  



Localization loss function은 smooth L1을 사용했어요. 


Bounding box regression은 t-v 값의 차이가 대부분 크게 나올거에요 (왜냐하면 t,v 에는 4가지 요소가 들어가 있기 때문이에요). 그래서 t-v가 많이 차이나는 outlier 경우에 L2 loss를 적용하게되면 더욱 차이가 커질거에요. 이렇게되면 exploding gradient 현상이 일어날 수 있기 때문에, 이를 방지하고자 L1형태의 smooth 함수를써요 (L1을 쓰지 않는 이유는 미분이 되지 않는 지점이 있어 backpropagation을 적용 할 때 문제가 일어날 수 있기 때문인거 같아요).



<사진5>



1-2) Fine tuning


RCNN같은 경우는 사실상 CNN, SVM, Bounding box regression에 대해 각각 Pascal VOC로 fine tuning하는 꼴이되요. 하지만 Fast RCNN에서는 SVM을 따로 classifier로 붙여서 쓰지 않고 기존의 CNN의 classifier (softmax)를 그대로 이용하여 동시에 CNN, softmax classifier, bounding box를 학습하기 때문에 Pascal VOC 데이터를 한 번만 쓰게 됩니다. 그래서 학습시 one single stage로 학습을 하게 되는거에요. 


<사진6>


아래 결과를 보면 Fast RCNN (FRCN)에서 softmax를 쓴 mAP가 조금씩 더 높게 나온 것을 알 수 있기 때문에 굳이 SVM을 붙여서 three stage로 학습시킬 이유가 없다는 것을 증명했어요.



여기서 주의해야 할 부분은 fine-tuning을 적용할 시 첫 번째 Conv layer부터 FC layer까지 전부 학습시키는것이 아니에요. VGGNet을 기준으로 했을 때 3번째 (conv3_1)에서 부터 fine-tuning을 하는것이 효율적이라고 언급했어요.


<사진7>

 

논문에서는 fc6에서 부터 fine tuning한것과 conv3_1에서부터 fine tuning을 적용한 것을 실험했는데, conv3_1에서부터 fine-tuning을 적용한 결과가 훨씬 좋게 나타났어요. 또한 conv3_1과 conv2_1에 대해서 실험을 진행했는데 conv2_1의 성능이 약간 좋았지만 training time이 1.3배 (12.5h > 9.5h) 더 소요되었기 때문에 '시간 및 정확도' 측면을 고루봤을 때 conv3_1에서부터 fine-tuning을 적용하는것이 효율적이라고 언급했어요.







2) Eliminate disk storage


RCNN에서는 SVM, bounding box에 feature를 넘기기전에 disk에 저장한다고 했죠?

하지만 Fast RCNN은 disk에 넘겨주지 않고 메모리단에서 학습을 시켜주기 때문에 시강늘 더 단축할 수 있었다고해요. 논문에서는 구체적인 방법에 대해서 서술하진 않고, 단지 아래 문장으로 disk storage 방식을 사용하지 않았다고 명시하고 있어요.


"Fast R-CNN also eliminates hundreds of gigabytes of disk storage, because it does not cache feature."







3) Hierarchical sampling (image centric sampling)


RCNN, SSP-Net은 mini-batch=128로 설정하여 한 번 학습할 때마다 128개의 서로 다른 이미지들 중에서 128개의RoI를 추출합니다. 이렇게 되면 128번의 CNN(conv layer, conv operation) 작업이 수행되어야 하기 때문에 많은 시간이 소요되요.


<사진8>


Fast RCNN은 RCNN, SPP-Net과는 다른 hierarchical sampling(image centric sampling)이라는 방식을 취했어요. 위에서와 같이 128개의 이미지에 대해서 128개의 RoI를 추출하는것이 아니라 128개 보다적은 개수의 이미지에서 (논문에서는 2개의 이미지로 설정) 128개의 RoI에 대해서 연산을 진행하게 해줍니다. 2개의 이미지 각각에 대해서 64개의 RoI를 추출하게 되는데요. 사실 더 많은 RoI들이 선별되지만 그중에서 IoU가 50% 이상인 것을 기준으로 positive example로 삼는다고해요. 이렇게 되면 2번의 CNN 작업(conv layer; conv operation)만 진행해주면 되기 때문에 시간이 절약될거에요.


<사진9>





4) Inefficient of SPP-Net backpropagation


Fast RCNN 논문에서는 SPP-Net backpropagation 때문에 weight update가 비효율(inefficient)적으로 일어난다고 설명하고 있어요. 좀 더 정확히 말하면 spatial pyramid pooling layer 때문에 이러한 비효율적인 문제가 발생한다고 하면서 자신들의 RoI pooling backpropagation을 소개하고 있어요. (RoI pooling backpropagation이 더 효율적이다라고 설명하려고 하는거 같은데, 왜 더 효율적인지 설명한 부분을 찾지는 못했어요. 제가 실력이 부족해서 이해를 못했을 가능성이 더 크지만요 ㅎㅎ;;;;)








<4. Result>











이번 시간에는 Fast RCNN에 대해서 알아보았어요. 다음 글에서는 Fast RCNN 버전을 업그레이드한 Faster RCNN에 대해서 알아보도록 할게요!





[글 래퍼런스]

https://m.blog.naver.com/PostView.nhn?blogId=laonple&logNo=220776743537&proxyReferer=https%3A%2F%2Fwww.google.com%2F


[논문 래퍼런스]

Fast RCNN/ Ross. G/ 2015/ https://arxiv.org/pdf/1504.08083.pdf


[사진 래퍼런스]

사진1

https://towardsdatascience.com/r-cnn-fast-r-cnn-faster-r-cnn-yolo-object-detection-algorithms-36d53571365e

사진2

http://www.open-eyes-photography.de/oep/articles/Resolution_comparison.htm

사진3

http://kormedi.com/1225116/%EB%88%88-%EA%B1%B4%EA%B0%95-%EC%A7%80%ED%82%A4%EB%8A%94-%EC%A2%8B%EC%9D%80-%EC%8A%B5%EA%B4%80-4/

사진4

https://man-about-town.tistory.com/52

https://m.blog.naver.com/PostView.nhn?blogId=laonple&logNo=220776743537&proxyReferer=https%3A%2F%2Fwww.google.com%2F

사진5

https://www.researchgate.net/figure/Plots-of-the-L1-L2-and-smooth-L1-loss-functions_fig4_321180616

사진6

https://www.mathworks.com/help/vision/ug/getting-started-with-r-cnn-fast-r-cnn-and-faster-r-cnn.html

사진7

https://excelsior-cjh.tistory.com/160

사진8

https://m.blog.naver.com/PostView.nhn?blogId=laonple&logNo=220776743537&proxyReferer=https%3A%2F%2Fwww.google.com%2F

사진9

https://blog.airlab.re.kr/2019/10/Fast-R-CNN

'Deep Learning for Computer Vision > Object Detection (OD)' 카테고리의 다른 글

9. YOLO V1  (4) 2020.02.06
8. Faster RCNN  (1) 2020.02.06
6. SPP Net  (2) 2020.02.05
5. RCNN  (0) 2020.02.05
4. DPM (Deformable Part Model)  (0) 2020.02.04

+ Recent posts