안녕하세요~


이번시간에는 VGGNet이라는 CNN모델에 대해서 설명드릴거에요~


이전에 설명드린 AlexNet의 등장으로 image classification 분야에서 CNN 모델이 주목을 받기 시작했어요. 그리고 이후 연구자들은 AlexNet의 구조를 바탕으로 자신들 만의 연구를 진행하게 되었죠. 후발 연구자들이 연구를 진행하던 중 2014년에 VGG 모델과 GoogLeNet 모델이 ILSVRC 대회에 출현하게 되었는데요. 이 두 모델은 AlexNet보다 더 깊은 layer를 쌓으면서 뛰어난 performance(성능)를 보여주기 시작했죠. 또한 향후 CNN을 개발할때 보편적으로 사용되는 기법들이 VGG 모델과 GoogLeNet 모델을 통해 소개되었어요.


<사진1>


이번글에서는 ILSVRC 2014에 나왔던 두 모델 (VGG or GooLeNet) 중 아쉽게도 GoogLeNet에 이어 2위를 차지한 VGG 모델에 대해서 알아보도록 하겠습니다~










<0. Abstract>


Abstract를 통해 저자가 강조하는 키워드는 'large scale image recognition', '3x3 convolution filter', 'increasing depth'로 볼 수 있을거 같네요. 한 문장으로 요약하면 "3x3 conv filter를 통해 기존 CNN 모델의 layer의 갯수를 (deep하게) 늘렸고 (increasing depth), 이것이 large-scale image recognition에서도 좋은 결과를 얻게 만들었다" 정도가 될거 같아요. 













<1. Introduction>


Introduction에서는 앞서 abstract에서 언급한 내용을 반복해서 말하고 있어요. CNN layer의 Depth를 중점적으로 보고 연구를 진행했다고 설명하고 있네요. 이전에는 conv filter size가 조금씩 다르긴 했는데, 여기에서는 모든 layer에 3x3 conv filter를 동일하게 적용하고 있다고 설명하고 있어요.



저자는 이 논문의 방향성을 아래와 같이 제시하고 있어요. Section2에서 VGGNet의 구조(configuration)에 대해서 설명하고, Section3에서 VGGNet 모델의 training 방식과 classification test 작업을 어떻게 진행했는진에 대해서 설명한다고 하네요. 그리고 마지막으로 저자가 앞서 언급한 내용들에 대해서 종합적인 결론 내려고 하는것 같습니다.


















<2. ConvNet Configuration>


2-1) Architecture


VGGNet의 기본설정에 대해서 언급하고 있어요.


Input image

- Input image size는 224x224로 고정한다.

- Input image (Training dataset)에 대한 Preprocessing은 RGB mean value를 빼주는것만 적용한다. (RGB mean value란 이미지 상에 pixel들이 갖고 있는 R,G,B 각각의 값들의 평균을 의미해요)


Conv layer

- 여기서는 3x3 conv filter를 사용한다. (3x3이 left, right, up, down을 고려할 수 있는 최소한의 receptive filed이기 때문이다)

- 하지만 1x1 conv filter도 사용한다. (이 부분만 읽고는 어떤 용도로 사용되었는지 파악이 힘들어요~)

- conv filter의 stride는 1이고, 연산시 padding이 적용된다.




Pooling layer

- max pooling은 conv layer 다음에 적용되고 총 5개의 max pooling layer로 구성된다. pooling연산은 2x2 size&stride=2로 구성된다.


FC(Fully-Connected) layer

- 처음 두 FC layer는 총 4096 channel로 이루어 져있다.


그외

- 모든 hidden layer에는 ReLU activation function이 적용된다.

- AlexNet에서 사용된 LRN 기법은 VGGNet 저자가 실험했을때 성능 향상도 없는데다가 메모리 소모 및 연산량을 늘리기 때문에 사용하지 않았다.




2-2) Configuration


Configuration에서는 depth에 따라 VGG 모델을 조금씩 변형시켜 연구를 진행했다고 언급하고 있어요. 모델명은 A~E라고 정의했고, 각각 layer가 16~19를 이루고 있다고 설명하고 있어요. 



