YOLO
YOLO : You Look Only Once의 약자로, 빠른 물체 탐색기법에 대한 획기적인 방법을 소개하고 있다.
YOLO는 R-CNN, DPM 계열 등과 다른 종류의 접근 방식으로, object detection를 적당한 성능으로 획기적인 속도향상을 이끌어내었다.
이전에서의 object detection은 detection을 수행하기 위해 분류기(classifier)를 목적으로 하였지만,
YOLO에서는 이를 공간적으로 분리된 바운딩박스(bounding box)와 이와 관련된 클래스 확률에 대한 regression 문제로 바꾸었다.
즉, 한편의 실행(evaluation)에서 단일 신경망이 bbox와 cls 확률을 이미지로부터 직접 예측하는 방식이 된다.
YOLO는 45 frame/s 로 이미지를 처리할 수 있어 실시간 탐색이 가능하다.
여기에 좀 더 작은 버전의 fast YOLO는 155 frame/s 까지 성능이 나온다고 한다.
1. Introduction
YOLO 모델은 간단하다.
단일 신경망이 여러 bbox와 그 bbox에 대한 클래스 확률을 동시에 계산한다.
YOLO는 정말 빠르다.
detection 문제를 regression 문제로 생각했기 때문에 복잡한 파이프라인이 필요 없다.
YOLO는 예측시 image 전체를 생각한다.
sliding window나 RPN(region proposal network)와 달리, 외관과 클래스에 대한 맥락적인 정보를 인코딩한다.
Fast R-CNN은 배경 패치를 object로 실수하여 판단하는데 더 큰 맥락을 보지 못해서이다. YOLO는 맥락 전체를 봄으로 배경 에러가 Fast R-CNN보다 절반으로 줄었다.
2. Unified Detection
바로, YOLO가 어떻게 작동하는 지 알아보자.
1) 입력이미지는 448 x 448 x 3 이다.
GoogLeNet의 인풋이미지 사이즈는 224 x 224 x 3 이지만, detection을 위해서는 fine-grained(더 픽셀수가 많은)한 시각 정보가 필요하기 때문이다.
2) 이미지 학습된(pretrained) GoogLeNet(Szegedy, 2014)을 거친다.
원래 22층이지만, 뒤에 GAP, FC 층을 제외한 20층을 사용한다. 뒤에 conv 층을 더 붙이기 위해서이다.
3) 그 뒤에 24개의 conv 층이 붙고, 2개의 FC 층이 붙어 마지막으로 7 x 7 x 30 로 reshape 해준다.
즉, 이 부분만 처음부터 학습되는 것이다.
4) 7 x 7 x 30 의 tensor 값을 해석해보자. (인풋 이미지를 7 x 7 grid로 자른 것이라 생각해보자.)
7 x 7 픽셀에서 한 픽셀을 골라 뒤의 30채널을 보면,
처음 5개는 bbox1에 대한 (x, y, w, h, c1) 이다.
x, y는 bbox1 중심 좌표, w, h는 넓이, 높이, c는 confidence로 bbox1에 object가 있을 확률이다.
그 뒤 5개는 bbox2에 대한 (x, y, w, h, c2) 이다.
이렇게 2개의 박스 후보를 가정한다.
그 뒤 20개는 20가지 클래스에 해서 class score를 확률로 나타낸 것이다.
즉 i번째 값은 box안 object가 class_i 에 속할 확률이다.
이제 이 벡터에 c1과 c2를 곱하여 각 grid마다 2개씩의 class score 벡터를 구한다.
5) 이제 detection 과정을 보자.
5-1) 각 클래스마다, threshold(0.2) 보다 낮은 score는 0으로 만든다.
5-2) 내림차순으로 정렬한다.
5-3) NMS(Non-maximum Suppression) 과정을 거치면, 불필요한 박스의 score는 0이 된다.
6) NMS 과정
한 클래스에 대해 예를 들어보자.
높은 순서대로 정렬되어 있고, 텐서의 각 값은 어떤 박스 bb_x 안에 '개'를 물체로 가질 확률이다.
우선 첫번째와 두번째 박스를 비교해서, IoU(Intersection of Union, 겹친 영역)가 threshold(0.5) 보다 크면 0으로 만든다.
즉 개를 품고있을 만한 그럴 싸한(Non-Maximum) 박스하나를 없앤 것(Suppression)이다.
이와 같이 다른 박스에 대해서도 모두 비교한다. threshold(0.5)다 작으면 continue한다.
이제 0이 아닌 다음 박스에 대해서도 진행해서, 모두 반복한다면
이 클래스에 대해서는 이렇게 2개만 남는다.
그럼 이제 dog 뿐만아니라, 한줄 한줄 내려와서 모든 클래스(20개)에 대해서도 같은 과정을 반복해주고, 결과를 얻었다면,
각 박스마다(세로 직사각형) max값을 score로 정하고, 이값이 0보다 작거나 같으면 skip,
그렇지 않으면 그 박스를 선택한다!
이렇게 선택된 박스의 (x, y, w, h, c) 값은 loss 계산 시 실제 label의 (x, y, w, h, c)와 비교되면서 loss를 줄여나가는 방향으로 학습이 될 것이다.
Training
YOLO는 sum-squared error를 최적화 하는데, mAP를 최대화 하는 목적에 부합하지 않는다.
localization 에러와 classification 에러를 동등한 가중치로 처리하기 때문이다.
또한, 모든 이미지에서 대부분 그리드 셀이 object가 없었다.
이것이 confidence score를 0으로 만들어서, object를 가진 셀의 gradient가 종종 매우 커졌고,
학습시 일찍 발산(diverge)하도록 만들었다.
그래서 loss를 좀 수정했다.
$\lambda_{coord} = 5, \lambda_{noobj} = 0.5$ (각각 coordinate, no-object)로 설정하여, 물체가 없는 경우의 loss에 끼치는 영향을 매우 줄였다.
반면 object가 있을 때의 에러와 confidence에 대한 에러는 앞에 1이 붙어있다고 생각할 수 있으니, noobj보다 2배 더 가중치를 줄것이다.
또한, Sum-squared error는 큰 박스와 작은박스에 동등한 가중치를 주는데,
"큰 박스의 작은 deviation이 작은 박스의 작은 deviation보다 덜 중요해야 하는 것"을 반영해야 하므로, width와 height에 대해서는 루트 연산을 해주었다. (작은 박스든 큰 박스든 같은 비중으로 loss를 줄여야 한다.)
3. Experiment
Fast R-CNN과의 비교
YOLO는 PASCAL VOC 2007, 2012 데이터로 실험이 이루어졌으며,
R-CNN, Fast R-CNN 등과 비교실험을 하였다.
보다시피, 성능은 밀리지만, background를 구별하는 것은 YOLO가 좀 더 좋다.
초기 YOLO의 장점은 결국 '빠른 연산'으로 실시간 물체 탐색이 가능했다는 점이다.
4. Real-Time Detection in the Wild
논문 저자는 웹캠과 YOLO를 연동하여, 실제로 사용가능한지에 대해서도 실험을 했다.
논문 시연 과정에서도 이를 직접 보여주었으며 다양한 물체를 빠르고 정확하게 판단하였다.
단 배경이 흰 물체를 'toilet'이라고 하는 오류를 범해 시연장 분위기를 재밌고 화기애애하게 만들기도 하였다.
5. Conclusion
YOLO의 중요한 점은 다음과 같다.
1) 빠르다. YOLO : 45 fps
2) End-to-end 학습이 가능하다. 따로 feature를 추출해 주는 수작업이 없어도 된다.
3) 더 많은 localization error가 있긴 하지만, 배경에서 false positive를 덜 예측하여서 좋다. (loss를 조절했기 때문)
4) Object의 아주 일반적인 표현을 학습한다. DPM, R-CNN 등 다른 방법을 능가한다. (Fast, Faster R-CNN, SSD 보다는 성능이 낮다.)
reference
YOLO: https://arxiv.org/abs/1506.02640
NMS 설명 프레젠테이션: https://docs.google.com/presentation/d/1aeRvtKG21KHdD5lg6Hgyhx5rPq_ZOsGjG5rJ1HP7BbA/pub?start=false&loop=false&delayms=3000&slide=id.p
'ML, DL > object detection' 카테고리의 다른 글
Object Detection 예제, 설명, 코드포함 [Pytorch] (282) | 2020.06.14 |
---|---|
[cs231n] 12 Object detection & Segmentation (972) | 2019.11.08 |
댓글