[Object Detection] YOLO, RCNN, Fast R-CNN

YOLO

YOLO는 real tiYOLO는 real time object detection에 사용되는 알고리즘이다.

각 이미지를 S x S 개의 그리드로 분할하고, 각 그리드의 신뢰도를 계산한다.

처음에는 객체와 동떨어진 그리드가 설정되지만, 신뢰도를 계산하여 위치를 조정함으로써

가장 높은 객체인식 정확성을 가지는 그리드를 얻는다.

신뢰도는 주변의 그리드를 합쳐 높이고, 이후 임계값을 설정해 불필요한 부분을 제거한다.

YOLO Version 비교

R-CNN

R-CNN 계열이 공통으로 가진 process

: 우선, 이미지에서 1차적으로 cpu 상에서 Selective Search를 진행한다. 이 Search 과정을 통해 물체가 있을 법한 위치 약 2000개 정도를 찾게 되고, 이러한 2000개의 부분을 Cropping과 Resizing을 하여서 개별적으로 CNN network를 거치면서 feature vector를 추출한다. 이러한 feature vector들을 SVM을 통해서 Classification을 진행하고 Regressor를 통해서 물체의 정확한 위치가 어딘지 bounding box를 예측하게 된다.

R-CNN MAIN IDEA (2steps)

2-stage Detector

  1. Region Proposal : 물체의 위치를 찾는
    ( region proposal 과정이 실제 object detection CNN과 별도로 이루어지기 때문에, selective search를 사용하면 end-to-end로 학습이 불가능하고, 실시간 적용에도 어려움이 있다)
  2. Region Classification : 물체를 분류하는

2-stage detector task를 처리하기 위해 만들어진 모듈

  1. Region Proposal : Selective Search
  2. CNN : Feature Vector 추출 (pre-trained : Cropping과 Resizing..인지?)
  3. Bounding Box Regression & SVM : Classificatoin

(1) Region Proposal

Selective Search라는 알고리즘을 이용해서 ‘임의의’ Bounding Box를 설정한다.

  1. 초기 sub-segmentation을 수행한다.

sub-segmentation

  1. 작은 영역을 반복적으로 큰 영역으로 통합한다.
    Greedy 알고리즘을 사용하여 이 과정을 진행한다.
    여러 영역으로부터 비슷한 영역을 고르고 통합하는 것을 1개의 영역이 남을 때까지 반복한다.

  2. 통합된 영역들을 바탕으로 후보 영역을 만들어낸다.

Segmentation : More iteration

(2) CNN

Bounding Box들을 같은 사이즈(227x227)로 통일시키는 작업(Warping)을 거친다.

(CNN은 인풋값의 크기가 고정되어있기 때문 227*227)

이미지 2000개를 227x227 Pixel Size로 각각 모두 (2000번) CNN에 인풋으로 넣어 준다.

 

 

(3) SVM (Support Vector Machine) & Bounding Box Regression

SVM으로 이미지 패치의 특징을 입력으로 받아 각 패치가 객체인지 아닌지를 분류
객체의 실제 위치와 제안된 Bounding Box 사이의 관계를 학습하여 Bounding Box를 조정

이로써 최종적으로 정확한 객체 위치와 Bounding Box를 얻는다.

 

 

R-CNN의 한계

  1. End-to-End 방식으로 학습할 수 없다.
    전체 아키텍쳐에서 SVM, Regressor모듈이 CNN과 분류되어있기 때문이다. 따라서 CNN을 통해서 업데이트 할 수 없다.
  2. 입력 이미지에 대해 CPU기반의 Selective Search를 진행해야 하므로 시간이 많이 소요된다.
  3. 합성곱 신경망의 입력을 위한 고정된 크기를 위해 warping / crop(이미지 크기 조절)을 사용하므로 정보 손실 발생
  4. 학습 시간이 길며(2천개의 영역) 공간을 많이 차지함
  5. detection 속도가 느리다.

 

Fast R-CNN

Fast RCNN

R-CNN과의 가장 큰 차이점은 CNN을 순차적으로 수행하느냐 (R-CNN), 병렬적으로 수행하느냐(Fast R-CNN) 의 차이이다.

기존 R-CNN같은 경우 CNN을 통과하고 고정된 길이의 벡터를 얻기 위해 Selective Search로부터 얻어진 2천개의 영역을 각각 Crop & Resize하여 입력으로 사용했다. 하지만 한 이미지당 2천번의 CNN을 수행하므로 매우 느릴 수밖에 없었다.
 
이를 해결하기 위해 Fast-RCNN에서는 해당 영역의 Feature를 원본 이미지에서 추출(Crop)하는 것이 아니라, Feature Map단에서 추출한다. 그렇기 때문에, 입력 **이미지마다 단 한번의 CNN만을 거친다.

이후에 RoI pooling을 통해 각각의 region들에 대해 feature에 대한 정보를 추출한다. 그리고 기본적인 CNN 네트워크를 이용해 softmax layer을 거쳐 각각의 class에 대한 probability를 구한다.  

feature map 예시

Fast R-CNN Main Idea

1. Rol (Region of Interest) Pooling

(1) 800x800크기의 이미지를 VGG모델에 입력하여 8x8크기의 feature map을 얻는다.

(2) 동시에 원본 이미지에 Selective search 알고리즘을 작성하여 500*700크기의 region proposal을 얻는다.

(3) feature map에서 각 region proposal에 해당하는 영역을 추출한다. (RoI Projection)

2. Multi-task loss

Classifier와 Bounding box regressior을 동시에 학습시킨다.

feature vector를 사용하여 Classifier 와 Bounding box regression을 동시에 학습시킨다. 두 모델을 한 번에 학습시키기 때문에 R-CNN모델과 각 모델을 독립적으로 학습시켜야 하는 번거로움이 없다는 장점.

3. Hierarchical Sampling

N개의 이미지를 sampling하고, 총 R개의 region proposal을 사용한다고 할 때, 각 이미지로부터 R/N개의 region proposals를 sampling.

Hierarchical Sampling

이렇게 Projection한 Bounding Box들을 RoI Pooling하는 것이 Fast R-CNN의 핵심. Selective Search를 통해 구해진 RoI영역은 각각 다른 크기를 가지고 있어 이 Resolution의 크기를 맞추기 위해 RoI Pooling을 수행한다.  

  • ex1) 8x8 input feature map에서 Selective Search 로 뽑아냈던 7x5짜리 ReginonProposal 부분이 있고 2x2로 만들어주기 위해 Stride 로 Pooling Section을 정하고 (7/2)=3,(5/2)=2로 pooling 하여 2x2 output을 얻어낸다.
  • ex2) 7x7의 output feature map을 만들기 위해 21x14 짜리 Region 에는 Stride (3, 2),42x35 짜리 Region 에는 Stride (6, 5)으로 MaxPooling 하여 Fixed Length Feature Vector인 7x7을 만들어냄

Fast R-CNN 한계

이전의 Fast R-CNN은 하나의 입력 이미지마다 2천번의 CNN을 수행하던 것을 RoI Pooling으로 단 1번의 CNN을 통과시켜 엄청난 속도 개선을 이뤄냈다.

하지만 여전히 영역을 제안하기 위해 Selective Search알고리즘을 사용하는, 이는 GPU에서 연산을 수행하지 않고 CPU에서 작동하기 때문에 병목현상이 발생하게 된다. 따라서 Faster-R-CNN Region Proposal도 CNN내부에서 수행하여 (=GPU이용 가능) 네트워크를 빠르게 만든다.