본문 바로가기

TIL(Today I Learned)

YOLO - You Only Look Once Real-Time Object Detection 논문 리뷰

 

📍 YOLO(You Only Look Once)란?

 

YOLO는 Real Time Object Detection으로 2015년 조셉 레드몬에 의해 등장했다. 

 

Object Detetion은 two-stage와 one-stgae로 분류할 수 있다. YOLO는 one-stage로 YOLO이전의 Classifier를 base로 하던 모델에서 single neural network로 한번에 객체를 인식할 수 있는 모델을 소개했다. YOLO 빠른 속도는 동영상과 같은 실시간으로 객체 인식과 객체 검을 가능하게 만들었다. 

 

YOLO는 객체 인식 분야에서 잘 알려진 모델로 현재까지 버전이 업그레이드 되며 널리 사용되고 있다. 

오늘은 YOLO의 첫번째 논문을 살펴보고자 한다. 

YOLO 논문

 

 

YOLO는 object detection을 단일 신경망으로 처리하여 매우 빠른 속도로 객체를 탐지 할 수 있다. 당시의 최첨단 detection과 비교했을 때 YOLO는 localization에러들이 더 발생하지만 False positive를 예측할 가능성은 낮다.

 

당시의 detection 모델들이 classifier 모델을 기반으로 classification이후, post-processing을 사용해서 bounding box를 세분화 하고 중복 감지를 제거하고, 장면의 다른 객체를 기반으로 점수를 매기고하는 긴 과정을 거쳐야 한것과 달리 YOLO는 이 복잡한 파이프라인들을 단일화 하여 빠른 속도로 물체를 검출 할 수 있다.

 

✅ YOLO의 특징

 

1. 기존의 모델보다 매우 빠르다

  • Image Localization과 Image Classification을 하나의 회귀 문제로 본다. 

2.  객체의 일반화 할 수 있는 표현(Generalizable Representation)을 배운다. 

  • 이미지로 부터 일반화가 가능한 특징을 학습한다. 
  • training에서 보지 못한 새로운 이미지에 대해서도 검출 정확도가 놓다. 

3. 이미지 전체를 본다. 

  • R-CNN계열의 모델들은 Sliding Window, Region Proposal방식으로 이미지의 일부만 보고 객체를 탐지하는 방법이다.
  • 그래서 객체와 비슷한 Background Patch에 대해서 False Positive 오류를 범하는 경우가 종종있다.
  • 하지만 YOLO는 학습할 때 객체가 포함된 주변 배경까지 고려한다.
  • 그래서 YOLO가 Fast R-CNN에 비해 Backround를 Fasle Positive로 판단하는 빈도가 1/2라고 한다. 

 

1️⃣ YOLO의 동작 원리 

 

 

✅ YOLO는 원본 이미지를 S*S 동일한 크기의 그리드(grid)로 나눈다.

한 Grid Cell안에 어떤 객체의 중심이 포함되면, 해당 Grid Cell이 그 객체에 대해 책임을 지고 탐지를 수행한다. 

 

✅ 각 Grid Cell은 B개의 Bounding Box와 confidence score를 예측한다.

confidence score는  박스 안에 객체가 포함될 확률과, 박스가 객체를 얼마나 잘 담고 있는지에 대한 곲으로 아래와 같이 계산한다.

  • Pr(Object) : 객체가 포함되면 1, 없으면 0.
    • 객체가 포함되지 않은 경우 전체 0이 된다. 
    • 점수가 높기 위해서는 예측한 Bounding Box가 최대한 Ground truth box와 겹치도록 하여 1에 가까워야 한다. 

 Bounding Box는 (x, y, w, h) 4개의 값에 대한 예측으로 이루어져 있다.

  •  x, y : Bounding Box의 중심 좌표값
    • Grid cell 안에서의 상대적인 좌표로 0~1사이의 값을 갖는다.
    • 예를 들어, Bounding Box와 Grid Cell의 중심이 겹치면 x, y는 0.5, 0.5가 된다.
  •  w, h : Bounding Box의 너비, 높이 값
    • 전체 이미지 안에서 상대적인 길이로 0~1사이의 값을 갖는다.
    • 예를 들어 Bounding Box의 크기가 이미지의 전체 크기와 같다면, w, h 모두 1이 된다. 

 

각 Grid Cell은 C개 클래스에 대한 Conditional Class Probabilities를 계산한다.

 각 Bounding Box안에 있는 객체가 어떤 클래스일지에 대한 조건부 확률이다. Conditional Class Probabilities는 다음과 같이 계산된다. 

Conditional Class Probabilities를 사용해서 최종적으로 구하는 값은 Class - specific Confidence Score이다.

  • Class - specific Confidence Score : Bounding Box안에 특정 객체가 속할 확률Bounding Box가 객체를 얼마나 잘 담고 있는지에 대한 정보를 표현하는 값.

