일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- R-CNN
- herbwood
- Anchor box
- Detection Transformer
- Faster R-CNN
- Darknet
- BiFPN
- hard negative mining
- AP
- Map
- fine tune AlexNet
- Object Detection metric
- detr
- mean Average Precision
- Linear SVM
- RPN
- Fast R-CNN
- Region proposal Network
- IOU
- multi task loss
- Average Precision
- pytorch
- Multi-task loss
- RoI pooling
- object queries
- Bounding box regressor
- Hungarian algorithm
- Non maximum suppression
- Object Detection
- YOLO
- Today
- Total
약초의 숲으로 놀러오세요
SSD 논문(SSD: Single Shot MultiBox Detector) 리뷰 본문
SSD 논문(SSD: Single Shot MultiBox Detector) 리뷰
herbwood 2021. 1. 1. 17:51이번 포스팅에서는 SSD 논문(SSD: Single Shot MultiBox Detector)을 읽고 정리해봤습니다. RCNN 계열의 2-stage detector는 region proposals와 같은 다양한 view를 모델에 제공하여 높은 정확도를 보여주고 있습니다. 하지만 region proposals를 추출하고 이를 처리하는 과정에서 많은 시간이 걸려 detection 속도가 느리다는 단점이 있습니다. 반면 YOLO v1은 원본 이미지 전체를 통합된 네트워크로 처리하기 때문에 detection 속도가 매우 빠릅니다. 반면 grid cell별로 2개의 bounding box만을 선택하여 상대적으로 적은 view를 모델에 제공하여 정확도가 떨어집니다. 이처럼 일반적으로 정확도와 detection 속도는 trade-off의 관계에 있습니다. 하지만 SSD는 다양한 view를 활용하면서 통합된 network 구조를 가진 1-stage detector로서 높은 정확도와 빠른 속도라는 두 마리 토끼🐰를 잡았습니다.
Preview
SSD 모델은 VGG16을 base network로 사용하고 보조 network(auxiliary network)를 추가한 구조를 가지고 있습니다. 두 network를 연결하는 과정에서 fc layer를 conv layer로 대체하면서 detection 속도가 향상됩니다. SSD 모델은 Convolutional Network 중간의 conv layer에서 얻은 feature map을 포함시켜, 총 6개의 서로 다른 scale의 feature map을 예측에 사용합니다. 또한 feature map의 각 cell마다 서로 다른 scale과 aspect ratio를 가진 bounding box인 default box를 사용하여 객체의 위치를 추정합니다.
Main Ideas
1) Multiscale feature maps
SSD 모델은 YOLO v1 모델과 마찬가지로 하나의 통합된 네트워크로 detection을 수행하는 1-stage detector입니다. 전체 network는 pretrained된 VGG16을 base network로 사용하고, 이후 보조(auxiliary) network를 추가한 구조를 가지고 있습니다. 보조 network는 일반적인 conv layer로 구성되어 있습니다. base network 후반부에 등장하는 fc layer를 conv layer로 바꿔줘 보조 network와 연결합니다. 이 과정에서 fc layer가 제거되면서 detection 속도가 향상되는 이점도 있습니다. 전체 network는 일반 convolutional network와 크게 다르지 않습니다.
하지만 SSD 모델의 핵심적인 아이디어는 다양한 scale의 feature map을 사용한다는 점입니다. 기존의 모델은 convolutional network를 거친 단일한 scale을 가진 feature map을 detection을 위해 사용했습니다. YOLO v1 모델의 경우 7x7(x30) 크기의 feature map만을 사용했습니다. 하지만 이처럼 단일한 scale의 feature map을 사용할 경우, 다양한 크기의 객체를 포착하는 것이 어렵다는 단점이 있습니다. 이러한 문제를 해결하기 위해 논문의 저자는 SSD network 중간에 존재하는 conv layer의 feature map들을 추출하여 detection 시 사용하는 방법을 제안합니다.
위의 그림을 보면서 feature map을 추출하는 conv layer와 추출한 feature map을 살펴보도록 하겠습니다. 입력 이미지의 크기는 300x300입니다. 먼저 base network conv4_3 layer에서 38x38x(512) 크기의 feature map을 추출합니다. 그 다음 base network의 conv7 layer에서 19x19x(1024) 크기의 feature map을 추출합니다. 다음으로 auxiliary network의 conv8_2, conv9_2, conv10_2, conv11_2 layer에서 각각 10x10x(512), 5x5x(256), 3x3x(256), 1x1x(256) 크기의 feature map을 추출합니다. 이같은 과정을 통해 총 6개의 scale을 가진 feature map을 얻을 수 있습니다. 이를 통해 다양한 scale의 feature map(Multiscale feature maps)을 사용하여 보다 다양한 크기의 객체를 탐지하는 것이 가능해집니다.
2) Default boxes
논문의 저자는 원본 이미지에서 보다 다양한 크기의 객체를 탐지하기 위해 feature map의 각 cell마다 서로 다른 scale과 aspect ratio(가로세로비)를 가진 Default box를 생성합니다. Default box는 Faster R-CNN 모델에서 사용하는 anchor box와 개념적으로 유사합니다. 하지만 논문의 저자는 서로 다른 크기의 feature map에 적용한다는 점에서 차이가 있다고 언급합니다. SSD 모델은 38x38, 19x19, 10x10, 5x5, 3x3, 1x1 총 6개의 scale의 feature map의 각 cell마다 default box를 생성합니다.
Default box의 scale = $s_k$입니다. 여기서 $s_k$는 원본 이미지에 대한 비율을 의미합니다. 예를 들어 원본 이미지의 크기가 300x300이며, $s=0.1$이며 aspect ratio가 1:1일 때, default box의 크기는 30x30(=300x0.1 x 300x0.1)입니다. 각 feature map별로 적용할 default box의 scale을 구하는 공식은 다음과 같습니다.
$$s_k = s_{min} + {{s_{max} - s_{min}} \over {m-1}} (k-1), k \in [1, m]$$
- $s_{min}$ = 0.2
- $s_{max}$ = 0.9
- m : 예측에 사용할 feature map의 수, SSD 모델일 경우 $m=6$
aspect ratio인 $a_r \in [1, 2, 3, 1/2, 1/3]$이며, default box의 너비 $w$$w_k^a = s_k \sqrt {a_r}$이며, 높이는 $h_k^a = s_k / \sqrt {a_r}$입니다. 논문의 저자는 aspect ratio가 1:1인 경우 scale이 $s'_k = \sqrt {s_k s_{k+1}}$인 default box를 추가적으로 사용한다고 합니다.
첫 번째 feature map(크기가 38x38)의 $s_k = 0.2$이며, 두 번째 feature map은 $k=2$이기 때문에 $s_k=0.34$입니다. 마지막 feature map(크기가 1x1)의 경우 $s_k=0.9$입니다. 즉 feature map의 scale이 작아질수록 default box의 scale은 커집니다. 이는 위에 그림에서 볼 수 있듯이 feature map의 크기가 작아질수록 더 큰 객체를 탐지할 수 있음을 의미합니다.
3) Predictions
각각의 feature map은 서로 다른 수의 default box를 적용합니다. 첫 번째(38x38)와 마지막(1x1) feature map은 aspect ratio가 1:1, 1:2, 1:1/2인 box와 aspect ratio가 1:1일 때 추가적으로 사용하는 box까지 총 4개의 default box를 적용합니다. 이는 feature map의 각 cell마다 4개의 default box가 생성됨을 의미합니다. 나머지 4개의 feature map은 위에서 언급한 6개의 default box를 모두 적용합니다. 총 서로 다른 scale의 feature map에 맞는 default box를 적용한 경우 총 default box의 수는 8732(=38x38x4 + 19x19x6 + 10x10x6 + 5x5x6 + 3x3x6 + 1x1x4)개입니다.
최종 예측을 위해 서로 다른 scale의 feature map을 추출한 후 3x3(stride=1, padding=1) conv 연산을 적용합니다. 이 때 default box의 수를 $k$, 예측하려는 class의 수를 $c$라고 할 때, output feature map의 channel 수는 $k(4 + c)$가 되도록 설계합니다. 이는 각 feature map의 cell이 $k$개의 default box를 생성하고 각 box마다 4개의 offset과 class score를 예측한다는 것을 의미합니다.
SSD 모델은 예측하려는 class의 수가 20개인 PASCAL VOC 데이터셋을 사용해 학습을 진행합니다. 따라서 class의 수는 배경을 포함하여 $c=21$입니다. 예를 들어 5x5(x256) 크기의 feature map을 추출할 경우 $k=6$, $c=21$이므로 conv 연산을 적용한 output feature map의 크기는 5x5x6x(4+21)입니다. 위의 그림을 보고 각 channel별로 함축한 정보를 확인하시면 좋을 것 같습니다(직접 그렸습니다🤣)
4) Matching strategy
학습을 진행할 때 default box의 학습 대상을 지정하기 위해 어떤 default box가 어떤 ground truth box와 대응하는지 결정해야 합니다. 이를 위해 default box와 ground truth box를 매칭하는 작업이 필요합니다. 먼저 ground truth box와 가장 큰 jaccard overlap(IoU와 같습니다)를 가지는 box와 jaccard overlap이 0.5 이상인 box는 모두 positive로 label합니다. 반대로 ground truth box와 0.5 미만의 jaccard overlap을 가지는 box는 negative로 label합니다.
하지만 일반적으로 이미지 내에서 배경(background)에 해당하는 box가 많기 때문에 negative sample의 수가 positive sample의 수보다 훨씬 많습니다. 이로 인해 클래스 불균형(class imabalance) 문제가 발생합니다. 논문의 저자는 이를 해결하기 위해 높은 confidence loss를 가진 sample을 추가하는 hard negative mining을 수행합니다. hard negative mining에 대한 설명은 R-CNN 논문 리뷰와 OHEM 논문 리뷰를 참고하시기 바랍니다. 이 때 positive/negative sample의 비율은 1:3이 되도록 합니다.
5) Loss function
$L(x, c, l, g) = {1 \over N} (L_{conf}(x, c) + \alpha L_{loc}(x, l, g)) $
SSD 모델의 loss function은 confidence loss인 $L_{conf}$와 localization loss인 $L_{loc}$의 합으로 구성되어 있습니다. $\alpha$는 두 loss 사이의 가중치를 조절하는 balancing parameter로 디폴트값으로 $\alpha=1$을 사용합니다. $N$은 ground truth box와 매칭된 default box의 수입니다. 만약 $N=0$이라면 loss는 0이 됩니다.
$L_{loc}(x, l, g) = \sum_{i \in Pos}^N \sum_{m \in {cx, cy, w, h}} x_{ij}^k smooth_{L1}(l_i^m - \hat{g_j^m})$
localization loss는 Faster R-CNN 모델과 마찬가지로 default box의 중심 좌표 (cx, cy)와 너비와 높이 (w, h)를 사용하여 smooth L1 loss를 통해 구합니다. 여기서 $l$은 예측한 box의 파라미터(여기선 좌표), $g$는 ground truth box의 파라미터(여기선 좌표)를 의미합니다. $x_{ij}^k$는 $i$번째 default box와 class가 $k$인 $j$번째 ground truth box와의 매칭 여부를 알려주는 indicator parameter로, 매칭될 경우 1, 그렇지 않을 경우 0을 가집니다.
$L_{conf}(x, c) = - \sum_{i \in Pos}^N x_{ij}^p log(\hat{c_i^p}) - \sum_{i \in Neg} log(\hat{c_i^0}) \ where \ \hat{c_i^p} = {{exp(c_i^p)} \over {\sum_p exp(c_i^p)}}$
confidence loss는 모든 class에 대한 loss를 softmax loss를 통해 계산합니다.
Training SSD
1) 전체 Network 구성하기(base network + auxiliary network)
학습을 위해 base network와 auxiliary network를 합쳐 전체 네트워크를 구성합니다. pre-trained된 VGG16 모델을 불러와 마지막 2개의 fc layer를 conv layer로 대체합니다. 이후 최종 output feature map의 크기가 1x1이 되도록 auxiliary network를 설계합니다.
2) 이미지 입력 및 서로 다른 scale의 feature map 얻기
SSD network에 300x300 크기의 이미지를 입력합니다. 이후 전체 network 구간 중 conv4_3, conv7, conv8_2, conv9_2, conv10_2, conv11_2 layer에서 각각 feature map을 추출합니다.
- Input : 300x300 sized imaeg
- Process : feature map extraction
- Output
- 38x38(x512) sized feature map
- 19x19(x1024) sized feature map
- 10x10(x512) sized feature map
- 5x5(x256) sized feature map
- 3x3(x256) sized feature map
- 1x1(x256) sized feature map
3) 서로 다른 scale의 feature map에 conv 연산 적용하기
앞의 과정에서 얻은 서로 다른 scale의 feature map에 3x3 conv(stride=1, padding=1) 연산을 적용합니다. 이 때 각 feature map마다 서로 다른 수의 default box를 사용함에 주의해야 합니다.
- Input : 6 feature maps
- Process : 3x3 conv(stride=1, padding=1)
- Output
- 38x38(x4x(21+4)) sized feature map
- 19x19(x6x(21+4)) sized feature map
- 10x10(x6x(21+4)) sized feature map
- 5x5(x6x(21+4)) sized feature map
- 3x3(x6x(21+4)) sized feature map
- 1x1(x4x(21+4)) sized feature map
4) 전체 feature map 병합하기
3)번 과정에서 얻은 모든 feature map을 8732 x (21+4) 크기로 병합합니다. 이를 통해 default box별로 bounding box offset 값과 class score를 파악할 수 있습니다.
- Input : 6 feature maps
- Process : merge feature maps
- Output : 8732 x (21+4) sized feature map
5) loss function을 통해 SSD network 학습시키기
위에서 얻은 feature map과 ground truth 정보를 활용하여 localization loss를 계산합니다. 이후 negative sample에 대하여 Cross entropy loss를 구한 후 loss에 따라 내림차순으로 정렬합니다. 그 다음 negative sample에서 loss가 높은 순으로 positive sample의 3배만큼의 수를 추출합니다. 이러한 hard negative mining 과정을 통해 얻은 hard negative sample과 positive sample을 사용하여 confidence loss를 계산합니다. 앞서 얻은 localization loss와 confidence loss를 더해 최종 loss를 구한 후 backward pass를 수행하여 network를 학습시킵니다.
Detection
SSD 모델은 detection 시, 마지막 예측에 대하여 Non maximum suppression을 수행합니다. 이를 통해 겹치는 default box를 적절하게 제거하여 정확도를 높혔습니다. Non maximum suppression에 대한 자세한 설명은 R-CNN 논문 리뷰를 참고하시기 바랍니다.
SSD 모델은 다양한 scale의 feature map에 다양한 scale과 aspect ratio를 가진 default box를 생성하여 다양한 크기를 가진 객체를 포착했습니다. 또한 전체 network가 분리되어 있지 않아 빠른 속도의 detection이 가능합니다. PASCAL VOC 데이터셋으로 시험했을 때, Faster R-CNN 모델은 7FPS, mAP=73.2%, YOLO v1 모델은 45FPS, mAP=63.4%의 성능을 보인 반면 SSD 모델은 59FPS, mAP=74.3%라는 놀라운 속도와 detection 정확도를 보였습니다.
논문이 친절하게 설명하지 않아서 이해하는데 애를 먹었던 것 같습니다😭. 드문드문 기존 모델의 아이디어를 적절하게 녹여낸 부분들이 보여 어느 정도 이해할 수 있습니다. 다음 포스팅에서는 R-FCN 논문을 읽고 리뷰해도록 하겠습니다.
Reference
SSD 논문(SSD: Single Shot MultiBox Detector)
sgrvinod님의 github repository(SSD 구현 코드)
OHEM 논문 리뷰(hard negative mining 설명)
R-CNN 논문 리뷰(hard negative mining, Non maximum suppression 설명)