You Only Look Once: Unified, Real-Time Object Detection
We present YOLO, a new approach to object detection. Prior work on object detection repurposes classifiers to perform detection. Instead, we frame object detection as a regression problem to spatially separated bounding boxes and associated class probabili
arxiv.org
0. 핵심 요약
Object Detection 문제를 Classification 에서 Regression 문제로 재정의
evaluation는 full image 당 1번만 수행하며, bounding box와 class를 동시에 예측
기존의 모델들보다 매우 빠른(155 fps) YOLO 제안
1. BackGround
- 기존 Object Detection
기존의 object detection 모델들의 흐름을 보면 다음과 같다
우선 image 에서 region proposal을 추출한 뒤, 각 proposal 마다 classification을 통해 detection을 수행
하지만, 이러한 방식은 model pipeline 자체가 너무 복잡하고 단계도 1단계가 아닌 여러 단계로 구성되어 있어서 속도가 매우 느리다는 단점이 존재
또한, 모델이 여러 단계로 구분되어 있어 학습을 할 때도 매우 오래 걸렸다
YOLO는 이러한 단점들을 개선하기 위해 모델 자체를 end-to-end로 학습할 수 있도록 구성
2. 논문 핵심 내용
- Grid Sell
YOLO의 핵심은 단언 grid sell 이라고 할 수 있다
위 그림은 YOLO의 전체적인 pipeline을 표현한 그림이다
우선, YOLO는 다른 모델들과 다르게 proposal을 생성하지 않기 때문에 이미지 전체의 공간적 정보를 파악한다는 장점이 있다
예측을 진행할 때도 만들어진 box만을 보고 class를 결정하거나 하지 않기 때문에 전체적인 context를 파악할 수 있다
이제 맨 처음 그림을 보면, 이미지 전체를 S x S 의 grid로 구분한 것을 볼 수 있다
YOLO는 해당 grid를 통해 객체를 인식하고 위치를 탐색한다
다음 부분을 보면 bounding boxes + confidence와 class probability map이 존재하는데 이를 각각 설명하도록 하겠다
우선 bounding boxes + confidence는 각 grid 마다 총 2개를 예측한다
이는 grid 안에 객체의 중심이 최대 2개까지만 존재한다는 것을 의미하는데, 해당 값은 논문에서 설정한 값이며 변경할 수 있다
bounding boxes + confidence는 다음과 같이 표현될 수 있다
$(x, y, w, h, c)$
$(x, y)$ : 객체의 중심점을 의미하며, 해당 값을 표현할 때는 grid 안에서 어디에 위치하는 지를 0에서 1 사이로 표현
$(w, h)$ : 객체의 넓이와 높이를 의미하며, 전체 이미지의 scale을 기준으로 0에서 1 사이로 표현
$c$ : score를 의미하며, bounding box 안에 실제로 객체가 존재할 확률이 얼마나 되는지를 표현
이때 score는 다음과 같은 식으로 구한다
$Pr(Object) \times IoU$
이는 객체가 존재할 확률과 IoU 값 모두를 고려한 것
이를 최종적으로 정리하면, 각 grid 별로 총 2개의 box를 예측하며, 각 box는 중심 좌표와 높이, 넓이, score를 가지고 있다
다음으로는 class probability map이다
이는 grid 마다 1개를 예측하는 것이며, 해당 grid가 어떤 class를 나타내는 지를 표현하는 것이다
이를 계산하는 식은 다음과 같다
$Pr(Class_i ~|~ Object)$
쉽게 생각해서 해당 grid가 객체를 가지고 있을 때, 각 class 별로 확률이 어떻게 되는 지를 표현한다
마지막으로 모든 값을 종합해서 최종적으로 detection을 수행한다
최종적으로 출력되는 값의 개수는 S x S x 30이며, 이러한 이유는 다음과 같다
조금 다르게 표현하면 각 grid 마다 30개의 출력 값을 내놓는 것인데, 이는 box 별로 5개 씩 해서 10개와 class가 20개여서 30개가 되는것이다
class 가 20개인 이유는 YOLO 는 PASCAL VOC 데이터를 활용하였는데, 해당 데이터가 class를 20개 보유하고 있다
- Loss Function
YOLO에서 Grid Sell 못지 않게 유명하고 중요한 것이 Loss Function이다
우선 Loss function의 전체적인 식은 다음과 같다
언뜻 보면 식이 너무 길고 복잡해 보일 수 있지만, 하나씩 뜯어보면 매우 간단한 식이라는 것을 알 수 있다
위의 식은 총 3 부분으로 나눌 수 있는데, box의 위치, score, class 확률 이다
이는 위에서 각 grid 마다 예측하는 값들인 것을 쉽게 알 수 있다
1. box의 위치
해당 부분이 바로 box의 위치를 나타내는 부분이다
맨 앞을 보면 $\lambda_{coord}$가 있는데 이는 맨 마지막에 설명하도록 하겠다
그 다음을 보면 또 처음 보는 것이 $1^{obj}_{ij}$인데 이는 i번째 grid에서 j번째 box 안에 객체가 있으면 1, 없으면 0을 반환하는 것이다
즉, box 안에 객체가 없으면 해당 box는 굳이 계산을 할 필요가 없기 때문에 계산을 하지 않겠다는 것이다
그런 다음 정답 값과 예측 값 간의 오차제곱합을 통해 loss를 계산한다
이때, w, h는 제곱근의 차이를 계산하는 것을 볼 수 있다
이렇게 하는 이유를 논문에서는 박스 간의 크기 차이에 따른 오차의 차이를 줄이기 위함이라고 설명한다
박스가 클 때의 정답과 예측의 차이와 박스가 작을 때의 정답과 예측의 차이는 엄연히 다르게 봐야한다
이를 동일하게 보게 되면 작은 것들의 오차는 쉽게 무시될 수 있다
따라서 이를 보정해주기 위해 제곱근을 사용하는 것이다
이때, 한 가지 의문점이 생길 수 있다
만약 동일한 객체에 대해서 여러 개의 box가 생성되면 어떤 것을 진짜 예측이라고 해야할까?
이럴 때는 정답과의 IoU 가 더 높은 box를 선택하였으며, 이러한 점 역시 반영하였다
2. score
다음 부분이 score에 대한 loss이다
이 부분은 box 안에 객체가 있을 때와 없을 때를 구분하여 계산하는데, 그러는 이유는 역시 box에 객체가 없을 때는 더 확률을 0으로 보내야 하고 box가 있을 때는 1로 보내야 하기 때문에 그런 것이라고 할 수 있겠다
3. class 확률
마지막으로 각 grid 별 class 확률에 대한 loss이다
이는 다른 것들과 다르게 box 별이 아닌 grid 별이기 때문에 summation이 1개만 있는 것을 볼 수 있다
뒤에 있는 summation은 각 class 별 차이를 더해주는 것이기 때문에 위에 것들과는 다른 것이다
마지막으로 $\lambda$ 값에 대해서 설명을 하자면, 해당 값은 box의 값과 class 값을 보정해주기 위한 값이다
해당 값을 계산해보면 box에 대한 값들은 너무 작고 class에 대한 값들은 너무 큰 문제가 있다
이렇게 되면 class에 대해서만 학습이 되고 box들은 학습이 안되기 때문에 가중치를 부여해 이를 보정하였다
$\lambda_{coord} = 5, \lambda_{noobj}=0.5$로 설정하여 이를 해결하였다
- YOLO의 한계
논문에서는 YOLO의 한계점을 총 3가지를 언급하였다
1. 각 grid가 2개의 box만 예측하였고, grid 별로 1개의 class 값만 가질 수 있다
이로 인해 작은 물체나 붙어 있는 물체를 예측하는 데에는 어려움이 있다
2. 학습 데이터에는 존재하지 않은 비정상적인 비율을 가진 물체는 예측이 어렵다
3. loss function이 box 크기에 따라 값이 변화하는 것이 없어서 이에 대한 개선점이 필요하다
3. Model Architecture
해당 그림은 YOLO의 전체적인 Architecture를 나타낸 그림이다
마지막 출력을 보면 7 x 7 x 30 인 것을 볼 수 있는데, 논문에서는 S를 7로 설정하였다
또한 특이한 것은 입력 해상도가 448 x 448 이다
이러한 결정을 한 것은 Object Detection은 Classification보다 더욱 세밀한 정보가 많이 필요하다고 한다
따라서 해상도를 더욱 높여 더 많은 정보를 부여했다고 한다
해당 구조는 DarkNet에서 가져온 것이며, ImageNet으로 pre-trained 된 모델이다
YOLO는 기본 모델과 Fast 모델이 존재하는데, 둘 간의 차이는 convolution layer 개수에만 차이가 있으며, 기본 모델은 24개, Fast 버전은 9개가 존재한다
활성화 함수는 마지막 layer를 제외하고는 leaky ReLU를 사용했는데, 식은 다음과 같다
$\phi (x) = \begin{cases} x, & \mbox{if } \mbox{ x > 0} \\ 0.1x, & \mbox{otherwise} \end{cases}$
각종 hyper parameter는 다음과 같다
batch size = 64
momentum = 0.9, weight decay = 0.0005
learning rate = $10^{-2}$에서 $10^{-4}$까지 서서히 감소
dropout = 0.5 확률로 fc layer에 적용
4. Experiment
기존에 존재하던 Real-Time 성질을 띄는 모델들과의 비교이다
FPS와 성능 모두 압도적으로 우세한 것을 볼 수 있다
다음은 틀릴 때 어떤 것을 위주로 틀렸는 지를 보여주는 그래프이다
보면 Background에 대해서 YOLO가 매우 우세한 모습을 보이는 것을 알 수 있다
이러한 점을 통해 기존의 R-CNN과 YOLO를 결합하여 결과를 확인해보았는데, 다음과 같은 결과가 도출되었다
R-CNN과 YOLO를 Combine 하였을 때, 성능이 많이 향상되는 것을 볼 수 있다
이는 PASCAL VOC 2012 데이터에 대한 결과이다
YOLO가 가장 좋은 성능을 보이는 것은 아니지만 속도가 매우 빠른 것을 생각하면 매우 준수한 성능을 보이는 것을 알 수 있다
해당 그래프와 표는 사람을 얼마나 잘 인식하는 지에 대한 결과이다
YOLO가 다른 모델들에 비해 사람을 인식하는 데에 있어서는 매우 뛰어난 성능을 보인다는 것을 알 수 있다
5. Contribution
객체 감지를 위한 통합 모델인 'YOLO(You Only Look Once)' 제안
YOLO는 간단하게 구성할 수 있으며, 전체 이미지에 대해 직접 학습
YOLO는 감지 성능에 직접적으로 대응하는 손실 함수에 대해 학습되며 전체 모델이 함께 훈련
+ Comment
YOLO는 지금도 버전이 꾸준히 업그레이드가 되면서 많은 사람들이 사용하는 모델이다
가장 적용하기도 쉽고 사용하기가 쉬운 점이 장점이라고 생각한다
그만큼 YOLO는 인공지능을 한번이라도 공부해본 사람이라면 꼭 알고 있는 논문이라고 생각한다