<Table1>



<사진2. Table1의 VGG E모델>


추가적으로 depth가 늘어나도 parameter가 줄어들었다는 것을 보여주고 있습니다.



<Table2>


<사진3>





2-3) Discussion


저자는 Discussion에서 small size filter인 3x3 conv filter를 사용한 이유를 설명하고 있어요. 간단하게는 3x3 conv filter 2개를 사용하는 것이 하나의 5x5 conv filter를 사용하는 것과 같은 효과를 불러온다고 설명하고 있는데요. 예를들어, 입력 feature map ‘A’라고 가정할게요. Feature map ‘A’에 첫 번째 3x3 conv filter를 통해 나온 feature map ‘B’에 두 번째 3x3 conv filter를 적용한 것이, 애초에 feature map ‘A’5x5 conv filter를 적용하는 것과 같은 receptive field 효과를 불러 일으킨다는 뜻이에요. 그래서 5x5 conv filter를 3x3 conv 2개로 나누어(factorizing) 사용한다고 설명하고 있네요.



좀더 자세한 내용은 아래 글에서 설명하고 있어요. 여기서는 3개의 3x3 conv filter와 1개의 7x7 conv filter를 비교하면서 설명하고 있어요. 먼저 각각의 conv filter를 하게 되면 ReLU라는 activation function을 거치게 되요. 그렇게 되면 non-linear한 문제를 좀 더 잘 풀 수 있게 되요 (이에 대한 이유는 여기 링크를 참고해주세요). 그래서 더 많은 conv filter를 사용하게 되면 여러개의 non linear function인 ReLU를 더 많이 사용할 수 있다는 장점이 있어요.


<사진4>




두 번째로는 3x3 conv filter를 사용하는 conv layer를 2번 사용되는 것이 7x7 conv filter를 한 개 사용하는 conv layer보다 연산시 적용되는 parameter수가 줄어든다는 점이에요. 그리고 이렇게 줄어든 parameter들은 overfitting을 줄여주는데 도움을 줄 거에요 (parameter가 줄어드는데 overfitting이 줄어드는 이유는 여기 링크의 '바나나'예시를 참고하세요)


(ex: 앞서 얻어진 feature map의 개수가 64개이고 128개의 3x3x64 conv filter로 연산하면, 3x3x64x128 parameter가 필요함) 



VGG C 모델같은 경우에는 1x1 conv를 두어 non-linear 성격을 좀 더 강화시켰다고해요. (1X1 conv 연산은 GoogLeNet에서 좀더 자세하게 설명하도록 할게요!)










<3. Classification Framework>

 

여기에서는 VGG 모델을 어떻게 학습시켰고 어떻게 test했는지를 상세하게 설명하고 있어요.


3-1) Training


먼저 training을 위해 hyper-parameter를 어떻게 설정했는지 설명하고 있어요.


Cost function: Multinomial logistic regression objective = Cross Entropy

Mini-batch: Batch size 256

Optimizer: Momentum=0.9

Regularization: L2 Regularization = 5.10^-4 & Dropout=0.5

Learning rate: 10-^2 --> validation error rate이 높아질수록 1/10 씩(10^-1) 감소시킴


<사진5. A factor of 10>




AlexNet보다도 더 깊고 parameter도 좀 더 많지만 더 적은 epoch를 기록했다고 언급하고 있어요. 그 이유는 implicit regularisation와 pre-initialisation 때문이라고 언급하고 있어요. Implicit regularisation은 앞선 눈문중에 "This can be seen as imposing a regularisation on the 7x7 conv"라는 부분을 말하고 있는건데요. 7x7 한 개보다 3개의 3x3 conv filter에 적용되는 parameter가 더 적기 때문에 이를 implicit regularisation이라고 언급하고 있어요 (explicit regularization은 'dropout=0.5'라고 볼 수 있겠네요. 왜냐하면 논문에서 명시적으로 regularization 방식을 dropout으로 쓴다고 언급하고 있으니까요)


