Deep Learning based Detection

Computer Vision에서 Detection 이란 image에서 물체를 탐지해서 대부분의 경우 Bounding Box로 물체위치를 표시하고 무엇인지 notation을 한다. 주로 VOC Pascal 데이터셋을 사용하는데, 영상에서 모든 물체를 다 표기하긴 어렵고, 대표적인 물체 20가지를 탐지하게 한다. Classification은 단순히 물체가 영상에 하나가 있다고 가정하고 그 물체가 무엇인지 분류하는 문제인데, 이제 성능이 saturate되었다. 반면 Detection은 물체위치도 찾고, 무엇인지도 맞춰야해서 더 어려운 문제이다.

R-CNN - SPPnet - Fast-RCNN - Faster-RCNN Framework 들을 요약해보려 한다. Faster 같은 경우는 아직 공부중이라 더 추가할 예정이다. 각 알고리즘의 장점을 설명하고 단점들은 어떻게 해결되었는지 설명하려 한다.

R-CNN

Rich feature hierarchies for accurate object detection and semantic segmentation

CVPR2014 github arxiv

가장 먼저 나온 framework.
Region Proposal. 그니까 물체인 듯 한 것들을 먼저 찾아낸다. 이때 쓰는 알고리즘은 Selective Search, EdgeBox 등이 있음. 그리고 그 proposal에 classification에 쓰는 CNN으로 분류시킴.

장점은 성능이 좋았던 것. 하지만 단점으로

  • region proposal을 CNN에서 classification할 때 image를 warp/crop을 하기 때문에 이미지 변형/손실이 일어나서 성능이 저하함.
  • 약 2000개 region proposal을 뽑고 다 CNN computation을 돌리기 때문에 속도 저하.
  • Region Proposal에 쓰는 알고리즘들은 GPU의 빠른 연산에서 이득을 못보는 CPU연산이었고 속도에서 Bottleneck으로 작용함.[1]

이 3개가 R-CNN의 대표적인 단점이었는데 1,2 번째 단점이 다음에 소개될 SPPnet에서 해결되었다. 2번째 단점은 소개되는 Fast-RCNN에서, 3번째 단점은 Faster-RCNN에서 해결된다.


SPPnet

Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition

ECCV2014 github arxiv

어떤 input size의 image도 fixed size의 vector output으로 나오게 함.
기존 AlexNet같은 경우 227x227 사이즈의 이미지만 input으로 가능했다. (한 2년 전 얘기.)
그 이유는 CNN에서 Convolution은 input size에 상관이 없으나, Fully Connected(FC) layer에서 input size가 반드시 고정되어야하니까.
Convolution은 filter로 convolution 계산만 하는 개념, FC는 fixed input size에서 fixed output size로 transformation을 하는 개념이다.


위의 AlexNet을 보면 마지막 layer에서 1000개가 나와야해서 결국 input image가 227x227이어야만 했음.
FC는 데이터를 transformation하는 개념이었는데 이는 사실 1x1 convolution layer라고 할 수 있음.
실제로 Yann Lecun은 본인 페이스북 계정으로

In Convolutional Nets, there is no such thing as "fully-connected layers".

라고 주장 하심.
하지만 이때는 예전이니까,
SPPnet의 장점은 국문으로 여기에 잘정리되어있음.
이를 요약하자면

본래 SPPnet 이전에 예를 들어 R-CNN은 정해진 사이즈로 input image를 만들어줘야해서 crop/warp을 하였는데 이때 이미지 정보가 손실되거나 변형되는 단점이 있다(위 image 첫번째 framework, 즉 기존 R-CNN). SPP가 들어감에 따라(두번째 framework)에서 어느 사이즈 이미지든 input으로 받을 수 있게 되었다. 아래 사진이 SPP layer인데 이를 Detection으로 사용하려면

Image에서 Selective Search 등으로 Region Proposal한 영역을 CNN Forward computation 결과인 Feature map에서 pooling하고 SPP layer를 통과시킨다. RCNN은 2000개의 Region에 CNN을 모두 돌렸는데, 이번엔 image 전체에 CNN을 한번만 돌리고 나온 결과물인 feature map으로 detection을 수행한다. 그 결과 RCNN과 성능은 비슷하면서도 training/test 속도가 몇배로 빠르다.


Fast-RCNN (FRCN)

ICCV2015 github arxiv

RoI pooling layer라고 SPP layer의 간단 버전. single level scale만 받음. 그래서 여기선
SPPnet은 (예를 들어, VGG16 모델을 사용했을때) 3-layer softmax classifer만 fine-tuning이 가능한데, 그이유는 convoulutional features가 offline으로 작동함. 그래서 Back-propagation이 안되서 첫 l3 layers만 초기값으로 고정되고, 마지막 3 layer만 업데이트.
그래서 SPPnet은 R-CNN에서 개발한 ROI-centric하게 training가능함.
RoI에 대해서 계산하는데 보통 RoI 크기가 원본 image 만함. 그래서 느리고 메모리도 너무 많이든다. 하지만 FRCN에서는 image-centric임. mini-batches들이 hierarchically 샘플되는데, 이미지 그다음 그 이미지의 RoI들에 대해서. 한 image에 대한 RoI들은 computation, memory 공유함.

개인적으로 전체적인 아이디어는 SPPnet과 비슷한데, 더 나은 방식으로 Back Propogation 알고리즘을 설계해서 기존의 SPPnet이 Conv layers들을 학습시키지 못한 단점을 보완한 것으로 보인다.

BP thourough RoI pooling layer.

우선 RoI pooling layer를 다시 설명하자면 이미지 input size가 다양해도 output vector size를 고정시켜주기 위해 쓴다.

image credit from caffe-cvpr150-detection

S: 이미지 scale이라서 1 또는 5
그래서 RoI pooling layer 전에 Conv5 feature map blob size가 어떻게 생기던 Pool5의 blob size는 항상 2000x500x6x6가 됨.

무튼 요지는 SPPnet의 input size에 상관없는 장점을 살린 것과, CNN computation을 단 한번으로 detection을 해내서 속도를 빠르게 해냈다는 것. 하지만 여전히 Region Proposal을 필요로 하기때문에 여기서 bottleneck으로 작용한다.


Faster-RCNN (Region Proposal Network)

NIPS2015 python-github official-matlab-github

arxiv
Region Proposal의 bottleneck을 해결했는데 이를 기발하게 Classification에서 사용되는 CNN weight를 재사용했다. 그리고 그 결과를 논문에서 제시한 Region Proposal Network에서 Region을 추론한다. 더 자세한 내용은 다음에 다루겠다.

review and comment

여기서 소개한 모든 알고리즘들이 코드를 공개해오는데, 딥러닝의 장점을 살린 Detection 연구가 불과 2014년도에 시작(R-CNN)했음에도 엄청난 속도로 알고리즘이 보완되고 있다. 요번에 발표한 ILSVRC2015의 순위권들이 Faster-RCNN을 기반인데, 오픈소스가 확실히 기술을 빠르게 발전시키는 것 같다.


  1. Selective Search로 2000개 proposal 뽑을 때 image 크기에 따라 다르지만 2초 정도 걸린다. edgebox는 약 0.2초. 그런데 AlexNet의 Forward 속도는 이보다 빠름. ↩︎