이 논문이 나오기 전(2015년 이전)의 Object Detection 모델들은 Classification 모델을 Object Detection에 맞게 변형한 것들이 주를 이루었다.
하지만 YOLO 연구진들은 기존의 multi-task 문제를 regression problem으로 재정의하였다.
즉, 하나의 Neural Network이 한 번의 계산만으로 bbox와 class probability를 예측한다.
- bbox(bounding box): 객체의 위치를 알려주기 위해 객체를 감싼 직사각형의 box
- class probability: bbox로 둘러싸인 객체가 어떤 클래스에 해당하는지의 확률
이렇게 모든 detection pipeline이 single network로 이루어져 있으므로 end-to-end 모델이라고 할 수 있다.
또한 YOLO 모델의 속도는 기존의 것과 비교해 매우 빠르다(extremely fast).
base YOLO 모델은 1초에 45프레임, smaller version인 fast YOLO는 1초에 155프레임을 처리할 수 있다. 동시에 다른 real-time detection model보다 2배 높은 mAP를 보여준다.
- mAP: mean Average Precision의 준말로, Precision-Recall 그래프 아래의 면적들의 평균이다. 자세한 설명은 이곳으로..
사람은 어떤 이미지를 보면 어디에 무엇이 있는지 한 번에 파악할 수 있다. 사람의 시각 체계는 빠르고 정확하기 때문이다. 그래서 우리는 복잡한 task도 손쉽게 수행할 수 있다.(ex. 차를 운전하면서 지나가는 바깥 환경을 인식)
만약 사람의 시각과 같은 정확하고 빠른 Object Detection 알고리즘을 개발할 수 있다면 자율주행 자동차와 같은 기술도 급격히 발전할 수 있을 것이다.
기존의 detection 모델은 classifier를 재정의하여 detector로 사용하고 있었다. classifier에서는 단순히 물체가 무엇인지 알아내기만 하면 되지만 object detection은 이미지에서 물체의 위치까지 파악해야 한다.
대표적인 기존의 object detection 모델로는 DPM과 R-CNN이 있다.
자세한 설명은 이 포스팅에 있기 때문에 본 포스팅에서는 R-CNN만 간단히 설명하고 넘어가도록 한다.
R-CNN의 탐지 구조에 대해 간단하게 설명하면, bbox일 확률이 높은 곳을 제안하고 그 제안된 bbox 영역을 Classifier에 넣어 Classification을 수행한다. 그 이후 bbox를 합치고 제거하는 등의 후처리 작업을 통해 정확도를 높인다.
이처럼 detection 과정이 총 3가지로 나눠져 있고 개별적으로 학습을 진행해야 하기 때문에 구조가 복잡하고 최적화가 어려워, 굉장히 큰 inference time을 가진다는 단점이 있다.
따라서 YOLO는 기존 모델의 단점을 개선하고 이미지를 하나의 Neural Network로 크게 한 번 보면서(그래서 이름이 you only look once이다) 여러 가지 장단점을 갖게 된다.
unified detection은 YOLO의 핵심이라고 할 수 있다. YOLO는 객체 검출의 개별적 요소들을 하나의 Neural Network로 통합한 모델이기 때문에 이미지의 전체 특징을 활용한다.
먼저 입력 이미지를 S * S의 grid로 나눈다. (사진의 맨 왼쪽 이미지처럼)
만약 어떤 객체의 중심이 특정 grid 안에 위치한다면 그 셀이 해당 객체를 검출해야 한다.
각 grid는 B개의 bbox와 그 bbox에 대한 confidence score를 예측한다. (사진의 가운데 위 이미지처럼)
confidence score: 해당 bbox 안에 객체가 존재할 확률, 0~1 사이
수식을 뜯어보자면 IoU는 interection over union의 약자로
다음과 같이 집합으로 표현된다. truth는 실제 bbox, pred는 예측한 bbox이다.
Pr(Object)는 만약 grid 안에 아무것도 없다면 0, 확실히 있다면 1로 예측하여 0과 1 사이의 값을 가진다.
따라서 confidence score가 IOU값과 같을수록 이상적이다.
각 bounding box는 5개의 값을 예측한다.
x
, y
, w
, h
, confidence
가 그것이다.
- (x,y) : bbox 중심의 grid cell 내 상대 위치, 0~1 사이의 값
- (w,h) : grid cell 내 상대 너비와 상대 높이, 0~1 사이의 값
- confidence : confidence score와 동일
그리고 각각의 grid cell은 conditional class probabilities(C) 를 예측한다.
이름에서 알 수 있듯이 조건부 확률인데, 셀 안에 객체가 있다는 조건 하에 그 객체가 어떤 class인지에 대한 확률이다. 식으로 나타내면 다음과 같다.
이때 grid cell에 몇 개의 bbox가 있는지에 상관없이 1개의 grid cell에서는 1개의 class에 대한 확률 값만을 구한다.
아까 B개의 bbox를 예측한다고 했는데 이 B의 개수에 상관없이 1개의 grid cell에서는 1개의 class만 예측하게 된다.
test 단계에서는 아까 구한 C와 개별 bbox의 confidence score를 곱해주는데, 이를 각 bbox에 대한 class-specific confidence score라고 부른다.
계산 식은 다음과 같다.
사실 마지막에 교집합이 왜 그냥 Class_i로 변하는지 궁금했는데 생각해 보니 Object가 존재해야 객체가 어떤 class인지 맞출 수 있으니까
이렇게 포함관계여서 Pr(Class_i)라고 생각했는데 아니면 지적 부탁드림닷...
이렇게 구한 class-specific confidence score는 bbox에 특정 클래스의 객체가 나타날 확률과 그 객체에 맞게 bbox를 올바르게 예측했는지를 나타낸다.
본 논문에서는 PASCAL VOC를 이용하여 Evaluation을 진행하였다. 이를 위해 S = 7, B = 2, C = 20으로 설정하였다.
즉 7 * 7의 grid cell로 나누고 각 grid마다 2개의 bbox를 예측하며 PASCAL VOC에는 20개의 label이 있으므로 C를 20으로 설정한 것이다.
따라서 모델의 output tensor는 S x S x (B x 5 + C) 이므로 7 x 7 x 30이다.
YOLO의 Network 구조는 하나의 CNN 구조로 디자인되었다. 앞부분은 Conv layer이고 뒷부분은 fc-layer로 이루어져 있다. conv layer에서 이미지의 특징을 추출하고 fc-layer에서 클래스의 확률과 bbox의 좌표(coordinates)을 예측한다.
기본적인 틀은 GoogLeNet에서 따왔기 때문에, 24개의 conv layer가 있고 2개의 fc layer가 있다. 원래 GoogLeNet에는 inception 구조가 존재하지만 YOLO에서는 1 x 1의 reduction layer과 3 x 3의 conv layer 구조의 결합을 사용하였다. 이것이 inception 구조를 대신한다고 한다.
모델의 최종 output은 위에서도 말했듯이 7 x 7 x 30의 tensor이다.
좀 더 빠른 예측을 위해 논문에서는 fast YOLO도 소개하였는데, 이는 conv layer를 24개에서 9개로 줄이고 filter를 추가한 모델이다. 나머지는 기존의 YOLO와 모두 동일하다.
먼저 1,000개의 class를 갖는 ImageNet dataset으로 conv layer 부분을 pretrain 시켰다. 이 훈련을 위해 24개의 conv layer 중 20개만 사용했고 이어서 fc layer를 연결했다.
이 모델은 약 1주간 훈련시켰으며, ImageNet 2012 validation set에서 88%의 정확도를 기록하였다.
YOLO 연구진은 이 모든 training과 inference를 위해 Darknet framework를 사용하였다.
Darknet framework
YOLO를 개발한 Joseph Redmon이 독자적으로 개발한 framework이며 dnn들을 학습시킬 수 있다. YOLO뿐 아니라 AlexNet, DenseNet, VGG-16 등의 기존 네트워크도 학습시킬 수 있다.
아까 pretrain을 할 때 conv layer 중 20개만 사용한다고 하였는데, 이 뒤에 나머지 4개의 conv layer와 2개의 fc layer를 추가하여 성능을 향상시켰다. 이 layer들을 추가할 때, 가중치(weight)는 random initialized로 초기화했다.
또한 Object Detection을 위해서는 이미지의 해상도가 높아야 하기 때문에 input image의 해상도를 224 x 224에서 448 x 448로 증가시켰다.
이 Network의 최종 output은 class probabilites와 bbox의 좌표(coordinates) 이다.
연구진들은 bbox의 (x,y) 좌표값과 (w,h) 좌표값을 모두 0~1 사이로 정규화(Normalized)했다.
YOLO의 활성화 함수는 Reaky ReLU이다. 마지막 계층에만 linear activation function을 적용하였다.
Reaky ReLU는 기존 ReLU가 0보다 작을 때 gradient가 kill되는 현상을 막아준다. 0 이하에서도 아주 작은 값을 갖기 때문이다.
YOLO의 Loss function은 SSE를 기반으로 한다. loss는 총 두 가지가 있는데,
이 두 loss에 같은 가중치를 두고 학습하는 것은 좋지 않다. 하지만 SSE를 최적화하는 방식은 이 두 loss의 가중치를 동일하게 취급한다.
또 다른 문제는, 이미지 내의 대부분 grid cell에는 객체가 없다. 배경 영역(background)가 크기 때문이다. 객체가 없다면 confidence score=0인데, 이렇게 되면 대부분의 grid cell이 confidence score=0으로 학습할 수 밖에 없고 모델의 불균형이 일어난다.
YOLO에서는 이러한 문제를 해결하기 위해 객체가 존재하는 bbox의 confidence loss의 가중치는 늘리고 객체가 존재하지 않는 loss의 가중치는 줄였다.
이 뜻은 localization loss의 가중치를 증가시킨다는 뜻이기도 하므로 위의 두 가지 문제가 해결되었다.
2개의 parameter를 사용해 가중치를 조정할 수 있는데, 와 이다. 이 논문에서는 각각 와 로 설정하였다.
또한 SSE는 큰 bbox와 작은 bbox에 모두 동일한 가중치로 loss를 계산한다는 문제점이 있다. 하지만 작은 bbox는 위치 변화에 민감하다. 객체가 조금만 어긋나도 벗어나기 때문이다.
이를 고려하기 위해 YOLO에서는 weight와 height에 square root
를 취해 준다. sqrt를 취하면 너비와 높이의 증가율이 감소해 loss의 가중치를 감소시키는 효과가 있기 때문이다.
YOLO는 하나의 grid cell당 여러 개의 bbox를 예측한다. 하지만 training을 할 때에는 하나의 grid cell당 하나의 bbox와 매칭시켜야 하므로, 여러 개의 bbox 중 무엇을 선택할지 정해야 한다.
이를 위해 여러 개의 bbox 중 ground-truth와의 IOU 값이 가장 높은 하나의 bbox를 선택한다. (객체를 가장 완벽하게 감싼 bbox)
는 좌표(coordinates)에 대한 loss와 다른 loss들과의 균형을 위한 parameter이다.
는 객체가 있는 bbox와 없는 bbox간의 균형을 위한 parameter이다.
논문에서는 PASCAL VOC 2007, 2012를 이용해서 총 135 epochs를 학습시켰다.
하이퍼 파라미터 세팅은 다음과 같다.
- batch size = 64
- momentum = 0.9
- decay = 0.0005
초반에는 lr을 0.001에서 0.01로 천천히 상승시켰다. 처음부터 lr을 너무 높게 설정하면 gradient explosion이 발생하기 때문이다.
이후 75 epoch 동안은 0.01, 30 epoch 동안에는 0.001, 마지막 30 epoch 동안에는 0.0001로 lr을 설정하였다. 점점 증가시켰다가 다시 감소시키는 형태이다.
또한 overfitting을 막기 위해 dropout과 data augmentation을 적용시켰다. dropout 비율은 0.5이고, data augmentation을 위해 원본 이미지의 20%까지 random scaling과 random translation을 적용하였다.
train 단계와 마찬가지로 inference 단계에서도 객체를 검출할 때 1개의 Neural Network만 거치면 된다.
PASCAL VOC dataset에 대해 YOLO는 한 이미지 당 98개의 bbox를 예측해주고 그 bbox마다 class probabilites를 구해준다. YOLO는 test 단계에서 굉장히 빠르다는 특징이 있는데, R-CNN 등과 다르게 1번의 evaluation만 필요하기 때문이다.
하지만 YOLO의 grid design에는 한 가지 단점이 있다. 하나의 객체를 여러 grid cell이 동시에 검출하는 경우가 있다는 점이다. 객체의 크기가 크거나 grid cell들의 경계에 인접해 있는 경우 하나의 객체에 대한 bbox가 여러 개 생길 수 있다.
이를 다중 검출(multiple detections) 문제라고 한다. 이 문제는 non-maximal suppression이라는 방법으로 개선할 수 있다. YOLO는 NMS를 통해 mAP를 2~3% 가량 올릴 수 있었다.
non-maximal suppression
object detector가 예측한 여러 개의 bbox 중에 가장 정확한 bbox를 선택하도록 하는 기법
자세한 설명은 이 링크 참조
YOLO 모델에는 한계점이 몇 가지 존재한다. 먼저 YOLO는 각 grid cell마다 하나의 객체만을 검출할 수 있어 강한 공간적 제약(spatial constraints) 을 가진다.
예를 들어 새들의 무리와 같이 작은 객체가 무리지어 있는 경우, 객체의 검출이 제한적이다.
또 bbox를 데이터로부터 학습하기 때문에 일반화 능력이 떨어져, train time에서는 학습한 적 없던 새로운 종횡비의 객체는 잘 검출하지 못한다.
마지막으로 가장 문제가 되는 부분이 잘못된 Localization 이다.
크기가 작은 bbox는 크기가 큰 bbox에 비해 조금만 위치가 달라져도 성능에 큰 영향을 주는데, YOLO에서는 크기에 상관없이 bbox의 loss에 전부 동일한 가중치를 주기 때문에 부정확한 localization 문제가 발생한다.
먼저 YOLO를 다른 모델과 비교한다. 먼저 Fast R-CNN과 비교하기 위해 PASCAL 2007 dataset에서의 error를 구했다. Fast R-CNN은 이 논문이 나온 시점에 가장 성능이 좋은 R-CNN 계열 모델이었다.
Object Detection에 대한 많은 연구들은 pipeline을 빠르게 만드는 데 초점을 두고 있다.
YOLO 연구진들은 GPU 버전의 YOLO와 30Hz/100Hz에서 DPM의 성능을 비교해 보았다.
Fast YOLO는 PASCAL dataset 기준으로 가장 속도가 빠른 모델이고, mAP는 52.7%이다. 이는 30Hz/100Hz에서의 DPM보다 2배 이상 높은 정확도이다.
YOLO는 성능(real-time)은 그대로 유지하며 mAP를 63.4%까지 높인 모델이다.
또한 YOLO 연구진들은 VGG-16을 이용하여 YOLO를 train시켰는데, 이 모델은 일반 YOLO에 비해 mAP가 더 높지만 속도가 느려 따로 깊게 설명하지는 않았다.
Fastest DPM은 mAP를 조금 떨어뜨리고 속도에 집중한 모델이지만 속도가 타 모델에 비해 현저히 느린 것을 확인할 수 있다.
Faster R-CNN 모델은 기존의 R-CNN 모델보다는 확실히 속도가 빨라졌지만 여전히 real-time으로 사용하기에는 역부족인 것을 확인할 수 있다.
적어도 FPS가 30은 되어야 real-time으로 사용할 수 있는 것으로 보이는데, Fast R-CNN이나 Faster R-CNN VGG-16 등의 모델은 정확도가 높아도 FPS가 너무 낮아 real-time model로 사용할 수 없다. 반면 속도와 정확도가 모두 높은 모델은 YOLO인 것을 확인할 수 있다.
PASCAL VOC 2007 dataset에 대해 Fast R-CNN과 YOLO의 성능을 비교해 보았다. 지표들은 다음과 같다.
그림을 보면 Fast R-CNN에서는 Background error가 많이 발생하는 것을 알 수 있다. 대신 Localization error가 상대적으로 적다.
반면 YOLO는 Background error는 작지만 Localization error가 많이 발생하는 것을 알 수 있다.
Background error는 배경에 물체가 없는데 물체가 있다고 판단하는 error이다.
YOLO는 fast R-CNN에 비해 Backround error가 적다. 따라서 만약 두 모델을 결합한다면 굉장히 높은 성능을 낼 수 있을 것이다.
방식은 R-CNN이 예측하는 모든 bbox에 대해 YOLO도 유사하게 예측하는지를 체크하면 된다. 만약 둘의 예측이 유사하다면 겹치는 부분을 bbox로 설정한다.
Fast R-CNN과 YOLO를 결합한 모델은 기존보다 3.2%나 mAP가 상승한 것을 볼 수 있다.
물론 둘을 결합한 모델은 YOLO에 비해 속도가 느리다. 그렇지만 YOLO의 속도가 굉장히 빨라 Fast R-CNN을 단독으로 돌리는 것과 둘을 결합한 모델의 속도는 비슷하기 때문에, Fast R-CNN을 사용하는 것보다는 앙상블 모델을 사용하는 것이 낫다고 볼 수 있다.
VOC 2012 dataset에서 YOLO는 57.9%의 mAP를 달성했다.
정확도는 Fast R-CNN과 YOLO를 결합한 모델이 가장 높은 것을 알 수 있다.
연구를 위해 사용하는 데이터셋은 train과 test의 데이터 분포가 동일하다. 하지만 실제 데이터셋은 이미지 분포가 다를 수 있다. 따라서 YOLO 연구진들은 train과 다른 분포를 가진 test 데이터로 모델을 테스트해보았다.
test 데이터로 활용한 것은 피카소의 예술 작품이다.
그래프와 표를 보면 R-CNN은 VOC 2007 dataset에서는 YOLO와 비슷한 성능을 보였지만 피카소 dataset에서는 크게 성능이 떨어진 것을 확인할 수 있다. 반면 YOLO는 피카소 dataset에서도 성능이 떨어지지 않고, VOC 2007에서도 가장 높은 정확도를 보였다.
연구진들은 YOLO를 webcam과 연결해 실시간 Object detection을 가능하게 했다. 이는 홈페이지를 통해 확인할 수 있다.