Pre-initialisation하는 방식은 먼저 VGG A 모델 (16 layer)를 학습하고, 다음 B,C,D,E 모델들을 구성할때 A 모델에 학습된 layer들을 가져다 쓰는 방식으로 진행되었어요. 자세하게는 A모델의 처음 4개 conv layer와 마지막 3개 FC layer를 사용했다고 하네요. 이러한 방법을 통해 최적의 초기값을 설정해주어 학습을 좀 더 용이하게 만들었던것 같습니다 (초기값과 관련된 내용은 여기 링크를 참고해주세요)



Training image size


VGG 모델을 학습시킬 때 제일 처음하는 것은 training image를 VGG 모델의 input size에 맞게 바뀌어주어야 한다는점이에요. 



예를들어 S=256이라고 한다면, 아래 사진처럼 training image의 넓이, 높이 중에서 더 작은 side를 256으로 줄여줄거에요. 이때 aspect ratio를 유지하면서 나머지 side도 rescaling해주는데 이러한 방식을 "isotropically-rescaled" 했다고 말한답니다.



이렇게 isotropically-rescaled training image (ex: 위의 이미지에서 512x256) 에서 224X224 size로 random하게 crop을 해주게되요.


사실 S값을 설정하는 두 가지 방식이 있는데요. 첫 번째가 'single-scale training' 방식이에요. 이 방식은 S를 256 or 384로 고정시켜 사용하는 방식이에요. 처음에 S=256으로 설정하여 학습시킨 VGG 모델의 가중치값들을 기반으로 S=384으로 설정하여 다시 학습시켜요. S=256에서 이미 많은 학습이 진행된 상태이기 때문에 S=384로 설정하고 학습할때는 learning rate를 줄여주고 학습을 시켜줍니다.



또 다른 방식은 multi-scale training 방식이에요. 이번에는 S를 고정시키지 않고 256~512 값들 중에서 random하게 값을 설정해줍니다. 보통 객체들이 모두 같은 사이즈가 아니라 각각 다를 수 있기 때문에 이렇게 random하게 multi-scale로 학습시키게 해주면 학습효과가 더 좋아질 수 있어요.



그리고 보통 이러한 data augmentation 방식을 scale jittering이라고도 합니다.


<사진6>


이러한 multi-scale을 학습시킬 때에는 앞선 single scale training 방식(S=256 or 384)을 진행한 VGG model로 fine tuning 시키게되요.





3-2) Test


Test image size


Training image가 rescaling되는것 처럼 VGG 모델을 test할 때도 rescaling 됩니다. Training image를 rescaling 할때 기준이되는 값을 S라고 했다면, test image를 rescaling 할때 기준이 되는 값은 Q라고 합니다. 이때 Q=S일 필요는 없는데, training image에서 설정된 S값 마다 다른 Q를 적용하면 VGG 모델의 성능이 좋아진다고 하네요 (아마 여기서 말하는 test image는 training 중간중간에 validation하는 validation image dataset을 의미하는거 같네요 -> 4.Classification Experiments 부분에서 Dataset 부분을 보니 validation dataset을 test dataset으로 간주하여 사용했다고 하네요.)



VGGNet 모델은 Training 할때와 중간중간 overfitting을 막기위해 Testing(Validation)할때 쓰이는 CNN 구조가 약간 달라요.


Test시에는 training시 사용되던 첫 번째 FC layer를 7X7 conv layer로 바꾸고, 마지막 두 FC layer를 1X1 conv layer로 바꾸었어요. 이것을 통해 whole (uncropped) image에 적용시킬 수 있다고 설명하고 있어요. 이 부분에 대한 설명을 조금 풀어서 해볼게요. 



먼저 아래 왼쪽 그림을 feature map이 FC layer로 들어가기 전에 flatten하는 순서를 보여주고 있어요. 그리고 오른쪽 그림은 1x1 conv filter를 적용하는게 어떻게 Fully connected layer와 연산구조가 비슷한건지 보여주고 있어요. 오른쪽과 같이 연산을 하면 결국 flatten하는 순서만 바뀌고 구조자체는 FC layer와 동일하게 바뀌어요. 


    


