[논문리뷰] SSD: Single Shot MultiBox Detector

김경준·2021년 10월 28일
1

논문

목록 보기
15/37
post-thumbnail

Introduction

  • 기존 연구들은 bouding box들을 뽑아내고 특징을 추출한 뒤 classifier를 거치는 과정을 거쳤다.
  • 하지만 이러한 과정들은 연산량이 매우 크며, 실시간으로 응용하기에는 느리다는 단점이 있다.
  • 본 논문에서는 속도를 크게 개선하며 정확도 또한 유지하는 네트워크를 제안한다.

<SSD의 특징>

  • classification과 localization을 위해 작은 컨볼루션 필터를 사용한다.
  • 각기 다른 비율을 가진 객체들을 검출하기 위해 구별된 필터를 사용한다.
  • 다양한 크기의 객체들을 검출하기 위해 여러 feature map으로부터 위의 필터를 이용하여 output을 도출한다.
    (VOC2007 데이터셋으로 test한 결과 59FPS/74.3% mAP로 7FPS/74.3% mAP인 Faster-RCNN과 45FPS/63.4% mAP인 YOLO에 비해 높은 성능)

Model

image

Base network로 VGG16을 활용하였다. 3개의 FC layer 중 2개만 Convolution layer로 대체하여 사용하였으며 뒤에 auxiliary structure를 덧붙였다. 추가된 레이어를 살펴보면 pp개의 채널을 가진 m x n feature map에 (3×3×p)(3 \times 3 \times p)의 필터를 적용하여 class score와 좌표값을 예측할 수 있다.

자세히 보면 다음과 같다.

image

Pascal 데이터셋을 예로 설명하면,
3x3x(bouding box의 개수x(Class의 개수+좌표값(x,y,w,h))) = 3x3x(6x(21+4))가 Classifier가 된다. 결과는 그림의 우측과 같이 각 bounding box별로 좌표값과 class score가 나오는 것을 볼 수 있다.

SSD에서는 클래스 별로 8732개의 bounding box가 나오게 되는데 도출 과정은 다음과 같다.

  • conv4_3로부터 38x38x(4x(Classes+4)) = 5776x(Classes+4)
  • conv7로부터 19x19x(6x(Classes+4)) = 2166x(Classes+4)
  • conv8_2로부터 10x10x(6x(Classes+4)) = 600x(Classes+4)
  • conv9_2로부터 5x5x(6x(Classes+4)) = 150x(Classes+4)
  • conv10_2로부터 3x3x(4x(Classes+4)) = 36x(Classes+4)
  • conv11_2로부터 1x1x(4x(Classes+4)) = 4x(Classes+4)
    -> 8732x(Classes+4)

Default boxes & Aspect ratio

모델에서 볼 수 있듯이 Default boxes는 feature map에 따라 4개 혹은 6개가 만들어진다. 이 때 생성되는 박스들은 각각 다른 비율을 가지며 Default box라고 부른다. Fater-RCNN의 anchor box와 유사한 개념이지만 서로 다른 feature map에 적용한다는 점에서 다르다.

image

  • Smin=0.2S_{min} = 0.2, Smax=0.9S_{max} = 0.9, m=6m=6(feature map의 개수)으로 kk에 따라 1~6이 대입되어(k=1k=1일 때 Smin,S_{min}, k=6k=6일 때 SmaxS_{max}) 각 feature map마다 다른 scale(sks_k)을 가지게 된다.

  • 비율은 ara_r에 의해 정해진다. 예를 들어 ar=2a_r = 2인 경우 w,hw,h는 2:1의 비율을 가진다.

  • 6개의 bounding boxes를 뽑을 때는 a_r의 5개 원소를 모두 사용하며, 추가적으로 더 작은 크기의 1:1 비율인 sks_k^{'}가 사용된다. 4개를 뽑을 때는 3과 1/3이 제외된다.

image

위 그림이 Default boxes에 대한 설명을 직관적으로 보여준다.

  • 작은 객체(고양이)는 resolution이 큰 feature map(8x8)에 의해 인식이 되며 큰 객체(강아지)는 resolution이 작은 feature map(4x4)에 의해 인식이 됨을 알 수 있다.
  • 1부터 6까지의 k의 값을 대입했을 때 sks_k = [0.2, 0.34, 0.48, 0.62, 0.76, 0.9]가 되는데 이 값이 default box의 크기를 결정하는 input image와의 비율임을 생각하면 그림과 맞아떨어짐을 다시 한 번 이해할 수 있다.
  • 300픽셀 이미지의 0.2는 60픽셀로 작은 default box이므로 세밀한 정보를 잡아내는 큰 feature map에서 사용되며 반대로 0.9일 경우에는 default box의 크기가 270이므로 작은 feature map에서 사용된다.

Matching strategy

학습을 하기 위해서는 수많은 default box들이 각각 어떤 Ground Truth box에 대응되는지 매칭해주는 과정이 필요하다. 이 때 GT와의 IOU를 활용하며 0.5 이상인 박스들을 전부 positive로 분류한다. 반대로 IOU가 0.5 미만인 박스들은 배경이라고 생각을 하여 negative로 분류한다.

Loss function

image

SSD의 loss function은 classification loss와 localization loss 합으로 이루어져있다. α\alpha는 둘의 가중치를 조절하는 값으로 디폴트 값은 1이다.

  • xx: default box
  • cc: 클래스
  • ll: bbox의 좌표
  • gg: GT의 좌표
  • NN: llgg의 IOU가 0.5 이상인 박스의 수

Localization Loss

image

smooth L1 loss는 다음과 같다.

image

Confidence Loss

image

Confidence Loss는 매칭된 박스와 매칭되지 않은 박스에 대해 모두 softmax loss를 구한다.

Hard Negative Minining

SSD의 default box는 8000여개나 되지만 실질적으로 우리가 인식하고자 하는 객체의 수는 10개도 안 되는 경우가 일반적이므로 대부분의 box들은 배경을 나타낸다. 따라서 배경 클래스에 대한 데이터만 과도하게 많은 imbalance 문제가 발생한다. 이를 해결하기 위해 SSD에서는 loss가 높은(background인데 background class라 판단하는 확률이 작은) 데이터만 sorting하여 positive data의 3배만 사용하는 기법을 쓴다.

Results

image

결과 중에 눈에 띄었던 것은 작은 물체에 대한 성능이 유독 떨어진다는 것인데 추후에 나온 분석으로는 작은 물체를 첫 feature map에서 detect하기 때문이라고 한다. 이를 보완하기 위해 RetinaNet에서는 왕복하는 방식을 통해 작은 물체에 대한 성능을 높였다.

SSD에서는 augmentation을 통해 이와 같은 문제를 개선하였다. Random crop을 통해 "zoom in"하여 더 큰 객체의 데이터를 만들기도 하고 반대로 "zoom out"한 후 남는 공간은 평균 픽셀값으로 채워 작은 객체의 데이터를 만들기도 하였다. 그 외에도 randomly sample patch, horizontally flipped 등의 방법이 활용된다.

References

1개의 댓글

comment-user-thumbnail
2021년 11월 1일

SSD 논문 좀 보려고 검색했는데 경준님 블로그가 나오네요! 덕분에 잘 보고가요!

답글 달기