그런 당신을 위해 논문을 준비했습니다! YOLO 편. You Only Look Once 논문 리뷰

송명규·2022년 12월 25일
0

원문 : !https://arxiv.org/pdf/1506.02640.pdf

YOLO는 기존 CNN 구조를 활용해 어떤 사물인지 맞추는 Classification이 아니라
한 사진에 "어떤 물체가 어디있는가?"라는 모든 질문에 답할 수 있는 Object Detection의 새로운 지평을 연 논문이다.
이 YOLO를 통해 굉장히 빠르게 모델을 통과하여 영상이 틀어지는 즉시 바로 objcet detection을 할 수 있다. 와우!

그럼 가보자. 이번글은 좀 길다. 천천히 읽어보도록 하자.

Abstract

연구자들은 YOLO는 기존의 multi-task 문제(여러개의 CNN구조를 통해 하던 방식과는 달리) 하나의 회귀문제로 적용했다고 말하고 있다.

말 그대로 end to end 형식(파이프 라인이 단 한개! 한번에 처리해버리기)을 사용해서 1초에 45프레임, FastYOLO(YOLO에서 layer 부분을 감소시킨 것)는 1초에 155프레임을 처리할 수 있다고 말한다.

1. Introduction

YOLO를 알아보기 앞서, 기존의 객체 검출 모델들을 살펴보자.

DPM(Deformable parts models)

DPM은 이미지 전체를 거쳐 sliding window 방식으로 객체를 검출한다.
여기서 sliding window 방식은 다음과 같다.
이것보다 더 잘 설명할 방법은 없을 것 같아서 가져왔다.
위 gif 처럼 일정 간격을 이동하면서 window를 만들고 각 window에 대해서 Classifier를 적용한다.

R-CNN

R-CNN도 마찬가지로 region proposal이라는 방법을 이용해 가장 객체가 있을 만할 곳을 찾고 각 bounding box에 classifier를 적용한다.

위 두 가지 방식은 2-stage(2단계)를 거친다.

1단계 : 객체가 검출될만한 곳 찾기
2단계 : 1단계에서 선택된 곳에서 무슨 물체인지 구분하기

게다가 전과 후 처리 과정에서 다양한 절차를 거쳐야 하고, 각 1단계와 2단계를 모두 독립적으로 optimize 시켜야 하기 때문에 최적화가 힘들다.

결과적으로, 느리다!

그러나 YOLO는 이름 그대로 한번에 물체가 어디에? 그리고 무엇이? 있는지 답해준다.

그래서 연구자들은 YOLO의 장점을 3가지를 말하고 있다.

1-1. YOLO는 빨라요

앞서 말했듯이, 기존의 방식과는 달리 하나의 파이프라인으로 객체 검출을 시행한다.
기본 YOLO의 네트워크에서는 1초에 45 프레임, FastYOLO는 1초에 150 프레임을 처리한다.
이는 실시간으로 영상에 bounding box를 넣어서 처리할 수 있다는 뜻이다! 매우 굳!

1-2. YOLO는 전체를 봐요

기존의 DPM의 sliding window나 R-CNN의 region proposal은 "객체가 어디있나요?"라는 질문에 답한다. 그래서 만약 아무것도 없는 화면에 점 하나가 찍혀있다면,의미없는 점 하나를 객체로 인식하고 Classifier를 진행한다.
이를 background error라고 한다.

그러나 YOLO는 화면 전체를 한 번에 보기때문에 기존의 방식보다 background error가 1/2 수준으로 적다.

1-3. YOLO는 어디를 봐도 더 잘 알아볼 수 있어요!

YOLO는 물체의 일반적인 부분을 학습한다고 말한다. 따라서 다른 모델에 비해 훈련단계에서 보지 못한 이미지가 나온다 하더라도 좀 더 robust하게 대응할 수 있다.

단점 : 하지만 쩜 정확도가 떨어짐..

YOLO는 SOTA(state of the art, 최신 연구 결과)에 비해 정확도가 다소 떨어진다.
속도를 얻은 대신 정확도를 조금 포기한것이다. 연구자들은 이것을 보고 속도와 정확성을 trade-off 관계에 있다고 말한다.(속도를 얻고 정확성을 포기하기 or 정확성을 얻고 속도를 포기하기)

2. Unified Detection

자 이제 YOLO의 작동 방식에 대해서 알아보자!

S X S Grid 로 나누기

먼저 전체 사진을 S X S Grid(격자)로 나눠준다.
이후 각각의 grid cell을 B개의 Bounding box, 각 bounding box에 대해서 confidence score를 예측한다.

