귀퉁이 서재

논문 리뷰 - SPP-net 톺아보기 본문

논문 리뷰

논문 리뷰 - SPP-net 톺아보기

Baek Kyun Shin 2022. 2. 26. 00:22

본 글에서 주요 내용 위주로 SPP-net 논문을 번역/정리했습니다. 글 중간에 <NOTE>로 부연 설명을 달아놓기도 했습니다. 틀린 내용이 있으면 피드백 부탁드립니다.

  • 논문 제목: Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition
  • 저자: Kaiming He, Xiangyu Zhang, Shaoqing Ren, Jian Sun
  • 개정 발표: 2015년 4월 (첫 발표: 2014년 6월)

Abstract

심층 합성곱 신경망(CNN)에는 고정된 크기(ex. 224 x 224)를 갖는 이미지를 입력해야 합니다. 

<NOTE> CNN의 전결합 계층 크기가 일정해서 입력 이미지의 크기도 고정되어야 합니다. 기존 R-CNN에서 warping을 하는 이유이기도 하죠.

다양한 입력 이미지를 일정한 크기로 고정하면 객체 인식 정확도가 떨어지기 쉽습니다. 본 논문에서는 'spatial pyramid pooling'이라는 특별한 풀링 방식을 적용한 네트워크를 소개합니다. SPP-net이라고 부르는 네트워크죠. SPP-net을 활용하면 입력 이미지를 고정할 필요가 없습니다. SPP-net은 입력 이미지 크기에 관계없이 일정한 크기의 출력을 반환하기 때문입니다. 이러한 특징 덕분에 SPP-net은 이미지 분류와 객체 탐지에서 모두 좋은 성능을 보입니다.

특히, 객체 탐지 분야에서 SPP-net의 장점이 두드러집니다. 전체 이미지에서 특성 맵(feature map, 피처 맵)을 구하는 연산을 딱 한 번만 합니다. 이어서 'spatial pyramid pooling' 방식으로 고정된 출력을 반환합니다. 합성곱 연산을 여러 차례 반복하지 않아도 되는 장점이 있죠. SPP-net은 PASCAL VOC 2007에서 R-CNN보다 좀 더 좋은 정확도를 보이고, 속도도 24~102배 빠릅니다. ILSVRC 2014 대회에서, SPP-net이 객체 탐지 분야에서는 2등, 이미지 분류 분야에서는 3등을 차지했습니다.


1. Introduction

컴퓨터 비전 분야는 CNN과 대규모 데이터 덕분에 날이 갈수록 빠르게 발전하고 있습니다. 최근 딥러닝 기반의 접근이 이미지 분류, 객체 탐지에 상당한 기여를 하고 있죠.

하지만 컴퓨터 비전 분야에서 CNN을 활용하는 데 기술적인 문제가 있습니다. 일반적인 CNN은 고정된 크기의 입력 이미지(ex. 224 x 224)를 필요로 한다는 점이죠. 다양한 크기를 갖는 입력 이미지를 일정한 크기로 바꾸려면 cropping이나 warping을 해야 합니다. 다음 그림은 cropping과 warping의 예시입니다.

cropping과 warping 예시

cropping한 이미지는 객체 전체를 포함하지 못할 가능성이 있습니다. warping한 이미지는 가로세로 비율이 달라져, 이미지가 찌그러져 보일 수 있습니다. 객체 일부를 포함하지 않거나 객체의 가로세로 비율이 달라지면 객체 탐지 성능이 떨어질 우려가 있습니다. 입력 이미지 크기를 고정하려니 성능이 떨어진다는 단점이 있군요.

그렇다면 CNN은 왜 고정된 크기의 입력 이미지를 받아야 할까요? CNN은 두 부분으로 이루어져 있습니다. 첫째는 합성곱 계층이고, 둘째는 전결합 계층이죠. 사실, 합성곱 계층은 고정된 크기의 입력 이미지를 받을 필요가 없습니다. 합성곱은 슬라이딩 윈도우 방식으로 작동해서, 입력 이미지 크기에 관계없이 동작하기 때문이죠. 입력 이미지 크기에 관계없이 어떤 크기의 피처 맵이든 만들 수 있습니다. 반면, 전결합 계층은 고정된 크기의 입력 데이터를 받아야 합니다. CNN이 고정된 크기의 입력 이미지를 받아야 하는 이유는 전결합 계층 때문이죠.

본 논문에서는 spatial pyramid pooling(SPP) 방식을 소개합니다. SPP 방식은 'CNN이 고정된 크기의 입력 이미지를 받아야 한다'는 제약조건을 해결해줍니다. 다시 말해, SPP 방식을 적용하면 입력 이미지 크기가 고정될 필요가 없습니다. 마지막 합성곱 계층 다음에 SPP 계층을 두고, 이어서 전결합 계층을 거치는 방식이죠. 곧, SPP 계층을 합성곱 계층과 전결합 계층 사이에 두는 겁니다. 그러면 SPP 계층을 고정된 크기의 결과 값을 내어줍니다. SPP 계층이 결과 값 크기를 고정해주니, 입력 이미지를 따로 cropping, warping을 할 필요가 없죠. 다음 그림은 기존 객체 탐지(R-CNN) 구조와 SPP 방식을 적용한 구조의 차이를 나타냅니다. SPP 방식을 적용한 네트워크를 SPP-net이라고 부릅니다.

R-CNN 구조와 SPP 구조의 차이

