YOLO(You only look once): Unified, real-time object detection 논문 리뷰
YOLO(You only look once): Unified, real-time object detection 논문을 정리한 글입니다!
Intro
YOLO 논문은 2015년에 나온 논문으로 (마지막 수정은 2016년 5월) 기존에 나왔던 R-CNN류의 문제점인 속도를 개선했습니다. 성능은 조금 줄이더라도 속도를 빠르게하는 것을 목표로 했으며, R-CNN류에서 1) Bounding Box Regression, 2) Detection Score를 찾는 2가지 Task를 YOLO에서는 1개의 Regression Task로 바꿔서 풀도록 재정의 했습니다.
- 논문 제목에서 볼 수 있듯, 전체 이미지를 1번만 보고(Yon only look once), 기존에 존재하던 좋은 것들을 합쳤고(Unified), 빠른 속도(Real-time object detection)를 가진다는 특징을 가지고 있습니다
- YOLO는 v1~v5가 있는데 이 글은 v5 기반으로 작성되어 있습니다
Abstract
- YOLO : object detection의 새로운 접근 방법
- Single neural network가 bounding box와 class probabilities를 예측
- 단일 네트워크를 사용하기 때문에 End-to-End로 성능을 최적화 가능
- Base YOLO : 45 FPS(frames per second)
- Fast YOLO : 155 FPS
- 다른 real-time detector보다 2배 높은 mAP
- General representations of object를 학습 가능
1. Introduction
기존에 사용하던 DPM, R-CNN의 단점
- 기존에 발표된 DPM(deformable parts models)나 R-CNN은 sliding window를 사용해 잠재적 bounding box를 구한 후, post-processing을 통해 bounding box를 재조정, 중복 제거, 재측정하는 과정을 가지고 있습니다.
- 위와 같은 방식은 각각의 component를 따로 학습해야 하기 때문에 느리고 최적화하기 힘듭니다!
YOLO 방법론
- Simple한 System
- Input image를 448x448로 resize
- single convolution network에 넣기
- 모델의 confidence를 threshold
- Extremely fast
- regression 문제로 바꿨기 때문에 복잡한 파이프라인이 필요 없습니다
- Demo
- Globally
- 전체 이미지를 넣음
- Fast R-CNN에 비해 절반 이하의 background errors
- Generalizable representation
- object의 일반화된 표현을 학습
- 새로운 도메인이나 예상치 못한 input에 대해 세분화되지 않고 일반화 가능
- ex) 사진으로 학습하고 그림 이미지로 예측할 경우 잘 맞습니다
- Context 정보를 많이 사용합니다
- training / testing code는 open source로 존재
6. Conclusion
- YOLO는 simple하고 빠르게 학습 가능!
2. Unified Detection
- 여러 component들을 단일 neural network로 합침
- bounding box를 예측하기 위해 전체 이미지를 사용
- 이미지에 대한 모든 클래스와 bounding box를 동시에 예측합니다
- System
- input image를 \(S \times S\) grid로 나눕니다
- 물체의 중심이 grid cell에 속하면 grid cell이 물체를 탐지합니다
- 각각의 grid cell이 B개의 Bounding box와 BB에 대한 confidence score를 예측합니다
- confidence score : box에 물체가 있는지, 상자가 예측한 정확도가 얼마나 정확한지를 나타내는 척도
- \[Pr(Object) * IOU_{pred}^{truth}\]
- 물체가 없다면 0
- confidence score가 IOU와 동일하길 원함
- Bounding box는 5 prediction으로 구성
- \((x, y)\) : center of the box
- \(w, h\) : whole image에 대비한 예측값
- \(confidence\) : 예측된 box와 다른 ground truth box간의 IOU
- grid cell은 또한 C개의 conditional class probability를 예측
- \(Pr(Class_{i}\mid Object)\) : object가 있을 grid cell의 확률
- test시에 conditional class probability와 individual box confidence prediction을 곱합니다
- \[Pr(Class_{i}\mid Object) * Pr(Object) * IOU_{pred}^{truth} = Pr(Class_{i}) * IOU_{pred}^{truth}\]
- 각 상자마다 특정 클래스에 대한 확률을 알 수 있습니다
- 평가시 Pascal VOC를 사용, \(S=7, B=2, C=20\)
- 따라서 final prediction은 \(7 \times 7 \times 30\) tensor (v5)
- v1은 Bounding box를 1개와 \(7 \times 7 \times 24\) tensor를 final prediction에서 return합니다!
- input image를 \(S \times S\) grid로 나눕니다
2.1 Network Design
- GoogleNet 모델 기반
- 24 Convolution layer, 2 Fully Connected layer
- 인셉션 대신 1x1 reduction layer를 넣어 네트워크의 파라미터를 줄였습니다
- Fast YOLO는 9개의 Convolution layer
2.2 Training
- 참고 슬라이드 : YOLO CVPR 2016
- ImageNet 1000-class dataset을 사용해 20개의 Convolution layer pretrain
- pretrain 이후 4 convolutiona layer와 2 fully connected layer 추가(with randomly initialized wieghts)
- Detection에선 세밀한 정보가 필요하기 때문에 input size 224x224를 448x448로 증가
- Bounding Box width, height를 이미지의 width, height로 0~1로 Normalization
- Bounding Box의 x, y는 특정 grid cell의 offset값 사용
- final layer에서 linear activation function 사용
MSE보다 쉽게 최적화할 수 있는 SSE(Sum-Squared Error)를 최적화 합니다
- 대부분이 object가 존재하지 않기 때문에 0으로 많이 차게 됩니다. 이런 상황이라면 해당 셀의 confidence score가 0으로 수렴하며 object가 포함된 셀의 gradient를 압도할 수 있습니다. 이로 인해 학습이 불안해질 수 있습니다
- 위 문제를 해결하기 위해 bounding box coordinate predictions의 loss를 증가시키고 confidence predictions for boxes that don’t contain objects의 loss를 감소시킵니다
- 이 때 사용하는 2개의 파라미터가 \(\lambda_{coord}\)와 \(\lambda_{noobj}\)!
- \(\lambda_{coord}=5\) \(\lambda_{noobj}=.5\)
- \(\lambda_{coord}\) : coordinates(x,y,w,h)에 대한 loss와 다른 loss들과의 균형을 위한 balancing parameter
- \(\lambda_{noobj}\) : obj가 있는 box와 없는 box간에 균형을 위한 balancing parameter. (일반적으로 image내에는 obj가 있는 cell보다는 obj가 없는 cell이 훨씬 많으므로)
- SSE는 큰 BB와 작은 BB의 error를 동일하게 평가합니다. 큰 BB가 중요하다는 것을 반영하기 위해 bounding box의 width와 height sqaure root를 사용합니다
- Batch size : 64
- Momentum : 0.9, decay of 0.0005
- Learning Rate : 0.001 -> 0.01로 상승(epoch마다) 75 epoch동안 0.01, 30 epoch동안 0.001, 30 epoch동안 0.0001
- Dropout : 0.5
- data augmentation : random scaling and translations of up to 20% of the original image size
Loss Function
출처 : 박진우님 블로그
2.3 Inference
- 참고 슬라이드 : Deep System’s YOLO
2.4 Limitations of YOLO
- 큰 object와 작은 object의 중심이 비슷할 경우, 둘 중 1개도 인식하지 못하는 경우가 있으며, loss function에서 큰 box에 제곱근을 취하지만 여전히 작은 물체에게 불리한 구조입니다
- grid cell이 1개의 클래스만 예측하기 때문에 작은 object가 여러 개 있는 경우 제대로 구분하지 못합니다
- 학습시 사용한 bounding box의 형태가 아닐 경우(=새로운 bounding box) 예측할 때 어려움이 생깁니다
- 작은 BB와 큰 BB의 error를 동일하게 처리하므로 잘못된 localization을 발생합니다
- fully connected layer를 2번 태워서 \(x,y,w,h\)를 맞추려고 하는데 이 값은 애초에 맞추기 힘든 값입니다.
4. Experiment
- 특이한 것은 Fast R-CNN + YOLO의 앙상블이 가장 점수가 높은 것
- YOLO는 배경에 대해 판단하지 않으며, Localization이 되지 않습니다
- 동시에 나온 것은 Fast R-CNN을 사용하고
- Fast R-CNN만 나오면 지워버리는 식으로(false-positive) 앙상블
Reference
카일스쿨 유튜브 채널을 만들었습니다. 데이터 사이언스, 성장, 리더십, BigQuery 등을 이야기할 예정이니, 관심 있으시면 구독 부탁드립니다 :)
PM을 위한 데이터 리터러시 강의를 만들었습니다. 문제 정의, 지표, 실험 설계, 문화 만들기, 로그 설계, 회고 등을 담은 강의입니다
이 글이 도움이 되셨거나 다양한 의견이 있다면 댓글 부탁드립니다 :)