이번 포스트에서 살펴볼 object detecion 알고리즘은 SSD (Single Shot Detector) 입니다. Region proposal networks 를 사용한 2-스테이지의 Faster-RCNN은 정확도가 매우 높지만 real-time 에 부적합한 7 FPS라는 매우 낮은 속도를 가지고, YOLO는 1-스테이지 detector 로서 속도가 45 FPS로 매우 높지만 정확도가 낮고 작은 물체를 잘 감지하지 못하는 단점이 있었습니다. SSD는 YOLO보다 빠르면서 Faster-RCNN 만큼 정확도를 높이는 다양한 테크닉을 사용하는데요 한번 살펴보도록 하겠습니다.
SSD
Figure 1은 YOLO와 SSD의 비교 그림입니다. SSD는 입력 이미지를 300을 사용하며 (SSD300), fully-connected layer 를 사용해 최종 layer feature map 에서 detection 을 수행하는 YOLO와 달리 VGG-16에서 추출한 feature 에 대해 다양한 해상도의 layer 로부터 detection 을 수행합니다.
Multi-scale feature maps
300x300 크기의 이미지에서 VGG-16을 거친 feature map 사이즈는 38x38x512 이며, 여기에 1x1 / 3x3-s2 convolution 을 지속적으로 수행하여 최종 1x1x256 feature map까지 유도합니다. SSD는 여기서 각 layer feature map에 대해 3x3 크기의 커널을 이용해 같은 크기면서 $k\cdot (c+4)$개의 채널을 가지는 feature map 을 추출합니다. 여기서 $c$는 클래스 개수, $k$는 각 그리드 별 bounding box 개수이고 각 bounding box 별 위치, 크기의 4개의 offset 이 포함되어 있습니다. 객체가 존재하는지의 여부가 confidence score 라는 별도의 채널로 존재하는 YOLO와 달리 SSD에서는 클래스 $c$에 'no obj' 라는 클래스로 포함시킵니다. (SSD 에서는 class "0"이 'no obj'가 됩니다.)
38x38 크기를 가진 Conv4_3 layer에 대해서는 3x3 convolution 결과 38x38x4x(21+4) 의 feature map이 되고 38x38x4=5776개의 bounding box 가 생성됩니다. 비슷하게 19x19 크기를 가진 Conv7 layer에 대해서 3x3 convolution 을 적용하고 그리드 당 6개의 bounding box 를 적용하여 19x19x6=2166개의 bounding box가 생성됩니다. 10x10 / 5x5 크기를 가진 Conv8_2 / 9_2 에 대해서도 그리드당 6개의 bounding box를 적용하고 3x3 / 1x1 크기를 가진 Conv10_2 / 11_2 에 대해서는 그리드당 4개의 bounding box를 적용하여 결과적으로 5776 + 2166 + 10x10x6 + 5x5x6 + 3x3x4 + 1x1x4 = 8732개의 bounding box를 생성합니다. 98개의 bounding box 만을 가진 YOLO v1을 생각해볼 때, bounding box 수가 매우 많습니다.
따라서 SSD는 6개의 layer 에 걸쳐 객체를 독립적으로 인식하는 multi-scale feature map 전략을 사용합니다. 이로 인해 맨 마지막 feature map 으로부터만 detection 을 진행하는 YOLO에 비해 다양한 스케일의 객체를 잘 탐지할 수 있습니다. 특히, CNN은 입력이 진행되면서 해상도가 낮아지고 lower layer (입력과 가까운 부분) 부분은 미시적인 정보, higher layer (입력과 먼 부분) 부분은 거시적인 정보를 담고 있으므로 Figure 3과 같이 낮은 해상도의 feature map은 큰 객체를, 큰 해상도의 feature map은 작은 객체를 포착하는데 사용합니다.
Default boundary box
그렇다면 boundary box는 어떻게 예측할까요? 만약 boundary box의 형태가 일정하다면, 예를 들어 위로 길쭉하다면 서있는 사람은 잘 잡겠지만 자동차 같은 경우는 예측하기 어려울 겁니다. 실제로 boundary box는 임의의 크기와 모양을 가지고 있습니다만 여러 물체에 대해서 몇 개의 크기로 군집화될 수 있습니다. (YOLO v2에서는 실제로 K-Means 를 수행해 prior anchor box를 잡습니다.) 따라서 SSD 에서는 각 layer 별, 그리드 별로 Figure 4와 같은 default boundary box를 상정합니다.
SSD는 multi-scale feature map을 사용하기 때문에 Conv4_3 부터 다른 스케일을 가진 default boundary box 를 사용합니다. (Equation 1) Equation 1의 $s_{min}, s_{max}$는 각각 0.2, 0.9로 Conv4_3 layer는 0.2의 스케일을 가지고 마지막 Conv11_2 layer는 0.9의 스케일을 가지게 됩니다. 이 스케일 값은 각 feature map 에서의 default box 크기의 입력 이미지 대비 비율로서 0.2 라면 입력 이미지 크기의 0.2 비율을 가진 작은 박스를 default box 로 설정하겠다는 의미입니다. 각 박스의 너비/높이는 $w_k^a = s_k \sqrt{a_r}, h_k^a=s_k/ \sqrt{a_r}$로 주어지며 aspect ratio $a_r=\{1,2,3,\frac{1}{2},\frac{1}{3}\}$으로 설정합니다. 여기에 부가적인 $s_k^{'}=\sqrt{s_k s_{k+1}}$ 스케일을 가진 $a_r=1$의 default box 까지 추가하여 feature map 그리드 당 6개의 default box 를 생성합니다. (그리드 당 박스 개수가 4개이면 $a_r=3, \frac{1}{3}$을 생략합니다.) 또한, feature map 에 대한 각 그리드 위치 $i, j$에 따라 default box의 중심점을 $(\frac{i+0.5}{|f_k|}, \frac{j+0.5}{|f_k|})$ 같이 설정합니다. ($|f_k|$는 feature map 크기)
Matching strategy
SSD는 ground-truth 박스와 0.5 이상의 IoU를 가지는 default boundary box 를 positive 샘플로 두고 그러지 못하는 박스를 negative 샘플로 설정하여 positive 샘플에 대해서만 localization 목적함수를 적용합니다. Figure 5에서와 같이 3개의 default box 가 존재한다고 했을 때, box 1, 2는 positive, 3은 negative 샘플이 됩니다. 특히, 하나의 ground-truth 박스에 대하여 여러 개의 default box를 positive 샘플로 할당함으로서 예측 결과가 다양해지고 훈련이 안정화되는 효과를 갖습니다.
Figure 6은 multi-scale feature map 과 default boundary box 가 서로 다른 크기, 비율의 객체에 대해 어떻게 동작하는지 나타냅니다. Figure 5의 개는 4x4 feature map 에서의 하나의 default box와 매칭되며, 고양이는 8x8 feature map 에서의 두 개의 default box와 매칭됩니다. 위에서 언급했던대로 큰 크기의 개는 작은 feature map에 할당되고 작은 크기의 고양이는 상대적으로 더 큰 feature map에 할당된 것을 볼 수 있습니다. 또한, 매우 작은 객체들은 Conv4_3 layer의 38x38 feature map이 감지해야하는데, 이 사이즈 또한 입력 사이즈 크기에 비해 매우 작으므로 작은 객체에 대해 검출이 잘 안되는 경우가 존재합니다. 따라서 추후에 입력의 크기를 512로 늘린 SSD512 모델에 대해서도 실험합니다.
Loss function
SSD의 목적함수는 Equation 2와 같이 localization loss와 confidence loss로 구성되며, $N$은 positive 샘플의 개수, $\alpha$는 localization loss의 가중치입니다.
Localization loss는 ground truth 박스와 예측 박스의 차이를 줄이는 loss로 positive 샘플에 대해서만 적용되며, Equation 3에서와 같이 예측 박스 $l$, gound truth 박스 $g$, default box $d$에 대해서 $g$에 대한 $d$의 offset을 예측하도록 동작합니다. $x, y$ 좌표값은 높이/너비로 나눠주고 높이와 너비는 로그를 씌어 정규화합니다.
Confidence loss는 클래스 예측을 위한 loss 항으로 Equation 4와 같이 모든 positive 샘플에 대해서는 해당 클래스에 대한 cross entropy 함수를 적용하고 negative 샘플에 대해서는 class 0 (no obj)에 대해서 loss 함수를 적용합니다.
Other training details
다른 object detection 알고리즘과 마찬가지로 negative 샘플 수는 positive에 비해 압도적으로 많아 자연스럽게 클래스 불균형 현상이 발생하게 되고 class 0 (no obj) 를 예측하는 항이 지나치게 강조됩니다. 따라서 SSD는 negative 샘플의 confidence loss가 큰 것부터 줄세워 positive 샘플 수와의 비율이 3:1이 되도록 조절합니다. 이 방법을 통해 더 빠르고 안정적인 훈련이 가능하다고 합니다.
또한, data augmentation 기법을 사용합니다. 각 훈련 데이터는 1) 원본 이미지 그대로 사용하거나, 2) 물체와 [0.1, 0.3, 0.5, 0.7, 0.9] 정도 겹치는 패치를 샘플링하거나, 3) 랜덤하게 샘플링하는 방법 중에 하나로 얻어지고 샘플링 시의 aspect ratio는 $\frac{1}{2}$와 2사이로 랜덤하게 정해집니다. 샘플링된 이후에는 원래 이미지로 resize 되면서 0.5의 확률로 horizontal flip / color distortion 이 적용됩니다. SSD300에 대해서 각 augmentation 에 따른 성능 추이는 Table 1과 같고, Data augmentation 기법이 성능 향상에 매우 중요함을 알 수 있습니다.
Experiment
PASCAL VOC 07+12 데이터셋에 훈련한 이후 VOC2007 테스트 데이터셋에 테스트한 결과는 Table 2와 같습니다. Faster-RCNN 보다 성능이 더 높을 뿐만 아니라 YOLO에 비해서는 압도적으로 높으면서 속도도 더 빠릅니다. (SSD300) 특히 512 입력 크기를 사용한 SSD512는 속도 측면에서 느리지만 성능이 더 좋은 것을 볼 수 있습니다.
SSD는 8732개의 박스를 예측하는데 대부분의 박스에는 물체가 존재하지 않으므로 confidence score가 0.01 미만인 것은 삭제합니다. 또한, NMS를 적용하여 같은 객체에 대한 중복 박스를 삭제하며 임계 IoU를 0.45로 설정합니다. 훈련 데이터셋을 다르게 했을 때의 VOC2012 테스트 데이터셋에 대한 결과는 Table 3과 같습니다.
Model analysis
Table 4는 data augmentation과 default box 수에 따른 성능 추이입니다. Table 1에서 보았듯이 data augmentation 에 따른 성능 향상이 제일 크며 박스 수에 따라서도 성능이 향상됨을 보입니다.
Table 5는 multi-scale feature map 에서 layer 포함 여부에 따른 성능 추이로 공평한 비교를 위해 레이어를 제거할 때마다 박스 수를 동일하게 유지한 것입니다. 예측에 포함되는 레이어의 수가 늘어나면 성능이 증가하지만 conv_7 하나의 layer 만으로 훈련했을 때 성능이 제일 낮으며 이는 하나의 스케일이 아닌 여러 개의 스케일에 따른 예측을 해야함을 나타냅니다. 마지막으로 conv11_2 레이어를 포함시켰을 때 성능이 약간 감소하는데, 이는 박스 수가 오히려 줄어 큰 물체를 포착하는 큰 박스가 충분히 없기 때문이라 추정됩니다.
홍머스 정리
- SSD는 작은 물체에 대하여 Faster-RCNN에 비해 성능이 안 좋은데 이는 고해상도 feature map 에서 작은 물체를 포착하여야 하지만 고해상도 자체가 입력 이미지 크기에 비해 작고 지나친 low-level feature 를 포함하기 때문이라고 추정됨. 단, $s_{min}$을 0.15정도로 더 낮게 시작하면 성능 향상이 가능할 듯.
- 입력 사이즈가 커지고 boundary box 수에 따라 성능은 증가하지만 속도가 낮아짐.
- 목적함수가 실질적으로 ground-truth 박스 대신 default boundary 박스를 예측하므로 훈련 자체는 더 안정적일 수 있지만 조금 더 좋은 default boundary 박스 설계가 요구됨.
- Faster-RCNN에 비해 classification 에러가 높은데, 이는 하나의 boundary box가 여러 개의 클래스 예측에 사용되기 때문이라고 추정됨.
참조
'Machine Learning Tasks > Object Detection' 카테고리의 다른 글
Object Detection - YOLO v3 Pytorch 구현 (2) (0) | 2021.06.11 |
---|---|
Object Detection - YOLO v3 Pytorch 구현 (1) (0) | 2021.06.11 |
Object Detection - DIoU, CIoU (0) | 2021.06.07 |
Object Detection - YOLO v3 (2) | 2021.06.03 |
Object Detection - YOLO v2 (0) | 2021.06.01 |