<NOTE> 기존 R-CNN은 입력 이미지(정확히는 입력 이미지에서 구한 2,000개의 후보 영역)를 처음부터 cropping/warping하고, 이어서 합성곱 계층과 전결합 계층을 거쳐 최종 출력값을 도출했습니다. 반면 SPP-net은 입력 이미지를 바로 합성곱 계층에 전달하고, 합성곱 계층이 출력한 특성 맵(피처 맵)에서 spatial pyramid pooling을 하고, 전결합 계층을 거쳐 최종 출력값을 반환합니다.

spatial pyramid pooling은 컴퓨터 비전 분야에서 상당히 유용한 기법이었습니다. 이미지를 여러 영역으로 나눈 뒤, 각 영역별 특성을 파악하는 방식이죠. 다음 그림과 같이 말이죠.

이미지를 여러 영역으로 나눈 뒤, 각 영역별 특성을 파악하는 SPP 방식

spatial pyramid pooling 기법은 CNN이 유행하기 전까지 이미지 분류나 객체 탐지에서 우수한 성능을 보였죠. 그런데도 지금까지(논문이 발표된 2014년 기준) CNN과 spatial pyramid pooling를 결합하려는 시도는 없었습니다. 연구진은 SPP를 CNN에 적용할 때 눈에 띌 만한 특징이 있다는 사실을 발견합니다. 1) SPP는 입력 이미지 크기에 관계없이 고정된 크기의 결과를 출력합니다(기존 CNN은 입력 이미지 크기가 달라지면 결괏값의 크기도 달라집니다). 2) SPP는 multi-level spatial bins를 사용합니다(기존 CNN은 단 하나의 윈도우만 사용합니다). 3) SPP는 다양한 스케일의 피처를 풀링할 수 있습니다. 이러한 세 가지 특징 덕분에 객체 탐지 정확도가 높아집니다.

SPP-net은 다양한 크기의 입력 이미지로 훈련할 수 있고, 테스트 단계에서도 여러 이미지를 입력받아 고정된 크기의 피처를 출력할 수 있습니다. 다양한 크기를 갖는 입력 이미지를 받아 훈련하면, 이미지를 cropping하거나 warping하지 않기 때문에, 모델이 이미지 크기에 강건해지고 과대적합도 방지하게 됩니다.

SPP의 장점은 CNN 구조에 관계없이 잘 동작한다는 점입니다. ImageNet 2012 데이터셋으로 실험한 결과, 이미 학계에 존재하는 네 가지 CNN 모델에 SPP을 적용하니 성능이 올랐습니다. 네 가지 CNN 모델은 필터 개수, 크기, 스트라이드, 깊이 등이 서로 다릅니다. 더 복잡한 구조를 갖는 모델에서도 SPP는 성능을 끌어올릴 것으로 추측해볼 수 있습니다. SPP-net은 Caltech101과 PASCAL VOC 2007에서 우수한 분류 성능을 보였습니다. 하나의 전체 이미지(single full-image)만 활용하고, 파인튜닝을 하지 않아도요. 게다가 SPP-net은 객체 탐지 분야에서도 좋은 성능을 냈습니다. 지금까지 좋은 성능을 보인 R-CNN은 CNN으로 후보 영역 경계 박스를 추출했습니다. 이 방식은 PASCAL VOC와 ImageNet에서 우수한 객체 탐지 성능을 보였죠. 하지만 피처를 계산하는 데 시간이 너무 오래 걸립니다. warping된 2,000개의 후보 영역 경계 박스마다 반복해서 CNN을 적용하기 때문이죠. R-CNN의 치명적인 단점입니다. 본 논문에서는, 전체 이미지에 (후보 영역 개수에 관계없이) 합성곱을 딱 한 번만 적용하고, 합성곱 연산으로 만든 피처 맵에 SPP를 적용해 고정된 크기의 피처를 추출하는 방식을 소개합니다. 그러면 R-CNN에 비해 속도가 100배나 빨라집니다. 

SPP 방식은 이미 잘 알려졌지만, 본 논문은 CNN과 SPP를 결합하는 방식을 새롭게 소개한 것입니다. 성능과 속도 모두를 좋게 만들기 위해서죠. R-CNN 파이프라인에 SPP 방식을 적용한 시스템은 R-CNN에 비해 24~102배 빠르며 정확도는 조금 더 좋아졌습니다. 한 이미지를 처리하는 데 0.5초가 걸리지요. 실제 서비스에서 사용할 만한 수준의 처리 속도입니다.

ILSVRC 2014 대회에서 SPP-net은 객체 탐지 분야에서 2등, 이미지 분류 분야에서 3등을 기록했습니다.


2. Deep Networks With Spatial Pyramid Pooling

2.1 Convolutional Layers and Feature Maps

7개 계층을 갖는 기존 CNN 구조를 생각해봅시다. 첫 다섯 개 계층은 합성곱 계층입니다. 그중 일부는 풀링 계층이 붙어있죠. 이 풀링 계층까지도 합성곱 계층으로 간주합니다.

<NOTE> 앞으로 합성곱 계층이라고 하면 풀링 계층까지 포함하는 계층이라고 생각하시면 됩니다.

