소소한 블로그

[논문리뷰] Fast R-CNN 이해 본문

이론/이미지인식

[논문리뷰] Fast R-CNN 이해

happy_ai 2021. 3. 31. 23:50

오늘 밖에 나갔는데 날씨도 따뜻하고 벚꽃도 많이 폈더라고요.

봄 옷 꺼내서 세탁을 왕창 했습니다. 본론으로... ㅎㅎ

 

지난 주에는 R-CNN 논문을 읽고 간략한 리뷰를 해봤습니다.

오늘은 R-CNN에 이어서 Fast R-CNN 논문을 다뤄보려 합니다.

Fast R-CNN 논문링크

(저번주와 마찬가지로) 저의 목표는 Mask R-CNN 이해 및 구현을 위한 배경지식을 쌓는 것이기 때문에,

오늘 리뷰 역시도 세세한 내용 보다는 제가 이해한 바를 간략히 끄적여봤습니다.

 

R-CNN에 대한 게시물은 아래를 클릭하면 보실 수 있습니다.

2021.03.23 - [이론/이미지인식] - R-CNN 이해

 


 

먼저 Fast R-CNNObject detection을 위한 모델입니다.

논문의 Abstract에서는 Fast R-CNN이 기존 Object detection 모델인 R-CNN, SPPnet보다 2가지 측면에서

1) training, testing speed

2) detection accuracy

더 성능이 좋다고 소개하고 있습니다.

 

 

글을 시작하기에 앞서 제가 느끼기에 논문에서 꾸준히 강조하고 있는 키워드가 몇개 있는데,

이를 먼저 언급하고 가겠습니다.

'Single-stage training'

'Sharing computation'

'Multi-task loss'

이것들을 기억하시고ㅎㅎ 이제 본론으로 들어가겠습니다.

 


먼저 이 논문의 introduction에서는

기존 object detection 모델인 R-CNN, SPPnet의 단점을 소개하고 있습니다. 

 

[R-CNN 단점]

1) Training이 multi-stage pipeline입니다. 

첫번째는 object proposals을 ConvNet하는 과정을 fine-tuning하는 과정,

두번째는 classification을 위해 ConvNet features를 input으로 삼는 SVMs를 fit하는 과정,

마지막은 bounding-box를 regression하는 과정

입니다.

 

2) Training이 space 측면에서나 time 측면에서나 성능이 좋지 않습니다.

공간적인 측면에서 성능이 좋지 않은 이유는 각 object proposal의 features이 disk에 저장되기 때문입니다.

시간적인 측면에서 성능이 좋지 않은 이유 중 하나는 모든 proposal에 대해 ConvNet 과정을 거치기 때문입니다.

 

3) Object detection이 느립니다.

마찬가지로 모든 proposal에 대해 features를 구해야 하기 때문에 detection 시간도 느릴 수 밖에 없습니다.

참고로 각 proposal마다 ConvNet 과정을 따로 수행하는 것을 'sharining computation'하지 않다고 표현하고 있습니다.

 

____________

 

 

[SPPnet 단점] (SPPnet이 무엇인지는 여기서 다루지 않겠습니다.)

1) Training이 R-CNN처럼 multi-stage pipeline입니다.

큰 단계 자체는 R-CNN과 비슷합니다. (fine-tuning a network, training SVMs, fitting bounding regressors)

 

2) R-CNN처럼 features가 disk를 사용하기 때문에 space 측면에서 성능이 좋지 않습니다.

 

3) spatial pyramid pooling 에서의 convolutional layers를 fine-tuning 할 수 없습니다.

 

 

위처럼 논문에서 R-CNN, SPPnet의 단점들을 소개했으니

Fast R-CNN은 앞에서 나열한 단점들을 해결했다는 것을 추측할 수 있겠죠?

 

 

논문에서는 Fast R-CNN의 장점을 아래와 같이 소개하고 있습니다.

1) R-CNN, SPPnet보다 mAP가 높습니다.

2) Training이 single-stage이고 multi-task loss를 사용합니다.

3) Training 과정에서 모든 network layers를 update시킬 수 있습니다.

4) R-CNN, SPPnet과는 달리 features를 caching하기 위해서 disk 공간을 쓰지 않습니다.

 


 

이제 Fast R-CNN의 전체적인 구조에 대해 살펴보겠습니다.

아래는 Fast R-CNN architecture를 그림으로 그려낸 것입니다.

Fast R-CNN논문의 Figure 1

 

그림을 차근차근 살펴보겠습니다!

 

____________

 

 

먼저 전체 image와 object proposalsinput으로 삼습니다.

전체 image는 convolution layers와 max pooling layers를 통해 Conv feature map으로 변환됩니다.

그리고 obect proposals를 이 Conv feature map에 projection 시킵니다.

 

____________

 

 

그 다음 RoI projection시킨 object proposalsRoI pooling layer를 통해

fixed-length feature vector을 추출합니다.

 

____________

 

 

 

그 다음 각 feature vector은 몇개의 fully connected layers를 거쳐서 마지막으로 2가지 sibling layer로 나뉩니다.