Class - specific Confidence Score 다음과 같이 계산된다. 

  • Class - specific Confidence Score = Conditional Class Probabilities X Bounding Box의 Confiednce Score

 

이때  Anchor Box는 각기 다른 크기와 형태의 객체 사전 정보를 확보하고 탐지하도록 설계되어 있다.

그 다음 Anchor Box와 그 박스에 대한 confidence score를 예측한다. 이렇게 confidence가 높은 박스들만 남기고 신뢰도가 낮은 박스들은 지워준다. 최종 Anchor Box 들은 NMS(Non-Maximum Suppression)을 이용해 선별하면 위의 final detecions와 같은 결과물이 나오게 된다. 

 

이와 동시에 어떤 사물인지에 대한 classification작업이 동시에 진행된다.

 

> 요약본



 2️⃣ YOLO Network구조 

YOLO의 네트워크 구조는 위와 같다.

 

24개의 Conv layer와 2개의 FC layer로 구성되어 있다. Darknet network라고 부르며 ImageNet dataset으로 Pre-trained된 network를 사용한다. 1x1 Conv layer와 3x3 Conv layer의 교차를 통해 Paramerter를 감소시킨다. 

  • 입력이미지 : 448 * 448 * 3 크기의 입력 이미지를 받는다. 
  • 24개의 convolutional layer와 2개의 fully connected layer로 구성되고, 첫 번째 convolutional layer는 이미지에서 feature를 추출한다. 
  • 마지막 layer는 fully connected layer로 output의 확률과 좌표를 예측한다.

 

3️⃣ YOLO의 Training 과정

✅ Pretraining

 ▪   YOLO의 convolution layer는 ImageNet 1000-class competition dataset으로 pretrain되었다. 

즉, YOLO의 backbone 네트워크는 ImageNet 1000개 클래스 데이터셋으로 사전 학습되었다. 

 

    초기 20개의 convolutional layer는 featrure extraction역할을 수행한다. 그 후 average pooling layer와 fully connected layer ( FC layer)를 추가하여 classification 모델로 동작하게 한다. 

이 모델을 약 1주일 동안 학습시켜 ImageNet 2012 validation set에서 단일 crop 기준 88% 성능을 달성했다. 

 

—> 초반 20개의 Convolutional Layer 학습 끝 

 

✅ Pretraining 이후 Detection에 적합하도록 변환

    이후, 추가적인 convolutional layer와 fully connected layer를 붙여 detection에 적합하도록 변환한다. 

랜덤하게 초기화된 weight를 가진 4개의 convolutional layer와 2개의 fully connected layer를 추가하여 성능을 향상한다. 

 

cf) Pretrained된 네트워크에 Convolutional Layers와 Fully Connected Layers를 추가했을 때 네트워크의 성능이 향상된다는 연구가 있었음. 그래서 논문의 저자들도 Pretrained된 20개의 Convolutional Layer뒤에 4개의 Convolutional Layer와 2개의 Fully Connected Layer를 추가함. 

 

     Detection 모델은 fine-grained한 (세밀한) 시각 정보를 필요로 하므로, 입력 해상도(input resolution)를 224*224에서 448*448로 증가시킨다. 

 

✅ Training

     마지막 layer는 class 확률과 bounding box좌표를 예측한다. 마지막 Layer에서만 linear activation function을 사용하고, 다른 hidden layer에서는 Leaky ReLU 활성화 함수를 적용하여, 일반적인 ReLU보다 죽은 뉴런 문제를 완화한다. 

 

      앞에서 YOLO는 Grid Cell에서 B개의 Bounding Box를 예측한다고 했다. 하지만, 학습할 때 각 객체(object)에 대해 하나의 bounding box predictor만 담당해야한다.

 

이를 위해 현재 ground truth와 가장 높은 IoU(Intersection over Union)를 갖는 예측 bounding box에 "책임"을 할당한다. 이렇게 하면 모델은 Bounding Box의 크기, 비율, 그리고 객체의 Class를 더 잘 예측하는 효과가 있다. 

  • 즉, 어떤 predictor는 특정 크기의 물체를 더 잘 탐지하고,
  • 어떤 predictor는 특정 종횡비(aspect ratio)의 물체를 더 잘 탐지하는 등
  • 특정한 객체 유형에 특화된 예측을 할 수 있도록 학습됨.

결과적으로, 모델의 전반적인 재현율(recall)이 향상된다. 

 

 

✅ 문제점과 해결방법

     YOLO는 손실 함수로 sum-squared error(합산된 제곱 오차, SSE)를 사용하여 모델을 최적화 한다. 

SSE는 계산이 간단하기 때문에 사용하지만 SSE는 여러 문제점을 갖는다.

 

1. Classification error(분류 오차)와 Localization error(위치 오차)에 동일한 가중치(weight)를 부여한다. 