그렇다면 아래 사진처럼 training시 갖고 있던 FC layer를 1x1 conv filter를 가진 conv layer로 바꿔줄 수 있어요.


      




   VS   

       

<사진7. 왼쪽 Test시 VGGNet 구조, 오른쪽 Training시 VGGNet 구조. 왼쪽 이미지의 7x7x512 maxpooling 이후, 7x7 conv layer가 적용된 결과가 이미지에 나타납니다. 왼쪽이미지상에서는 FC-connted라고 표현했지만 실제로 3객의 1x1 conv layer인 셈인것이죠>



논문에서 "The resulting fully-convolutional net is then applied to the whole (uncropped) image. The result is a class score map with the number of channels equal to the number of classes, and a variable spatial resolution, dependent on the image size. Finally, to obtain a fixed size vector of class scores for the image, the class score map is spatially averaged (sum-pooled)." 라고 언급된 부분에서 많은 혼동이 있을 수 있는데 이 부분에 대해서 잘 살펴보도록 할게요. 


Training시에는 crop하는 방법을 쓰지만, Test 시에는 FC layer를 conv layer(=fully-convolutional net)으로 바꿔주어 uncropped image를 사용해도 된다고 나와 있어요. 당연히 FC layer는 MLP 개념으로써 입력 노드가 hyperparameter로 정해져 있기 때문에 항상 입력 노드(size)가 동일해야 해요. 하지만 conv 연산에서는 그런 제약이 없어지게 됩니다. 그런데, 기존 crop을 통해 얻은 224x224 입력 image size가  VGG model에 입력되었을 때 classifier에 해당하는 부분 (FC layer가 1x1 conv layer로 바뀐 부분) 을 거친 최종 output feature map size가 입력 image size에 따라 서로 달라질거에요.


<사진8>


이때 output feature map size가 1x1이 아닌 경우에는 계산을 어떻게 하게 될까요? 예를들어, 224x224 이미지 사이즈가 들어왔을때는 '사진8'의 위쪽에 위치 한 그림처럼 classifier 단계(1x1 conv filter가 적용되기 시작하는 부분)에서 1x1 conv filter가 feature map에 알맞게 적용되는 것을 볼 수 있지만, 아래에 위치한 그림에서는 1x1 conv filter가 feature map size와 다르다는 것을 알 수 있어요. 


만약 큰 이미지가 입력으로 들어오게 되면 1x1 conv filter를 적용할 때 feature map size가 1x1이 아니고 7x7이 될 수도 있어요. 논문에서 언급한 "The result is a class score map with the number of channels equal to the number of classes, and a variable spatial resolution, dependent on the image size."의 의미는 1x1 conv filter(layer)를 거치고 softmax에 들어가기 직전의 output feature map size가 이미지 크기에 따라 달라지는데, 아래와 같은 예에서는 7x7x1000 의 output feature map size를 얻을 수도 있다는 말과 같아요. 이때 7X7 output feature map을 class score map이라고 한답니다. 이렇게 얻은 7x7 class score map은 1000개(channel)를 얻게 되는데요. 이때 각각의 7X7 feature map은 "spatially averaged (mean or average pooling)"을 하게되요. (사실 논문에서는 sum pooling이라고 언급해서 pooling연산 할때 feature map을 더해주는게 아닌가라는 생각도 해봤는데 sum pooling에 대한 정확한 정의를 찾기도 힘들었고 코드들을 보면 GAP(Global Average pooling)을 사용하는것 같아 저는 mean or average pooling을 한다고 해석했어요)


         

      <사진9>                                                                               <사진10. GAP>



위와 같은 작업을 수행하되 softmax 이후에 flipped image와 original image의 평균값을 통해 최종 score (final)를 출력하게 됩니다.


