YOLO v1 모델
v2 → VGG 모델을 튜닝해서 사용했습니다. VGG모델은 그 당시 최고의 모델 중 하나로써 지금까지 사용이 많이 되고 있으며 많은 모델의 기반이 됩니다.
VGG의 컨셉은 ‘깊게 가보자’입니다.
당시 많은 연구자들이 했던 연구들 중에 뭐가 있었냐면 깊을수록 성능이 좋다는 인식이 있었습니다.
일반적으로 모델이 깊어지면 속도는 느려지지만, 성능은 좋아진다는 일반적인 견해때문에 일단 깊게 가보는 것입니다.
VGG 연구자들이 아래의 실험 테이블을 만들어서 모델을 연구했는데 , 성능이 개선되었음을 확인할 수 있습니다.
그래서 VGG를 기반으로 한 모델을 만들건데, 작은 테크닉을 적용합니다.
VGG는 conv을 그냥 사용합니다. convolutional operator의 연산은 어떻게 진행되죠?
3x3 filter가 있다고 했을 때, 이미지의 국소적인 부분을 filter로 봤었죠.
Convolutional 연산은 linear convolution으로 이루어져 있었습니다.
그 다음 feature map의 첫번째 연산은 이미지의 각 픽셀이 갖는 값과 filter의 값으로 linear combination을 통해 계산했습니다. 각 위치에 해당하는 값끼리 곱한 뒤에 더해서 계산했죠?
여기서는 조금 더 성능을 높이기 위해서 Convolution 네트워크 안에 Network in Network 기술을 사용한 것입니다. 말 그대로 네트워크 안에 네트워크를 한 번 더 넣는건데요, Convolution 연산 후에 일차결합을 하지 않고 중간에 MLP 연산을 넣는거예요.
VGG와 유사하게 3x3 필터를 사용
Max Pooling 후 채널을 2배씩 늘림
Batch Normalization 사용
FC 삭제 - Global average pooling으로 대체
NIN 적용
Darknet19
yolo v2 모델은 VGG를 기반으로 했기 때문에, deep하게 형성되어 있고, 블록들이 유사하게 구성되어 있습니다 ( Convoutional ).
VGG기반인 NIN(Network in Network) 기술이 적용된 네트워크를 Darknet19이라고 부르기로 했습니다. Conv layer가 19개 maxpooling이 5개 입니다. 그래서 Darknet’19’라는 이름으로 불리게 되었습니다.
3x3 , 1x1 을 섞어서 쓰는 저런 조합은 메모리를 효율적으로 사용하는 방법입니다. 아주 많이 쓰는 구조 중 하나이죠. 그리고 채널 수를 마음대로 바꿀 수 있는 것이 장점입니다.
512에서 256으로 바꿨다가 다시 512로 바꿔주네요. 이미지 사이즈는 유지한채 연산량을 한 번 더 늘려서 계산할 수 있는데, 효율적인 연산을 위해서 채널 수도 조정할 수 있습니다.
초반에는 ImageNet으로 훈련을 하기 때문에 Conv 연산의 filter가 1000개로 세팅이 되어있는 것을 보실 수 있습니다. 채널 수가 마지막의 크기이기 때문에 7 x 7 x 1000 를 GAP(Global Average Pooling)을 시행하면 1000 x 1 짜리 벡터가 하나 나오는거죠.
Polynomial learning rate decay는 논문에서 레퍼런스를 찾을 수 없습니다.
찾아본 내용을 바탕으로 적어보겠습니다.
일반적으로 learning rate ( as lr ) 은 epoch이 커지면 작게 설정하게 되어있습니다.
polynomial 함수를 하나 그려서 아래의 그래프 처럼 lr을 줄여가면서 학습을 진행하겠다는 것이죠.
그래서 몇 승을 쓰느냐에 따라서 저렇게 색깔별로 다양한 그래프가 나올 수 있습니다.
각 epoch마다 진행되기 때문에 아래의 식에서 ‘t / T’ = epoch에 대한 정보가 들어있습니다.
→ 스케줄링 기법 중 하나
앞서 봤듯이 , low level에서 만든 feature map과 high level에서 만든 feature map의 사이즈가 다르잖아요 ? 그래서 그 사이즈를 보면
마지막 전 단계의 feature map의 사이즈는 n x n x k 입니다. 그리고 우리가 가지고 온 feature map의 사이즈가 2n x 2n x m 사이즈입니다.
이 둘을 붙여야하는데 사이즈가 다르기 때문에
conv13을 4등분을 해줍니다. 각각 4등분에 대한 크기는 n x n x m 입니다.
4등분한 요소들을 일렬로 붙이면 크기는 n x n x 4m이 되죠 ?
그러면 우리가 붙여야 하는 feature map의 사이즈 ( n x n x k )와 동일한 사이즈를 얻을 수 있습니다.
이제 이걸 뒤에 붙이면 됩니다. 그래서 마지막 conv layer에 들어갈 input 값이 n x n x ( k + 4m )이 되는 것입니다.
CNN은 일반적으로 low level ( 앞 부분의 layer ) 에서는 작은 패턴이나 색상이나 질감이 잘 포착된다고 하구요, high level에서는 객체의 형상을 본다고 합니다. 큰 이미지 shape을 본다는 것이죠.
아래의 그림은 activation maximization 기술을 사용해서 만든 그림인데, 이게 뭐냐면
각 layer의 filter가 최대 활성화가 되기 위한 이미지는 어떤 이미지를 필요로 할지에 대해 생각해 봤을 때, pre-trained 된 모델의 filter를 고정한 채 이미지를 최적화하여 이 filter가 가장 활성화 되는 이미지를 찾는 기술이에요.
만약에 이게 이해가 잘 안간다면, low level 딴에서는 color, 자동 개체, texture 이 정도를 본다! 는 정도만 알고 있으면 되고 high level에서는 object shape을 본다! 라는 것 정도 알고 계시면 좋을 것 같습니다.
아래의 그림을 보면 conv이 깊어질수록 작은 형상들이 나오기 시작합니다.
color나 texture에서 점점 눈, 코와 같은 구체적인 object shape이 뚜렷해지네요 !
passthrough layer를 사용할 경우 high level에서 low level을 사용할 수 있다는 장점이 있습니다.
이런 background가 있다는 것만 알고 계시면 될 것 같습니다 :)
Batch Normalization ( 배치 정규화 )는 수렴 속도를 빠르게 하고 정규화 효과가 있는 것으로 알려져있죠. 일반적으로 conv 뒤에 사용하고 Feature map의 결과를 정규화해서 항상 동일 분포위에 있도록 하는 방법입니다. 각각의 Batch에서 들어오는 평균과 분산을 구하구요 그 평균과 분산을 바탕으로 정규화를 진행합니다.
분산이 너무 작은 경우에 분모가 0이 되는 것을 방지하고자 입실론(작은 값)을 더해줬고, 정규화를 스케일링 ( 감마를 곱해주고, 베타를 더함 ) 해줬습니다. 여기서 감마랑 베타도 학습이 가능한 파라미터입니다. 따라서 Batch Norm도 학습이 되는 것이죠.
평가를 할 때는 학습 시에 학습을 했던 각 batch마다의 평균을 이용해서 평균을 정의했고
마찬가지로 표준편차도 batch마다 계산되었던 표준편차를 이용해서 평균으로 표준편차를 정의했습니다.
그래서 그 둘을 바탕으로 Batch Norm을 적용을 시켰네요.
결과를 확인해보면 2-stage 모델인 Faster R-CNN 모델보다는 mAP가 낮지만
YOLO v1 보다는 mAP와 FPS 모두 월등히 높은 것을 확인할 수 있습니다.
입력 이미지 사이즈를 높였더니 2-stage 모델보다 성능이 높아졌네요.
버전2에서 성능이 상당히 높게 개선되었다는 것을 볼 수 있겠네요.
Anchor Boxes - Dimension Clusters
coco데이터와 VOC 데이터에 대한 결과입니다.
클러스터링의 개수가 많을수록 ( bbox의 개수가 많을수록 ) IoU가 올라가는 모습을 볼 수 있습니다.
시그모이드를 사용하여 예측 !
YOLOv2 의 모델은 mAP와 FPS 모두 크게 향상 !!
이 부분은 기존에 사용하지 않았던 다양한 기술들을 yolo v2에서 사용했음을 보여주네요.
여기서 yolov2 논문 리뷰를 마치도록 하겠습니다 ! :)
yolov2는 따로 scratch에서 구현해보지 않을 계획이며 v3나 v5에서 따로 구현하는 연습을 할까합니다. 그래도 yolov2는 v1과 굉장히 많은 차이가 있는 모델이므로 꼭 공부해보시면 좋겠네요 !