안녕하세요~
이번글에서는 YOLO V1을 업그레이드한 버전인 YOLO V2에 대해서 알아보도록 할거에요.
YOLO V2 논문에서는 YOLO V1을 3가지 측면에서 업그레이드 시켜서 논문 제목을 Better, Faster, Stronger이라고 지었는데요. 이번에는 Motivation을 따로 나누지 않고 3가지 측면을 통해 어떤 motivation이 있었고 어떠한 방법으로 해결했는지 알아보도록할거에요!
<1. Better>
YOLO V1이 이전 object detection 모델보다 속도는 굉장히 빨라졌음에도 불구하고 정확성(mAP)측면에서는 다소 아쉬움을 나타내고 있었어요. 특히 recall과 localization 성능이 낮았다라고 언급하고 있는데요. Recall이 낮았다는 말은 7x7x2 개의 bounding box에서 객체를 찾는것이 어려웠다는 뜻이고 (recall에 대한 설명은 여기 링크를 참고해주세요), Faster RCNN에서 생성하는 bounding box개수가 현저히 적기때문에 recall 성능도 낮을 수 밖에 없었어요.
논문에 언급한 "Better"의 의미는 YOLO V1보다 정확성(mAP)가 더 좋아졌다는 뜻으로 쓰였는데, 어떤 방법들을 이용해 recall과 localization 성능을 높였는지 알아보도록 할게요.
1) Batch Normaliation
YOLO V1에서 사용되고 있는 convolution layer에 모두 batch normalization을 적용시켜 mAP 2% 성능향상을 기록했어요.
Batch normalization에 대한 설명은 여기 링크를 참고해주세요.
2) High resolution classifier
YOLO V1에서 feature extraction 목적으로 사용된 CNN모델은 VGG 16 기반이에요 (YOLO V1은 중간중간 1x1 conv도 적용시켰기 때문에 온전한 VGG 16을 사용했다고 보긴 어려워요). VGG 16은 보시다시피 224 image로 resizing되어 학습을 하기 때문에 224x224 image에 대한 객체를 classification하는데 최적화되어 있어요.
<사진1. VGG 16 구조>
그런데 아래 YOLO V1을 보면 detection을 위해 input image size가 두 배더 커진것을 볼 수 있죠? 이렇다보니 448x448 image에 익숙하지 않았던 (YOLO V1에 사용된) VGG 16 기반의 CNN 모델이 detection에서는 성능저하를 일으키게되요.
그래서 YOLO V2에서는 imageNet의 dataset에서 448x448 이미지들을 다시 학습시켜 fine-tuning 해주었는데요. 기존 224x224 보다 high resolution인 448x448 image에 대한 CNN (classification network; classifier) 모델을 재학습시켜주려고 했어요.
YOLO V2에서는 YOLO V1과는 달리 VGG Net 기반의 모델을 사용하지 않고 자체적으로 만든 CNN 모델을 사용했는데요. 그 모델 이름이 "darknet 19"에요. (사실 darknet 19는 'Faster'라는 섹션에 있는데 여기서 설명을 해도 될 듯 싶어요)
Darknet은 19개의 layer로 구성되어 있기 때문에 논문에서는 darknet 19라고 통칭하고 있어요. Darknet 19는 처음에 224x224에 대한 imageNet dataset을 학습시키고난 후, 448x448 이미지에 대해서 재학습 시켜주어 fine tuning해주어요. 이때 learning rate를 더 적게 설정해 주는데 그 이유에 대해서는 명확한 언급이 없었어요. (그냥 empirical한 결과라고 이해하고 있어요)
Darknet 19를 이용한 결과 4% mAP 성능 향상을 볼 수 있었습니다.
3) Anchor Boxes
YOLO V2에서는 기존에 사용했던 FC layer 방식을 쓰지 않고 Faster RCNN에서 사용한 RPN방식을 사용하는 실험이 있어요. 그런데, 나중에 결과를 보면 Anchor Boxes를 사용하지 않은 경우에 mAP 성능이 더 좋았고 achor boxes를 사용하지 않은 기존 모델을 결과표에서 최종 모델로 보여주고 있어요.
논문을 읽다보면 anchor boxes를 사용하게되면 recall이 굉장히 향상되기 때문에 미래에 더 발전될 여지가 있다고 언급하는 부분이 있어요 (왜냐하면 recall이 높다는건 객체가 검출될 확률이 높으니까 mAP도 더 높게 나올 가능성이 있는거니까요).
그런데 문제는 결과표는 anchor boxes를 사용하지 않은걸 기준으로 올려 놓았기 때문에 논문에서 'yolo v2''라고 언급된 부분들을 anchor boxes가 포함된 모델로 봐야하는건지, 포함되지 않은 모델로 봐야하는건지 잘 모르겠어요. 그리고, anchor boxes를 사용하면 당연히 yolo v1보다 fps가 더 증가할거라고 생각하는데 그 부분에 대한 언급도 없는것 같았어요 (abstract에서 fps 성능을 보여주는 yolo v2는 anchor boxes를 적용시키지 않았을때의 모델 갔았어요).
정확한 판단을 위해서는 코드를 직접 들어가서 봐야겠지만, 논문만 보면 기냥 기존 yolo v1 구조에서 FC layer만 제거하고 conv layer를 추가해 13x13x30 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!작성중!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3-1) Convolutional with Anchor Boxes
Faster RCNN의 RPN 구조를 보면 convolution 연산을 통해 RoI를 추출하는 작업을해요.
YOLO V1은 x,y,w,h 값을 랜덤하게 설정해주고 직접 최적화된 값을 찾아가도록 학습하지만, Faster RCNN은 사전에 anchor box 9개를 설정해주고 그에 따른 x,y, aspect ratio (offset)값과 object confidence score를 계산하면 되는 구조이기 때문에 훨씬 간단하게 학습할 수 있죠 (예를들어, 아무것도 모르는 상태에서 정답을 찾아가는것 보다 어느정도 틀이 갖추어진 상태에서 정답을 찾아가는것이 더 쉽겠죠?).
<사진2>
YOLO V2에서는 Faster RCNN과 비슷한 region proposal 방식을 사용합니다. Anchor box를 미리선정하고 사용하기 때문에 MLP 방식으로 bounding box coordinate를 추론할 필요가 없어 FC layer를 사용하지 않고 RPN과 비슷하게 convolution layer를 사용하게 됩니다. 논문에서는 5, 9개의 anchor box를 설정하고 실험을 진행했어요 (자세한 부분은 뒤에서 설명드릴게요).
위에서 darknet 19 (=for classification)를 학습시킬 때는 448x448 이미지를 학습시킨다고 했죠? 하지만 detection을 진행할때는 입력이미지가 416x416으로 바뀌어요. 그 이유를 설명하면 아래와 같아요.
먼저 제일 마지막 pooling layer 이후를 모두 지워줍니다. 그 이유는 7x7 grid cell은 너무 크기가 작기 때문에 사실상 low resolution 상태에서 detection하는것과 같아요. 또한 YOLO V1 에서 적용한 bounding box 개수를 보면 7x7x2 = 98 개인데, 이 개수가 recall 관점에서는 터무니 없이 적은 bounding box 개수라는걸 확인할 수 있어요. 그래서 anchor box 개수를 5개로 설정하여 기존보다 3개 더 많은 bounding box를 설정해주고, 7x7 보다 더 큰 feature map size (higher resolution) 인 13x13 (어떻게 13x13이 되는지 뒤에서 설명) 로 설정하게 되면 13x13x5 = 845 개의 bounding box를 사용할 수 있기 때문에 더 많은 recall을 얻을 수 있었어요. 하지만 mAP 성능에서는 오히려 더 낮은 mAP를 기록했다고 합니다.
YOLO V2에서는 output feature map이 짝수x짝수가 되는게 좋지 않다고 생각했는데요. 그 이유는 보통 물체가 이미지의 중앙에 있는 경우가 많다보니 홀수x홀수 로 최종 output feature map을 설정해주는게 더 좋다고 합니다. 그래서 14x14가 아닌 13x13으로 맞춰주기 위해서 448x448을 416x416으로 변경해주었다고 하네요.
아래그림이 detection시 사용되는 YOLO V2구조의 앞부분이라고 보시면 됩니다.
<사진3. YOLO V2 구조 for detection>
3-2) Dimension Clusters
Faster RCNN에서 사용한 anchor box는 사전에 aspect ratio와 size를 달리하여 9개의 숫자로 미리 정해주었어요 (hand pick). YOLO V2에서는 anchor box를 적용시킬때 단순히 aspect ratio, size를 통해 미리 정해준 anchor box를 사용하는것이 문제가 있다고 판단했어요.
그래서 "we run k-means clustering on the training set bounding boxes to automatically find good priors"라고 언급했는데요. 이 이야기는 training dataset에 있는 ground truth bounding boxes에 k-means clustering 방법을 사용하여 최적의 anchor boxes를 찾겠다는 뜻이에요.
K-means clustering은 본래 euclidean distance를 사용하여 구하는데요. 아래 예시를 한 번 살펴볼게요.
먼저,
step1. k=3이라고 설정을 하면 임의의 data 3개를 지정합니다. 그리고 각 3개의 데이터를 기준으로 3개의 다른 영역들을 구성하게되죠.
step2. 3개의 다른 영역을 나눌때, 지정된 3개의 data에서 가장 가까운 (euclidean distance 이용) data들을 계산해 각각의 그룹을 형성합니다.
step3. 해당 그룹내에서 데이터들간의 위치를 계산하여 그룹내에서 평균을 냅니다. 그리고, 그 평균을 기준으로 step2의 방식을 적용하여 다시 3개의 그룹을 형성하게되죠.
step4. step2~3을 반복하다보면 최적화된 clustering을 만들게 됩니다.
<사진4>
그런데 최적의 anchor box를 찾을때 euclidean clustering 기준으로 k-means clustering 방식을 적용하면 문제가 생깁니다.
아래 그림에서 파란색 부분은 ground truth bounding box라고 하고, 빨간색 부분은 예측된 anchor box라고 할게요. 아래 왼쪽 그림을 봤을 때, bounding boxes가 비슷함에도 불구하고 중심점끼리의 차이가 많이 나기 때문에 예측된 anchor box는 실제 ground truth와 유사함에도 불구하고, 무시되거나 같은 group이라고 보지 않을 가능성이 많아요. 반면에 euclidean distance를 기준으로 grouping을 하면 아래그림의 중간, 오른쪽과 같이 ground truth와 전혀 엉뚱한 anchor boxes이 grouping될 확률이 높아집니다.
그래서 논문에서는 IoU개념을 이용해서 distance metric라는 방식을 제안했는데요. 다시말해, K-means clustering 방식을 적용하여 최적의 anchor boxes를 추출할때, euclidean distance가 아닌 IoU를 적용한다는 뜻이에요.
IoU를 기준으로 하여 clustering을 적용하면 training dataset에 있는 ground truth bounding boxes들의 평균을 잘 계산해주어 더 좋은 anchor boxes를 추출할 수 있게 됩니다.
3-3) Direct location prediction
RCNN에서 bounding box regression에 대해서 설명드린바있죠? (링크)
Fast RCNN, Faster RCNN 모두 같은 bounding box regression 식을 이용하는데요. 짧게 설명드리면 d함수를 학습시켜 P (predicted bounding box)의 (x,y,w,h)를 조정해주는거에요.
그런데 문제는 d라는 함수에 제한이 없기 때문에 predicted bounding box가 아래와 같이 하나의 cell을 벗어나 형성될 수 있게되는데요. 특히 초기에는 d함수가 학습도 제대로 되어 있지 않기 때문에 문제가 더 심각할거에요.
그래서 아래와 같은 방식으로 bounding box regression 식을 변경시켜주었는데요. 아래의 notation을 먼저 설명해드리면 아래와 같아요.
위의 수식에서 중요한건 시그모이드 함수와 tx, ty tw, th에요.
YOLO V2는 5개의 anchor boxes를 적용시킨다고 말씀드렸죠? 5개의 anchor boxes 각각의 좌표를 tx, ty, tw, th라고해요. 그래서 Faster RCNN에서는 d함수를 학습시켰다면, YOLO V2에서는 t에 대해 학습을 시켜주게 됩니다.
Ground truth 좌표값과 predicted anchor box에 속하는 t가 서로 regression하면서 b와 ground truth의 차이가 0이 되게 수렴하는 predicted anchor box 't'가 학습이 될거에요. 그런데 시그모이드 함수를 적용하지 않으면 predicted anchor box는 Faster RCNN에서 제기된 문제처럼 cell의 아무곳에서나 생성될거에요.
그런데 sigmoid function을 적용해주면 tx, ty의 범위가 0~1로 바뀌기 때문에 predicted bounding box가 초기에 그려지는 범위가 해당 cell 영역에 제한될거에요. 이렇게 된다면 초기 학습에 시간을 낭비할 필요도 없고, 더 좋은 anchor box를 그려주도록 할거에요.
YOLO V2는 이러한 anchor boxes 방식 (위에서 언급한 3가지 기술)을 적용시켰을 때 5%의 성능향상이 되었다고 기술했어요 (그런데 이 성능이라는 것이 mAP를 말하는건지, 단순히 recall을 말하는건지 잘 모르겠네요;;;;)
4) Fine-Grained Features
상대적으로 작은 feature map에서는 작은 크기의 객체에 대한 localization 작업이 힘들수 있어요. 그래서 조금 해상도를 높여 (feature map size를 증가시켜) 작은 객체또한 잘 detection할 수 있도록 하기위해 고안된 방법이 fine-grained features에요 (사실 이 기술은 SSD object detection에서 주로 사용된건데 다음글에서 SSD에 대해 설명하도록 할게요!)
YOLO V1과 달리 YOLO V2의 최종 output feature map은 13x13의 크기를 갖고 있는데요. 이러한 13x13 output feature map보다 조금 더 큰 26x26 output feature map 위에서 bounding box 작업을 진행하게 됩니다.
아래와 같이 최종 feature map에서 적용한 13x13x512의 channel수를 기준으로 26x26에서도 같은 channel수를 유지하여 13x13 output feature map에서 다루어지는 정보들 (512)와 동일하게 설정해주되, 26x26에서는 4등분을하여 적용시켜주게 됩니다.
<사진5>
<사진6>
그렇다면 최종적으로 아래와 같은 YOLO V2 구조를 생각해 볼 수 있겠네요.
마지막 13x13x125에서 125의 의미는 YOLO V1과 동일하게 생각하면 되실것 같아요. YOLO V1은 classification과 localization이 동시에 적용되기 때문에 2개의 bounding box가 각각의 cell에 대해 classification 결과를 공유했는데요. YOLO V2에서 anchor box를 적용시켰을때에는 각각의 anchor box에 대해서 classification 정보를 갖고있다보니 아래와 같이 하나의 anchor box에 대해 25가지 정보를 구성하게 되었어요. 그래서 총 5개의 anchor boxes를 적용했다고 가정했을 때 하나의 cell에서 총 5x25 =125개의 정보를 갖고 있게 되기 때문에 125개의 channel을 사용하게되요.
아래그림을 보면 125 channel에 대해 gray scale로 visualization한 것을 볼 수 있는데요. 하나의 anchor box에 25개의 정보가 담겨져있고, 앞부분 5개는 anchor box정보(x,y,w,h and object confidence score)이고, 뒷 부분은 20개의 classes에 대한 activation map을 보여주고 있어요.
<사진7>
<사진8>
지금까지 방식을 적용시켰을때 기존의 YOLO V1보다 더 좋은 성능을 기록하게 되었어요.
5) Multi-Scale Training
추가적으로 YOLO V2는 하나의 image scale에 대해서만 학습시키는 것이 아니고 다양한 image scale에 대해서 학습을 시켜요.
논문에서 제시한 방식은 320, 320+32=352, 320+32*2=384, ..., 320+32*9=608 의 이미지로 training 시키려고 했는데요. 32씩 증가시킨 이유는 YOLO가 본래 이미지 사이즈에서 1/32 만큼 줄인 output feature map을 추출하기 때문이에요. YOLO V2는 10 batches 마다 input size를 변경시켜 학습을 시키게 됩니다.
이렇게 multi-scale로 학습시켰을때 아래와 같은 결과를 얻을 수 있었어요. Test 단계에서 input size를 다르게 설정할 수록 mAP와 FPS의 성능이 변하는걸 알 수 있어요. 당연히 output feature map의 size가 달라지기 때문에 anchor boxes 수도 달라질 거고, 그에 따라서 mAP, FPS 성능도 달라질거에요.
<2. Faster>
지금까지 YOLO V2가 변한 과정을보면 여러 기법들이 사용되었고 동시에 anchor boxes가 사용되었다는 점이에요. 그런데 생각해보면 faster RCNN과 유사한 anchor boxes 개념을 사용하게되면 FPS 성능이 YOLO V1보다 더 나빠져야 하는데, 더 좋아진 이유는 무엇일까요?
1) Darknet 19
YOLO V2가 더 빨라진 이유는 CNN 모델로 쓰인 darknet 19에 있어요. 기존 YOLO V1과 다른점은 FC layer를 제거했다는 점이에요. YOLO V1에서 쓰인 구조를 잠시보면 FC layer에서 7x7x1024x4096+4096x7x7x30이라는 weight가 사용이되요. 거의 YOLO V1에서 쓰이는 대부분의 가중치가 FC layer에 국한되어 있다고 보시면되요.
하지만 YOLO V2에서는 FC layer를 제거함으로써 가중치 파라미터수를 급격하게 낮췄기 때문에 더 빠른 속도로 detection이 가능하게 되었어요. 이것을 가능하게 했던 또 하나의 이유는 global average pooling이라는 기술인데요. Darkenet 19에서는 7x7x1024 feature map에 1x1x1024 conv filter를 1000개 적용시켜, 7x7x1000개를 만들어줘요 (1000개가 뜻하는바는 imageNet dataset의 class가 1000개 이기 때문이에요. 즉, 1000개의 classes에 대해서 classification 하겠다는것이죠. 그리고 나서 7x7x1000 feature map에 대해서 global average pooling을 하게되면 YOLO V1에서 언급했던 7x7x1024 feature map 이후에 사용된 가중치는 1x1x1000 이 됩니다 (YOLO V1: 7x7x1024x4096+4096x7x7x30 VS YOLO V2: 1000). 실제 detecetion에서는 크기도 13x13 feature map으로 바뀌고 26x26 feature map과 concatenation하는 부분이 있어 가중치가 개수가 조금 달라지지만 여전히 FC layer와는 비교도 안되는 수의 가중치 개수를 갖게됩니다.
<사진9>
<3. Stronger>
논문 제목을 보면 YOLO9000이라고 되어있죠? 왜 9000이라는 숫자를 제목에 붙였을까요? YOLO V1은 pascal VOC dataset에서 제공되는 20개의 classes를 기준으로 학습하기 때문에 20개의 classses에 대해서밖에 detection을 하지 못했어요. 하지만 YOLO V2에서는 9000개의 classes에서 detection을 할 수 있도록 해주었는데요. 이러한 놀라운 성과를 갖었기 때문에 논문제목을 YOLO9000이라고 붙였어요.
이 부분에 대해서는 자세하게 언급을 하진 않으려고 합니다. 이유는 Object detection 모델 아키텍처를 구성하는데 필요한 지식이 아니고 단지 detection하는 label을 어떻게 늘릴 수 있는지에 대해서 설명한 것이기 때문이에요 (아 물론 output feature map의 size가 달라질수는 있겠네요). 간단하게 이야기하면 ImageNet dataset에는 2만개 넘는 라벨링이 있는데요. 그 중에서 9000개를 가져오고 COCO dataset에서 대략 300개 정도되는 라벨을 갖고와서, 약 9300개의 classes에 대해서 detection할 수 있도록 구성하게 됩니다.
지금까지 YOLO V2에 대해서 알아보았어요. YOLO V3를 설명하기 전에 SSD라는 object detection 모델을 설명하려고 하는데요. 그 이유는 YOLO V3에서 사용된 중요한 개념중에서 SSD에서 쓰인 방식이 적용된 부분이 있기 때문이에요 (paper 순서는 YOLO V1 -> SSD -> YOLO V2 입니다) ~
그럼 SSD 모델에서 뵐께요~
[논문 래퍼런스]
YOLO9000: Better, Faster, Stronger/ Joseph. R/ 2017/ https://arxiv.org/abs/1612.08242
[사진 래퍼런스]
사진1
사진2
https://towardsdatascience.com/yolov1-you-only-look-once-object-detection-e1f3ffec8a89
사진3
https://www.researchgate.net/figure/The-architecture-of-YOLOv2_fig4_336177198
사진4
https://en.wikipedia.org/wiki/K-means_clustering
사진5
https://www.slideshare.net/JinwonLee9/pr12-yolo9000
사진6
https://www.etsy.com/il-en/listing/692367997/dog-brick-puzzle-boxset-size-26x26-cm
사진7
https://www.youtube.com/watch?v=vw1R5JXvXi0&feature=youtu.be
사진8
사진9
https://towardsdatascience.com/review-nin-network-in-network-image-classification-69e271e499ee
'Deep Learning for Computer Vision > Object Detection (OD)' 카테고리의 다른 글
13. YOLO V3 (0) | 2021.08.26 |
---|---|
11. SSD (3) | 2020.02.06 |
9. YOLO V1 (4) | 2020.02.06 |
8. Faster RCNN (1) | 2020.02.06 |
7. Fast RCNN (2) | 2020.02.06 |