여기서 bounding box란 객체를 둘러싼 직사각형의 사각형을 의미한다.
confidence score은 "bounding box안의 객체가 있을지 몇퍼센트 확신하는지, 그리고 그 경계가 얼마나 확실한지"를 나타낸다. confidence score은 다음과 같이 정의한다.

괜찮다. 무슨소리인지 모를수가 있다.

먼저, IOU개념을 그림으로 한방에 설명해보겠다.

식으로 다시 정리하면
IOU = (예측된 영역과 실제 영역의 교집합) / (예측된 영역과 실제 영역의 합집합)
이다.
만약 둘이 정확히 일치한다면 정확히 1이 나올 것이다.

그리고 Pr은 "이 안에 객체가 있는 확률은 ~~~% 입니다!"라고 하는 확률이다.

따라서 이 물체가 50% 확률로 객체가 있다고 예측했고 영역은 같은 크기로 예측했지만, 25% 영역만 일치했다면

confidence score
== Pr(object) x IoU((1/4)/(7/4))
== 0.5 x 0.14(1/7 근사)
== 0.07
이 되는 것이다.

bounding box의 구성

자, 그럼 다시 bounding box로 넘어와서,
bounding box는 x,y,w,h,confidence로 구성되어 있다.

(x,y)는 해당 그리드 셀 내에서의 상대위치를 뜻한다.
만약 해당 그리드 셀 정 가운데에 위치했다면 (0.5,0.5) 가 되겠죠?

(w,h)는 bounding box의 너비와 높이를 뜻한다.
이 역시 전체 이미지 크기에 상대적이다. 정사각형 모양의 전체 이미지 크기의 25%라면, (0.5,0.5)가 될것이다.

confidence는 아까 말했던 confidence score 이다!

conditional class probabilities

자, 이제 "어디에" 객체가 있는지 해결했으니, "어떤" 객체가 있는 확인할 차례이다.

여기서 알아야 할 것은 "하나의 grid cell 에서는 하나의 class만을 예측한다."는 것이다.

예를 들어 한 그리드 셀 안에 사람과 강아지가 함께 있어도 사람 혹은 강아지 둘 중 하나의 class 만을 예측한다.

그래서 class specific confidence score 이라는 수치를 만들어
bounding box에 class에 해당하는 객체가 있을 확률 과 예측된 bounding box가 그 클래스에 얼마나 잘 fit gkswl 나타낸다.

논문에서의 데이터

논문에서는 Pascal VOC라는 데이터셋을 이용했다고 나와있다.
S(grid) = 7, B(bounding box) = 2, C(Class) = 20 를 이용했다고 한다.

따라서 마지막 output tensor는
S x S x (Bx5 + C) = 7 x 7 x (2x5 + 20)
= 7 x 7 x30 이 된다.

뜬금없이 B에 5는 왜 곱하나요???

라고 물어본다면, 5는 앞에서 설명한 x,y,w,h,c이다. 그래서 5가 곱해지는 것이다!
나는 한참을 고민해서 알게 되었다... 주룩..

2-1. Network Design

자 이제 모델링으로 넘어가 보자.

YOLO의 신경망 구조는 GoogLeNet에서 따왔다고 한다.

총 24개의 convolutional layers 와 2개의 Fully connected layers로 구성되어 있다.

convolutional layer 은 1x1(reduction layer), 3x3, 7x7 을 다양하게 적용하였고, 이미지의 특징을 두드러지게 하는 Maxpooling layer를 추가했다.

여기서 조금 빠르게 하기 위해서 24개의 convolutional layer 에서 9개로 축소시킨 모델이 바로 Fast YOLO 이다. 딱 크기만 다르다.

2-2. Training

신경망 구성

사전 훈련은 ImageNet 2012 데이터 셋으로 20개의 convolutonal layer 를 pretrain 시켰으며, 위 과정에서 Darknet 프레임워크를 사용했다고 한다. 또한 객체 검출을 위해 이미지의 해상도를 224x224 에서 448x448 로 증가시켰다고 한다.

(((Darknet 프레임워크는 YOLO를 개발한 사람이 독자적으로 만든 프레임워크라고 한다. 여기서는 그냥 Darknet 프레임워크를 썼어요~ 만 알고 넘어가자.)))

본론으로 돌아와서, ImageNet 2012 데이터로 pretrain 시킨 모델은 Classification(어떤 것인지 맞추기) 이다. 그러므로 object detection 으로 바꾸기 위해 우리는 아직 "어디에?"라는 질문이 남아있다.
그렇기에 앞서 pretrain 시킨 20개의 convolution layer 뒤에 4개의 convolution layer 를 더해, 위치를 예측 하게 했다.

activation