반면 마지막에 등장하는 두 계층은 전결합 계층입니다. 전결합 계층은 소프트맥스 함수를 통해 N개의 클래스 결과값을 출력합니다. N은 클래스(레이블, 카테고리) 개수를 뜻하죠. 이러한 딥러닝 구조는 고정된 크기를 갖는 입력 이미지를 필요로 합니다. 전결합 계층이 고정된 크기의 입력값을 필요로 하기 때문이죠. 반면, 합성곱 계층은 어떤 크기의 입력 이미지를 받아도 됩니다. 곧, 입력 이미지 크기가 고정되지 않아도 된다는 말이죠. 합성곱 계층은 슬라이딩 필터를 사용해서 입력 이미지 비율과 비슷한 결괏값을 냅니다. 이 결괏값을 피처 맵(feature map)이라고 부릅니다. 피처 맵은 response 강도와 위치 정보를 포함합니다. 피처 맵을 시각화 하면 다음 그림과 같습니다.

피처 맵 시각화

conv5(다섯 번째 합성곱/풀링 계층) 계층의 필터가 도출한 피처 맵을 시각화했습니다. (a)는 PASCAL VOC 2007 이미지 데이터입니다. (b)는 conv5 계층의 필터를 거친 피처 맵을 나타냅니다. 가장 강한 response와 해당 response의 위치를 화살표로 표시했습니다. (c)는 가장 강한 response 영역을 이미지에 표시한 그림입니다. 초록색 사각형으로 가장 강한 response를 보인 영역에 경계 박스를 표시했죠. 참고로, (c)는 ImageNet 데이터를 활용한 결과입니다. 왼쪽 (c) 그림의 아랫부분은 동그라미 영역을 가장 활성화했네요. 오른쪽 (c) 그림의 윗부분은 ∧모양을 가장 활성화했고, 오른쪽 (c) 그림의 아랫부분은 ∨모양을 가장 활성화했습니다. 활성화된 영역이 피처 맵에 표시된 것도 (b)에서 볼 수 있죠. 합성곱 필터는 입력 이미지의 크기에 관계없이 피처 맵을 출력합니다. 

2.2 The Spatial Pyramid Pooling Layer

합성곱 계층은 이미지 크기에 관계없이 입력을 받지만, 출력하는 피처 맵 크기도 다양하게 할 수 있습니다. 반면, SVM이나 소프트맥스 같은 분류기 또는 전결합 계층은 고정된 크기의 입력 벡터가 필요합니다. Spatial pyramid pooling 방식이 고정된 크기의 벡터를 만듭니다. Spatial pyramid pooling 방식은 local spatial bins(부분 공간 격자)를 통해 공간 정보(spatial informataion)를 추출합니다. local spatial bins의 크기는 입력 이미지 크기에 비례합니다. 그렇기 때문에 local spatial bins의 개수는 입력 이미지 크기에 관계없이 일정합니다. 입력 이미지 크기가 크면 그만큼 local spatial bins 크기도 커지니, local spatial bins 개수는 일정한 거죠. 반면, 합성곱 계층의 필터(슬라이딩 윈도우 방식의 필터)는 이미지 크기에 따라 필터 개수도 달라집니다.

<NOTE> 자, 정리해볼까요? 합성곱 계층의 필터는 슬라이딩 윈도우 방식으로 작동한다고 했죠. 슬라이딩 윈도우 개수는 입력 이미지 크기에 따라 달라집니다. 그래서 합성곱 계층의 결괏값 크기는 입력 이미지 크기에 비례합니다. 반면, Spatial pyramid pooling 방식은 local spatial bins를 활용해 결괏값을 내는데, local spatial bins 개수는 입력 이미지 크기에 따라 변하지 않습니다. 따라서 Spatial pyramid pooling의 결괏값 크기는 입력 이미지 크기에 관계없이 일정합니다.

다양한 크기의 입력 이미지에 대응하기 위한 딥러닝 네트워크를 만들려면, 마지막 합성곱 풀링 계층(pool5)을 spatial pyramid pooling 계층으로 바꿔야 합니다. 다음 그림은 spatial pyramid pooling 계층을 적용한 네트워크 구조입니다.

spatial pyramid pooling 계층을 적용한 네트워크 구조

첫 번째 spatial pyramid pooling 계층(위 그림에서 맨 오른쪽 계층)은 bin을 한 개만 갖습니다. 한 개의 bin이 이미지 전체를 커버하죠. 가운데 spatial pyramid pooling 계층엔 bin이 4개 있네요. 오른쪽 spatial pyramid pooling 계층엔 16개가 있고요. 참고로, 256은 conv5 계층의 필터 개수입니다(conv5는 마지막 합성곱 계층).

각 spatial bin(공간 격자)마다 response를 풀링합니다(SPP-net에서는 최대 풀링을 사용함). spatial pyramid pooing 결괏값은 (k x M) 크기를 갖는 벡터입니다. M은 spatial bins의 개수이고, k는 마지막 합성곱 계층의 필터 개수입니다. 위 구조를 예로 들면, M = (16+4+1) = 21이고, k = 256입니다. 따라서 전결합 계층의 입력값 크기는 21 x 256 = 5,376이 됩니다. 입력 이미지 크기가 어떻든 spatial bins 개수가 같다면, spatial pyramid pooling 계층을 거친 데이터 개수는 5,376개입니다. 입력 이미지 크기에 관계없이 전결합 계층에 동일한 크기의 벡터를 전달할 수 있는 것이죠. 크기가 일정한 벡터는 전결합 계층의 입력값이 될 수 있다고 했습니다. spatial pyramid pooing 덕분에 입력 이미지 크기가 다양해도 됩니다. 가로세로 비율과 이미지 크기 모두 다양해도 괜찮습니다. spatial pyramid pooing을 거치면 이미지를 원하는 크기로 조정할 수 있기 때문이죠. 참고로, bins(격자)는 촘촘하게 짜도 되고, 넓게 짜도 됩니다. 넓은 격자부터 촘촘한 격자까지 단계별로 설정할 수 있습니다. 위 그림에서는 세 단계(1x1, 2x2, 4x4)로 격자를 짰습니다.

