본문 바로가기
모아 읽은 보따리/Object Detection

2-stage Object Detection Model (R-CNN ~ FrRCNN)

by 동석2 2021. 3. 10.

2-stage Object detection을 위해 나온 모델들을 정리하는 곳.

비교적 간단히만 요약할 듯. 오래된 모델이 많아서

 

(1) R-CNN

https://arxiv.org/pdf/1311.2524.pdf

가장 처음에 제안된 R-CNN은 2-stage OD의 첫 모델이다.

(1 stage) image로 부터 Selective Search 알고리즘을 통해 RoI(Region of Interest)를 뽑아내어 (수치론 2000개)

(2 stage) ConvNet을 통해 각 RoI의 feature를 뽑아, reg/cls를 진행하는 모델이다.

여기서 Selective Search란, 기존 window sliding을 보완한 알고리즘인데, non-object segmentation(색깔, 크기 등)을 통해 여러 구역을 찾아, 비슷한 구역끼리 더해가며 2000개의 영역을 뽑아내는 알고리즘이다. 물론 현재는 이를 쓰지 않기에 넘어간다.

이렇게 찾은 RoI는 ConvNet을 통해 각각 feature를 뽑아낸다. 여기서 R-CNN의 가장 큰 단점이 나온다. 앞의 Selective Search도 연산량이 굉장히 많은데, 2000개의 CNN 연산을 진행하는 것에서 연산량 / parameter가 굉장히 많아져 속도가 굉장히 느리다는 것이다.

그래서 그 후로 속도에 관한 보완책이 줄줄이 나온다.

아무튼, 뽑아낸 feature를 두 network에 넣는데, 하나는 Bbox regression으로 RoI의 영역을 조정하는 layer이고, 하나는 SVM으로 classification을 수행하여 output을 내는 layer이다.

앞에서도 말했듯 R-CNN은 속도가 너무 느리고, end-to-end 학습이 불가능한 문제를 가졌다. 사람들은 어떻게 이 문제를 해결했을까?

(2) Fast R-CNN

https://arxiv.org/pdf/1504.08083.pdf

Fast R-CNN은 R-CNN의 속도를 높이는데 기여했다. 이전엔 볼 영역을 찾아 RoI 각각 CNN들을 통과시켜 각각의 feature를 구했다면, 여기선 통째로 이미지를 하나의 CNN에 넣어 feature를 구한다.

이 방법을 위해선 RoI와 이미지 feature들을 연결하는 작업이 필요한데, 그것이 RoI pooling이다.

과정은 다음과 같다.

  1. 위 사진의 왼쪽이 feature map이고, 거기에 미리 뽑은 hxw 크기의 RoI를 투영해놓았다.

  2. 이후에 fc layer에 들어갈 input의 크기를 고정적으로 만들기 위해서, 그 input의 크기에 맞게 RoI를 split한다.

  3. split한 영역마다 max pooling을 진행하여 원하는 input 크기 HxW의 벡터를 얻는다.

이러한 방법을 통해 모든 RoI를 일정한 크기의 벡터로 매칭시킴으로써,(HxW) CNN통과를 한번만 할 수 있게 만든 것이다. RoI pooling은 이후 SPP(Spatial Pyramid Pooling)라는 이름으로, 피라미드와 같이 층을 더 쌓음으로써 효과적인 pooling방법으로 진화한다.

이렇게 찾은 RoI vector들을 각각 cls/reg fc layer에 넣으면 완성된다.

Fast R-CNN은 또한 end-to-end network 구조를 완성하였다. R-CNN에선 SVM으로 cls를, reg에선 RoI 데이터를 이용하기에 training이 공유가 안되었는데, 이제 똑같은 pooling된 vector를 서로 다른 fc layer로 학습하기에 적절한 multi-task loss function으로써 함께 학습할 수 있게 된 것이다.

또한 CNN도 하나로 고정되어, pooling과정도 포함시켜 CNN까지고 fine-tuning할 수 있게 되어 end-to-end 학습 구조를 완성하였다.

하지만 여전히 Selective Search를 통해 RoI를 구했기 때문에, 여기서 쓰는 time이 너무 길었다. 어떻게 보완했을까? 이것도 gpu를 활용할 수는 없을까?

(3) Faster R-CNN

https://arxiv.org/pdf/1506.01497.pdf

이 selective search를 딥러닝으로 해결한 것이 바로 Faster R-CNN입니다. Faster R-CNN은 기존의 방법대신 RPN(Region Proposal Network)를 이용해 RoI를 추출하여 이용했습니다.

RPN의 구조는 다음과 같다. 우선 CNN을 통해 뽑은 feature map을 3x3 크기의 sliding window로 convolution하여 BxHxWx256의 dim을 갖는 intermediate layer를 추출한다.

이렇게 추출된 중간층에 대해 1x1 convolution을 이용해 cls, reg layer의 output을 추출해 RoI를 추출하는 방식이다.

여기서 1x1 convolution은 fc layer 대신 이용하는 것으로, fc layer는 input크기가 일정해야하지만 대신에 weight만큼의 1x1 convolution을 이용하면 가변적인 input크기에도 대응할 수 있게 되기에 사용하는 것이다. 사실 계산과정은 fc layer와 거의 같다고 보면 된다. 마지막으로 non-max suppression을 진행하면 최종 RoI가 나온다.

이렇게 RoI찾는 과정을 딥러닝 학습으로 할 수 있게 된 것이다.

논문은 이 RPN을 먼저 학습하여, RoI를 찾는 한편 RPN의 CNN을 본래 Fast R-CNN의 CNN과 공유하여, 이후 RoI Pooling 및 실제 cls/bbox훈련에 쓰이게끔 하였다.