또 신경망의 마지막은 activation 을 relu, 나머지는 leaky_relu를 적용했다고 한다.
leaky_relu는 음수부분을 0으로 만드는 relu와는 달리 음수부분에 작은 값을 곱하여 음수부분를 조금 남겨준다.
이렇게 leaky_relu를 쓰면 조금 더 데이터를 많이 쓰기 때문에 연산량은 늘고, 정확도는 높아질 (수)! 있다.

loss function

(1) SSE 문제
YOLO는 SSE(sum-squared error)를 적용했다고 한다.

그런데 여기서 문제가 생긴다.
SSE를 loss function으로 활용하여, optimize를 하면 평균 정확도인 mAP의 상승과 정확히 일치하지 않는다는 문제가 있다.

왜냐면 우리의 질문이 2가지이기 때문이다. 따라서 우리는 답도 2가지로 예측을 해야할 것이다.

  1. "어디에?" -> localization losss
  2. "무엇이?" -> classification loss

그런데 두가지의 loss에 동일한 가중치를 준다면 앞서 말한듯, mAP의 상승과 정비례하지 않는 문제가 있다.

(2) 객체 불균형 문제
또 다른 문제는 우리가 S = 7 로 설정했을 때, 객체가 소수의 그리드 내에만 있고, 나머지 다수의 그리드 내에는 없는 문제이다.
이는 대 다수의 그리드 내의 confidence score = 0 이 되버리기 때문에 모델의 불균형을 초래할 수 있다.

(3) 문제 해결하기
위 두개의 문제를 해결하기 위해 다음과 같은 방법을 사용했다.
객체가 존재하는 bounding box의 confidence loss에 대한 가중치를 증가시키고(λ_coord=5),
객체가 존재하지 않는 bounding box의 confidence loss에 대한 가중치를 감소시켰다(λ_noobj=0.5).

하지만 아직도 문제가 남았다.

ㅜㅜ

SSE는 큰 객체와 작은 객체에 대해서 동일한 가중치로 계산한다.
이 방법의 문제는 큰 객체는 중심이 10px을 이동해도 그럭저럭 맞지만, 작은 객체는 10px을 이동하면 IoU가 말그대로 박살나버린다.
따라서 연구자들은 loss function을 계산할때, w 와 h에 루트를 씌워주었다.
이렇게 되면 큰 값은 많이 작아지고 작은 값은 조금 작아져서, loss에 대한 가중치를 감소시킨다.

또.. 하나의 그리드 셀 안에 한 객체를 잡아내는 여러가지의 bounding box가 생길 수 있다.

귀여운 강아지에 수많은 검은 bounding box가 있는것이 보이는가?
이 중 실제 강아지를 둘러싸는 직사각형의 bounding box(ground-truth bounding box)와 IoU가 가장 큰 것을 선택한다.
그렇게 하면 단 하나의 가장 정확한 bounding box만 남게 된다.

loss function 종결

후 지금까지 loss function을 어떻게 수정할지 고민했다.
나머지는 붙히는 일만 남았다. 레츠 고.

자. 위부터 천천히 가보자.

(1) 첫번째 줄
object가 존재하는(λ_coord=5) 각 그리드 셀과 셀안의 bounding box에 대해서 x,y(상대 위치)의 loss
(2) 두번째 줄
object가 존재하는(λ_coord=5) 각 그리드 셀과 셀 안의 bounding box에 대해서 루트를 씌운(크기로 인한 오류 최소화) w,h(너비, 높이)의 loss
(3) 세번째 줄
object가 존재하는(λ_coord=5) 각 그리드 셀과 셀 안의 bounding box에 대해서 c(confidence score)의 loss를 계산
(4) 네번째 줄
object가 존재하지 않는(λ_noobj=0.5) 각 그리드 셀과 셀 안의 bounding box에 대해서 c(confidence score)의 loss 계산
(5) 다섯번째 줄
object가 존재하는(object가 존재하지 않는다면 굳이 coordinate를 할 필요가 없으므로 람다를 굳이 곱하지 않는다!) 각 그리드 셀과 셀 안의 bounding box에 대해서 conditional class probability의 loss 계산

epoch, batch, dropout

연구자들은 2007, 2012 훈련 및 검증 데이터 셋을 활용하여

epoch : 135
batch_size : 64
learning rate : 0.001 -> 0.01 -> 0.001 -> 0.00001으로 변화
drop out : 0.5
augmentation : 원본 image의 20%까지 random scaling, random translation

여기서 왜 처음에는 좀 낮게 시작했냐면, 처음부터 lr을 높게 시작해버리면 gradient exploding 문제때문에 학습이 제대로 되지 않았다고 한다. 그래서 처음에는 낮게 시작하여 감을 잡고, 중간부터 lr를 올렸다고 한다.

2-3. Inference

