- [16′ CVPR] YOLO v1 : You Only Look Once: Unified, Real-Time Object Detection
- [17′ CVPR] YOLO v2 : YOLO9000: Better, Faster, Stronger
- [17′ ICCV] RetinaNet : Focal Loss for Dense Object Detection
- [18′ arxiv] YOLO v3
- [20′ arxiv] YOLO v4: Optimal Speed and Accuracy of Object Detection
내용 요약
YOLO v1이 발표될 당시는 2 stage object detection 방법이 일반적이었습니다. 하지만 2 stage object detection은 속도가 느리다는 단점이 있었습니다. YOLO v1은 입력 이미지를 CNN으로 추출하여 바로 계산하는 1 stage object detection 방법을 제안합니다. 실험을 통해 YOLO v1은 2 stage detector들과 성능이 비슷하면서도 속도는 훨씬 빠름을 증명했습니다. 또한 일반화 능력도 좋아 다른 도메인에서도 잘 동작한다는 장점이 있습니다.
1. 들어가며
이번 글에서는 2016년 CVPR에 발표된 You Only Look Once – Unified, Real-Time Object Detection 논문을 리뷰합니다. 이 논문은 YOLO 시리즈의 첫 번째 논문으로써, 이번 글에서는 YOLO v1으로 지칭하겠습니다.
먼저 제목의 의미를 통해 저자들이 가장 강조하고자 했던 내용을 생각해 보겠습니다.
첫 번째로 You Only Look Once의 의미를 생각해 보겠습니다. 당시 R-CNN 등과 같은 기존의 object detection 모델들은 2 stage로 동작했습니다. 따라서 속도가 느리다는 단점이 있었죠. You Only Look Once는 이에 따라 1 stage로 동작하는 object detection 모델의 필요성을 강조하는 의미라고 볼 수 있습니다.
두 번째로 Real time의 의미입니다. YOLO v1은 1 stage로 동작하기 때문에 속도가 매우 빨라졌습니다. 따라서 2 stage 계열의 object detection 모델들과 달리 real time object detection이 가능해졌음을 강조하고 있습니다.
이번 글에서는 이러한 내용에 초점을 맞춰 살펴보도록 하겠습니다.
먼저 기존 방법의 문제점을 생각해 보겠습니다.
위에서도 언급했듯, R-CNN과 같은 기존의 object detection 모델들은 2 stage로 동작했습니다. 위 그림은 2 stage object detection 모델과 1 stage object detection 모델의 동작 방식을 표현한 그림입니다.
먼저 2 stage 방식을 살펴보겠습니다.
첫 번째 단계로 input image를 Region Proposal 과정을 거쳐 물체가 있음 직한 부분을 찾아내고 있습니다.
두 번째 단계로 이렇게 찾은 많은 이미지들을 CNN에 넣어 feature를 추출한 뒤 어떤 클래스에 해당하는지를 추론하는 모습입니다.
이러한 방법은 몇 가지 문제가 있습니다.
각각의 문제를 개선한 후속 논문들이 많으니, 여기서는 속도 측면에서만 생각해 볼까요? Region Proposal 단계와 feature extraction 단계가 직렬로 연결되어 있으니, 각각 시간을 소모하여 속도가 느릴 수밖에 없습니다.
그래서 저자들은 Region Proposal과 feature extraction 단계를 통합한 1 stage object detection 방법론을 제안합니다.
위 그림의 아래쪽은 1 stage object detection 모델의 동작 방식을 표현한 그림입니다. 2 stage 모델과 달리 input image로부터 바로 CNN을 사용하여 feature를 추출한 뒤 detection에 필요한 정보를 추론하는 모습을 볼 수 있습니다. 이러한 방법이라면 한 번의 feature extraction 과정만 거치면 되므로 속도 측면에서는 매우 유리해지겠네요.
2. 제안 방법
그럼 YOLO v1의 방법을 하나씩 자세히 살펴보겠습니다.
2-1. YOLO v1의 큰 그림
먼저 YOLO v1의 큰 그림을 좀 더 그려보고 하나씩 자세히 살펴보도록 하겠습니다.
위 그림은 YOLO v1의 작동 방식을 나타낸 그림입니다.
전에도 언급했듯 1 stage로 구성된 모습을 볼 수 있습니다. Input image를 CNN에 넣어 feature를 추출할 겁니다. 이제 이 feature map을 어떻게 구성하면 좋을지 생각해 볼게요. 우선 feature map을 구성하고 있는 WxH개의 feature들은 각각 해당 위치에서의 물체 정보를 의미합니다. 따라서 WxH개 각각의 feature에는 bounding box에 물체가 존재하는지, 그 물체는 무엇인지, box의 정확한 위치는 무엇인지에 대한 정보가 담겨 있어야 합니다.
위 그림을 다시 볼까요. 위 그림에서 추출한 feature map은 WxH개의 feature로 구성되어 있다고 생각해 보겠습니다. 이때 하나의 feature를 뽑아보죠. (위 그림에서는 회색 직사각형에 해당합니다.) 이 feature에는 위에서 언급했듯 세 가지 정보가 담겨야 합니다.
첫 번째는 해당 위치의 박스에 물체가 있는지에 대한 정보입니다. 그림에서는 Objectness Probability라고 표현했습니다.
두 번째는 해당 위치 박스의 정확한 위치 정보입니다. 그림에서는 Bounding Box Location이라고 표현했습니다.
세 번째는 해당 위치 박스에 들어있는 물체의 종류(클래스)입니다. 그림에서는 Class Probability라고 표현했습니다.
이 세 가지 정보는 object detection 데이터셋을 사용하여 줄 수 있는 정보들이죠. 따라서 각각 loss를 설정해 학습하면 되겠네요. Objectness Probability는 0~1 사이값이 나올 테니 regression loss로 설정해 줄 겁니다. Bounding Box Location도 상대적인 위치정보로 0~1 사이값으로 만들어줄 테니 마찬가지로 regression loss로 설정해 줄 겁니다. 마지막 Class Probability는 classification 문제이니 classification loss로 설정해 주겠습니다. (classification loss라고 표현했지만 Cross Entropy Loss로 설정한다는 의미는 아닙니다.)
2-2. YOLO v1 Loss
그럼 loss를 정확히 어떻게 구성해줘야 할지 조금만 더 자세히 생각해 볼게요.
위 그림처럼 오른쪽 위에 강아지가 있는 이미지로부터 YOLO v1으로 object detection을 한다고 생각해 보죠.
CNN을 통해 나온 feature map은 2x2xC 사이즈를 갖는다고 가정해 보겠습니다. 이 feature map은 가장 오른쪽 그림처럼 총 4개의 feature들로 구성되어 있습니다. 그리고 각 feature에는 해당 위치에서의 정보들이 들어가 있고요. 이제 feature에 있는 각각의 예측된 값에 Ground Truth를 매칭해 보겠습니다.
위 그림에서는 강아지가 오른쪽 위에만 존재합니다. 따라서 2번 feature는 강아지와 그 위치에 대한 정보를 포함해야 합니다. 반면 1,3,4번 feature에는 물체가 없으므로 ‘아무것도 없음’이라는 정보를 포함해야겠네요. 따라서 2번 feature와 1,3,4번 feature의 경우를 나눠서 생각해야 합니다.
먼저 강아지를 포함하고 있는 2번 feature부터 생각해 보죠.
위 그림에서 왼쪽의 값은 모델이 예측한 값을 의미합니다.
Objectness Probability, Bounding Box Location, Class Probability 3가지에 해당하는 값을 예측한 모습을 볼 수 있습니다.
2-2-1. Bounding Box Location
먼저 Bounding Box Location부터 살펴보겠습니다.
위 그림은 예측한 bounding box와 Ground Truth bounding box를 표현한 그림입니다.
x와 y는 bounding box의 중심점을, w와 h는 weidth와 height를 의미합니다. 모두 normalize 하여 0~1 사이 값으로 표현해 줍니다. 따라서 각각의 예측값이 Ground Truth 값과 같아지도록 regression loss를 설정해 주면 되겠네요.
2-2-2. Objectness Probability
다음으로 Objectness Probability는 해당 위치에 물체가 (강아지) 존재하는 확률을 의미합니다.
이때의 정답 c는 어떻게 구해줄까요? YOLO v1에서는 정답과의 IoU 값으로 정해줍니다.
위 그림은 Bounding Box Location을 구할 때의 박스를 기준으로 IoU를 구하는 방법을 표현한 그림입니다.
예측한 bounding box의 위치가 Ground Truth 박스의 위치와 일치할수록 confidence 값이 1에 가까워짐을 알 수 있습니다. 그럼 계산한 IoU값과 같아지도록 regression loss를 설정해 주면 되겠네요.
2-2-3. Class Probability
다음은 Class Probability 값입니다.
이는 클래스별 확률값을 의미하므로 해당 클래스에 해당하는 값으로 Regression Loss를 설정해 주면 됩니다. 이번에는 1,3,4번 feature의 경우를 생각해 보겠습니다.
이 feature들에는 object가 없습니다. 따라서 위 그림과 같이 objectness probability는 0이 되도록 loss를 구성해줘야 합니다. 또한 Bounding Box Location과 Class Probability는 아얘 해당 사항이 없으므로 loss가 없도록 설정해 줘야겠습니다.
2-3. YOLO v1 Network Design
이번에는 그동안 CNN이라고 표현한 부분에 해당하는 YOLO v1의 network design을 살펴보겠습니다.
전체 구성 방법은 이렇습니다.
우선 큰 구성은 GoogleNet을 따랐습니다. GoogleNet으로 먼저 ImageNet classification을 학습해 줬습니다. 이는 Object Detection 데이터셋은 양이 적어 ImageNet의 풍부한 feature를 활용하는 것이 더 유리하기 때문입니다. 학습이 완료되면 Object Detection에 적합하게 모델을 변경해 주고 Object Detection 데이터셋을 학습했습니다. 구체적으로는 classification 모델의 뒷부분은 제거해 주고 새로운 convolution layer와 fully connected layer를 붙여주었습니다. 위 그림에서는 뒤쪽의 초록색 부분에 해당합니다.
이렇게 추가된 layer들의 파라미터는 모두 random initialization 해주었고요. 이때 더 작은 물체도 찾을 수 있도록 resolution을 224×224에서 448×448로 확대하여 학습해 주었습니다. 위 그림에서 최종 output feature map의 사이즈가 7x7x30인 모습을 볼 수 있습니다. 이때 7×7은 하이퍼파라미터로 세팅해 준 spatial 사이즈에 해당하고 30은 feature당 포함된 정보의 개수에 해당합니다. 위에서 살펴본바대로라면 Objectness Probability + Bounding Box Location + Class Probability에 해당하는 값입니다.
YOLO v1에서는 각 feature당 2개씩의 bounding box를 예측했습니다.
따라서 Objectness Probability (1개)와 Bounding Box Location (4개)에 해당하는 정보가 2개 있어야 합니다.
또한 VOC 데이터셋의 클래스 개수는 20개입니다.
따라서 최종적으로는 2x(1 + 4) + 20인 30이 나오게 됩니다.
2-4. YOLO v1 Training 방법
다음은 YOLO v1의 학습 방법을 살펴보겠습니다.
먼저 Loss function을 살펴보겠습니다. 위에서 살펴봤듯이 YOLO v1은 총 3개의 Loss로 구성되어 있습니다.
첫 번째는 Localization Loss입니다.
위 그림은 Localization Loss의 수식입니다.
x, y, w, h의 예측값에 대해 매칭되는 Ground Truth 값들과 같아지도록 구성된 모습을 볼 수 있습니다.
위 식을 보면서 두 가지 의문점이 드는데요.
첫 번째는 𝛌coord값의 의미입니다. 이는 Localization Loss에 대한 가중치입니다. 최종 Loss는 Localization Loss와 Confidence Loss, Classification loss의 합으로 구성될 겁니다. 이렇게 되면 Localization loss와 Classification loss는 동등한 중요도를 갖겠죠. 하지만 우리가 풀려고 하는 문제는 object detection 문제입니다. 따라서 Localization loss에 더 큰 가중치를 줘야 합니다. YOLO v1에서는 𝛌coord값을 5로 설정했습니다.
두 번째는 𝟙obji,j의 의미입니다. 위에서 각 feature마다 2개의 bounding box를 예측했다고 언급했습니다. 그럼 이 두 개의 box는 위치가 거의 겹칠 텐데, 둘 다 학습하면 곤란하겠죠. 따라서 YOLO v1에서는 IoU가 더 큰 box에만 loss를 할당해 줍니다. 이를 resposible 하다고 표현하고, 수식으로는 𝟙obji,j라고 표현합니다.
두 번째는 Confidence Loss입니다.
위 그림은 Confidence Loss의 수식입니다.
예측한 confidence의 값이 Ground Truth와 계산한 IoU와 같아지도록 구성된 모습을 볼 수 있습니다. 그런데 생각해 보면 대부분의 box에는 object가 없을 겁니다. 따라서 대부분의 confidence는 0이 되도록 학습해야 하죠. 하지만 이렇게 되면 아주 소수의 object에 해당하는 confidence도 영향을 받아 제대로 학습이 안됩니다. 따라서 object가 없는 box의 confidence에서 나오는 loss는 적은 가중치를 적용해줘야 합니다. 이에 해당하는 값이 𝛌noobj입니다. YOLO v1에서는 0.5로 세팅해 주었습니다.
세 번째는 Classification Loss입니다.
위 그림은 Classification Loss의 수식입니다.
각 확률값이 해당하는 클래스의 정답 확률값과 같아지도록 구성된 모습을 볼 수 있습니다.
이렇게 세 개 Loss를 합친 전체 Loss는 다음과 같습니다.
2-5. YOLO v1 Inference 방법
다음은 YOLO v1의 inference 방법을 살펴보겠습니다.
학습 과정에서는 각 feature 마다 2개의 bounding box를 예측하도록 했었죠. 그리고는 2개의 box 중에서 Ground Truth와의 IoU가 큰 box만 학습되도록 해주었습니다. 그런데 문제는 inference 과정에서 발생합니다. Inference에서는 정답을 모르니 2개의 box 중 무얼 지워줘야 할지 모르잖아요. YOLO v1은 일단 2개씩 예측해 줍니다. 그러고 나서 NMS (Non Maximum Suppresion) 방법을 사용하여 겹치는 박스들을 제거해 줍니다.
3. 실험 결과
이제 YOLO v1은 기존의 다른 방법들보다 얼마나 성능이 좋은지 실험을 통해 확인해 보겠습니다.
3-1. 다른 real time 방법들과의 성능 비교
먼저 VOC2007 데이터셋에 대한 다른 real time object detection 방법들과의 성능을 비교해 보겠습니다.
위 표는 기존 real time object detector들과 YOLO v1의 VOC2007 성능을 비교한 표입니다. 우선 성능 (mAP) 측면에서 봤을 때 훨씬 좋은 성능을 확인할 수 있습니다. 또한 속도 (FPS) 측면에서도 훨씬 좋은 성능을 볼 수 있습니다.
표의 아래 부분은 real time이 아닌 object detector들과의 성능을 비교한 표입니다. Real time이 아닌 만큼 성능 면에서는 유리하다고 할 수 있는데요. YOLO v1은 이 부분에서도 크게 차이 없는 성능을 보이고 있습니다.
3-2. VOC2007 에러 분석
다음은 위에서 살펴본 VOC2007 데이터셋에 대한 에러를 분석해 보겠습니다.
표의 왼쪽은 Fast R-CNN의 에러를, 오른쪽은 YOLO v1의 에러를 분석한 도표입니다.
에러 분류 기준은 다음과 같습니다.
- Correct : 클래스를 맞추고, IoU > 0.5
- Localization : 클래스를 맞추고, 0.1 < IoU < 0.5
- Similar : 클래스가 비슷하고, IoU > 0.1
- Other : 클래스가 틀렸고, IoU > 0.1
- Background : IoU < 0.1
결과를 살펴보겠습니다.
YOLO v1은 Fast R-CNN에 비해 localization error가 압도적으로 많은 모습을 볼 수 있습니다. 이는 YOLO v1은 클래스는 잘 맞추지만, bounding box 위치 정확도가 떨어진다고 해석할 수 있습니다.
반면 Fast R-CNN은 YOLO v1에 비해 background error가 훨씬 많은 모습을 볼 수 있습니다. 이는 Region Proposal을 사용하기에 발생하는 특징으로 해석할 수 있습니다. 왜냐하면 Region Proposal의 output은 일단 물체라고 가정하고 클래스를 분류합니다. 따라서 Region Proposal이 틀렸을 경우 background error가 발생하게 됩니다.
반면 YOLO v1의 방식은 모든 위치에 대해 배경인지 아닌지를 판단하므로, 배경을 찾아내는 능력이 더 좋다고 해석할 수 있습니다.
3-3. Fast R-CNN과 YOLO v1의 결합
위의 결과를 보면 자연스럽게 이런 생각이 드는데요.
“Fast R-CNN과 YOLO v1의 장점이 각자 다르면, 둘을 결합하면 서로 보완해 줄 수 있겠는데?” 그래서 저자들은 Fast R-CNN과 YOLO v1을 결합하여 성능 비교 실험을 해보았습니다.
위 그림은 VOC2007 데이터셋에서 Fast R-CNN과 YOLO v1을 결합한 모델의 성능을 나타낸 표입니다.
YOLO v1은 배경을 찾아내는 능력이 탁월하고, Fast R-CNN은 localization 성능이 좋습니다. 따라서 Fast R-CNN가 찾아낸 proposed region 중에서 YOLO가 배경인 부분을 지워내도록 결합했습니다. 결과를 보면 결합한 모델의 성능은 YOLO v1, Fast R-CNN 둘 다 보다 좋아지는 모습을 볼 수 있습니다.
3-4. VOC2012 성능
다음은 VOC2012 데이터셋에 대한 object detector들의 성능을 비교해 보겠습니다.
위 표는 다양한 object detector들의 VOC2012에 대한 성능표입니다.
우선 YOLO v1은 작은 물체에서 성능이 떨어지는 모습을 볼 수 있습니다. Bottle, sheep, tv/monitor 등에서 R-CNN보다 성능이 많이 떨어지는 모습입니다.
왜 YOLO v1은 작은 물체를 잘 못 찾을까요?
Localization Loss를 생각해 보겠습니다. Bounding box의 위치 정보인 x, y, w, h 각각에 대해 normalize 하여 0~1까지의 값으로 표현해 주었는데요. 이는 생각해 보면 작은 박스에게는 손해임을 알 수 있습니다.
큰 박스와 작은 박스가 동일하게 10픽셀씩 localization error가 있었다고 생각해 보죠. 동일한 10픽셀이지만 이를 박스 크기에 맞게 0~1 사이값으로 normalization 하면 작은 박스에게는 더 큰 값으로 변환됩니다. 따라서 작은 박스에 대한 localization 학습이 불안정해지게 되고, 이는 작은 박스에 대한 localization 성능을 약화시키게 됩니다.
3-5. 일반화 성능
다음은 다양한 object detector들의 일반화 (generalizability) 성능을 살펴보겠습니다.
위 표는 VOC 데이터셋으로 학습한 뒤 Artwork 데이터셋들에서 테스트한 성능을 비교한 표입니다.
Artwork 데이터셋들은 VOC와는 전혀 다른 특성을 갖고 있으므로, VOC에서 학습한 모델이 Artwork 데이터셋들에서도 잘 동작한다면 이는 일반화 능력이 좋은 모델이라고 할 수 있습니다. 이는 마치 사진으로 강아지를 학습한 어린아이가 펜으로 그린 강아지를 인식할 수 있는 것과 마찬가지죠.
결과를 살펴보겠습니다.
R-CNN과 DPM 등 기존 모델들은 Artwork 데이터셋들에서 성능이 대폭 하락하는 모습을 볼 수 있습니다. 이는 R-CNN의 selective search가 자연 이미지에서만 잘 동작하기 때문인 것으로 해석할 수 있습니다. 반면 YOLO v1은 Artwork 데이터셋들에서도 거의 비슷하게 동작하는 모습을 볼 수 있습니다.
3-6. 실제 환경에서의 결과
마지막으로 실제 환경(in the wild)에서 object detection 실험을 한 결과를 살펴보겠습니다.
위 그림은 다양한 환경에서 YOLO v1으로 object detection을 수행한 결과입니다.
거의 모든 물체를 잘 찾는 모습을 볼 수 있습니다. 재밌게도 아래 왼쪽에서 두 번째 그림의 나는 사람에 대해 비행기라고 예측하고 있네요. 제법 하늘이라는 문맥을 고려해 판단하는 모습입니다.
반면 첫 번째 그림에서의 작은 사람은 감지하지 못하는 모습입니다. 역시 작은 물체에서는 약한 모습을 보이네요.
또한 네 번째 그림에서 개가 물고 있는 작은 우산도 감지하지 못하는 모습입니다. 역시 겹쳐있는 물체에 대해서도 약한 모습을 보입니다.
4. 결론
거의 최초의 1 stage object detection 방법인 YOLO v1을 살펴봤습니다.
YOLO v1은 기존 방법들보다 다음 세 가지의 장점을 갖습니다.
첫 번째로 YOLO v1은 매우 빠릅니다.
입력 이미지를 바로 CNN으로 feature를 추출한 뒤 결과를 계산하기 때문입니다.
두 번째로 전체 문맥을 보고 판단합니다.
기존의 Region Proposal 방식과 달리 이미지 전체의 feature를 기준으로 판단하기에 문맥을 고려할 수 있습니다.
세 번째로 일반화 능력이 뛰어납니다.
사진 데이터로 학습하고 Artwork 데이터셋에서 테스트했을 때도 좋은 성능을 확인할 수 있었습니다.
반면 YOLO v1은 다음 세 가지의 한계를 갖습니다.
첫 번째로 YOLO v1은 기존의 2 stage 방법들보다 성능이 떨어집니다.
속도는 매우 빨라졌지만 성능 면에서는 아직 부족한 점이 있습니다.
두 번째로 모여있거나 겹쳐있는 물체를 검출하는 성능이 떨어집니다.
이는 하나의 grid (feature) 당 2개의 박스만 검출하도록 설계되었기 때문입니다.따라서 좁은 위치에 물체들이 몰려있는 경우 검출할 수 없습니다.
세 번째로 작은 박스에 대한 검출 성능이 떨어집니다.
이는 박스 크기에 상관없이 동일하게 normalization 된 값으로 Localization loss를 설정했기 때문입니다.
그럼에도 불구하고 YOLO v1은 기존 2 stage 동작이 일반적인 object detection 연구에 1 stage object detection의 가능성을 알리는 계기가 되었습니다.
이후 YOLO v1을 개선한 다양한 1 stage object detector들이 발표되게 됩니다.
뿐만 아니라 YOLO v2, YOLO v3, YOLO v4 등 이후 YOLO 시리즈에 많은 영감을 주었습니다.