<SSD의 특징>
- classification과 localization을 위해 작은 컨볼루션 필터를 사용한다.
- 각기 다른 비율을 가진 객체들을 검출하기 위해 구별된 필터를 사용한다.
- 다양한 크기의 객체들을 검출하기 위해 여러 feature map으로부터 위의 필터를 이용하여 output을 도출한다.
(VOC2007 데이터셋으로 test한 결과 59FPS/74.3% mAP로 7FPS/74.3% mAP인 Faster-RCNN과 45FPS/63.4% mAP인 YOLO에 비해 높은 성능)
Base network로 VGG16을 활용하였다. 3개의 FC layer 중 2개만 Convolution layer로 대체하여 사용하였으며 뒤에 auxiliary structure를 덧붙였다. 추가된 레이어를 살펴보면 개의 채널을 가진 m x n feature map에 의 필터를 적용하여 class score와 좌표값을 예측할 수 있다.
자세히 보면 다음과 같다.
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는 feature map에 따라 4개 혹은 6개가 만들어진다. 이 때 생성되는 박스들은 각각 다른 비율을 가지며 Default box라고 부른다. Fater-RCNN의 anchor box와 유사한 개념이지만 서로 다른 feature map에 적용한다는 점에서 다르다.
, , (feature map의 개수)으로 에 따라 1~6이 대입되어(일 때 일 때 ) 각 feature map마다 다른 scale()을 가지게 된다.
비율은 에 의해 정해진다. 예를 들어 인 경우 는 2:1의 비율을 가진다.
6개의 bounding boxes를 뽑을 때는 a_r의 5개 원소를 모두 사용하며, 추가적으로 더 작은 크기의 1:1 비율인 가 사용된다. 4개를 뽑을 때는 3과 1/3이 제외된다.
위 그림이 Default boxes에 대한 설명을 직관적으로 보여준다.
학습을 하기 위해서는 수많은 default box들이 각각 어떤 Ground Truth box에 대응되는지 매칭해주는 과정이 필요하다. 이 때 GT와의 IOU를 활용하며 0.5 이상인 박스들을 전부 positive로 분류한다. 반대로 IOU가 0.5 미만인 박스들은 배경이라고 생각을 하여 negative로 분류한다.
SSD의 loss function은 classification loss와 localization loss 합으로 이루어져있다. 는 둘의 가중치를 조절하는 값으로 디폴트 값은 1이다.
- : default box
- : 클래스
- : bbox의 좌표
- : GT의 좌표
- : 과 의 IOU가 0.5 이상인 박스의 수
smooth L1 loss는 다음과 같다.
Confidence Loss는 매칭된 박스와 매칭되지 않은 박스에 대해 모두 softmax loss를 구한다.
SSD의 default box는 8000여개나 되지만 실질적으로 우리가 인식하고자 하는 객체의 수는 10개도 안 되는 경우가 일반적이므로 대부분의 box들은 배경을 나타낸다. 따라서 배경 클래스에 대한 데이터만 과도하게 많은 imbalance 문제가 발생한다. 이를 해결하기 위해 SSD에서는 loss가 높은(background인데 background class라 판단하는 확률이 작은) 데이터만 sorting하여 positive data의 3배만 사용하는 기법을 쓴다.
결과 중에 눈에 띄었던 것은 작은 물체에 대한 성능이 유독 떨어진다는 것인데 추후에 나온 분석으로는 작은 물체를 첫 feature map에서 detect하기 때문이라고 한다. 이를 보완하기 위해 RetinaNet에서는 왕복하는 방식을 통해 작은 물체에 대한 성능을 높였다.
SSD에서는 augmentation을 통해 이와 같은 문제를 개선하였다. Random crop을 통해 "zoom in"하여 더 큰 객체의 데이터를 만들기도 하고 반대로 "zoom out"한 후 남는 공간은 평균 픽셀값으로 채워 작은 객체의 데이터를 만들기도 하였다. 그 외에도 randomly sample patch, horizontally flipped 등의 방법이 활용된다.
SSD 논문 좀 보려고 검색했는데 경준님 블로그가 나오네요! 덕분에 잘 보고가요!