☞ 문서의 내용은 가장 하단 참고문헌 및 사이트를 참고하여 필자가 보기 쉽도록 정리한 내용입니다.
☞ 틀린 내용 및 저작권 관련 문의가 있는 경우 문의하시면 수정 및 삭제 조치하겠습니다.
Yolo의 문제는 입력 이미지를 nxn 크기의 그리드로 나누고, 각 그리드 별로 Bounding box 예측을 진행하여 그리드 보다 크기가 작은 물체는 잡아내지 못하는 문제가 있다. 또한 신경망을 모두 통과하면서 Convolution과 pooling을 거쳐 coarse한 정보만 남은 마지막 단 feature map만 사용하기 때문에 정확도에 한계가 있다. 이에 SSD는 이전 네트워크의 장점을 모아 yolo의 한계점을 극복한다. 쉽게 이야기 하면 Fully convolutional Network에서 처럼 앞단 Convolution feature map을 가져와 사용하여 detail을 잡아내고 Faster R-CNN의 anchor 개념을 가져와 다양한 형태의 objecte들을 잡아낼 수 있도록 한다.
SSD는 여러 feature map에 convolutional filter를 사용하여 Bounding box offset(위치 좌표 x, y와 w,h 너비와 높이)과 class score(사물들이 어떤 class인지 나타내는 점수)를 반환한다. Bounding Box의 offset은 사전에 정의한 default box에 대한 offset이며, default box는 다양한 크기(sclae)와 종횡비(aspect ratio)로 설정한다. 여러 feature map에서 반환된 Bounding box는 한 곳에 모여 non-maximum supression을 거쳐 최종 Bounding box를 선별한다.
SSD는 300x300크기의 이미지를 입력받아 Image net으로 pretrained된 VGG-16모델을 가져와 Conv4_3층까지 통과하며 feature를 추출한다. 여기서 Conv4_3까지를 base network라고 한다.
basenetwork 이후 feature map에서 3x3 conv filter를 이용해 Bounding box의 class score와 offset을 얻게된다. 이때 추출되는 feature map은 그 다음 층에 넘겨주는 동시에 Object Detection을 수행한다. (3 x 3 x bouding box 개수 x (class score x offset))이고 stride = 1, padding =1이라고 할 때 6개의 feature map에서 예측된 bouding box는 8732개이다. 38x38, 19x19, 10x10, 5x5, 3x3, 1x1 feature map에서 bouding box를 예측하므로 다양한 크기의 객체를 검출할 수 있다.
8732개의 Bounding Box의 output이 나온다고 해서 그것을 다 고려하지 않는다. 각 feature map당 다른 scale을 적용해 Default box간의 IOU를 계산한 다음 미리 0.5이상이 되는 box들만 1로 고려 대상에 포함시키고 나머지 0으로 만들어버려 위와 같이 3개의 feature map에서만 box가 detect될 수 있다. 그리고 Non-Max-Suppression을 적용하여 최종으로 Bounding box를 선택한다.
Default boxes and aspect ratios
Convolution 중간에 5x5x256크기의 feature map을 대상으로 Object Detection을 수행한다고 가정할 때 5x5는 그리드 크기에 해당한다. 하나의 그리드 마다 크기가 각기 다른 Default Box들을 먼저 계산한다. Default Box란 Faster R-CNN에서 Anchor의 개념으로 비율과 크기가 각기 다른 Box를 먼저 설정해 놓아서 Bounding Box를 추론하는데 도움을 주는 장치이다.
Default Box는 각 셀당 6개이다. 이때 default box의 w,h는 feature map의 scale에 따라 서로 다른 s값과 서로 다른 aspect ratio인 a값을 이용해 도출된다. 또 default box의 cx와 cy는 feature map size와 index에 따라 결정된다.
아래 그림을 보면 고양이는 강아지 보다 작으며 강아지는 고양이보다 크다. 높은 해상도의 feature map에서는 작은 물체를 잘 잡아낼 수 있고, 낮은 해상도에서는 큰 물체를 잘 잡아낼 수 있다. SSD는 각각의 feature map을 가져와 비율과 크기가 각기 다른 Default box를 투영한다. 그리고 이렇게 찾아낸 Box들에 Bounding box regression를 적용하고 Confidence Level을 계산한다.
Predicted Box는 Extra Network의 5x5의 feature map에서 output(predicted box)를 위해 conv 연산을 하면 총 5x5 ( 6x (21 +4)의 값이 형성된다. ( = gride cell x gride cell x (of bb x (class + offset))
default box와 ground truth box간의 IOU를 계산해 0.5 이상인 값들은 1(positive), 아닌 값들은 0으로 할당한다. 예를 들어, 아래 그림과 같이 5x5 feature map의 13번째 셀(가운데)에서 총 6개의 default box와 predicted bounding box가 있는데, 같은 순서로 매칭되어 loss를 계산한다. 이는 아래의 loss function을 보면 더 쉽게 이해할 수 있을 것이다. 어쨋든, 매칭된( x= 1, positive) default box와 같은 순서의 predited bounding box 대해서만 offset에 대한 loss를 고려한다.
빨간색 점선이 matching된 default box라고 한다면, 거기에 해당하는 cell의 같은 순서의 predicted bounding box의 offset만 update되고 최종적으로는 아래와 같이 predict된다.
loss function
앞 부분은 confidence loss로 class에 대한 loss를 계산한다. 뒷 부분은 localization loss로 Bounding box offset에 대한 loss를 계산한다. N은 매칭된 default box와 ground truth box수를 나타내며 는 1입니다.
$x^p_{ij}$는 i번째 default box와 j번째 ground truth box사이 IoU가 0.5 이상이되어 서로 매칭된 것을 나타낸다. 즉, $x^p_{ij}$기호가 들어가 있으면, 매칭된 것들에 대해서만 loss를 계산한다. 앞 부분은 default box에 object가 있는 경우, default box와 ground box의 cross entrophy loss를 계산한다. i는 defualt box, j는 ground truth box를 의미한다. 뒷 부분은 defualt box에 물체가 없다고 예측했지만, 실제로 물체가 있는 경우의 loss를 계산한다.
localization loss를 계산한다. $\hat{g}$은 ground truth box와 default box 사이의 offset이다. cx, cy, w, h에 해당하는 $\hat{g}$를 계산하고, 예측값인 l에 값을 빼주어 smooth L1 loss를 계산한다. 각 $\hat{g}$는 정규화하여 0에서 1의 값을 갖는다.
smmothL1은 Fast R-CNN논문에 나와있는 수식이다.
Choosing scales and aspect ratios for defaults boxes
각 Feature map에 대한 Default box의 크기는 다음과 같이 계산한다. s_min은 0.2, s_max는 0.9이며 위의 수식은 큰 의미 없고 min과 max를 잡은 다음 그 사이를 m값에 따라서 scale의 구간을 나누어 주는 값이다. m=6으로 설정했을 때의 결과는 [0.2, 0.34, 0.48, 0.62, 0.76, 0.9]가 된다.
이 값은 각각의 feature map에서 default box의 크기를 계산할 때 입력 이미지의 너비, 높이에 대해서 얼마나 큰 지를 나타내는 값이다. 즉, 첫 번째 feature map에서는 input 이미지의 크기의 0.2비율을 가진 박스를 default box로 놓고 마지막 feature map에는 0.9와 같이 큰 default box를 놓겠다는 의미이다.
aspect ratio(종횡비)도 설정한다. {1,2,3,1/2,1/3}으로 설정 했다면, 이 종횡비는 default box의 넓이에 루트를 씌워 곱해주고 높이에는 루트를 씌워 나눔으로써 종횡비를 유지한다.
예를 들어 k = 3 즉 3번째 feature map의 default box들의 width와 height를 구현해보겠다. 앞서 우리는 scale 값을 구했으며 , k=3일 때의 값은 0.48이다. 주어진 공식에 맞게 쭉쭉 계산을 해보면 아래와 같은 값을 구 할 수 있다.
입력 이미지에서 default box가 위치할 중심점을 구해보자. 이에 대한 수식은 아래와 같다. fk는 feature map의 가로 세로 크기이다. 즉 m x n 크기의 feaure map의 중심점을 구한 것으로 1x1 크기의 feaure map의 중심점은 0.5, 0.5이다. 이를 한 칸씩 index를 옮겨가면서 계산을 해주는 작업으로 fk가 25라 가정했을 때 아래와 같은 결과를 얻을 수 있다. 구해준 중심점 좌표들에 원래의 입력이미지 크기를 곱해서 중심점을 구하고, 각각의 중심점마다 defualt box를 그려주면된다. 이 작업을 시각화 하면 아래와 같다.