AlexNet에서는 Test할때 1개의 이미지에 대해서 좌상단, 우상단, 가운데, 좌하단, 우하단으로 crop을 하고 각각 crop 된 이미지를 좌, 우 반전을시켜 10 augmented images를 사용하게되요. 이러한 10 augmented images에 대해 평균을 취하는 방식으로 최종 score를 출력했습니다 (Softmax의 결과 확률값이 나오는데 각각의 class에서 나오는 10개의 값들에 대해 평균을 취한것이죠). 그렇기 때문에 속도가 매우 느려지게 되는것이죠. 하지만, FC layer를 1x1 conv layer로 대체하고 약간의 큰 사이즈의 이미지를 넣어주고 학습을 시켰고 data augmentation도 horizontal flipping만 적용했는데도 좋은 효과를 얻어냈다고 언급하고 있어요.



이러한 Fully convolutional network로 구성되어 있을때에는 dense estimation을 적용했다고 하는데요 (이부분은 아직 이해가 명확히 안되서 이해하는대로 정리해서 올리도록 하겠습니다).


VGGNet 저자는 GoogLeNet에서 사용한 multi-crop 방식이 좋은 성능을 보였다는것을 인지하고 VGGNet에서 사용한 dense evaluation 방식을 보완(complementary)하기 위해 multi-crop evaluation 방식 또한 사용했다고해요. 나중에는 multi-crop evaluation과  dense evaluation을 적절하게 섞어 test(validation)을 진행했는데 이러한 방식의 evaluation 기법이 좋은 결과를 내었다고 언급하고 있어요.


 






<4. Classification Experiments>


이 부분에서는 실제 classification 실험(experiments) 결과를 보여주고 있어요. 간단하게 dataset은 ILSVRC를 사용했고, top-1 결과는 multi-class classification error (<-- 이 부분은 뒷부분에서 더 설명이 나와요)이고 top-5결과는 기존 ILSVRC에서 요구하는 test(evaluation) 기준을 사용했다고 해요.



대부분 실험에서 validation set을 test set으로 사용하고 있다고 언급하고 있어요.




4-1) Single scale


Single scale Evaluation이란 test시 image size(scale)가 고정되어 있는것을 의미해요. 앞서 training image size를 설정해주는데 2가지 방식이 있다고 했는데요. 첫 번째는 training image size(S) 256 or 384 로 fix시켜주는 single scaling training 방식과, 256~512 size에서 random하게 골라 multi-scaling training 방식이 있어요. Single scaling training 방식을 선택했을때에는 S=Q size로 test image size가 고정(single scale)되고, multi-scaling trailing 방식에서는 0.5(256+512)=384로 고정됩니다.




AlexNet에서 사용되는 Local Response Normalization 기법을 사용한 모델 (A-LRN)과 그렇지 않은 모델 (A)간의 성능차가 나지 않았기 때문에 B 모델을 사용할때부터는 LRN을 사용하지 않았다고해요. 



또한, 아래의 테이블에서 볼 수 있듯이, 1x1 conv filter를 사용하고 있는 C 모델보다 3x3 conv filter를 사용한 D 모델의 성능이 더 좋게 나온것을 알 수 있어요. 저자는 그 이유를 1x1 conv filter를 사용하면 non linearity를 더 잘 표현할 수 있게 되지만, 3x3 conv filter 가 spatial context (공간 or 위치정보)의 특징을 더 잘 추출해주기 때문에 3x3 conv filter를 사용하는것이 좋다라고 언급하고 있어요. (또한 layer를 19에서 error rate이 정체 되어있다고 이야기하는거 보면 19 layer보다 더 깊이 layer를 쌓고 진행을 했었던거 같아요)






4-2) Multi-scale evaluation


Multi-scale evaluation은 test이미지를 multi scale로 설정하여 evaluation한 방식을 이야기해요. 그래서 아래 테이블을 보시면 하나의 S 사이즈에 대해 여러 test image로 evaluation을 하는것을 볼 수 있으실거에요.






4-3) Multi-crop evaluation & 4-4) ConvNet fusion


앞서 언급했던 dense evaluation 방식으로 validation을 진행한 결과와 multi-crop evaluation방식으로 validation을 진행한 결과에 대해서 언급하고 있어요. 또한 multi-crop evaluation결과와 dense evaluation의 평균을 통해 두 방식을 적절하게 섞은 새로운 방식(=ConvNet fusion)으로 validation한 결과를 보여주고 있네요.




