본문 바로가기

IT/Paper

[Deeplearning] OverFeat: Integrated Recognition, Localization and Detection using Convolutional Networks

Deeplearning기반 Object Detection System에 주류가되는 알고리즘들은 컨셉적으로 다 알고 있다고 생각했었는데, 막상 여러가지 이유로 논문을 다시 보게 되니까 제가 이해하고 있던 부분들이 많이 틀렸다는 것을 알게되었습니다.


그래서 이번 포스팅은 Object Detection 논문 중, OverFeat이라는 논문을 리뷰하도록 하겠습니다.


시작하기 전에, Object Detection 시스템에 대한 개략적인 이해는 알고있다는 가정을 하고 진행하도록 하겠습니다.



1. Classification

1-1. Model Design and Training


  • ImageNet 2012 데이터셋을 사용(1.2 million images and Class = 1,000 classes)
  • 고정된 입력데이터 사이즈를 갖는 모델을 사용(256 pixels라고 언급되어있는데, 256 x 256의 이미지를 의미하는 듯 합니다.)
  • 221x221크기의 5 Random Crop과 그에 대한 좌우 반전 영상을 사용
  • Batch Size는 128
  • Weights Random Initialize  
  • Momentum SGD(stochastic gradient descent) 사용 (momentum parameter는 0.6)
  • wegith decay 사용
  • learning rate는 로 시작해서, (30, 50, 60, 70, 80) epoch마다 0.5 factor씩 줄여나감
  • Fully Connected Layer(6th, 7th에 대해서)Dropout 사용(factor 0.5)
  • Convolution Layer(1th ~ 5th)는 Activation function으로 ReLU 사용
  • Convolution Layer(1th ~ 5th)를 Feature Extractor라고 부르고, Accurate model과 fast model로 나눔( 아래 Table 참조)





1-2. Multi-Scale Classification


multi-view voting은 성능 향상을 위해서 사용될 수 있습니다. 평균적으로 10views로 고정하는데, 4개의 코너와 중앙으로 총 5개를 뽑고, 이 추출된 5개의 영상에 대해서 좌우 영상반전을 합니다. 이렇게 사용하면, 영상의 많은 부분을 무시하게 되고, 과도하게 컴퓨팅 연산을 수행하게됩니다. 논문에서 저자는 Convolutional Network를 사용하게 되면, 전체 이미지를 각위치 및 다양한 스케일에서 조밀하게(Densely)하게 탐색할 수 있다고 합니다. 저자가 제안한 방식을 따르면, 효율력이 좋아지면서 견고해진다고 합니다. 


[CNN]



CNN을 계속 통과시키다보면, Image에서의 큰 Pixel의 덩어리가 subsampling이 되서, subsampling ratio에 따라 작게 변합니다. 만약에 subsampling ratio가 36이라면 CNN의 마지막 레이어에의 feature map의 1 pixel은 원본 이미지의 36pixel에 대해서 이야기하는 값이 됩니다. 이렇게 되면 최종 feature map이 원본 이미지에 대해서 표현하는 해상도가 너무 포괄적이게 되는데, 논문에서는 객체와 feature map사이의 정렬(align)이 안맞는다고 표현합니다. 논문에서는 이렇게 되면 네트워크의 성능이10-view보다 떨어진다고 이야기합니다. 저자는 이 문제를 해결하려고 Fast image scanning with deep max-pooling convolutional neural networks의 논문과 유사한 접근을 했다고 합니다.



이 부분을 보면서, 이게 무슨 소린가 너무 이해가 안되서, 언급하는 논문을 살펴봤는데, OverFeat저자가 이야기하는 정렬(align)이 안맞는다는 이야기와 해당 논문의 저자가 의도하는 바는 조금 많이 다른듯 했습니다. Fast image scanning with deep max-pooling convolutional neural network의 저자는 max-pooling이 해당 View Field안에서 제일 큰값만 가져다 쓰는데, 그러면 이전 Convolution 연산에서 다른 연산부분은 무시하고 downsampling하는 것이기 때문에, 표현력이 많이 낮아진다고 생각하는 것 같다고 느꼈습니다. 그래서 max-pooling을 다른식으로 써서 이전 Convolution 연산값들을 조금 더 챙겨가보자 하는게, Fast image scanning with deep max-pooling convolutional neural network 논문의 핵심 컨셉이라고 이해가 됬습니다.