2.3 Training the Network

이론적으로 위 네트워크 구조는 입력 이미지 크기에 관계없이 전통적인 역전파로 학습할 수 있습니다. 그렇지만 실제 GPU 환경에서는 가급적 입력 이미지 크기를 고정하는 게 좋습니다. spatial pyramid pooling 기법을 적용하면서도 GPU의 장점을 살리도록 훈련하는 방법을 설명하겠습니다.

Single-size training

<NOTE> single-size 훈련이란 한 가지 크기의 이미지로만 훈련하는 방식을 뜻합니다.

R-CNN에서는 이미지를 cropping하거나 warping해서 일정한 크기(ex. 224 x 224)로 만들었습니다. cropping, warping은 데이터 증강 기법(data augmentation)이죠. 만약 입력 이미지 크기가 일정하면, spatial pyramid pooling에서 사용할 격자(bin) 크기를 미리 계산할 수 있습니다. conv5를 거친 피처 맵 크기가 (13 x 13)이라고 합시다. spatial bin 크기를 (2 x 2)로 만들고 싶을 때, 윈도우 크기와 스트라이드 크기는 각각 7과 6으로 설정하면 됩니다. 다음 그림을 보시죠.

(2 x 2) sptial bin을 만들기 위한 풀링 윈도우 크기와 스트라이드 크기 예시

공식으로 만들면 이렇습니다. conv5를 거친 피처 맵 크기가 (a x a)이고, 만들고자하는 spatial bin 크기가 (n x n) 일 때, 윈도우 크기와 스트라이드 크기는 다음과 같이 구할 수 있습니다.

  • 윈도우 크기 = ceiling(a / n) = (a / n)을 올림한 값
  • 스트라이드 크기 = floor(a / n) = (a / n)을 내림한 값

이 공식을 활용해서 피라미드 단계별(spatial bin 크기별) 윈도우 크기와 스트라이드를 구해보죠. 3단계 피라미드인 경우의 예시입니다. 결과는 다음과 같습니다(sizeX = 풀링 윈도우 크기 / stride = 스트라이드).

첫 번째 열을 예로 들면, bins 크기가 (3 x 3)이 되려면 풀링 윈도우 (5 x 5), 스트라이드 (4 x 4)가 되어야 한다는 말입니다. 두 번째 열은 bins 크기가 (2 x 2)가 되려면 풀링 윈도우 (7 x 7), 스트라이드 (6 x 6)이 되어야 한다는 말입니다. 앞서 예시에서 살펴본 바와 같습니다. single-size training의 목적은 multi-level pooling을 하기 위해서입니다. 

Multi-size training

<NOTE> single-size 훈련이란 한 가지 크기의 이미지로만 훈련하는 방식을 뜻한다고 했습니다. 반면, multi-size 훈련은 여러 크기의 이미지로 훈련하는 방식을 의미합니다.

SPP-net은 크기에 관계없이 이미지를 입력받을 수 있습니다. 훈련 단계에서 이미지 크기가 다양해지는 문제를 다루기 위해, 몇 가지 크기를 미리 정해봤습니다. 두 가지 크기, (180 x 180)과 (224 x 224)를 생각해봤습니다. (224 x 224) 영역을 cropping하는 대신, 이미지 해상도를 조정해 (180 x 180)으로 맞췄습니다. 두 영역의 크기가 모두 (180 x 180)로 같아졌습니다. 오직 해상도만 다를 뿐이죠. (180 x 180) 크기를 사용하든 (224 x 224)를 사용하든 spatial pyramid pooling 계층을 거친 결괏값 크기는 같습니다. 

Multi-size training 방법은 이렇습니다. 먼저 (180 x 180) 네트워크를 전체 에폭만큼 훈련합니다. 이어서 (224 x 224) 네트워크를 전체 에폭만큼 훈련합니다. 이렇게 반복합니다. Multi-size training을 반복하면 Single-size training과 비슷해진다고 합니다. Multi-size training의 목적은 다양한 크기의 입력 이미지로 실험해보기 위함입니다. single-size training이나 multi-size training 모두 오로지 '훈련'을 위한 방법입니다. 이렇게 훈련하면 테스트 단계에서는 다양한 크기의 이미지로 SPP-net을 적용할 수 있습니다.


3. SPP-Net for Image Classification

3.1 Experiments on ImageNet 2012 Classification

연구진은 1,000개의 클래스를 갖는 ImageNet 2012 데이터셋으로 SPP-net을 훈련했습니다. 먼저, min(너비, 높이)=256이 되게 이미지 크기를 조정하고, 이미지의 중앙 부분과 네 모서리 부분 중 하나를 (224 x 224) 크기로 cropping해서 뽑습니다. 이어서 수평 대칭(horizontal flipping)과 색상 변경(color altering)을 통해 데이터 증강(data augmentation)을 합니다. 마지막 두 전결합 계층에는 드롭아웃(dropout)을 적용합니다. 학습률은 0.01로 설정하되, 중간에 오류값이 정체되면 10으로 두 번 나눕니다. 즉, 학습률 0.01로 훈련하다가 오류값이 정체되면 0.001로 바꾸고 훈련합니다. 다시 오류값이 정체되면 0.0001로 바꿉니다. 전체 네트워크를 GeForce GTX Titan GPU(6GB 메모리)로 훈련하려면 2~4주가 걸립니다.

