Perception/Object Detection

[Object Detection] SPP(Spatial Pyramid Pooling)Net

고집호랑이 2023. 5. 12. 23:07

이전 포스팅에서 배운 RCNN은 아래와 같은 문제점이 있었습니다.

  • 개별 이미지에서 Region Proposal을 통해 뽑은 2000개의 영역 모두에 대해서 각각 CNN feacture extract을 수행하기 때문에 detect 시간이 굉장히 오래 걸린다.
  • 2000개의 영역을 crop과 warp하는 과정에서 data 손실이 날 수도 있다.

 

이 문제점을 해결하기 위해서는 어떻게 해야 할까요?

 

RCNN 문제점을 해결하기 위해 고안된 방법

 

단순하게 생각했을 때, 추출된 2000개의 영역 모두 CNN feacture extract을 수행하지 않고 먼저 원본 이미지만 CNN을 통과시켜 Feacture Map을 만든 후 2000개의 영역은 feature map에 mapping 시키면 문제점을 해결할 수 있습니다.(image crop & warp도 사라지고 속도도 높일 수 있다.)

 

하지만 위의 방법은 한가지 간과한 것이 있습니다. 바로 Dense Layer(FC Layer)의 입력 사이즈가 무조건 고정되어야 한다는 점입니다. 

 

위의 방법대로 크기와 비율이 다른 2000개의 영역을 feature map에 mapping 시킨다면 Dense Layer의 입력 사이즈도 제각각 다를 것이기 때문에 문제가 생깁니다.

 

이 문제를 해결해주는 것이 바로 SPPNet입니다. SPPNet은 feature map에 표현된 각 영역들의 서로 다른 크기를 동일하게 만들어줌으로써 Dense Layer의 입력 사이즈를 고정되게 만들어줍니다.

 

SPPNet가 문제 해결

 

SPPNet이 대체 뭐길래 이를 가능하게 하는걸까요?

 

SPP는 오래전부터 컴퓨터 비전 영역에서 활용된 SPM(Spatial Pyramid Matching) 기법에 근간을 두고있기 때문에 우선 이 SPM에 대해서 알아야할 필요가 있습니다.

 

SPM(Spatial Pyramid Matching)

Bag-of-Words

Bag of Words(BoW)는 본래 자연어 처리 분야에서 문서를 분류하기 위한 방법 중 하나로, 단순히 단어의 빈도만을 고려해서 이 문서가 어떤 종류의 문서인지 판단하는 방법입니다.

 

이 방법이 Imgae Processing 분야에 들어오면서, 이미지에 있는 feature들을 히스토그램으로 나타내 빈도수가 가장 높은 feature를 보고 object를 판단하도록 사용되었습니다. 

 

BoW

 

가령 위 그림과 같이 사람의 feature 수가 가장 많았다면 사람으로, 자전거의 feature 수가 가장 많았다면 자전거로 판단하는 식입니다.  

 

하지만 이 방식은 이미지가 지닌 feature들의 문맥(위치 정보)이 고려되지 않는다는 문제점이 있습니다.

사람과 강아지사람과 강아지(왼), 바다(오른)

예를 들어 위의 왼쪽 이미지에는 사람과 강아지가 둘 다 있습니다. 그러면 이 이미지에는 강아지의 feature와 사람의 feature가 모두 존재하는데, 강아지의 feature가 사람의 feature보다 더 많기 때문에 사람은 detect하지 못할 수 있습니다.

 

또는 위의 오른쪽 이미지에는 모래의 feature, 바다의 feature, 하늘의 feature 모두 있지만 모래의 feature가 가장 많이 나온다면 모래만 보고 사막으로 판단할 수도 있겠죠. 

 

이런 문제점들을 해결한 방법이 바로 SPM(Spatial Pyramid Matching) 기법입니다.

 

Spatial Pyramid Matching

SPM은 feature들의 위치 정보를 고려하기 위해서 이미지를 미리 정해져 있는 영역으로 나눈 후 각 영역에서 feature들의 빈도를 이용하는 방법입니다. 

 

다음은 어떤 이미지에 나타난 feature의 종류가 , , + 로 3개라고 할 때 SPM이 사용된 그림입니다.

 

SPM

level 0은 전체 이미지에서 각 feature들의 빈도를 나타낸 것으로 Bag of Words 방식이 이에 해당됩니다.

 

SPM은 이에 추가로 전체 이미지를 2 x 2로 분할한 각 영역에서의 feature들의 빈도(level 1)와 전체 이미지를 4 x 4로 분할한 각 영역에서의 feature들의 빈도(level 2)도 함께 사용합니다. (이미지의 영역을 나누는 방식이나 level의 수는 임의로 정하면 된다.)

 