4-5) Comparison with the state of the art


저자는 ILSVRC 대회에 모델성능을 제출할시 7개 모들의 ensemble 기법을 적용했는데요. 나중에 대회가 끝나고 자체 실험에서 단 2개의 모델 (D,E) 만 ensemble한 결과가 더 좋았다고 언급하고 있어요.


(앙상블관련 개념은 아래 영상 or 링크를 참고해주세요)





최종적으로 2014 ILSVRC에 출시된 classification 모델들과 경합한 결과를 보여주고 있는데요. VGGNet 이 대회에서 2등을 차지하게되요.





지금까지 2014 ILSVRC 대회에서 2등을 한 VGGNet 모델에 대해서 언급했어요. 그렇다면 다음글에서는 2014 ILSVRC 대회에서 1등을 한 GoogLeNet 모델을 설명해야겠죠?ㅎ


그럼 다음 글에서 뵙겠습니다~






P.S


이 논문에서는 localisation에 대한 설명도 하고 있고, 이를 위해 Pascal Dataset을 사용했다고도 언급하고 있지만 CNN 모델을 설명할때에는 localisation와 관련된 개념들은 언급을 하지 않으려고해요. 그 이유는 추후에 Object detection chapter를 열게 될건데 이때 자세하게 설명하는게 적절하다고 판단했기 때문이에요~





[논문 래퍼런스]

VGG Net

Very Deep Convolutional Networks for Large-Scale Image Recognition/ Simonyan, Karen and Zisserman, Andrew/ 2014/09/04/ https://arxiv.org/abs/1409.1556v6


[글 래퍼런스]

https://www.google.com/search?q=%EB%9D%BC%EC%98%A8%ED%94%BC%ED%94%8C+VGGNet&oq=%EB%9D%BC%EC%98%A8%ED%94%BC%ED%94%8C+&aqs=chrome.1.69i59l4j35i39j69i61l3.3070j0j4&sourceid=chrome&ie=UTF-8

https://datascienceschool.net/view-notebook/47c57f9446224af08f13e1f3b00a774e/

https://www.youtube.com/watch?v=fe2Vn0mwALI


[사진 래퍼런스]

사진1

https://dataplay.tistory.com/24

사진2

https://www.researchgate.net/figure/llustration-of-the-network-architecture-of-VGG-19-model-conv-means-convolution-FC-means_fig2_325137356

사진3

https://www.youtube.com/watch?v=fe2Vn0mwALI

사진4

https://bskyvision.com/504

사진5

https://ell.stackexchange.com/questions/52706/what-does-reduce-by-a-factor-of-10-mean-in-terms-of-percentage-in-the-followin/129493#129493

사진6

https://slideplayer.com/slide/12507676/

사진7

https://junjiwon1031.github.io/2017/09/08/Single-Shot-Multibox-Detector.html

http://blog.naver.com/laonple/220738560542?

사진8

https://laonple.blog.me/220752877630

사진9

https://www.gputechconf.co.kr/assets/files/presentations/2-1650-1710_DL_Contest_%EC%A7%80%EC%A0%95%EC%A3%BC%EC%A0%9C_%EB%8C%80%EC%83%81.pdf

사진10

https://zhuanlan.zhihu.com/p/42233779

  1. 리키미 2021.07.02 13:13

    논문 스스로 읽어볼 때는 이해가 잘 안되고 힘들었는데, 정말 쉽게 잘 알려주셔서 이해가 잘 된 것 같습니다.
    이 글을 바탕으로 github에 정리해서 올려보고 싶은데, 출처를 밝히고 사용해도 될까요?

  2. 리키미 2021.07.02 14:01

    정말 감사합니다!!

  3. Mason 2021.10.26 17:20

    VGG Net 구조를 급하게 봐야했는데, 정말 깔끔하고 머리에 쏙쏙들어오네요

    정말 감사합니다!

+ Recent posts