논문/Image&Video Recognition

[논문 리뷰] VGGNET - very deep convolutional networks for large-scale image recognition

바보1 2022. 6. 26. 05:18

Abstract

 

우선 초록에서는 해당 논문이 convolution network depth가 대규모 이미지 인식에 있어서 얼만큼 영향을 끼치는지 조사했다고 설명합니다.

해당 연구팀은 기존의 CNN 모델에서 3 x 3 Conv Filter를 16~19 층을 쌓음으로써 상당한 성능 향상이 있었다고 합니다..

이러한 발견은 이미지넷 챌린지 2014에서 localisation에서는 1등, classification에서는 2등을 기록하였다고 합니다.

또한 결과물이 다른 데이터셋에 대하여 일반화가 잘되어 최고의 결과를 내었다고 합니다.


1. Introdution

 

 

서론에서는 이미지넷과 같은 대규모 이미지 저장소와 GPU의 발전이 Convolutional network의 대규모 이미지, 비디오 인식을 성공시킨 역할이라고 간단히 언급한다. (그렇게 중요한 내용은 아닌 듯 싶습니다.)

또한 기존의 architecture에서의 성능을 올리려는 다양한 시도와, training and testing the networks densely over the whole image and over multiple scales가 Conv Nets에 있어 중요한 역할을 했다고 소개합니다.

 

하지만 해당 논문에서는 ConvNet architecture design에 중요한 영향을 끼칠 수 있는 다른 요소를 소개하는데,

바로 depth입니다.

 

연구팀들은 architecture의 다른 파라미터를 수정하며,

매우 작은 3 x 3 convolution filter를 모든 layer에 사용하며, convolutional layer의 depth를 꾸준히 증가시켰다고 합니다.

 

결과적으로, ILSVRC classification and localisation task에서 상당히 높은 정확도를 보였으며,

뿐만 아니라 비교적 간단한 pipeline의 일부(linear SVM)로써 다른 이미지 데이터 셋에도 잘 적용되어 훌륭한 성능을 보였다고 합니다.

 

마지막으로 논문의 목차에 대해서 요약하고 있는데,

  • ConvNet(VGGnet)의 구조
  • image classification에서의 training & evaluation의 세부사항
  • ILSVRC 분류 작업을 대상으로 모델의 구조를 비교
  • 결론

이렇게 목차가 나와있습니다.

 


2. ConvNet Configurations

 

 

우선 depth의 증가가 성능의 향상을 불러온다는 것을 측정하기 위해 모든 vggnet layer은 같은 원리로 설계되었다고 한다.

2.1에서는 ConvNet의 포괄적인 구조, 2.2에서는 평가에서 사용된 구조에 대해 자세히 설명하고, 3.3에서는 기존의 모델들과 비교한다고 나와있습니다.

 


2.1 Architecture

 

Input Image

  • 224 x 224 RGB image
  • 전처리는 RGB의 평균을 빼는 것만 적용

 

Conv Layer

  • 3 x 3 크기의 receptive field를 사용(이미지를 좌우상하로 파악할 수 있는 최소한의 크기가 3 x 3)
  • 추가적으로 1 x 1의 convolutional filter를 사용하는데, 이는 non-linerity를 증가시키기 위해 사용되었습니다.
  • convolution의 stride는 1이고, 공간 해상도를 유지하기 위해 padding 또한 1로 설정했습니다.

즉 1 pixel를 padding하고, stride가 1인 3 x 3 filter라고 보면 될 것 같습니다.

 

 

Pooling layer

  • 총 다섯개의 ax-pooling layer가 나오고
  • conv layer뒤에 나온다.
  • 사이즈는 2 x 2이고, stride는 2이므로 pooling을 통해 사이즈가 절반으로 줄여진다.

 

Fully-Connected layer

  • convolutional layers들의 적층 뒤에는 FC layer이 나오는데,
  • 처음 두 FC layer은 4096개의 채널
  • 마지막 FC layer은 이미지 분류를 위해 1000개의 채널을 가지고 있습니다.

마지막 층에는 soft-max layer가 있습니다.

 

