내용 요약
YOLO v3는 기존 YOLO에 최신 기법들을 적용하여 성능을 개선한 모델입니다. 기존 YOLO 버전들(v1, v2) 대비하여 Loss 측정 방법, feature 추출 방법 등에서의 차이를 중점적으로 살펴봅니다. YOLO v3는 IoU threshold 50%를 기준으로 측정했을 때 기존 SOTA들보다 성능이 우수하고 작은 물체에 대한 성능이 개선되었다는 의의가 있습니다. 반면 높은 IoU threshold와 큰 물체에서 성능이 떨어진다는 한계가 있습니다.
1. 들어가며
이번 글에서는 2018년 발표된 YOLO v3 논문을 리뷰합니다. 해당 논문은 YOLO 시리즈의 세 번째 버전입니다. YOLO v3에서는 Object Detection 연구의 최신 기법들을 적용하여 YOLO v2의 성능과 속도를 개선했습니다. 따라서 이번 글에서는 YOLO 이전 버전과 달라진 YOLO v3의 내용을 중점적으로 리뷰하도록 하겠습니다.
2. 기존 YOLO와 YOLO v3의 차이
기존 YOLO들과 YOLO v3의 차이를 하나씩 살펴보겠습니다.
2-1. Bounding Box의 loss 측정 방법
먼저 bounding box의 정보로부터 loss를 측정하는 방법을 살펴보겠습니다.
위 그림은 YOLO v2, v3의 anchor box로부터 Ground Truth bounding box와의 차이를 측정하는 방법을 나타낸 그림입니다. YOLO 모델이 예측하는 값은 위 그림에서 t값들에 해당합니다. (tx, ty, tw, th) 이렇게 예측한 t값들을 적절한 수식을 사용하여 b값으로 변형하는 모습을 볼 수 있습니다. b값들은 각각 bounding box의 x, y좌표와 width, height에 해당합니다.
기존 YOLO에서는 이 b값들을 사용하여 localization loss를 설정해 주었습니다. 반면 YOLO v3는 b값들을 사용하지 않습니다. YOLO v3는 t값들을 사용하여 localization loss를 계산해 줍니다. 모델에서 예측한 t값들과 Ground Truth 정보를 통해 역산한 t값들이 서로 같아지도록 localization loss를 구성해 주는 것이죠.
2-2. IoU에 따른 loss 구성
다음은 IoU에 따라 loss를 어떻게 설정해 주었는지 살펴보겠습니다. 기존 YOLO에서는 Ground Truth 박스와 가장 잘 맞는 박스(responsible box)에서만 모든 loss를 받도록 하고, 나머지 박스들은 no objectness loss를 받도록 구성해 주었습니다. YOLO v3에서는 Faster R-CNN의 방법에서 착안하여 IoU에 따라 다른 loss를 받도록 구성해 주었습니다.
IoU별로 살펴보면 다음과 같습니다.
첫 번째로 Ground Truth와 가장 잘 맞는 박스에 대한 loss 세팅을 비교해 보겠습니다.
이 경우 기존 YOLO와 YOLO v3의 loss 세팅은 동일합니다. 모두 Localization Loss와 Classification Loss, Objectness Loss를 받는 모습을 볼 수 있습니다.
두 번째는 가장 잘 맞지는 않지만, IoU가 0.5를 넘어가는 경우입니다.
기존 YOLO에서는 이런 경우 No Objectness Loss를 받도록 세팅했습니다. 반면 YOLO v3에서는 이런 경우 아무 loss도 받지 않습니다. (Ignore)
세 번째는 IoU가 0.5보다 작은 경우입니다.
기존 YOLO에서는 이런 경우에도 마찬가지로 No Objectness Loss를 받도록 세팅했습니다. YOLO v3에서도 이런 경우 동일하게 No Objectness Loss를 받습니다.
결론적으로 YOLO v3는 IoU가 0.5보다 큰 경우 Loss를 받지 않도록 변경되었습니다. 이는 확실한 object와 확실히 object가 아닌 경우에만 loss를 설정하겠다는 철학으로 이해할 수 있습니다. IoU가 0.5 이상이지만 확실하게 매칭되지 않는 박스는 무시하겠다는 거죠.
2-3. Class 예측 방법
다음은 class 예측 방법을 살펴보겠습니다.
기존 YOLO v2에서는 Softmax와 Cross Entropy Loss를 사용하여 class를 구분했습니다.
YOLO v2에서도 설명했듯 이러한 방식은 각 클래스가 상호배타적이라는 가정을 포함하고 있습니다. 따라서 정답은 오직 하나이므로, 정답을 제외한 클래스에 대한 대답은 억누르는 방향으로 학습합니다. 이러한 경향은 Softmax 함수로 인해 발생합니다. 왜냐하면 Softmax의 결괏값의 합은 1이 되어야 하기에 정답 클래스에 해당하는 확률값이 커지면 나머지 클래스의 확률값은 작아져야 하기 때문입니다.
반면 YOLO v3은 이러한 철학에 의문을 제기합니다. 하나의 클래스만 정답이라고 학습하는 게 아닌, 다양한 정답이 있다고 생각할 수 있도록 학습해야 한다는 거죠. 즉 Multi Label Classification 방법을 적용합니다.
이를 위해 YOLO v3에서는 Binary Cross Entropy Loss를 도입합니다. 이는 결과적으로 Softmax 함수를 Sigmoid 함수로 대체해 준 것과 동일합니다. 위 그림을 보면 이전 YOLO와 달리 YOLO v3에서는 Softmax가 아닌 Sigmoid 함수를 사용하는 모습을 볼 수 있습니다.
Softmax를 Sigmoid로 대체하면 무엇이 달라질까요? Sigmoid는 다른 클래스의 결괏값에 영향을 받지 않습니다. 강아지에 해당하는 값이 크게 나왔다고 해서 고양이에 해당하는 값이 작아지지는 않는다는 것이죠. 그 결과 최종 확률값으로 강아지 90%, 고양이 30%, 사자 20%와 같은 결과가 나올 수 있게 됩니다.
2-4. Loss function
다음은 기존 YOLO와 YOLO v3의 Loss Function을 비교해 보겠습니다.
YOLO의 loss는 크게 세 가지로 구성되어 있습니다.
첫 번째는 Localization Loss입니다. 이는 예측한 bounding box의 위치를 더 정확하게 맞춰주는 역할을 합니다.
두 번째는 Objectness Loss입니다. 이는 해당 feature에서 예측한 bounding box에 물체가 있는지, 없는지를 예측하는 loss입니다.
세 번째는 Classification Loss입니다. 이는 해당 bounding box에 물체가 있다면, 물체의 클래스가 무엇인지를 맞추는 역할을 합니다.
위 그림은 YOLO v1과 YOLO v3의 Loss의 상세 구성을 비교한 그림입니다. 먼저 Localization Loss는 YOLO v1과 YOLO v3가 동일하게 Sum Squared Error (SSE)을 사용하는 모습을 볼 수 있습니다. 반면 Objectness Loss와 Classification Loss는 기존 YOLO v1과 달리 YOLO v3에서는 Binary Cross Entropy Loss를 사용하는 모습입니다. 이는 위에서 설명했듯 Multi Label Classification을 반영하고자 하는 철학이 반영된 결과입니다.
2-5. Feature 사용 방법
딥러닝 연구가 진행되며 추출한 feature를 사용하는 방법도 진화해 왔습니다. 초창기에는 최종 압축된 정보인 마지막 feature만을 사용하여 원하는 task에 맞춰 학습을 했죠. 하지만 연구가 진행되면서 layer의 레벨에 따라 다른 종류의 정보들이 있음이 밝혀졌습니다. 이에 따라 많은 task들이 다양한 layer의 feature를 사용하며 성능을 증가시켰죠. Object Detection 같은 경우에는 FPN과 SPP등에서 다양한 layer의 feature를 사용할 때의 유용성을 증명했습니다.
2-5-1. YOLO v1, v2 방법
이에 YOLO에서도 feature를 사용하는 방법이 진화해 왔습니다. YOLO v1에서는 CNN으로 추출한 마지막 feature만을 사용했습니다. 이 feature는 7x7x30의 사이즈를 갖고 있습니다. 30개의 정보에는 해당 위치에서의 bounding box 위치 정보, Objectness 정보, Class 정보 등이 들어있죠. YOLO v2에서는 마지막 feature 뿐만 아니라 한 단계 위 레벨의 feature도 같이 사용합니다.
위 그림은 YOLO v2에서 마지막 feature와 상위 레벨 feature를 하나의 feature로 합쳐주는 모습을 표현한 그림입니다. 마지막 feature의 사이즈는 13×13이고, 상위 레벨 feature의 사이즈는 26×26입니다. 사이즈가 맞지 않아 합쳐줄 수가 없어서, 26×26 feature를 4 등분하여 채널 방향으로 합쳐주는 모습을 볼 수 있습니다. YOLO v2에서는 이렇게 2개 레벨의 feature를 사용하여 성능 향상을 이뤘습니다.
2-5-2. YOLO v3의 방법
YOLO v3에서는 이보다 더 직접적으로 다양한 레벨의 feature를 사용합니다.
위 그림은 YOLO v3에서 feature를 사용하는 방법을 표현한 그림입니다.
2-5-3. 기존 방법과의 차이 – 1
우선 첫 번째로 주목해야 하는 차이점은 각 레벨의 feature마다 prediction을 수행한다는 점입니다. YOLO v2에서는 서로 다른 레벨의 feature를 합쳐주어 최종적으로 한 번의 prediction을 수행했죠. 반면 YOLO v3에서는 3개의 서로 다른 레벨 feature를 사용하면서, 각 레벨의 feature마다 각각 prediction을 수행합니다. 이때 각 위치별로 3개의 anchor를 사용하며 각각 4개의 localization 정보, 1개의 objectness 정보, 80개의 class 정보를 포함합니다. 그 결과 위 그림에서 마지막 feature의 채널 사이즈는 3x(4+1+80)인 모습을 볼 수 있습니다.
이렇게 다양한 레벨의 feature가 각각 prediction을 할 때의 장점은 무엇일까요? 각 레벨의 feature들은 receptive field size가 다릅니다.
이건 이런 상황으로 비유해서 생각해 보면 좋을 것 같아요. 3명의 사람이 그림을 관찰할 건데요, 각각 쓰고 있는 돋보기가 다르다고 상상해 보겠습니다. 각각 10배, 5배, 1배 확대 돋보기를 쓰고 있다고 가정하겠습니다. 10배 돋보기를 쓰고 있는 사람 눈에는 모래, 머리카락 같이 아주 작은 물체들이 잘 보일 겁니다. 반면 5배 돋보기를 쓰고 있는 사람 눈에는 개미, 나비 같이 작은 물체들이 잘 보이겠죠. 마지막으로 1배 돋보기를 쓰고 있는 사람 눈에는 큰 크기의 물체들이 잘 보일 겁니다. 최종적으로 이 세 사람의 대답을 종합해서 관찰 결과를 낸다고 생각해 보죠. 특정 돋보기만 사용하는 것보다 훨씬 좋은 대답을 기대할 수 있을 겁니다. 마찬가지로 딥러닝 모델입장에서도 다양한 level의 feature에서 각각 대답할 수 있게 해 주는 게 더 유리하다고 할 수 있습니다.
2-5-4. 기존 방법과의 차이 – 2
두 번째 차이점은 feature를 합치는 방법입니다. 위 그림을 보면 작은 사이즈의 feature를 upsample 하여 상위 레벨 feature와 합쳐주는 모습을 볼 수 있습니다. 상위 레벨에서는 이렇게 합쳐진 feature를 사용하여 prediction을 수행하고 있죠.
이는 또다시 돋보기를 들고 그림을 관찰하는 사람들로 비유할 수 있겠네요. 이번에는 각자 돋보기를 들고 관찰하여 대답을 하는 상황은 동일하지만, 가장 큰 그림을 본 사람이 다음 사람에게 정보를 전달해 준다는 점이 다릅니다. 다음 사람은 큰 관점에서의 정보를 감안하여 판단할 수 있으니 더 정확하게 판단할 수 있겠죠. 위 그림을 보면 13×13 사이즈의 feature가 26×26 사이즈로 upsample 되어 기존의 26×26 feature와 합쳐지는 모습을 볼 수 있습니다. 그리고 이렇게 합쳐진 feature를 사용하여 최종 prediction을 하죠. 13×13 feature는 26×26 feature에 비하여 더 큰 그림에서 관찰한 정보에 해당합니다. 동일한 사이즈를 13 등분하여 볼 때 26 등분하여 보는 것보다 더 많은 부분을 봐야 하기 때문이죠. 이 둘을 합쳐 prediction 하여 더 좋은 성능을 낼 수 있습니다. 다음 레벨인 52×52에서도 동일한 작업이 반복되는 모습을 볼 수 있습니다.
2-6. Feature Extractor
다음은 feature extractor 부분을 살펴보겠습니다.
위 그림은 YOLO v3에서 사용한 네트워크 구조를 표현한 그림입니다. 총 53개의 convolution layer로 구성된 네트워크입니다. 기존 네트워크에 shortcut connection을 추가해 주는 정도의 수정이 있었습니다. 이렇게 구성한 네트워크를 Darknet-53이라고 부릅니다.
위 그림은 Darknet-53과 다른 네트워크들의 성능을 비교한 표입니다. Darknet-53은 Darknet-19보다 더 높은 성능을 내는 모습을 볼 수 있습니다. 또한 ResNet-152와는 비슷한 성능에서 2배 이상의 빠르기를, ResNet-101보다는 높은 성능과 1.5배의 빠르기를 내는 모습을 볼 수 있습니다.
3. 실험 결과
다음은 YOLO v3의 성능 실험 결과를 살펴보겠습니다.
위 그림은 YOLO v3와 다른 방법들의 동작 시간에 따른 성능을 측정한 표입니다. YOLO v3는 기존 SOTA 모델인 RetinaNet보다 훨씬 빠르고 좋은 성능을 내는 모습을 볼 수 있습니다. 이는 IoU threshold를 50%로 세팅했을 때의 결과입니다. 이번에는 다양한 IoU threshold와 다양한 사이즈의 물체에 대한 성능을 비교해 보겠습니다.
AP50, AP75는 각각 IoU threshold가 50%, 75% 일 때의 성능을 의미합니다. APS, APM, ApL는 각각 작은 물체, 중간 사이즈 물체, 큰 물체에 대한 성능을 의미합니다.
우선 기존 방법 대비 개선된 점은 작은 물체에서의 성능입니다. YOLO v2는 작은 물체에서는 성능이 매우 낮았지만, YOLO v3에서는 많이 개선된 모습을 볼 수 있습니다. 반면 중간 사이즈와 큰 물체에 대해서는 상대적으로 낮은 성능을 보입니다. 또한 IoU threshold는 50일 때만 성능이 좋고 다른 threshold에서는 성능이 크게 떨어지는 모습을 볼 수 있습니다. 특히 threshold가 올라가면 성능이 떨어지는 모습을 보입니다. 이는 YOLO v3가 완벽하게 localization을 하는 능력은 떨어진다고 이해할 수 있습니다.
4. 결론
YOLO 시리즈의 세 번째 모델인 YOLO v3를 살펴봤습니다. YOLO v3는 최신 기법들을 도입하여 YOLO v2 성능과 속도를 개선했다는 의의를 갖습니다. 반면 특정 IoU threshold에서만 성능이 좋고 큰 물체에 대해서는 성능이 떨어진다는 한계를 갖습니다.