3.1.1. Baseline Network Architectures

SPP의 장점은 합성곱 네트워크 구조에 관계없이 사용할 수 있다는 점입니다. 연구진은 서로 다른 네 가지 베이스라인 네트워크 구조를 활용해 실험해봤습니다. 모든 네트워크에 SPP를 적용하니 정확도가 높아졌습니다. 네 가지 네트워크 구조는 다음과 같습니다.

네 가지 베이스라인 네트워크 구조

표에 써있는 정보는 이런 뜻입니다.

  • 필터 개수 x 필터 크기 (ex. 96 x 7²), 필터 스트라이드 (ex. str 2), 풀링 윈도우 크기 (ex. pool 3²), 피처 맵 결과 크기 (ex. map size 55 x 55)
  • LRN = Local Response Normalization
  • 계획한 피처 맵 크기로 맞추기 위해 패딩을 조정함

각 네트워크를 간단히 소개해보겠습니다.

  • ZF-5: Zeiler and Fergus(ZF) 'fast' 모델. 숫자는 합성곱 계층 개수를 뜻함. 즉, 합성곱 계층이 다섯 개 있다는 의미.
  • Convnet*-5: Krizhevsky의 네트워크를 조금 변형한 모델. conv1과 conv2 대신 conv2와 conv3 다음에 풀링 계층을 둠. 변형 결과, 각 계층별 피처 맵 크기는 ZF-5와 같음.
  • Overfeat-5/7: Overfeat을 조금 변형한 모델. ZF-5/Convnet*-5와 다르게, 이 네트워크는 마지막 풀링 계층 전에 더 큰 피처 맵을 도출함(13 x 13 대신 18 x 18).  conv3과 그 이후 합성곱 계층에서 더 큰 필터 크기(512)를 사용함. 합성곱 계층 7개를 갖는 Overfeat-7은 conv3부터 conv7까지 같은 구조를 가짐.

베이스라인 모델에서 마지막 합성곱 계층 다음의 풀링 계층은 (6 x 6) 크기의 피처 맵을 생성합니다. 이어서 두 개의 전결합 계층과 소프트맥스 계층이 있습니다. SPP를 사용하지 않은 베이스라인 모델의 오류율이 다음 표의 (a)에 표기돼 있습니다. ZF-5는 70에폭으로, 나머지는 90에폭으로 훈련했습니다. 

ImageNet 2012의 검증 데이터셋 오류율(괄호 안 값은 SPP를 사용하지 않은 베이스라인 모델 대비 오류 차이)

3.1.2 Multi-level Pooling Improves Accuracy

위 표의 (b)는 single-size 훈련 결과입니다. 이때 훈련, 테스트 이미지 크기는 모두 (224 x 224)입니다. 이 네트워크의 합성곱 계층은 3.1.1의 베이스라인 모델과 같습니다. 다만, 마지막 합성곱 계층 다음의 풀링 계층을 SPP 계층으로 바꿨습니다. 4단계 피라미드(4-level pyramid) 구조를 사용하는데, 피라미드는 {6x6, 3x3, 2x2, 1x1}입니다(총 50개의 격자(bins)). 공정한 비교를 위해 standard 10-view 예측을 사용합니다. 각 view는 (224 x 224)로 cropping되죠. 

<NOTE> standard 10-view란 10개의 cropping 이미지를 사용한다는 뜻입니다. 단, cropping하는 영역은 이미지의 가운데(1개)와 네 모서리 영역(4개), 그리고 좌우 대칭한 이미지의 가운데(1개)와 네 모서리 영역(4개)으로 총 10개입니다.

위 표의 (b) 결과를 보면 SPP 계층을 사용하지 않은 결과인 (a)보다 성능이 꽤 좋아진 걸 볼 수 있습니다. 흥미로운 점은 top-1 오류율 감소량은 (가장 성능이 좋은 모델인) Overfeat-7가 1.65로 가장 크다는 사실입니다. multi-level pooling 덕분에 성능이 크게 오른 겁니다.

multi-level pooling이 도움되는 까닭은 단지 파라미터가 더 많아졌기 때문만이 아니라, multi-level pooling이 객체 크기 변형에 강건하기 때문입니다. 이를 증명하기 위해 ZF-5 네트워크에 다른 4단계 피라미드(4-level pyramid)를 적용해봤습니다. 이때 사용한 피라미드는 {4x4, 3x3, 2x2, 1x1}(총 30개의 격자(bins))입니다. 이 네트워크는 SPP를 사용하지 않은 베이스라인 모델보다 파라미터가 적습니다. 그런데도 SPP를 사용하지 않은 베이스라인 모델보다 성능이 좋습니다.

3.1.3 Multi-size Training Improves Accuracy

위 표의 (c)는 multi-size 훈련의 결괏값입니다. 훈련 이미지 크기는 (224 x 224)와 (180 x 180)이며, 테스트 이미지 크기는 (224 x 224)입니다. 역시나 standard 10-view를 사용했습니다. 그 결과, top-1/top-5 오류율은 더 떨어졌네요. SPP-net(Overfeat-7)의 top-1 오류율은 29.68%로 SPP를 사용하지 않은 베이스라인 모델에 비해 2.33% 떨어졌습니다. single-size 훈련한 모델보다는 0.68% 떨어졌고요.