그외 모든 layer에서는 ReLU를 사용하였고,

한 개의 모델을 제외하고는 LRN(Local Response Normalisation)을 적용하지 않았다.

(LRN은 한 개의 강한 픽셀이 다른 픽셀에도 영향을 주는 것을 방지하기 위해 인접한 픽셀끼리 일반화 한 것)

뒤에서 나오지만 해당 normalisation은 성능을 향상시키지 않았으며, 메모리 사용량과 연산 시간이 늘었다고 설명합니다.

 


2.2 Configurations

 

 

 

각 column은 하나의 모델 구조이며, A에서 E로 갈 수록 깊이가 깊어집니다.

conv layer의 channel은 64부터 시작하여, max pooling layer을 지날 때마다 2배씩 커져서 최대 512가 됩니다.

또한 맨 아래에 각 구조의 파라미터 수를 적어놨는데, 

상당히 depth함에도 불구하고, 오히려 얕고 넓은 conv layer을 사용하는 모델보다 가중치, 파라미터의 개수가 적습니다.

 


2.3 Discussion

 

 

여기서는 왜 더 큰 사이즈, 예를 들어 11 x 11 with stride 4를 갖고 있는 모델이나, 7 x 7 with stride 2 모델 대신에,

매우 작은 3 x 3 with stride 1의 conv filter을 모든 픽셀에 대하여 적용하였는지에 대하여 나옵니다.

 

3 x 3의 conv filter를 2개 사용하는 것은 5 x 5 conv filter 하나를 사용하는 것과 같고,

3 x 3의 conv filter를 3개 사용하는 것은 7 x 7 conv filter 하나를 사용하는 것과 같습니다.

 

그러면 7 x 7을 하나 사용하는 것보다 3 x 3을 세 개를 사용하여 무엇을 얻었는가?

 

첫 번째로, 비선형적인 조정(ReLU)을 더 많이 통과하게 되어서, 의사 결정을 잘하게 된다.

두 번째로, 파라미터 수를 줄인다.

예를 들어 3개의 3 x 3 conv stack이 있다고 했을 때, C channel이 input하고, C channel을 output 한다고 가정하자.

그러면 필요한 파라미터의 개수는 3 * 3 * 3 * C * C가 된다.

하지만 하나의 7 x 7 conv stack이 있다고 한다면, 파라미터 수는 7 * 7 * C * C가 되므로, 1.8배 정도의 파라미터 개수 차이가 나게 된다.

 

이는 곧 7 x 7 conv filter에 regularization을 적용하는 것과 같아, 오버피팅을 줄인다고 볼 수 있다.

왜냐하면 파라미터 수가 줄어들기 때문!

 

또한 1 x 1 conf filter를 넣은 이유는 의사 결정에 있어서 non-linearity를 좀 더 증가시키기 위해 넣었다고 한다.

공간이 같은 차원으로 그대로 투영되지만, non-linearity를 강화하기 위하여 도입했다고 한다.

 

 

기존에도 작은 filter를 사용한 모델이 있었지만, deep하지 않고, large-scale dataset에 대하여 평가하지도 않았다고 한다.

당시 우승한 GoogLeNet 같은 모델은 vggNet과 따로 개발하였으나, deep ConvNets는 비슷하다고 한다.

뭐 더 복잡하지만, 매우 공격적으로 연산을 낮췄다고 합니다.

 

 


3. Classification Framework

 

 

3장은 크게 Traning하는 부분과 Testing하는 부분으로 나뉩니다.


3.1 Training

 

 

Cost Function

  • 우선 back-propagation에 기반한 momentum = 0.9인 mini-batch gradient descent를 사용하여
  • multinomial logistric regression objective(내 생각엔 softmax function)을 사용합니다.

Batch Size

  • 256 size

Optimizer

  • momentun = 0.9
  • mini-batch gradient descent

Regularization

  • L2 Regularization with 5*10^-4
  • 마지막 두 개의 FC layer에는 0.5 비율의 dropout regularization을 적용

