RCNN 부터 Mask R-CNN까지 (1) R-CNN ~ Fast R-CNN

February 2, 2019    Object Detection

Fast R-CNN

안녕하세요. 이번 포스트에서는 Object Detection을 정리해보려 합니다. 우선, Object Detection이란 Classification보다 더 어려운 task입니다. 분류가 단순히 이미지의 클래스를 판별하는 작업이라면, object detection은 이미지 안에 있는 여러 레이블을 정확히 분류하는 동시에 레이블의 위치까지도 파악해야 하기 때문입니다.

Object Detection은 정교한 작업이 요구됩니다.

Object Detection의 성능을 눈에띄게 높인 연구로 R-CNN을 얘기할 수 있겠습니다. R-CNN으로부터 SPPnet, Fast R-CNN 등이 제안되었고 이에 본 블로그에서는 차후 Faster R-CNN을 넘어 Mask R-CNN까지 다루는 것을 목표로 합니다.

그럼 RCNN을 통해 본격적으로 시작해보겠습니다.


R-CNN

RCNN은 CNN을 본격적으로 이용하여 Object Detection에서 높은 성능을 보였다는 점에서 주목을 끌었습니다.

R-CNN 학습 구조

R-CNN의 학습은 다음과 같이 진행됩니다.

  1. 우선 이미지에 대한 후보 영역(region proposal)을 생성합니다. (약 2000여개)
  2. 각 region proposal마다 고정된 크기로 wraping/crop하여 CNN 인풋으로 사용합니다. 여기서 CNN은 이미 ImageNet을 활용한 pre-trained된 네트워크를 사용합니다.
  3. CNN을 통해 나온 feature map을 활용하여 SVM을 통한 분류, regressor를 통한 bounding box regression을 진행합니다.

R-CNN은 CNN의 invariace 특징을 잘 활용하여 object detection에서 좋은 성능을 가져왔습니다. 그러나 학습이 세 단계의 multi-stage로 구성되어 있고, selective search에 해당하는 region proposal 만큼 CNN을 돌려야 하며 큰 저장 공간을 요구하며 무엇보다도 느리다는 단점이 존재합니다.

이러한 R-CNN의 단점을 보완하고자 제안된 연구가 SPPnet입니다.


SPPnet

SPPnet은 R-CNN에서 가장 크게 나타나는 속도 저하의 원인인 각 region proposal마다의 CNN feature map 생성을 보완하였고 이를 통해 학습시 3배, 실제 사용시 10-100배라는 속도 개선을 이루어냈다는 장점을 보여줍니다. 이를 가능케한 구조는 무엇보다도 region proposal에 바로 CNN을 적용하는 것이 아니라 이미지에 우선 CNN을 적용하여 생성한 feature map을 region proposal에 사용했기 때문입니다.

SPPnet 학습 구조

SPPnet은 Spatial Pyramid Pooling 이라는 특징을 같는 구조를 활용하여 임의 사이즈의 이미지를 모두 활용할 수 있도록 하였습니다. SPP layer는 쉽게 말해서 이미지의 사이즈와 상관없이 특징을 잘 반영할 수 있도록 여러 크기의 bin을 만들고 그 bin값을 활용하는 구조입니다. 결론적으로, SPPnet은 속도를 크게 향상 시켰고, 고정된 이미지만을 필요로 하지 않는다는 장점을 갖게 됩니다.

다만 한계점도 존재합니다. 우선 R-CNN과 같은 학습 파이프라인을 갖고 있기에 multi-stage로 학습이 진행됩니다. 따라서 저장 공간을 요구하게 되고 학습이 여전히 빠르게 진행되기는 어렵게 됩니다. 또한 위의 그림과 같이 CNN의 파라미터가 학습이 되지 못하기에 Task에 맞는 fine-tuning이 어려워집니다.

지금까지 다룬 R-CNN과 SPPnet의 장점을 가져오고 단점을 보완하고자 제안된 결과물이 바로 Fast R-CNN이 되겠습니다.


Fast R-CNN

Fast R-CNN을 다루도록 하겠습니다.

Fast R-CNN은 R-CNN의 단점을 보완하기 위해 고안되었습니다. 기존의 R-CNN에 비해 더 빠른 처리 속도와 더 높은 정확도를 보장합니다. 논문에서는 R-CNN과 SPPnet의 단점으로 아래 세 가지를 언급합니다.

  1. 학습이 여러 단계로 진행되며
  2. 그로 인해 학습에 많은 시간과 GPU 계산 용량이 요구된다.
  3. 또한 실제 object detect에 있어서 오랜 시간이 걸린다.

R-CNN은 연산을 공유하지 않고 모든 object proposal에 각각 convnet을 적용하기에 굉장히 느립니다. SPPnet은 이 단점을 보완하기 위해 하나의 conv feature map을 통해 object proposal을 접근하였는데요, 이를 통해 연산 공유가 가능하도록 하여 보다 빠른 계산이 가능해졌습니다. 그러나 SPPnet 또한 다단계 파이프라인 사용과 같은 단점을 가지고 있으며 오늘 소개할 논문인 Fast R-CNN에서는 두 이전 연구의 단점을 보완함을 강조하고 있습니다.