YOLO모델 Training 목표는 mAP를 올리는 것인데, SSE를 최적화 하는 작업은 mAP(평균 정밀도)를 최적화하지 않는다. 

 

2. 대부분의 grid cell은 객체를 포함하지 않는다.

즉, negative sample(배경)일 가능성이 크다. 

이렇게 되면, 배경 cell의 confidence score를 0으로 만들도록 gradient를 크게 주게 되는데, 이 값이 객체가 있는 cell의 gradient를 압도하는 현상이 발생한다. 즉, Negative Sample이 Positive Sample보다 많아서 데이터의 불균형 문제가 발생하고 이로 인해 학습이 불안정해지고 조기 분기(early divergence)를 유발할 수 있다.  

 

      이 두가지 문제를 해결하기 위해 LE에대한 가중치는 증가시키고, 객체를 포함하지 않는 Negative Sample에 대한 CE 가중치는 감소시킨다. 

  • λcoord = 5: 좌표(localization) 오차를 줄이기 위해 가중치를 증가.
  • λnoobj = 0.5: 객체가 없는 배경 부분의 confidence loss 가중치를 감소.

 

3. SSE는 큰 Bounding Box와 작은 Bounding Box의 가중치를 동일하게 준다. 

이 것은 큰 Bounding Box가 거리 1만큼 움직이는 것은 IoU에 영향이 작지만, 작은 Bounding Box가 1 만큼 움직이는 것은 IoU점수에 영향이 크다는 것과 연관이 있다. 

즉, 작은 bounding box의 작은 편차(deviation)가 더 중요한 반면, 큰 bounding box에서는 영향이 덜해야한다. 

 

      이를 해결하기 위해 bounding box의 width와 height에 square root(제곱근) 값을 취한다. 이렇게 하면 작은 bounding box에서의 작은 편차가 더 크게 반영되도록 조정된다. 제곱근에 의해 LE의 증가율이 작아져서 큰 Bounding Box의 Error에 덜 민감해진다. 

Training Loss Function

  • 첫 번째 식 : Bounding Box의 중심 좌표 x, y에 대한 loss
  • 두 번쨰 식 : Bounding Box의 너비, 높이에 대한 Loss
  • 세 번째 식 : Bounding Box의 Confidence Score에 대한 loss
  • 네 번째 식 :  Bounding Box의 Confidence Score에 대한 loss
  • 다섯 번째 식 : Conditional Class Probability의 Loss. 

 

4️⃣ YOLO모델의 한계 

✅ YOLO는 Strong Spatial Constraints를 부과한다. 

각 Grid Cell은 오직 B개의 Bounding Box를 예측하고 하나의 클래스만을 갖을 수 있다.

Spatial Constraints에 의해 가까이 있는 개체의 수에 대한 예측 제한이 발생한다.  

 

예를 들어, 아래의 그림에는 하나의 Cell안에 여러 마리의 새가 있다. 하지만 YOLO는 주로 하나의 Cell에서 2개의 객체만 탐지함므로 모든 새를 탐지하지 못하는 문제가 발생한다. 


 

 

 

✅ YOLO는 특정한 데이터로만 학습한다. 

그래서 Bounding Box의 가로 세로의 비가 새롭거나 일반적이니 않을 경우 탐지 성능이 저하된다. 

 

✅ Loss Function은 Bounding Box의 크기를 고려하지 않는다. 

물론, Bounding Box의 width와 height에 제곱을 취했지만 이것은 Bounding Box의 width와 height의 증가율을 감소시킨것이지, 궁극적으로 작은 Bounding Box가 error에 더 민감한 문제를 해결하지 못한다.

 

 

 

 

 

reference 

https://medium.com/@parkie0517/yolo-%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0-you-only-look-once-uni%EF%AC%81ed-real-time-object-detection-f146af809c57

 

YOLO 논문 리뷰: You Only Look Once: Unified, Real-Time Object Detection

안녕하세요 공돌준입니다. 오늘은 컴공이면 모두가 한 번쯤 들어봤을 YOLO 논문을 리뷰 해보도록 하겠습니다.

medium.com

 

https://velog.io/@hhhong/Object-Detection-with-YOLO

 

[딥러닝] Object Detection with YOLO

한번만 본다고? 욜로라이프 아니고? 얘 머신아, 사진에서 내가 원하는 것들 좀 알아서 봐줘

velog.io

 

https://velog.io/@qtly_u/n4ptcz54

 

[YOLO] YOLO 버전 - Yolo v1부터 Yolo v8까지 (23.03.기준)

이번 글에서는 YOLO 시리즈별 구조 및 특징에 대해 정리해보겠습니다. 23년 3월 기준 YOLO는 버전 8까지 나와있습니다. < YOLO 버전별 출시 시점 > - YOLOv1 : 2016년에 발표된 최초 버전으로, 실시간 객체

velog.io