본문 바로가기
Deep Learning

[DL - 논문 리뷰] Very Deep Convolutional Networks for Large-Scale Image Recognition(VGG)

by JJuOn 2021. 12. 5.

이번 포스팅에서는 VGG로 알려져 있는 Karen Simonyan & Andrew Zisserman이 2014년에 발표한 "Very Deep Convolutional Networks for Large-Scale Image Recognition"을 읽고 정리해 보도록 하겠습니다.

 

VGG는 ILSVRC-2014에서 top-5 error rate 7.3%로 2위를 차지했습니다.


1. Introduction

 CNN은 대규모의 데이터셋(ImageNet), 고성능의 컴퓨팅 자원(GPU), 분산 클러스터링 등 덕분에 large-scale 이미지와 비디오 인식 분야에서 큰 성공을 거두고 있습니다. AlexNet을 이후로 kernel size와 stride를 줄이는 방식(ZFNet, OverFeat)으로 성능이 개선되고 있습니다. 다른 한쪽에는 network의 학습과 테스팅에서 전체 이미지를 사용하고, 여러 scale을 사용하면서(OverFeat) 성능개선을 노력하고 있습니다. 본 논문에서는 CNN의 depth를 증가시키는 방식으로 성능 향상을 시도했습니다. 다른 parameter를 고정한 채 3x3의 작은 conv layer를 추가하면서 depth를 증가시켰습니다.


2. ConvNet Configurations

 Network의 깊이에 따른 성능 향상을 측정하기 위해 VGG의 conf간에는 같은 설정을 적용했습니다.

2.1 Architecture

 이번 절에서는 본 논문에서 고안된 일반적인 CNN의 구조를 다룹니다. 학습 과정에서 입력 이미지의 크기는 224x224로 고정됩니다. AlexNet에서와 유사하게 전처리과정에서 mean RGB 값을 빼 줍니다. VGG는 3x3의 아주 작은 kernel size를 갖는 conv layer로 구성되어있습니다. 3x3의 크기는 좌/우, 상/하, 중심을 구분할 수 있는 가장 작은 크기라고 합니다. VGG의 일부 버전에서는 1x1 conv layer를 사용합니다. 이는 linear transformation과 ReLU를 적용시킨 것처럼 보입니다. stride는 1로 고정되어있습니다. 3x3 conv layer에는 padding이 1입니다. 그리고 몇몇 뒤에 max-pooling layer를 적용시켜 총 5개의 max-pooling layer가 구성되어있습니다. max-pooling layer는 2x2의 kernel size와 stride=2입니다.

 

 Fully-Connected layer들은 AlexNet처럼 4096-4096-1000으로 이루어져 있습니다. 모든 은닉층은 ReLU를 사용하고, AlexNet에서 사용된 Local Response Normalization은 VGG의 한 버전에만 적용시켰습니다. LRN은 ILSVRC 데이터셋에 대한 성능 향상에 도움이 안 된다고 합니다. LRN이 사용된 부분은 AlexNet에서의 parameter를 사용했습니다.

2.2 Configurations

ConvNet configurations

 위 표에서처럼 VGG의 각 conf들은 A부터 E까지 이름이 붙여졌습니다. 모든 설정은 2.1에 언급된 대로 따르고 11개의 layer로 구성된 A부터 19개의 layer로 구성된 E까지 depth를 달리했습니다. channel의 수는 64부터 시작해(입력 이미지는 3) max-pooling을 거칠 때 마다 2배씩 증가해 마지막엔 512에 달하도록 했습니다. 아래 표에서는 parameter의 수를 나타냅니다. Network가 깊어진데 반해, parameter의 수는 크게 증가하지 않은 것을 알 수 있습니다.

