본문 바로가기

갈아먹는 Object Detection [2] Spatial Pyramid Pooling Network

지난 글

갈아먹는 Object Detection [1] R-CNN

들어가며

지난 시간 R-CNN에 이어서 오늘은 SPP-Net[1]을 리뷰해보도록 하겠습니다. 저 역시 그랬고, 많은 분들이 R-CNN 다음으로 Fast R-CNN 논문을 보시는데요, 해당 논문을 보다 보면 SPPNet에서 많은 부분들을 참고한 것을 확인할 수 있습니다. 특히나 핵심인 Spatial Pyramid Pooling은 중요한 개념이므로 리뷰하고 넘어가도록 하겠습니다.

 

영향력: ResNet으로 유명한 Kaming He가 1 저자로 인용 횟수만 3600회에 달합니다.

주요 기여:  입력 이미지 크기와 상관없이 CNN을 적용할 수 있도록 하는 Spatial Pyramid Pooling 기법을 제안하였습니다.

핵심 아이디어

기존의 CNN 아키텍쳐들은 모두 입력 이미지가 고정되어야 했습니다. (ex. 224 x 224) 그렇기 때문에 신경망을 통과시키기 위해서는 이미지를 고정된 크기로 크롭하거나 비율을 조정(warp)해야 했습니다. 하지만 이렇게 되면 물체의 일부분이 잘리거나, 본래의 생김새와 달라지는 문제점이 있습니다. 여기서 저자들의 아이디어가 시작합니다.

 

"입력 이미지의 크기나 비율에 관계 없이 CNN을 학습 시킬 수는 없을까?"

SPPNet 핵심 아이디어

Convolution 필터들은 사실 입력 이미지가 고정될 필요가 없습니다. sliding window 방식으로 작동하기 때문에, 입력 이미지의 크기나 비율에 관계 없이 작동합니다. 입력 이미지 크기의 고정이 필요한 이유는 바로 컨볼루션 레이어들 다음에 이어지는 fully connected layer가 고정된 크기의 입력을 받기 때문입니다. 여기서 Spatial Pyramid Pooling(이하 SPP)이 제안됩니다.

 

"입력 이미지의 크기에 관계 없이 Conv layer들을 통과시키고,

FC layer 통과 전에 피쳐 맵들을 동일한 크기로 조절해주는 pooling을 적용하자!"

 

입력 이미지의 크기를 조절하지 않은 채로 컨볼루션을 진행하면 원본 이미지의 특징을 고스란히 간직한 피쳐 맵을 얻을 수 있습니다. 또한 사물의 크기 변화에 더 견고한 모델을 얻을 수 있다는 것이 저자들의 주장입니다. 또한 이는 Image Classification이나 Object Detection과 같은 여러 테스크들에 일반적으로 적용할 수 있다는 장점이 있습니다.

 

전체 알고리즘은 다음과 같습니다.

1. 먼저 전체 이미지를 미리 학습된 CNN을 통과시켜 피쳐맵을 추출합니다.

2. Selective Search를 통해서 찾은 각각의 RoI들은 제 각기 크기와 비율이 다릅니다. 이에 SPP를 적용하여 고정된 크기의 feature vector를 추출합니다.

3. 그 다음 fully connected layer들을 통과 시킵니다.

4. 앞서 추출한 벡터로 각 이미지 클래스 별로 binary SVM Classifier를 학습시킵니다.

5. 마찬가지로 앞서 추출한 벡터로 bounding box regressor를 학습시킵니다. 

 

본 논문의 가장 핵심은 Spatial Pyramid Pooling을 통해서 각기 크기가 다른 CNN 피쳐맵 인풋으로부터 고정된 크기의 feature vector를 뽑아내는 것에 있습니다. 그 이후의 접근 방식은 R-CNN과 거의 동일합니다. 그렇다면 SPP에 대해서 좀 더 자세히 알아보고, Object Detection에서는 어떻게 적용되는 지 알아보겠습니다.

Spatial Pyramid Pooling

 