Learning Rate

  • 초기의 학습률은 10^-2
  • validation의 정확도 향상이 멈추면 10씩 나눈다.

 

결과적으로 learning rate는 총 3번 감소하고, 74번의 epochs 이후에 종료되었습니다.

해당 모델은 AlexNet 보다 파라미터 수가 많고, 깊이는 더 깊은데,

AlexNet보다 더 적은 epochs를 사용한 이유를 다음 두 가지로 추측했습니다.

  • Implicit regularization imposed by greater depth and small filter size
    • 이는 7 * 7 filter 하나보다 3 * 3 filter 3개를 사용하는 것이 암묵적인 규제가 있기 때문
  • pre-initialization of certain layers
    • network weight의 초기화는 매우 중요합니다.
    • 좋지 않은 초기화는 gradient의 불안정성 때문에 학습이 중지될 수 있습니다.
    • 이러한 문제를 해결하기 위해 연구팀은 A 모델을 먼저 학습한 후, 
    • 더 깊은 모델을 학습할 때, A의 처음 4개의 convolutional layer와 마지막 세 개의 FC layer을 가지고 왔습니다.
    • 나머지 layer은 random으로 초기화 되었습니다.
    • 이때 pre-initilized layer는 학습률을 감소 시키지 않아서 학습 중에 바뀔 수 있도록 하였습니다.
    • 나머지 layer는 정규 분포로 초기화 되었는데, 평균이 0이고 분산이 10^-2, 그리고 bias가 0으로 초기화 되었습니다.

 

Training Image에 대해 설명하자면,

고정된 224 * 224의 이미지를 얻기 위해서, rescaled된 이미지를 무작위로 잘랐습니다. (SGD 반복 한 번 당 한 번)

training set를 augment하기 위하여 임의의 수평 뒤집기와 임의의 RGB 색상 이동을 하였습니다.

training image rescaling은 아래에서 자세히 설명합니다.

 

little 3.1 Training Image Rescaling

여기부터는 조금 이해하기 어려웠습니다..

사실상 소단원이라 생각하는게 편하고, 이 개념이 뒤에서 쭉 이어지기 때문입니다.

 

논문에서는 S라는 개념을 도입하여 설명합니다.

let S be the smallest side of an isotropically-rescaled training image, from which the ConvNet input is cropped

s는 ConvNet 입력이 잘리는 등방성으로 다시 조정된 훈련 이미지의 가장 작은 면입니다.

라고 하는데 사실 뭔 소린지 모르겠습니다.

간단히 말하여 S는 training scale이라고 볼 수 있습니다.

 

이때 데이터를 넣기 위하여 우리는 224 * 224 크기로 잘라야 하는데,

이론적으로 S는 224보다 작지 않은 어떤 값도 가능합니다...

 

만약 S = 224라면 그냥 이미지 전체를 사용하면 되지만,

S가 224보다 크다면 객체를 포함하게 이미지를 작은 사이즈로 잘라야합니다. 

 

이때 traning scale S를 설정하는 두 가지 방법이 있습니다.

  1. single-scale training (이때의 image scaling은 multi-scale image에 포함될 수 있습니다.) 
    • 이때 S를 두 개의 scale로 고정합니다.
    • S = 256, S = 384로 고정합니다. (즉 이미지를 해당 S의 크기로 변환합니다.)
    • 이때 vggnet을 S = 256을 이용하여 먼저 훈련하고,
    • S = 384에서는 속도 증가를 위해 S = 256에 의해 pre-trained된 weights로 initalised합니다.
    • 이때 초기의 학습률은 10^-3으로 시작합니다.
  2. multi-scale training
    • 이때는 S를 [S_min, S_max] 사이의 랜덤한 값으로 설정하여, 변환합니다.
    • 연구팀은 S_min = 256, S_max = 512로 설정하여 사용했다고 말합니다.
    • 이미지에 있는 객체가 다양한 크기로 나타나기 때문에, 훈련에 유익하다고 말합니다.
    • 하나의 모델이 객체를 다양한 범위의 scale로 인식할 수 있게 훈련하고, training set augmentation으로 볼 수 있기 때문에 이를 scale jittering이라고 합니다.
    • 속도를 위하여, 학습은 같은 모델 구조에서 S = 384로 훈련된 모델의 모든 layer을 fine-tuning하여 학습합니다.

 

