2. Deep Networks with Spatial Pyramid Pooling
2.1 Convolutional Layers and Feature Maps
AlexNet과 같은 유명한 seven-layer architecture들을 생각해보면,
처음 5개의 Layer들은 Convolutional Layer이고, 마지막 2개의 Layer들은 Fully-Connected Layer이다.
5개 Convolutional Layer의 일부는 Pooling Layer가 붙어있는데, 이 Pooling Layer까지 모두 'Convolutional' Layer로 간주한다.
앞으로 Convolutional Layer이라 하면, 이는 Pooling Layer까지 포함하는 Layer이라 보면 된다.
2개의 FC Layer들은 Softmax Function을 통해 N개의 Class에 대한 Class Score을 확률 값으로 출력한다.
Fully-Connected Layer와 Classifier(Softmax, SVM)들이 fixed-length vector를 Input으로 요구하는데 비해,
이와 다르게 Convolutional Layer들은 임의의 Input Size를 입력으로 받아도 된다.
즉, Input Image Size가 고정되지 않아도 Sliding Filter(Kernel)을 이용하여 Input Image 비율과 비슷한 Feature Map을 출력한다.
이러한 Feature Map들은 두 가지의 특징을 가진다.
Strength of the responses(Response 강도)와 Spatial Positions(위치 정보) 를 포함한다.
위의 사진은 Conv5인 5번째 Convolutional Layer에서 도출한 Feature Map을 시각화한 것이다.
(a)는 PASCAL VOC 2007 이미지 데이터이고,
(b)는 conv5 계층의 필터를 거친 피처 맵을 나타낸다. 가장 강한 response와 해당 response의 위치를 화살표로 표시했다.
(c)는 가장 강한 response 영역을 이미지에 표시한 그림이다. 초록색 사각형으로 가장 강한 response를 보인 영역에 경계 박스를 표시했다. 이때, (c)는 ImageNet 데이터를 활용한 결과이다. 왼쪽 (c) 그림의 아랫부분은 동그라미 영역을 가장 활성화했으며, 오른쪽 (c) 그림의 윗부분은 ∧모양을 가장 활성화했고, 오른쪽 (c) 그림의 아랫부분은 ∨모양을 가장 활성화했다.
활성화된 영역이 피처 맵에 표시된 것도 (b)에서 볼 수 있다.
즉, 각 Filter가 하나의 Feature Map을 추출하는데, 이때 각 Filter마다 Input Feature Map에서 활성화 하는 부분이 다르다.
그리고 이러한 Convolutional Layer들은 Input Image의 Size와 관계없이 Feature Map을 출력할 수 있다.
2.2 The Spatial Pyramid Pooling Layer
Convolutional Layer들은 Input Size가 arbitrary해도 문제가 없지만, 그에 따른 output도 variable한 size를 갖게 된다.
문제는 Classifier(SVM / Softmax)과 FC Layer들 모두가 fixed-length vector들을 입력으로 요구한다는 점이다.
CNN Feature Extractor를 거쳐 나온 Output Feature Map의 크기가 다 제각각이라면 Classifier와 FC Layer를 적용할 수 없다.
그렇기 때문에 위의 Classifier와 FC Layer에 들어가는 Input Feature Vector의 Size를 Input Image의 Size와 관계없이
일정하게 만들기 위해서 Spatial Pyramid Pooling을 사용한다.
SPP(Spatial Pyramid Pooling)는 local spatial bins(부분 공간 격자)를 이용하여 spatial information(공간 정보)를 추출한다.
이때, local spatial bins(부분 공간 격자)의 크기는 Input image size에 비례하기 때문에
number of bins(격자의 개수)는 Image size에 상관없이 일정하다.
예를 들어, Input Image의 size가 커지면 그에 비례하여 local spatial bins의 크기도 커지니 local spatial bins의 크기는 일정하다.
이와 다르게 Convolutional Layer의 Pooling Layer은 Input Image SIze가 다르면 반환하는 Feature Map의 Size가 다르다.
따라서 arbitrary한 size의 Image들에 대해 fixed-length vector를 출력하기 위해서는
마지막 Pooling Layer(pool5)를 Spatial Pyramid Pooling Layer로 바꿔야 한다.
첫 번째 Spatial Pyramid Pooling Layer(위 그림에서 맨 오른쪽 계층) 에서는 spatial bin의 개수가 1개이다. 즉 1개의 bin이 Image 전체를 커버한다.
가운데 Spatial Pytramid Pooling Layer에는 Spatial bin이 4개 있다.
가장 왼쪽 Spatial Pyramid Pooling 계층에는 Spatial bin이 16개 있다.
이때, 256은 5번째 Convolution Layer의 Filter 개수이자 Output Feature Map의 Channel 개수이며, 이는 SPP Layer에 들어가는 Input Feature Map의 Channel 수이다.
각 Spatial bin마다 response를 Pooling 한다. (SPPnet에서는 Max-Pooling을 사용한다)
이때, Spatial Pyramid Pooling의 결과 vector는 $M \times k$ 크기를 갖는 vector이다.
M은 Spatial bin 개수의 총합이다.
k는 conv5의 Filter 개수이자, Output feature map의 Channel 개수이자, SPP Layer에 Input으로 Input feature map의 Channel 개수이다.
위의 구조를 예를 들면, $M = 16 + 4 + 1 = 21$이고, $k = 256$이다.
따라서, FC Layer의 Input vector size는 $21 \times 256 = 5,376$ 이다.
Input Image size가 어떻게 되든지 간에, $M$과 $k$를 동일한 값으로 설정할 수 있다면 Output Vector의 size는 같다.
즉 Spatial Pyramid Pooling Layer를 이용하여 입력 이미지 크기와 관계없이 FC Layer에 동일한 크기의 Vector를 전달할 수 있다.
Spatial Pyramid Pooling을 이용한다면 Input image size는 다양해도 된다.
즉 가로세로 비율과 이미지 크기 모두 상관없다.
Spatial Pyramid Pooling을 이용하여 k(conv5의 Filter 개수)와 M(Spatial bins의 총 개수)을 동일하게 만들어 원하는 크기의 Vector로 조절 가능하다.
이때 bins(격자)는 촘촘하게 짜도 되고, 넓게 짜도 된다.
만약 spatial bins를 다르게 나누더라도, 총합인 M이 같다면 최종적으로 생성되는 Feature Vector의 크기는 동일하다.
$+\alpha$: How to mix with R-CNN?
R-CNN의 단점
R-CNN은 각 이미지당 생성된 2000개의 RoI에 대해 각각 CNN Feature Extractor를 적용한다. 이는 시간이 오래 걸린다.
SPPnet의 장점
1) SPPnet은 CNN Feature Extractor를 각 이미지에 한 번씩만 적용하여 속도가 빠르다
2) CNN으로 생성된 Feature Map에 Selective Search를 통해 구한 RoI들을 Projection시킨다
3) Output Feature Map에 projection된 RoI의 크기와 상관없이 고정된 크기의 Feature Vector를 만들 수 있다
4) Input Image (RoI Projection)의 scale, size, aspect ratio에 영향을 받지 않는다
SPPnet의 작동방식
1) Selective Search를 이용하여 하나의 이미지당 약 2000개의 Region Proposal(RoI)을 생성한다
2) Image를 CNN에 통과시켜 ouput feature map을 얻는다
3) 각 RoI들을 Output Feature Map에 Projection 시켜 경계가 제한된 Feature Map을 얻는다
4) SPP Layer을 적용하여 얻은 fixed-length Feature Vector를 FC Layer에 Input으로 전달한다
5) Softmax & SVM으로 Classification(Category 분류)을 수행한다
6) Bounding Box Regression으로 Bounding Box의 크기를 조정하고 NMS(Non-maximum Suppression)을 사용하여 최종 bounding box를 선별한다
$+\alpha$: R-CNN vs SPPnet vs Fast R-CNN
Q. R-CNN에서 각 이미지의 RoI들을 모두 $224 \times 224$로 Resizing하는 이유는 Pre-Train된 Feature Extractor를 사용하기 때문이다.
그런데 SPPnet과 Fast R-CNN도 Feature Extractor 부분은 Pre-Train된 CNN을 사용하는데 어떻게 arbitrary한 size를 가진 image를 Input으로 넣을 수 있는가?
A. Pre-Train된 Model이 고정된 크기의 Input을 요구하는 이유는 어떠한 크기의 이미지도 처리할 수 있는 Convolutional Layer가 아닌 Fully-Connected Layer에서 고정된 크기의 입력을 요구하기 때문이다.
즉 임의의 크기를 가진 Image를 Input으로 넣어서 Convolution Layer를 통과한 후에 어떤 방식으로든 고정된 크기의 출력을 만들 수 있다면 (Spatial Pyramid Pooling or RoI Pooling) Pre-Train된 모델의 이러한 제약을 우회할 수 있다.
Convolution Layer: 이 계층들은 입력 이미지의 크기에 관계없이 작동할 수 있다. 여기서 생성된 Feature Map은 입력 이미지의 크기와 비례하여 그 크기가 달라진다.
Fixed-Length Feaure Vector / Matrix: SPP(Spatial Pyramid Pooling) 또는 RoI(Region of Interest) Pooling과 같은 기법을 사용하면, Convolution Layer를 통과한 후의 가변적인 크기의 Feature Map을 fixed-length의 Feature Vector or Feature Matrix로 변환할 수 있다. 이렇게 하면 Fully-Connected Layer에 일관된 형태의 데이터를 제공할 수 있으며, pre-train된 모델의 파라미터를 효율적으로 재사용할 수 있다.
실제 적용 시 고려사항
임의 크기의 입력 이미지를 사용할 수 있는 능력은 큰 장점이지만, 실제로 이를 적용할 때는 몇 가지 추가적인 고려사항이 있다:
성능: 이미지의 크기가 네트워크의 처리 능력에 영향을 줄 수 있다. 매우 큰 이미지는 더 많은 계산을 필요로 하며, 이는 훈련과 추론 시간에 영향을 줄 수 있다.
메모리 사용량: 큰 이미지는 또한 더 많은 메모리를 소비한다. GPU 메모리는 일반적으로 제한적이므로, 이를 효율적으로 관리하는 것이 중요하다.
데이터 전처리 및 확장성: 임의 크기의 입력을 처리할 수 있도록 네트워크를 설계하는 것은 데이터 전처리와 확장성 측면에서 추가적인 고려사항을 필요로 한다. 예를 들어, 네트워크가 다양한 크기의 이미지에 잘 작동하도록 만들려면, 적절한 데이터 확장 기법이 필요할 수 있다.
결론적으로, 고정된 크기의 출력을 만들 수 있다면, 사전 학습된 모델에 임의의 크기의 이미지를 입력으로 사용하는 것이 가능합니다. 그러나 이를 실제로 적용할 때는 성능, 메모리 사용량, 데이터 전처리 등 여러 측면에서 고려해야 할 사항이 있습니다.
Q. SPPnet의 SPP Pooling과 Fast R-CNN의 RoI Pooling의 Output이 어떻게 다른가?
A. SPPnet과 Fast R-CNN의 Pooling Layer 출력 차이
SPPnet은 Spatial Pyramid Pooling을 사용하여 Fixed-Length Feature Vector를 반환한다. SPP Layer는 Convolution Layer을 통과한 Feature Map 적용되어, 여러 크기의 Spatial bin을 사용하여 공간적 계층구조를 구성한다. 이를 통해 얻은 Feature Map들은 Flatten되고 Concatenate되어 고정된 크기의 Feature Vector를 형성한다.
Fast R-CNN은 각 RoI에 대해 RoI Pooling Layer를 사용하여, 해당 RoI에서 추출된 Feature Map을 Fixed Size의 Feature Matrix로 변환한다. 여기서의 'Feature Matrix'이란, 고정된 차원을 가진 2D Feature Map을 의미한다. 이 Feature Matrix는 이후 두 개의 FC Layer를 거친 후 분류 및 바운딩 박스 회귀(bounding box regression) 작업에 사용된다.
결론적으로, SPPnet과 Fast R-CNN 모두 컨볼루션 계층을 통과한 후의 다양한 크기와 비율의 특징 맵을 처리하여 고정된 크기의 출력을 생성할 수 있지만, 이들이 최종적으로 반환하는 출력의 형태는 약간 다르다.