제가 이해한 바에 따르면, 위에서 보는 것과 같이 기존 max-pooling기법을 따르는게 아니라 제안한 방식으로 feature map들의 fragment를 설정하고 그에 대해서 max-pooling을 진행하는 것이 핵심입니다. 이렇게하면, 제한된 View Field안에서만 max-pooling이 진행되는 것이 아니고, 모든 feature map의 pixel값들에 대해서공평하게 max-pooling될 기회가 주어지기 때문에 네트워크의 표현력이 좋다진다고 이야기하는 것 같습니다. OverFeat저자는 여기에서 컨셉을 얻어서 Feature Extractor(Convolutional Layer 1~5th)에서 나온 feature map을 0~2까지 shift를 해서 fragments를 얻고 그에 대해서 max-pooling & Fully Connected layer에 통과시켜서 출력맵을 얻고, 이를 Concatenate해서 조밀한 출력값을 얻겠다는 의도인 것 같습니다. 


그런데..... 도대체... 여기서 그냥 3x3 max-pooling의 stride를 1로 준것과, 3x3 max-pooling kernel과 stride 3을 줘서 저자의 방식 결과의 차이가 같을거 같은데, 무슨 이야기를 이렇게 길게 이야기했는지 잘 모르겠습니다.....


차이점이라고 하면, OverFeat에서는 말하고자 하는 바는 다음과 같은데, 만약 Feature extractor에서 마지막 레이어(5번째)에 왔을 때, feature Map이 6x6이라고 할 때, accurate 모델과 같은 max-pooling kernel 3x3, stride 3x3을 적용하면, max-pooling은 아래의 그림과 같이 수행되게 됩니다. 



하지만 Figure 3에서 이야기하는 바는 만약에 왼쪽 상단의 Pooling의 경우만 생각해보면 아래의 그림과 같이 적용하자는 이야기입니다. feature map에서 다양한 multi-scale voting을 해야겠으니, max-pooling시, view field를 x, y좌표로 {0,1,2}씩 shift해서 max-pooling을 하고, 그 결과를 고정된 Fully Connected Layer에 Sliding Windows 방식으로 넣어서, dense evaluation이라는 것을 통해서, 조금 더 해상력이 좋아진 결과를 얻고, 각 fragment들의 pooling 결과를 어떻게 Concatenate 할 것인지에 대한 내용이 Figure 3에 대한 내용이었습니다. 기존의 max-pooling을 써서 Fully Connected Layer에 넣을 때는, Pooling된 feature map에서 하나의 pixel이 원본 영상의 36pixel을 의미해서 해상력이 매우 안좋은데, 제안된 방식으로 Sliding Windows 방식으로 Multi-scale voting을 하게 되면, feature map의 1pixel의 12pixel에 대응하게 되어 해상력이 좋아진다고 이야기를 합니다.



                     


         


      


      



[Pooling 결과를 input size가 5인 Fully Connect Layer Sliding Windows 방식으로 입력]



아래의 그림과 같이 논문에서 Figure 8에 나타나있는 그림은 OverFeat으로 추가적인 Boxing Regression Network에 대해 설명한 그림입니다. (a)의 Layer 5 pooled maps는 feature extractor를 통과하고 나온, max-pooling 이전의 feature map이고, feature map의 size는 7x6입니다. 여기에서 의 max-pooling을 진행할 건데, feature map의 height가 더 내려갈 수 없으니 결과론적으로 최종 pooling된 feature map이 3x2의 크기가 될 수 밖에 없습니다. 이를 Fully Connected Layer를 통과시키면, 256 채널에서 4096, 1024채널로 변경되다가, 최종 출력은 3x2x4의 tensor가 됩니다. 여기서 3x4는 공간적 정보를 의미하고 4채널은 박스의 (xmin, ymin, xmax, ymax)를 의미하게됩니다.







이렇게, 최종 Bounding Box의 좌표를 얻게되면, 최종 출력은 위의 그림과 같은 형태로 출력되게 됩니다. 그럼 이제 이중에, 어떤 Box가 Object에 제일 적합하냐를 찾아야하는데,  아래와 같은 방법으로 결정될 수 있습니다. 먼저 Classifier에서 출력된 N개의 클래스 벡터집합에서 제일 score가 높은 class를 해당 object로 할당합니다. 모든 스케일에 대해서 검출된 Box를 특정 bin에 넣고 그 중에 2개를 뽑아서, GT Box와 IOU와 Center Point의 차이에 대한 유클리디언 거리가 제일 작은지에 대한 match_score를 먹여서 어느 일정값보다 높으면 해당 Object에 대한 Box를 해당 Box로 고정하고, 그렇지 않다면, Center Point와 각 width, height에 대한 평균값을 설정해서 해당 bin에서 사용했던 box를 제거하고, 새로 합쳐진 Box를 넣어주고 이를 반복합니다.






여기까지가 OverFeat이라는 논문에서 제가 이해한 핵심적인 컨셉을 설명드렸습니다.


그 외의 내용을 알고싶으신 분은 논문을 직접 참고하시면 될 것 같습니다.


혹시 포스팅한 내용을 읽다가 제가 틀린게 있다면, 언제든지 피드백 주시면 감사하겠습니다.