Fast R-CNN 구조

Fast R-CNN의 전체 구조는 아래 그림 1과 같습니다.

그림 1

입력으로 전체 이미지와 object proposal을 사용합니다. 네트워크 과정을 통해서 Conv feature map이 생성되며 각 RoI에 대해 feature map으로부터 고정된 길이의 벡터를 출력합니다. 최종적으로 FC층을 지나면서 각 RoI에 대해 softmax 확률값과 class별 bounding box regression offsets을 출력합니다. 전체 학습은 end to end로 진행됩니다.

The RoI pooling layer

RoI pooling layer는 Conv를 통해 생성된 feature map에서 유효한 RoI 특징을 저차원으로 매핑하기 위해 H*W로의 max pooling을 사용합니다. 여기서 H와 W는 hyperparameter입니다. 논문에서 RoI는 직사각형 모양을 띄며 (r,c,h,w)의 튜플 형태로 정의됩니다. (r,c)는 위, 왼쪽 코너를 의미하며 (h,w)는 높이와 너비를 의미합니다. RoI pooling layer는 앞서 SPPnet에서 사용한 SPP layer의 하나의 pyramid level만을 이용한 특수 현상으로 이해하셔도 동이합니다.

RoI pooling layer 예시

Initializing from pre-trained networks

논문에서는 미리 학습된 3개의 Imagenet 네트워크를 초기화시 적용하였습니다. 각각 5개의 max pooling layer와 5~13개의 conv layer를 가진 네트워크이며 Fast R-CNN에 적용되면서 크게 3가지 변화가 적용되었습니다.

  1. 마지막 max pooling layer는 첫 fc layer와 호환되는 RoI pooling layer로 대체되었습니다.
  2. 네트워크 마지막의 fc layer와 softmax는 앞서 언급한 바와 같이 2개의 서로 다른 layer로 대체되었습니다.
  3. 네트워크는 이미지와 region proposal 두 개의 입력을 받을 수 있도록 수정되었습니다.

Fine-tuning for detection

detection을 위해서 Fast R-CNN은 R-CNN&SPPnet의 region-wise sampling이 아닌 hierarchical sampling을 사용합니다. 따라서 N개의 이미지를 미리 뽑고 그 중 R개의 RoI를 뽑아서 학습이 사용합니다. 논문에서 N=2, R=128을 사용하였고 약 64배의 빠른 학습이 가능하다고 말합니다. 수직적 구조로 인해 수렴이 늦어질수도 있겠지만 학습 결과 수렴 속도에 큰 영향을 미치지 않는다는 것이 언급되어 있습니다. 무엇보다도 Fast R-CNN은 최종 classifier와 regression까지 단방향 단계인 single stage로 fine-tuning이 가능하다는 장점을 갖습니다.

Multi-task loss

Fast R-CNN은 두 개의 출력층을 갖습니다. 분류의 경우 각 RoI별 클래스에 속할 사후 확률 값을, 회귀의 경우 bounding box regression 값을 출력하며 두 출력에 대한 ground truth를 u, v로 봅니다. 최종 손실 함수는 아래와 같습니다.

Loss function

미니 배치 샘플링

앞서 언급했듯이, N=2, R=128로 미니배치를 구성합니다. RoI의 25%를 전체 object proposal에서 IoU가 0.5 이상인 경우로 구하고 나머지를 0.1~0.5 사이 값으로(배경으로 인식) 구합니다. 학습 과정에서 이미지는 50%의 확률로 수평으로 뒤집어집니다.

실제 detection

보통 2000개의 RoI를 224*224 스케일과 비슷하게 사용하며 각 RoI마다 사후 class분포 값과 bb 예측값을 산출하여 detecion confidence를 부여합니다. 이러한 confidence값을 사용하여 non-maximum suppression을 통해 region proposal의 수를 2000여개로 줄입니다.

Truncated SVD

특이값분해를 사용하여 detection을 더욱 빠르게 할 수 있습니다. U : u * t 를, V : v*t 의 차원을 갖고 있으며

\(W \sim U \sum_t V^T\) 로 표현할 수 있습니다. 이 경우 파라미터 수가 uv -> t(u+v)만큼 감소하게 됩니다.

실험결과

VOC07, 2010, 2012에서 SOTA의 mAP를 보여줬습니다. 무엇보다도 논문에 앞에서 밝혔듯이 R-CNN과 SPPnet에 비해 굉장한 속도 개선을 이루어 냈습니다.

실험결과 mAP성능

실험결과 속도개선

그러나 아직까지 실제 detection에서 걸리는 시간은 충분히 빠르지 못하는데 이는 다음 포스트인 Faster R-CNN에서 자세히 다루도록 하겠습니다.