이때 scale을 한 후에 여러 방향에 대하여 224 * 224의 이미지를 잘라냅니다.


3.2 Testing

 

 

(중요한 것은 뒤에서 나오는데, 이들은 validation set를 test set로 사용했습니다.

따라서 해당 Testing은 validation을 통하여 평가한다고 봐야 합니다.)

 

여기서는 테스트를 위하여 Q라는 test scale을 소개합니다.

Q는 반드시 S와 같을 필요는 없습니다.

각 S에 대하여 각기 다른 값의 Q를 사용하는 것은 성능 향상에 도움이 됩니다.

 

그 다음에 vggnet은 alex net과 비슷하게 rescaled된 test image에 대하여 조밀하게 적용됩니다.

(즉, 이미지를 crop하여 성능을 측정하는 방식)

이때, 여기서는 모델의 구조에 약간의 변화를 주는데, FC layer가 convolutional layer로 변환됩니다.

첫 번째 FC layer는 7 x 7의 conv layer로 변환되고, 나머지 두 개의 FC layer는 1 x 1의 conv layer로 변환됩니다.

(그럼 이때 기존에 학습되었던 가중치는 어떻게 변환되는지..?)

따라서 원본 이미지에 fully-convolutional net의 결과를 적용할 수 있습니다.

FC layer는 입력의 크기가 하이퍼 파라미터로 정해져 있지만, conv 연산에서는 상관이 없기 때문입니다.

 

이때 최종적으로 나오는 채널의 개수는 클래스의 개수와 동일합니다.

또한 해상도는 input image size에 의존적으로 변화합니다.

 

이때 결과적으로 나오는 map을 class score map이라고 하는데,

해당 이미지의 class score를 얻기 위해서 class score map을 sum-pooled를 적용하여, average를 구합니다.

(어차피 사이즈는 같으므로 sum / map.size = average가 됩니다.)

또한 연구팀은 test set에도 augmentation을 적용하여 나온 결과원본 test set에서 나온 결과를 평균하여,

이미지의 클래스에 대한 최종 점수를 획득합니다.

 

사실 fully-convolutional network에는 전체 이미지를 적용하기 때문에,

test time에서는 multiple crops을 사용할 필요가 없습니다.

이것은 각 crop에 대하여 network가 재연산해야하는 시간이 필요하기 때문에 비효율적이기 때문입니다.

왜냐하면 crop에서 중복되는 부분이 있을 수 있으므로, 이 중복되는 부분을 또 다시 연산해야 하기 때문입니다.

하지만, set of crops가 많으면 많을수록 좀 더 input image를 정밀하게 sampling하여 정확도는 향상됩니다.

또한, multi-crop은 각각의 crop 마다 경계가 다르므로 dense evaluation과 상호보완합니다.

ConvNet에 crop을 적용하면, 일부분만 추출한 것이기 때문에 the convolved feature map은 0으로 padded 되지만,

dense evaluation이 같은 crop의 부분에 대해서는 이미지의 인접부분에서 padding하기 때문에 상호 보완을 할 수 있습니다.

따라서 receptive filed를 증가시키고, 더 많은 context가 인식됩니다.

 

연구진들은 연산 시간의 증가가 정확도의 증가로 이루어진다고 생각하지 않았고, 3개의 scale에 대해 각각 50개를 crop하여,

총 150개의 crop으로 평가하였습니다.

 

따라서 연구진은 multiple-crop과 dense evaluation을 적절히 사용하여 성능을 더 올렸습니다.

 

 

이해가 잘 안 되네요..

 


3.3 Implementation Details

 

 

뭐 GPU의 성능 덕분에 좋았다고 말하는 것 같습니다.

딱히 중요한 부분은 아닌 것 같네요

 


4. Classification Experiments

 

 