첫번째는 classification(K개의 class + back-ground = 총 K+1)을 하는 부분,

두번째는 K개의 object class에 대해 4개의 실수 값 즉 bounding-box의 위치를 output하는 부분입니다.

 

 

 

Fast R-CNN은 사전 학습된 ImageNet모델들을 사용했습니다.

위에 언급된 Fast R-CNN의 architecture을 구현하기 위해

사전 학습 모델을 아래와 같이 변형하여 사용했습니다.

1) 기존 마지막 max pooling layer를 RoI pooling layer로 바꿨습니다.

2) 기존 마지막 softmax layer를 앞서 소개한 2개의 sibiling layer로 바꿨습니다.

3) 네트워크의 input을 2가지로 받게끔 수정했습니다. (a list of images, a list of RoIs)

 


 

Fast R-CNN의 loss는 아래와 같습니다.

Fast R-CNN의 multi-task loss

논문에서는 Fast R-CNN을 Multi-task loss라고 소개하고 있습니다.

하나의 loss 정의로 여러가지 task의 loss를 다룬다고 생각하시면 됩니다.

우변의 첫번째 항은 classification에 대한 loss이며,

우변의 두번째 항은 bounding-box의 위치에 대한 loss입니다.

따라서 하나의 손실함수 정의에 classification에 대한 loss, bounding-box에 대한 loss를 포함하고 있습니다.

 

변수의 정의만 잠깐 살펴보고 가자면,

p := 추측 class

u := ground-truth class

t^u := ground-truth class에 대한 추측 bounding-box 위치

v := ground-truth bounding-box 위치

입니다.

 


 

논문에서는 Fast R-CNN에서 어떤 기법들을 사용했는지 제가 생각하기에는 자세히 설명해주고 있습니다.

(제가 이전에 봤던 논문들에서는 optimization, batch 등의 방법들에 대해 설명해주지 않은 것이 많았는데,

이 논문에서는 자세히 설명해주고 있어서 신기했습니다)

예를 들면 SGD mini-batches를 사용하고 있다든지, Truncated SVD를 썼다든지 하는 것 등

이 글에서는 이에 관한 설명은 생략하겠습니다.

(제 목표는 Fast R-CNN이 무슨 architecture이고 주요 특징은 무엇인지 파악하는 것이기 때문이죠ㅎㅎ)

 

 

 

논문에서 소개한 Fast R-CNN의 실험 결과들 중 Training, testing time에서의 결과를 소개해보겠습니다.

Fast R-CNN 논문의 Table 4.

여기서 S는 사전 학습된 CaffeNet을 사용한 것, M은 VGG_CNN_M_1024를 사용한것, L은 VGG16을 사용한 것입니다. (참고로 S는 small, M은 medium, L은 large를 뜻합니다.)

 

VGG16을 사용한 Fast R-CNN은 truncated SVD를 적용하지 않는다면

같은 모델을 사용한 R-CNN보다 test time측면에서 146배나 더 빠르며,

Fast R-CNN에 truncated SVD를 사용한다면 R-CNN보다 213배나 더 빠릅니다.

training time측면에서는 9배 더 빠릅니다.

 

또한 VGG16을 사용한 Fast R-CNN에 truncated SVD를 적용하지 않는다면

같은 모델을 사용한 SPPnet보다 test time측면에서 7배 빠르며,

Fast R-CNN에 truncaated SVD를 사용한다면 SPPnet보다 10배 빠릅니다.

training time측면에서는 2.7배 더 빠릅니다.

 

Fast R-CNNfeatures를 cache하지 않기 때문에

시간적인 측면에서 뿐만 아니라 공간적인 측면에서도 효율적입니다. 

 


 

제가 논문을 읽으면서 흥미로웠던 서술방식(?)은 

어떤 선택이 좋을지 질문을 던져놓고

이에 대해 자신이 실험한 결과를 소개함으로써 답을 내는 방식이었습니다.

 

예를 들면 과연 multi-task training이 실제로 도움이 되는지,

scale-invariant object detection을 위해 single-scale learning, multi-scale learning 둘 중 무엇이 좋은지,

training data를 많이 사용하는 것이 좋은지,

SVMs이 좋은지 softmax가 좋은지,

proposals이 많으면 항상 좋은 것인지

등 입니다.

 

논문을 읽는 사람 입장에서는 참신한 서술 방식..ㅎㅎ

 


 

이처럼 Fast R-CNN의 architecture

기존 object detection 모델인 R-CNN, SPPnet과 비교해 어떤 점이 개선되었는지

살펴보았습니다.

 

 

 

여담이지만 이번주에 Fast R-CNN, Faster R-CNN 모두 다뤄보려고 했는데 그러지 못했네요.

혼자 공부하면서 마음만 조급해질 때가 종종 찾아오는 것 같습니다.

이것도 해야할 것 같고, 저것도 해야할 것 같고요.

그래도 성급해하지 말고 차근차근 끄적이려고 노력하고 있습니다.ㅎㅎ

 

그러면 이젠 저는 Faster R-CNN을 읽어보러 가겠습니다 :)