2.3 Discussion

 VGG의 설정은 ILSVRC-2012나 ILSVRC-2013에서 우수한 성적을 거둔 모델들과는 다소 다릅니다. VGG는 이전의 5x5 conv layer를 2개의 3x3 conv layer로, 7x7 conv layer는 3개의 conv layer로 교체했습니다. 교체 전과 후는 실제론 같은 연산을 하지만 장점이 몇 가지 있습니다.

 

 첫번째로, conv layer를 하나만 썼을 때 보다 ReLU를 더 많이 적용시킵니다. 두 번째로, parameter의 수를 감소시킵니다. 7x7 conv layer를 사용했을 때, 3개의 3x3 conv layer를 사용했을 때 보다 81% 더 많은 parameter를 사용하게 됩니다.

 

 VGG의 C 버전에서는 1x1 conv layer를 사용합니다. 이는 linear tranformation과 ReLU를 적용시킨 것으로, non-linearity를 증가시키게 됩니다. 이러한 1x1 conv layer는 "Network in Network"라고 불리기도 합니다.

 

 Ciresan et al.에서도 작은 크기의 conv layer를 사용했지만 network가 깊지 않았으며 ILSVRC 데이터셋으로 평가가 안되었습니다. Goodfellow et al.에서는 11개의 layer로 이루어진 network로 street number recognition을 진행했습니다. 그 결과 network의 깊이가 깊어짐에 따라 성능이 향상된다는 것을 보였습니다. 그리고 ILSVRC-2014의 Classification에서 우승한 GoogLeNet은 또한 22개의 layer로 network를 깊게 쌓았고 1x1, 3x3, 5x5의 작은 크기의 conv layer를 사용했습니다. 그러나 GoogLeNet은 VGG보다 더 복잡하고 연산량을 줄이기 위해 spatial resolution을 첫 번째 layer에서 많이 줄이게 됩니다. VGG가 single-network 분류 정확도에서는 GoogLeNet보다 더 좋은 성능을 보입니다.


3. Classification Framework

 이번 장에서는 classification 문제에서 학습과 평가를 어떻게 진행했는 지 서술합니다.

3.1 Training

 학습 절차는 일반적으로 AlexNet을 따르도록 했습니다.

  • Optimizer: SGD
  • Batch size: 256
  • Momemtum: 0.9
  • Weight decay: 0.0005
  • Dropout for first two fc layers
  • Initial learning rate: 0.01, decreased by a factor of 10 when validation stopped improving
  • # of epochs: 74

 AlexNet에 비해 parameter의 수가 많고 더 깊은 network이지만 수렴하는 데 epoch이 더 적게걸렸는데 그에 대한 이유는 더 깊어진 network와 더 작은 conv layer를 사용하면서 규제가 발생했고, 특정 layer에 대한 사전 초기화 때문이라고 합니다.

 

 학습 과정에서 가중치의 초기화는 중요합니다. 본 논문에서는 Table1의 A conf를 random initialization으로 학습시키기에 충분히 얕다고 생각했기 때문에 먼저 학습시켰습니다. 그 다음에 A보다 깊은 network에 대해서는 A의 앞에서부터 4개의 conv layer와 3개의 fc layer의 가중치로 초기화 했습니다. Random initialization을 할 때는 평균 0, 표준편자 0.1의 Gaussian으로 초기화했습니다. Bias들은 0으로 초기화 됐습니다.

 

 224x224의 고정된 크기의 이미지는 rescaled images에서 RandomResizedCrop해서 얻습니다. 이러한 이미지를 AlexNet의 학습 과정에서처럼 RandomHorizontalFlip하고 RGB color shift을 거칩니다. 학습 이미지의 경우는 비율을 유지한 채 가로와 세로 중 작은 쪽을 S(>=224)로 맞춥니다. 이러한 S를 정하는데 두 가지 접근방식을 취합니다. 첫번째는 고정된 S를 사용하는 경우입니다. 이는 single-scale training이라고 합니다. 학습할때 S=256인 경우와 S=384인 경우로 나누어 진행했습니다. 두번째는 multi-scale training입니다. [S_min,S_max] 범위에서 S를 뽑습니다. Multi-scale의 경우 시간상의 이유로 S=384로 pre-trained된 network를 사용하였습니다.

3.2 Testing

 테스트시에는 test scale이라고 하는 Q를 사용합니다. Q는 train scale인 S와 같을 필요는 없으며 training에서와 마찬가지로 가로와 세로 중 작은 쪽을 Q로 줄입니다. Overfeat에서와 유사하게 fc layer들을 conv layer로 대체하여