훈련할 때 (180 x 180)과 (224 x 224) 크기의 이미지를 고정적으로 사용하지 않고, [180, 224]에서 임의로 샘플링해 크기를 정한 뒤 훈련해봤습니다. 그 결과 SPP-net(Overfeat-7)의 top-1/top-5 오류율은 30.06%, 10.96%가 됐습니다. 이미지 크기를 고정해서 훈련할 때보다 성능이 조금 안 좋지만, 여전히 single-size 훈련 모델보다는 좋습니다. 이미지 크기를 고정해서 훈련할 때보다 성능이 조금 안 좋은 이유는 (224 x 224) 크기에 대한 훈련이 적게 이루어지기 때문입니다. 테스트 이미지 크기가 (224 x 224)이기 때문에 훈련할 때도 (224 x 224) 크기의 이미지가 적당히 있어야 성능이 좋아집니다.

3.1.4 Full-image Representations Improve Accuracy

이번에는 전체 이미지를 활용해 성능을 측정해봅니다. 가로세로 비율을 유지하면서 min(너비, 높이)=256이 되게 이미지 크기를 조정합니다. 여기에 SPP-net을 적용했죠. 공정한 비교를 위해 (224 x 224) 크기로만 crop한 이미지로도 성능을 측정했습니다. 아래 표는 (224 x 224) 크기로만 crop한 이미지(1 crop)와 전체 이미지(1 full)를 사용해 각각 테스트해본 결과입니다. 오류율을 비교한 표입니다.

(224 x 224) crop 이미지와 전체 이미지의 오류율 비교

보다시피 모든 경우에, 전체 이미지(full-view)를 사용해 테스트하니 오류율이 더 낮아졌습니다. 전체 이미지의 내용(content)를 살리는 게 중요하다는 점을 보여줍니다. 비록 SPP 네트워크가 정사각형 이미지로 훈련이 되었지만, 가로세로 비율이 다른 이미지에서도 좋은 성능을 내는 걸 알 수 있네요.

<NOTE> crop한 이미지는 정사각형이지만, 전체 이미지는 반드시 정사각형인 건 아닙니다. 그런데도 전체 이미지를 사용할 때 성능이 더 좋은 걸 봐서는 정사각형 이미지로 훈련했어도, 정사각형이 아닌 이미지도 잘 예측한다는 사실을 알 수 있죠. 일반화 성능이 좋은 겁니다.

3.1.5 Multi-view Testing on Feature Maps

본 객체 탐지 알고리즘에 영감을 받아, 연구진은 피처 맵에 더 많은 multi-view를 적용하기로 했습니다. SPP-net의 유연성 덕분에 다양한 크기의 윈도우(view)에서 피처를 쉽게 추출할 수 있습니다. 이 윈도우는 마지막 피처 맵에서 나온 것이고요.

테스트 단계에서 이미지 크기가 min(너비, 높이)=s가 되게 조정합니다. 여기서 s는 사전에 정의한 스케일, 가령 256입니다. 이어서 전체 이미지에서 합성곱 피처 맵을 구합니다. 좌우 대칭된 윈도우(view)를 사용하기 위해, 좌우 대칭된 이미지에서도 피처 맵을 구합니다. 다음 그림은 피처 맵의 윈도우에서 SPP 풀링을 하는 예시입니다.

피처 맵의 임의의 윈도우에서 추출한 SPP 풀링 피처

전체 이미지에서 피처 맵을 구했습니다. 이 피처 맵에서 임의의 윈도우를 정하고, 그 윈도우에 SPP를 적용해 고정된 크기의 피처를 구합니다. 이렇게 구한 피처는 전결합 계층의 입력 값이 됩니다. 전결합 계층을 거친 뒤 최종적으로 소프트맥스 점수를 구할 수 있죠. 이 점수가 바로 해당 윈도우에 대한 점수입니다. 최종 예측을 할 땐, 모든 윈도우의 소프트맥스 점수를 평균을 취합니다. standard 10-view를 위해, s=256, 윈도우 크기(view 크기)는 이미지 중앙과 네 코너에서 (224 x 224)로 정합니다. 네 모서리 부분의 윈도우, 가운데 윈도우로 총 5가지 view가 정해집니다. 좌우 대칭한 이미지에서도 마찬가지로 네 모서리 부분의 윈도우, 가운데 윈도우로 총 5가지 view가 정해지죠. 이렇게 총 10가지 view를 정한 겁니다. 실험 결과 10-view의 top-5 오류율은 crop한 이미지의 10-view 오류율과 0.1% 이내의 차이를 보였습니다.

더 나아가, multiple-scale에서 구한 multiple-view로도 실험해봤습니다. 이미지를 여섯 가지 스케일로 조정했는데, s ∈ {224, 256, 300, 360, 448, 560}입니다. 각 스케일마다 전체 이미지에서 피처 맵을 구했죠. 윈도우 크기는 (224 x 224)로 했습니다. 이미지 전체 크기는 다른데, 윈도우 크기는 고정이기 때문에, 윈도우의 상대적인 크기는 다른 셈이죠. 각 스케일마다 18개 윈도우를 사용했습니다. 이미지 중앙(1개), 각 모서리 부분(총 4개), 위쪽 중앙(1개), 왼쪽 중앙(1개), 오른쪽 중앙(1개), 아래쪽 중앙(1개)으로 총 9개죠. 그런데 좌우 대칭한 이미지에도 똑같이 윈도우를 추출하니 총 18개되는 것입니다. 단, s=224일 땐 6개 윈도우만 사용합니다.

