본문 바로가기

AI/Object Detection

[OD] Fast R-CNN

 

 

(논문리뷰) Fast R-CNN 설명 및 정리

이전글 : (논문리뷰) R-CNN 설명 및 정리 컴퓨터비전에서의 문제들은 크게 다음 4가지로 분류할 수 있다. 1. Classification 2. Object Detection 3. Image Segmentation 4. Visual relationship 이중에서 4. Visu..

ganghee-lee.tistory.com

 

 

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

Fast R-CNN 안녕하세요. 이번 포스트에서는 Object Detection을 정리해보려 합니다. 우선, Object Detection이란 Classification보다 더 어려운 task입니다. 분류가 단순히 이미지의 클래스를 판별하는 작업이라면

woosikyang.github.io

 

R-CNN과 SPPnet의 단점으로 아래 세 가지를 언급합니다.

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

그리고 Fast R-CNN에서는 다음 두 가지를 통해 위 한계점들을 극복했다.

1) RoI pooling

2) CNN 특징 추출부터 classification, bounding box regression까지 하나의 모델에서 학습

 

"Fast R-CNN 프로세스"

1-1. R-CNN에서와 마찬가지로 Selective Search를 통해 RoI를 찾는다.
1-2. 전체 이미지를 CNN에 통과시켜 feature map을 추출한다.

2. Selective Search로 찾았었던 RoI를 feature map크기에 맞춰서 projection시킨다.

3. projection시킨 RoI에 대해 RoI Pooling을 진행하여 고정된 크기의 feature vector를 얻는다.

4. feature vector는 FC layer를 통과한 뒤,  두 브랜치로 나뉘게 된다.

5-1. 하나는 softmax를 통과하여 RoI에 대해 object classification을 한다.
5-2. bounding box regression을 통해 selective search로 찾은 box의 위치를 조정한다. 

 

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로 진행됩니다.

 

R-CNN에서 CNN output이 FC layer의 input으로 들어가야했기 때문에 CNN input을 동일 size로 맞춰줘야 했다.
따라서 원래 이미지에서 추출한 RoI를 crop, warp을 통해 동일 size로 조정했었다.
그러나 실제로 "FC layer의 input이 고정인거지 CNN input은 고정이 아니다"
따라서 CNN에는 입력 이미지 크기, 비율 관계없이 input으로 들어갈 수 있고
FC layer의 input으로 들어갈때만 size를 맞춰주기만 하면된다.
 
여기서 Spatial Pyramid Pooling(SPP)이 제안된다.

<Spatial Pyramid Pooling(SPP)>

 

Spatial Pyramid Pooling

 

SPP에서는 먼저 이미지를 CNN에 통과시켜 feature map을 추출한다.

그리고 미리 정해진 4x4, 2x2, 1x1 영역의 피라미드로 feature map을 나눠준다. 피라미드 한칸을 bin이라 한다.

bin내에서 max pooling을 적용하여 각 bin마다 하나의 값을 추출하고,

최종적으로 피라미드 크기만큼 max값을 추출하여 3개의 피라미드의 결과를 쭉 이어붙여 고정된 크기 vector를 만든다.

 

정리하자면,

4x4, 2x2, 1x1 세 가지 피라미드가 존재하고, max pooling을 적용하여 각 피라미드 크기에 맞게 max값을 뽑아낸다.

각 피라미드 별로 뽑아낸 max값들을 쭉 이어붙여 고정된 크기 vector를 만들고 이게 FC layer의 input으로 들어간다.

 

따라서 CNN을 통과한 feature map에서 2천개의 region proposal을 만들고 region proposal마다

SPPNet에 집어넣어 고정된 크기의 feature vector를 얻어낸다. 

이 작업을 통해 모든 2천개의 region proposal마다 해야했던 2천번의 CNN연산이 1번으로 줄었다.

 

<RoI Pooling>

다시 돌아와 Fast R-CNN에서 이 SPP가 적용되는 것을 보면 다음과 같다.

Fast R-CNN의 구조

 

실제로 Fast R-CNN에서는 1개의 피라미드를 적용시킨 SPP로 구성되어있다. 또한 피라미드의 사이즈는 7x7이다.

Fast R-CNN에서 적용된 1개의 피라미드 SPP로 고정된 크기의 feature vector를 만드는과정을 "RoI Pooling"이라 한다.

 

 

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∼U∑tVT 로 표현할 수 있습니다. 이 경우 파라미터 수가 uv -> t(u+v)만큼 감소하게 됩니다.

 

실험결과

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

실험결과 mAP성능

 

실험결과 속도개선

 

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

'AI > Object Detection' 카테고리의 다른 글

[OD] Non-Maximum Suppression(NMS)  (0) 2021.06.28
[OD] SPPnet  (0) 2021.06.25
[OD] R-CNN  (0) 2021.05.20
[OD] Object Detection 흐름  (0) 2021.05.20
[OD] Object Detection이란  (0) 2021.02.19