Spatial Pyramid Pooling Structure

먼저 Conv Layer들을 거쳐거 추출된 피쳐맵을 인풋으로 받습니다. 그리고 이를 미리 정해져 있는 영역으로 나누어 줍니다. 위의 예시에서는 미리 4x4, 2x2, 1x1 세 가지 영역을 제공하며, 각각을 하나의 피라미드라고 부릅니다. 즉, 해당 예시에서는 3개의 피라미드를 설정한 것입니다. 피라미드의 한 칸을 bin 이라고 합니다. 예를 들어 입력이 64 x 64 x 256 크기의 피쳐 맵이 들어온다고 했을 때, 4x4의 피라미드의 bin의 크기는 16x16이 됩니다.

 

이제 각 bin에서 가장 큰 값만 추출하는 max pooling을 수행하고, 그 결과를 쭉 이어붙여 줍니다. 입력 피쳐맵의 체널 크기를 k, bin의 개수를 M이라고 했을 때 SPP의 최종 아웃풋은 kM 차원의 벡터입니다. 위의 예시에서 k = 256, M = (16 + 4 + 1) = 21 이 됩니다. 정리해보면 입력 이미지의 크기와는 상관없이 미리 설정한 bin의 개수와 CNN 체널 값으로 SPP의 출력이 결정되므로, 항상 동일한 크기의 결과를 리턴한다고 볼 수 있습니다. 실제 실험에서 저자들은 1x1, 2x2, 3x3, 6x6 총 4개의 피라미드로 SPP를 적용합니다.

Object Detection에의 적용

SPP in Object Detection

Object Detection에 SPP를 적용할 수 있습니다. 먼저 저자들은 R-CNN의 문제점을 지적하며 SPP를 이용한 더 효율적인 object detection을 제안합니다. R-CNN은 Selective Search로 찾은 2천개의 물체 영역을 모두 고정 크기로 조절한 다음, 미리 학습된 CNN 모델을 통과시켜 feature를 추출합니다. 때문에 속도가 느릴 수 밖에 없습니다.

 

반면 SPPNet은 입력 이미지를 그대로 CNN에 통과시켜 피쳐 맵을 추출한 다음, 그 feature map에서 2천개의 물체 영역을 찾아 SPP를 적용하여 고정된 크기의 feature를 얻어냅니다. 그리고 이를 FC와 SVM Classifier에 통과시킵니다.

 

한계점

SPPNet은 기존 R-CNN이 모든 RoI에 대해서 CNN inference를 한다는 문제점을 획기적으로 개선하였지만 여전히 한계점이 있습니다.

1. end-to-end 방식이 아니라 학습에 여러 단계가 필요하다. (fine-tuning, SVM training, Bounding Box Regression)

2. 여전히 최종 클래시피케이션은 binary SVM, Region Proposal은 Selective Search를 이용한다.

3. fine tuning 시에 SPP를 거치기 이전의 Conv 레이어들을 학습 시키지 못한다. 단지 그 뒤에 Fully Connnected Layer만 학습시킨다.

 

여기서 세 번째 한계점에 대해서 저자들은 "for simplicity"  라고만 설명이 되어 있습니다. 이 뒤에 이어지는 Fast R-CNN 논문에서는 앞서 언급된 SPPNet의 한계점을 대폭 개선한 접근 방법이 소개됩니다.

(이렇게 하나씩 난제들을 풀어나가는 과정들이 너무 멋지고 재밌네요 ㅎㅎ)

마치며

논문에는 구현에 더 필요한 디테일, 이미지 넷, VOC, Caltech 등의 데이터 셋으로 진행한 실험 결과 등이 제시되어 있지만 생략하겠습니다. 이 논문을 기점으로 CNN이 입력 이미지의 크기로부터 자유로워졌다는데 큰 의미가 있는 것 같습니다. 다음 논문으로는 SPPNet의 컨셉을 많이 가져온 Fast R-CNN을 리뷰하도록 하겠습니다.

 

감사합니다.

Reference

[1] He et al, Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition, 2014