(첫 fc->7x7 conv, 나머지 두 fc->1x1 conv) fully-convolutional network를 구성하기도 하는데 이 경우 channel의 개수가 전체 클래스의 개수(ImageNet의 경우 1000)를 의미하게 됩니다. score를 계산하기 위해 각각의 channel를 spatially average합니다. 테스트 이미지의 경우 RandomHorizontalFlip을 적용시킵니다.

 

 Fully-convolutional network는 전체 이미지를 사용하기 때문에 테스트시에 multiple crop할 필요가 없어집니다. 그러나 Multiple-Crop은 성능향상에 도움이 됩니다. Fully-Convolutional network를 이용한 dense evaluation과 multiple-crop을 이용한 방식은 convolutional boundary가 다르기 때문에 상보적입니다. 이후의 실험에서는 둘 다 적용시켜 더 좋은 성과를 냈습니다.

3.3 Implementation Details

 구현은 C++ Caffe를 사용하여 이루어졌습니다. 4개의 GPU를 사용하기 위해 Caffe를 수정하였고, network를 학습시키는데 2~3주가 걸렸습니다.


4. Classification Experiments

 실험의 대부분에서 valid set을 test set으로 사용했습니다.

4.1 Single Scale Evaluation

ConvNet performance at a single test scale

 Fixed train scale인 경우에는 Q=S로 설정했고, Scale jitter인 경우에는 Q=(S_min+S_max)/2, S[S_min,S_max]로 설정했씁니다. A-LRN에서 LRN은 성능 향상에 큰 영향을 미치지 않는 것으로 나타났습니다. Depth가 증가함에 따라 성능이 향상되는 것을 알 수 있습니다. C는 1x1 conv를 적용시킨 것인데 오히려 D보다 성능이 떨어졌습니다. 이를 통해 알 수 있는 것은 1x1 conv로 non-linearity를 추가 해주었지만 일반적인 conv layer로 spatial context를 포착하는 것이 더 중요하다는 점입니다. Scale jittering을 적용한 경우 성능이 다소 향상되었습니다.

4.2 Multi-Scale Evaluation

ConvNet performance at multiple test scales

 Train scale과 test scale의 차이가 크면 성능 저하를 유발합니다. Fixed train scale로 학습된 network인 경우에는
Q={S-32,S,S+32} 에서 test scale를 설정했고, jittered train scale인 경우에는 Q={S_min,(S_min+S_max)/2,S_max}로 설정했습니다. 4.1과 마찬가지로 jittered train scale에서 성능이 좋게 나왔습니다. 

4.3 Multi-Crop Evaluation

ConvNet evaluation techniques comparsion

 3.2에서 언급된 것 처럼 dense evaluation과 multi-crop을 비교해 보았습니다. Multi-crop만을 사용한 경우가 dense evaluation을 사용한 경우보다 성능이 좋게 나왔고, 둘을 모두 적용한 경우 성능이 더 좋게 나왔습니다. 

4.4 ConvNet Fusion

 이번 절에서는 여러 network를 ensemble하여 실험을 진행했습니다. ILSVRC 제출 당시에는 single scale networks와 fine-tuning한 multi-scale model D만을 학습시켰습니다. 제출 이후 multi-scale model D,E와 dense evaluaton, multi-crop, 둘 다로 테스트 해봤는데 둘 다를 모두 적용시킨 경우 6.8%로 성능이 더 좋게 나왔습니다. Single model 중 가장 성능이 좋게 나온 경우는 Table 5의 E 입니다.(7.1%) 

4.5 Comparison with the State of the Art

Comparison with the state of the art in ILSVRC classification

 마지막으로 다른 sota 모델들과 비교를 했습니다. 공식적으로 7.3%의 top-5 error로 2위를 차지했습니다(GoogLeNet이 6.7%로 1위). Single network(7.0%)로 봤을때는 GoogLeNet(7.9%)보다 성능이 더 잘 나온다고 합니다.


본 논문의 구현은 GitHub에서 확인할 수 있습니다.

References

[1] https://arxiv.org/abs/1409.1556

[2] https://deep-learning-study.tistory.com/398?category=963091 

[3] https://oi.readthedocs.io/en/latest/computer_vision/cnn/vggnet.html

[4] https://dhhwang89.tistory.com/135

 

댓글