<NOTE> s=224일 땐 6개 윈도우만 사용하는 까닭은 윈도우 크기도 (224 x 224)이기 때문일 겁니다. 전체 이미지와 윈도우 크기가 크게 다르지 않아 윈도우 18개를 추출하기가 어렵기 때문이죠.

총 윈도우 개수는 18*5 + 6= 96개입니다. 96개 view(윈도우)를 사용하니, 곧 multiple-view를 적용하니 top-5 오류율은 10.95%에서 9.36%로 줄었습니다. 두 가지 full-image view (with flipping)을 결합하니 top-5 오류율이 9.14%까지 줄었습니다.

3.1.6 Summary and Results for ILSVRC 2014

아래 표는 최신 네트워크와 SPP-net의 성능을 비교한 결과입니다. 

ILSVRC 2014 이미지 분류 결과 비교

Krizhevsky et al. 모델은 ILSVRC 2012에서 우승했습니다. Overfeat과 Howard, Zeiler & Fergus 모델은 ILSVRC 2013에서 우수했던 모델입니다. 지금까지 우수했던 모델과 SPP-net을 비교하니, SPP-net의 성능이 더 좋은 걸 볼 수 있습니다. 10-views보다는 3.1.5절에서 설명한 96 views + 2 full-image view 결합 모델의 성능이 더 좋네요.

ILSVRC 2014 이미지 분류 대회에서 SPP-net은 3등을 기록했습니다. 1등, 2등은 그 유명한 GoogLeNet과 VGG입니다.

ILSVRC 2014 분류 대회 결과

3.2 Experiments on VOC 2007 Classification

SPP-net을 VOC 2007 이미지 분류 데이터셋에도 적용해봤습니다. Pascal VOC 2007은 9,963개 이미지를 갖습니다. 20개 클래스(레이블)가 있죠. 훈련 데이터는 5,011개, 테스트 데이터는 4,952개입니다. 아래 표는 Pascal VOC 2007 데이터셋에서 측정한 SPP-net의 mAP 결과입니다.

Pascal VOC 2007 데이터셋에서 측정한 SPP-net의 mAP

(a)는 베이스라인 모델입니다. SPP 없이 ZF-5로만 테스트했을 때, 최고 mAP는 75.90이죠. 이땐 이미지를 (224 x 224) 크기로 crop했습니다. conv4 → conv5 → pool5/7 → fc6/8 → fc7/9로 갈수록 mAP가 높아지네요. 네트워크가 깊어질수록 성능이 좋아진다는 뜻입니다. (b)는 (a) 모델에 SPP를 적용한 결과입니다. 여전히 (224 x 224)로 crop한 이미지를 사용했죠. SPP를 적용하니 mAP가 높아졌습니다. 

(c)는 crop한 이미지가 아니라 전체 이미지를 사용한 결과를 보여줍니다. min(너비, 높이)=224가 되게 이미지 크기를 조정할 뿐입니다. mAP가 76.45에서 78.39로 크게 향상됐습니다. 전체 이미지를 사용하니 이미지 전체 내용을 유지할 수 있기 때문입니다. min(너비, 높이)=s가 되게 이미지 크기를 조정하며 테스트해본 결과 s=392일 때 성능이 가장 좋았다고 합니다. 그 이유는 ImageNet에서는 객체가 상대적으로 큰 영역을 차지하는데, Pascal VOC 2007에서는 작은 영역을 차지하기 때문입니다. 그래서 ImageNet의 객체 크기만큼 키우려면 min(너비, 높이)=224보다 min(너비, 높이)=392가 되게 키운 것이죠. 결과적으로 객체의 크기(scale)가 분류 성능에 영향을 준다는 점을 알 수 있습니다. SPP-net은 객체 크기에 영향을 받네요.

(e)는 네트워크 구조를 Overfeat-7으로 바꾼 결과입니다. Overfeat-7은 ZF-5보다 성능이 좋은 네트워크 구조입니다. 기본 네트워크 구조의 성능이 좋으면 전체 SPP-net의 성능도 좋아집니다. 최종적으로 mAP는 82.44까지 높아졌습니다. 

<NOTE> 정리하면, 계층 깊이가 깊을수록, SPP-net을 적용할수록, crop한 이미지보다 전체 이미지를 사용할수록, min(너비, 높이)=392가 되게 전체 이미지 크기를 조절할수록, 뼈대가 되는 베이스라인 모델이 좋을수록 전체 성능도 좋아집니다.

4. SPP-Net For Object Detection

최근 객체 탐지에 딥러닝 구조를 활용해왔습니다. 그 가운데 하나인 R-CNN을 간단히 리뷰해보겠습니다. R-CNN은 선택적 탐색(selective search)을 통해 이미지 한 개마다 2,000개의 후보 영역 윈도우를 추출합니다. 이어서 후보 영역 윈도우를 (227 x 227) 크기로 warping합니다. 사전 훈련된 딥러닝 네트워크는 각 윈도우에서 피처를 뽑아냅니다. 이 피처들을 SVM 분류기의 입력값으로 사용하죠. SVM은 이 피처들을 활용해 객체 탐지를 수행하고요. R-CNN은 기존 알고리즘보다 성능이 우수했습니다. 하지만 2,000개 윈도우마다 딥러닝 네트워크를 적용해야 하니 시간이 오래 걸렸죠. 각 윈도우에서 딥러닝으로 피처를 뽑아내는 부분이 병목 구간입니다. 시간 소모가 많다는 것이죠.