YOLO는 하나의 파이프라인만 사용하기 때문에 앞서 말했듯이 매우 빠르다!
Pascal VOC를 이용하여 1개의 이미지 당 98개의 bounding box를 사용한다.

또한 물체의 크기가 너무 크거나, grid cell의 경계면에 걸려있는 경우 같은 사물을 동시에 잡아내는 현상이 발생하였다. 이를 NMS(non-maximal suppression)를 통해 해결하였다.

NMS란?

간단한 아이디어이다.
예를 들어 20개의 class가 있다고 하면 각 클래스에 대해
1. '고양이'라는 class를 담은 bounding box들 을 모은다.(10개라고 생각해보자.)
2. 여기서 가장 높은 점수(classifier 점수)를 가지고 있는 bounding box를 뽑아 box list를 만든다.(파이썬의 pop)
3. 이후 box list 들과 하나하나 비교하며 IoU값이 threshold(임계치,역치라고 이해하면 됩니당)이상 넘는 것들을 제거합니다.
4. 이후 가장 높은 점수를 가진 box 만 final box에 추가합니다.
5. while box list: 로 반복해주기

이 NMS를 통해 mAP를 2~3% 가량 향상 시켰다!

2-4. Limitation

이렇게 짱짱인 YOLO에도 단점은 물론 있다.
연구자들은 3가지의 단점을 말하고 있다.

(1) 너무 작은거는 찾기 힘들어유...

한 개의 class에 대해서 각 그리드 셀 안에 2개밖에 예측을 못하기 때문에 뭉쳐있는 새때 같은 친구들은 잘 구분할 수 없다.

(2) 너무 그림이 이상해져버리면 힘들어유 ...
pretrain된 classifier는 결국 특정 종횡비를 학습한 것이기 때문에 가로로 너무 늘린다거나, 세로로 너무 늘린 그림은 파악하기 힘들다.

(3) 큰 boundging box 와 작은 bounding box에 대해 동일한 가중치를 둬유..
작은 bounding box 가 큰 bounding box에 비해 훨씬 많은 localization문제를 보일 수 있다.

3. Comparison to Other Detection Systems

아까 위에 적어 놓은 정도면 충분히 이해했다고 생각한다. DPM,R-CNN 과 YOLO를 비교했다는 것만 알고 넘어가자!

4. Experiments

드디어 실험단계이다.

4-1. R-CNN vs DPM vs YOLO

Real-Time Detectors(실시간 검출)로는 YOLO가 제일 높은 성능을 보였다.
Fast YOLO는 빠르지만, 정확도가 조금 낮아진 모습을 볼 수 있다.

Less Than Real-Time에서는 Fast R-CNN VCG-16이 가장 높은 정확도를 보였다.

4-2. VOC 2007 Error Analysis

이번에는 error analysis를 해보자!

에러의 종류는 다음과 같다.

correct : class 맞음, IoU > 0.5 이다.
Loc : class 맞음, but 0.1 < IoU < 0.5 이다.
Similar : class가 유사하고(정확히 유사하다 라는 말의 경계가 논문에 나오지 않음) IoU > 0.1 이다.
Other : class는 틀렸으나, IoU > 0.1 이다.
Background : IoU < 0.1, 즉 배경을 선택해버림.

에러를 분석하면, Fast R-CNN은 backgound(배경을 선택하는 것)이 많고, YOLO는 loc(위치 선택)이 많다.

4-3. Combining Fast R-CNN and YOLO

그렇다면 서로를 보완할 수 있는 Fast R-CNN 과 YOLO를 결합해보자!

Fast R-CNN 단독으로 사용했을 때는 mAP가 71.8 였지만 YOLO를 결합한 경우 3.2가 증가한 75.0이다!

4-4. VOC 2012 Results

위 표는 VOC 2012 데이터셋에 대해서 실행한 모델들이다.
속도는 역시 YOLO가 가장 빠르고, 정확도는 Fast R-CNN + YOLO가 가장 높은 정확도를 보여주었다.

4-5. Generalizability: Person Detection in Artwork

그럼 그냥 일반적인 이미지에서도 같은 성과를 보일까??
이번에는 파스칼 VOC 2007에서 학습한 데이터를 피카소의 예술작품에 대입해보았다!

YOLO는 새로운 이미지 데이터 셋에 대해서도 잘 적응하였다!

5. Conclusion

연구자들은 YOLO가 단순하고 빠르면서 정확하다고 한다. 또한 새로운 이미지도 잘 검출하여, 애플리케이션에서도 충분히 활용할만한 가치가 있다고 한다!

References

YOLO 논문원본

도움이 될만한 논문리뷰 블로그

profile
안녕하세요

0개의 댓글