논문에서는 VGGNet을 이용해 ILSVRC에서 제공한 ImageNet dataset으로 다양한 Classification 실험을 했습니다.

Top-1 결과는 Multi-class classfication error이고, Top-5는 예측한 상위 5개 결과 중 정답이 없는 비율을 의미합니다.

 


4.1 Single Scale Evaluation

 

 

 

먼저 single scale에 대해 평가했는데, 이는 test할 때 test image size가 고정되어 있는 것입니다..

이때 앞선 training 방식에서 single scale traning 방식과 multi scale training 방식이 있었습니다.

 

이때 single scale training 방식으로 학습한 모델은 Q = S이고,multi scale training 방식으로 학습한 모델은 Q = (S_min + S_max) / 2가 됩니다.

 

우선,

LRN을 적용한 모델은 성능 향상이 일어나지 않았으며, 따라서 다음부터는 적용하지 않기로 했습니다.

 

그 다음, depth

가 증가할 수록 오류율은 낮아졌으며, B보다 C가 좋으며, C 모델보다 D 모델이 더 성능이 좋게 나왔습니다.이는 1 x 1 filter를 추가하는 것이 non-linearity를 더 잘 표현할 수 있지만, 3 x 3 filter가 spatial context(공간 특징)을 더 잘 뽑아주기 때문에 3 x 3 filter를 사용하는 것이 더 좋다고 합니다.

 

그리고 5x5 Convolution 대신에 3x3 Convolution을 두 번 사용 하는 경우 그 성능이 약 7% 향상 됐다고 합니다.

이는 Network를 더 깊게 만들고 Parameter 수를 줄이는 효과 만 있는 것이 아니라, Neuron의 Non-linearity 활성함수 사용 횟수가 늘어남에 따라 Feature 추출이 더 잘 되는 것을 증명 하는 것입니다.

 

마지막으로 scale jittering을 적용한 모델이 single scale trining한 모델보다 더 명백한 성능 향상이 일어났습니다.

비록 single scale evaluation을 적용하였지만, scale jittering한 모델이 더 좋은 성능이 나왔다는 것은, single jittering로 인한 training set augmentation이 도움이 된다는 것을 증명합니다. 

 


4.2 Multi-Scale Evaluation

 

 

 

여기서는 test 이미지를 multi scale로 설정하여 평가했습니다.

만약에 single scale training을 했을 경우에는 Q = {S-32, S, S+32}로 설정하였고,

multi scale training을 했을 경우에는 Q = {S_min, (S_min + S_max) / 2, S_max}로 설정하였습니다.

 

 

이것도 보시다시피 scale jittering을 적용한 모델이 더 좋은 성능 향상을 보였습니다.

이 또한 깊이가 깊어질수록 좋은 성능을 보였습니다. (D and E)

 


4.3 Multi-Crop Evaluation

 

 

마지막으로 multi-crop을 적용했을 때입니다.

여기서는 multi-crop과 dense를 평가 방법으로 이용했을 때의 결과입니다.

 

dense만 적용한 것보다 multi-crop이 더 좋고, 최종적으로 두 개를 합친 것이 더 좋네요.


4.4 ConvNet Fusion

 

 

마지막으로 여러 개의 ConvNet을 앙상블 했을 때입니다.

 

대회에서는 7개의 모델을 앙상블 해서 사용했었지만, 추후 따로 실험한 결과 D와 E 2개만 앙상블 했을 때 결과가 더 좋았다고 나옵니다.

 


5. Concolusion

 

 

해당 논문에서는 very deep convolutional network for large-scale image classification에 대해 실험했습니다.

깊은 표현이 분류의 정확도에 도움을 준다는 것이 증명 되었고, 기본적인 CNN 구조에서 깊이를 증가시키는 것만으로도 최고의 성과를 낼 수 있다는 것이 증명되었습니다.

 

또한 다양한 범위와 다른 데이터 셋에서도 잘 적용되는 모습이 보였으며, 더 적은 이미지 표현으로 만들어진 복잡한 인식 파이프 라인보다 성능이 좋거나, 비슷한 모습을 보였습니다.