<NOTE> R-CNN에 관한 자세한 설명은 논문 리뷰 - R-CNN 톺아보기를 참고해주세요.

SPP-net도 객체 탐지를 할 수 있습니다. 다만, SPP-net은 전체 이미지에서 피처 맵을 한 번만 추출합니다. 피처 맵의 각 윈도우에서 spatial pyramid pooling을 적용합니다. 그러면 해당 윈도우에서 고정된 크기의 피처 벡터를 구할 수 있습니다. 이 피처 벡터는 전결합 계층의 입력값이 되고요. 이렇듯 SPP-net은 시간이 오래 걸리는 합성곱 네트워크를 딱 한 번만 하므로 R-CNN에 비해 상당히 빠릅니다.

4.1 Detection Algorithm

전체 이미지에서 합성곱 계층을 거쳐 피처 맵을 구하고, 피처 맵에서 윈도우를 추출한 뒤, 윈도우에서 spatial pyramid pooling을 적용하는 알고리즘은 이미지 분류와 비슷합니다. 최종 피처 벡터는 전결합 계층으로 입력되고요. SVM이 최종 클래스를 분류합니다.

더불어, positive 샘플을 생성하기 위해 실제 윈도우(ground-truth windows)를 사용합니다. positive 윈도우와 겹치는 부분이 30% 이하면 negative 샘플로 간주합니다. IoU로 계산하죠. negative 샘플이 다른 negative 샘플과 70% 이상 겹치면 제거합니다. SVM을 훈련하기 위해 standard hard negative sampling을 적용합니다. 이런 일련의 과정은 한 번만 합니다. 여러 차례 반복하지 않습니다. 따라서 SVM이 20개 클래스를 훈련하는 데 1시간이 채 걸리지 않습니다. 테스트 단계에서는, 후보 영역 윈도우의 점수를 매기는 데 SVM을 활용합니다. 점수화된 윈도우에 비최댓값 억제(non-maximum suppression)도 적용하고요(임계값 30%). 

SPP-net은 multi-scale feature extraction을 적용하면 성능을 더 끌어올릴 수 있습니다. multi-scale feature extraction을 위해 min(너비, 높이) = s ∈ {480, 576, 688, 864, 1200}가 되게 이미지 크기를 조정했습니다. 그리고 각 이미지 크기마다 conv5의 피처 맵을 구했고요. 

또한, 사전 훈련된 네트워크를 파인튜닝(fine-tunning)했습니다. 다양한 크기의 윈도우마다 conv5 피처 맵에서 피처 벡터를 풀링했기 때문에, 전결합 계층만 파인튜닝했습니다. 파인튜닝할 때, 실제 윈도우(ground-truth window)와 [0.5, 1]만큼 겹치는 것을 postitive 샘플로 정하고, [0.1, 0.5)만큼 겹치는 것을 negative 샘플로 정했습니다. 전결합 계층만 파인튜닝하기 때문에, 훈련하는 데 GPU로 2시간 가량밖에 걸리지 않습니다. 이어서 후처리를 위해 경계 박스 회귀(bounding-box regression)도 진행합니다. 실제 윈도우와 IoU가 0.5이상인 값만 경계 박스 회귀에 사용했습니다.

4.2 Detection Results

Pascal VOC 2007 데이터셋으로 성능 테스트를 해봤습니다. 아래 표를 보시죠.

Pascal VOC 2007 데이터셋에서 측정한 mAP. 'ft'와 'bb'는 파인튜닝, 경계 박스 회귀를 뜻함.

1-scale(s=688)로 훈련한 모델보다는 5-scale로 훈련한 모델이 성능이 좋네요. 여기서 'ft'는 파인튜닝을 뜻합니다. ftfc7이란 fc7(일곱 번째 전결합 계층)에 파인튜닝을 적용한 모델이라는 의미입니다. ftfc7 bb는 ftfc7에 경계 박스 회귀까지 적용했다는 말입니다. ftfc7 bb가 가장 성능이 좋네요. 그런데 SPP와 R-CNN에서 사용한 사전 훈련 네트워크가 ZF-5, Alex-5로 서로 다릅니다. 동등한 비교를 위해 모두 ZF-5로 다시 테스트해봤습니다.

같은 사전 훈련 네트워크를 사용해 비교한 mAP 결과

ftfc7 bb가 역시 가장 좋습니다. SPP와 R-CNN 성능이 59.2로 같네요. 그런데 속도는 SPP가 0.382초로 월등히 빨라졌습니다. R-CNN은 14.46초인데 말이죠. 


5. Conclusion

SPP는 이미지 스케일, 크기, 가로세로 비율을 유연하게 처리하는 알고리즘입니다. 이미지 스케일, 크기, 가로세로 비율을 유연하게 처리한다는 점은 객체 인식 분야에서 중요한 점이죠. 하지만 딥러닝 객체 탐지 모델로는 이미지 스케일이나 비율을 유연하게 다룰 수 없었습니다. 

<NOTE> 기존 딥러닝 기반 객체 탐지 모델인 R-CNN은 warping을 해서 이미지 크기를 고정해야만 했습니다. 이미지 스케일이나 비율을 유연하게 처리할 수 없었죠.

본 논문은 spatial pyramid pooling 기법을 딥러닝에 적용하는 방법을 소개했습니다. spatial pyramid pooling 기법을 적용한 SPP-net은 이미지 분류나 객체 인식 분야에서 성능도 뛰어나고, 속도도 빠릅니다. 

Comments