이때 각 level 별 feature들의 히스토그램(빈도)을 벡터로 나타내면 다음과 같습니다. (, , + 의 순서로 나타냈습니다)

  • level 0 - [11], [10], [12] - 원소 개수: 3 x 1 (3개의 feature들이 하나의 원소(빈도)를 가짐)
  • level 1 - [5, 3, 2, 1], [4, 1, 3, 2], [4, 4, 1, 3] - 원소 개수: 3 x 4 (3개의 feature들이 각각 영역별로 1개씩 총 4개의 원소(빈도)를 가짐) 
  • level 2 - [1, 1, 0, 1, ...], [...], [0, 2, 1, 1, ...] - 원소 개수: 3 x 16 (3개의 feature들이 각각 16개의 원소(빈도)를 가짐) 

이 벡터들을 일렬로 이어 붙이면 3 + 12 + 48로 총 63개의 원소로 이루어진 벡터가 만들어집니다.

 

주목해야 할 점은 이미지의 크기에 관계없이 feature의 종류와 이미지의 영역을 나누는 방식이 같다면, SPM을 이용해 만들어낸 벡터의 원소 개수는 항상 동일하다는 점입니다.

 

아래는 8 x 8 크기의 Feature Map에서 SPM을 이용해 만든 벡터의 원소 개수를 나타낸 것인데요, Feature Map의 사이즈가 어떻든 간에 벡터의 원소 개수는 항상 63개가 나오게 됩니다. 

 

SPM으로 이미지를 벡터로 표현

 

즉 이 SPM을 사용한다면 입력 이미지의 사이즈에 관계없이 항상 Dense Layer의 입력 사이즈를 일정하게 만들 수 있겠죠.

 

SPP(Spatial Pyramid Pooling)

SPP는 SPM처럼 각 영역에서 feature들의 빈도를 모두 이용하는 것이 아니라 feature들의 빈도들 중 최댓값만을 이용합니다. 

 

Feature Map에서는 각 영역에서 Max Pooling 적용한 값을 이용한다고 생각하시면 됩니다.

  • Max Pooling: 정해진 영역 안에서 가장 큰 값만 뽑아내는 것

 

feature map에서의 SPP 사용

 

위와 같이 8 x 8 크기의 Feature Map에서 SPP를 적용해 벡터로 표현하면,

  • 원본 이미지에서 Max Pooling을 통해 나온 값 1개 
  • 2 x 2로 분할한 각 영역에서 Max Pooling을 통해 나온 값 4개
  • 4 x 4로 분할한 각 영역에서 Max Pooling을 통해 나온 값 16개

총 21개의 원소를 가진 벡터로 나타낼 수 있습니다. 

 

그리고 이 원소의 개수도 영역을 나누는 방식만 동일하다면 어떤 크기의 Feature Map에 SPP를 적용하더라도 변화가 없겠죠.

 

아래 사진은 Dense Layer(Fully-connected Layer) 이전에 Spatial Pyramid Pooling Layer을 추가한 SPPNet의 구조를 보여주는 그림입니다.

 

SPPNet의 구조

 

위의 예시와 같이 1 x 1, 2 x 2, 4 x 4 세 가지 영역(각 영역 하나하나를 spatial bin이라고 합니다.)을 사용하고 있기 때문에 각각 SPP에 의해서 1, 4, 16개의 원소가 나오는 것을 확인할 수 있습니다. 

 

각각 256이 곱해진 이유는 Convolution Layer을 통과한 Feature Map이 크기가 <? x ? x 256>으로 depth가 256으로 고정되어 있기 때문입니다.

 

최종적으로 벡터의 원소 개수는 (1 x 256) + (4 x 256) + (16 x 256) = 5376개가 되고, 어떤 크기의 이미지가 들어오더라도 Dense Layer의 입력 벡터 크기는 [5376, 1]로 고정되게 됩니다. 

 

이러한 SPP Layer을 사용한다면, Selective Search로 뽑은 2000개의 영역을 feature map에 mapping 시킨 후 SPPNet으로 Dense Layer의 입력 벡터 크기를 고정시키면 아무 오류 없이 R-CNN의 문제점을 해결할 수 있습니다.

 

원래 이미지 한 개에 CNN을 2000번 통과해야 했지만, 이제 이미지 1개에 CNN을 1번 통과해도 되며 이미지의 crop과 warp 과정도 필요 없어졌기 때문이죠. 

 

SPP Layer로 향상시킨 RCNN

 

다음 포스팅에서는 이 SPP Layer와 유사한 ROI Pooling 기법을 사용하는 Fast R-CNN에 대해서 알아보도록 하겠습니다.

 

Reference

 https://www.inflearn.com/course/딥러닝-컴퓨터비전-완벽가이드/dashboard - 인프런 강의

 

https://yeomko.tistory.com/14

 

https://driip.me/5743aed5-c630-4900-b367-9987a088661a