공부기록

YOLO 논문 리뷰 본문

분석/논문

YOLO 논문 리뷰

맘모스빵러버 2021. 4. 13. 16:15

 

YOLO는 2015년에 나온 논문으로 Faster R-CNN에 비하여 부려 6배 가량 빠른 속도를 보인다. 정확도는 비록 조금 낮다 하더라고 정말 비약적인 발전이라고 할 수 있다!!

 

www.youtube.com/watch?v=XS2UWYuh5u0

 

  • YOLO의 기본 동작 원리

이미지 그리드를 448 x 448로 resize한 후 single convolution을 동작한다. 즉, CNN 동작이다. 그리곤 난 후 그 output의 결과를 NMS를 통해 걸러내서 객체를 탐지하는 것이다.

여기서 NMS란 CNN의 MaxPooling 같은 느낌이다. 정확히는 현재 픽셀을 기준으로 주변의 픽셀과 비교했을 때 최대값인 경우인 경우 그대로 놔두고, 아닐 경우 억제하는 것이다.

- Introduction에 나오는 YOLO의 특징에 대해서 설명하겠다.

 

1. YOLO는 무지하게 빠르다.

회귀문제로 인식하기 때문에 복잡한 파이프라인이 필요하지 않다. 간단한 신경망 학습을 통해 예측하는 것이다. 기본적으로 YOLO는 45FPS(frames per second), Fast - YOLO는 무려 150 FPS 보다 높다.

 

2. YOLO는 이미지 예측을 할 때 이미지 전체적으로 파악한다.

YOLO는 훈련과 테스트 시간 중에 이미지 전체를 보기 때문에 클래스의 외관뿐만 아니라 상황에 따른 정보도 암묵적으로 Encoding한다. 따라서 Fast R - CNN와 비교했을 때 Backgroud Error(예를 들어 강아지 뿐만 아니라 뒷배경도 인식하는 에러)가 반 이하로 낮아진다.

 

3. YOLO는 일반화를 배운다.

일반적인 이미지로 train하고 예술작품으로 test를 돌렸을 때 DPM(Deformable Parts Model)과 R-CNN보다 성능이 좋았다. 이 이유는 YOLO가 일반화가 잘 되기 때문에 새로운 분야나 예상치 못한 이미지가 들어왔을 때 예측을 더 잘할 수 있다.

 

  • Unirfied Detection

Yolo는 일단 input 이미지를 S x S의 그리드로 나눈다. 그리고 각각의 그리드 셀들은 bbox(Bounding Box)와 해당 박스에 대한 신뢰도(Confidence score)를 예측한다. 여기서 말하는 신뢰도 점수는 물체가 그 안에 포함이 되어 있다는 것과 박스(S x S grid)가 예측하는 박스의 정확성을 측정하는 지표이다. 만약에 셀 안에 물체가 없다면 이는 신뢰도가 0이 된다.

※ 알아야 할 점이 bbox의 구성요소이다. (x,y,w,h,confidence)로 5가지의 예측으로 구성되어있다. x,y 는 사각형 중앙의 좌표이고 w는 넓이(즉 가로 길이), h는 높이(즉 세로 길이), confidence는 신뢰도(예측된 box 와 실제 true 박스의 IOU) 또한, 그리드 셀은 클래스의 가능성을 예측한다. 이 확률은 객체를 포함하는 그리드 셀에서의 조건부 확률이다. 

 

C : Pr(Class_i | Object) 

이 확률은 상자 B의 수에 관계없이 그리드 셀당 하나의 클래스 확률 세트만 예측한다.

 

 

이러한 예측 값으로 하나의 tensor 구조를 예측할 수 있다. S x S x (5*B+C) 라는 예측값이 나오게 된다.

 

  • Network Design

Yolo Network

논문에서 가져온 네트워크 그림이다. 저자는 GoogleNet의 아키텍쳐에서 영감을 받았으며, Inception 블럭 대신 단순한 컨볼루션으로 네트웤을 구성했다고 한다. 224x224 크기의 이미지 넷 클래시피케이션으로 pretrain 시켰다. 이후엔 입력 이미지로 448x448 크기 이미지를 입력으로 받는다. 그리고 앞쪽 20개의 컨볼루션 레이어는 고정한 채, 뒷 단의 4개 레이어만 object detection 테스크에 맞게 학습시킨다. 아래는 [2]에서 가져온 더 직관적인 그림이다.

Yolo Network

이제 네트워크의 출력인 7x7x30 피쳐맵에 대해서 알아보겠다. 여기 안에는 우리가 앞서서 말했던 그리드 별 바운딩 박스와 신뢰도 지수, 그리고 각 클래스 별 예측값들이 담겨져 있다.

먼저 7x7은 그리드를 의미하며, 각각의 인덱스는 총 30차원의 백터 값을 가진다. 위 그림을 보시면 7x7 그리드 가운데 하나의 인덱스에 붉은 색 박스가 쳐져있는 것을 볼 수 있다. 앞서 우리는 하나의 인덱스에서 B개의 Bounding Box를 추측한다고 했으며, 논문에서는 이를 2로 설정하였다. 30차원 벡터 가운데 앞의 10 개의 수는 바로 이 두 개의 박스를 의미한다. 하나의 박스는 중심점 x와 y, 너비와 높이 w,h 그리고 신뢰도 지수 C 이렇게 (x, y, w, h, C) 다섯개 차원의 벡터로 나타낼 수 있으며, 두 개 박스는 10차원 벡터에 해당한다.

 

그 다음 오는 20차원 벡터는 해당 인덱스가 특정 클래스일 확률 값들이며, 여기서는 클래스가 20인 데이터 셋을 사용하였기 때문에 20 차원 벡터로 표현된다. 잠깐 기억을 더듬으면 우리는 박스의 신뢰도를 Pr(obj) * IoU로 구했고, 각 클래스별 확률 값을 구할 때는 Pr(classi | object) 로 구했다. 따라서 이 둘을 곱해주면 Pr(classi) * IoU 가 되고, 이는 곧 해당 박스가 특정 클래스일 확률 값이 된다. 이제 이 작업을 인덱스 i의 모든 B개 바운딩 박스에 적용하고, 이를 다시 SxS 인덱스에 적용하면 다음과 같은 결과를 얻는다.

이제 이렇게 구한 벡터들을 모두 모은 뒤 일렬로 나란히 세우면, 가장 위 차원부터 각 클래스별로 전체 바운딩 박스에서의 확률 값을 구할 수 있다. 물론 여기에는 동일한 물체에 중복되어 지정된 박스들도 있을 것이다. 이를 방지하고자 NMS라는 작업을 거치게 되는데, 구체적인 작동방식은 [2]의 슬라이드 39 - 70을 참고하면 된다.이제 NMS를 거쳐서 살아남은 최종 결과를 이미지 위에 그려주는 작업만 남았다.

NMS를 거치게 되면 벡터들의 대부분의 값들은 0이 된다. 하나의 바운딩 박스는 하나의 클래스에 속하므로, 벡터에서 최대 값을 계산하여 해당하는 클래스를 이미지 위에 박스와 함께 그려주면 된다.

 

  • Training

YOLO는 Darknet framework를 사용하여 훈련과 예측 과정을 수행하였다. 그리고 활성화 함수는 leaky ReLU를 사용하였다. 그리고 최적화 함수는 sum-square error 를 사용하였는데 이 이유는 간단하기 때문이다. 하지만 여러 문제들이 발생하였다. (+ 객체가 없는 이미지가 많았다)

이를 극복하기 위해 2개의 파라미터(lambda_coord, lambda_noobj)를 사용하여 경계 상자 좌표 예측에서 손실을 늘리고 객체를 포함하지 않는 상자에 대한 신뢰 예측 손실을 줄입니다. Sum-squared error 또한 큰 박스와 작은 박스에 동일한 가중치를 적용하여 큰 상자의 작은 편차가 작은 상자보다 중요하다는 것을 반영한다. YOLO는 그리드 하나당 두개의 bbox를 예측하게 되는데 이 문제점을 해결하기 위해 IOU가 높은 박스를 찾아서 "Responsible" predictor를 할당한다. 이로인해 recall을 향상 시킬 수 있다. 그리고 과대적합을 피하기 위해 dropout(0.5)과 데이터를 확장시켰다.

 

  • Loss Function

지금까지 조금 복잡하지만 아주아주 신기한 yolo의 네트워크 구조를 알아보았다. 그렇다면 이 네트워크를 어떻게 학습시킬 수 있을까? 저자들은 아주 세심하게 디자인 된 로스 펑션을 제시한다.

Yolo Loss Function

수식이 좀 긴데 전혀 쫄 필요가 없다. 이를 이해하기 위해선 먼저 1obj ij라고 생긴 기호를 이해해야 한다. 이는 object 가 등장하는 i 인덱스의 j번째 바운딩 박스가 최종 프레딕션을 낸 것을 의미한다. 앞서 우리는 NMS를 거쳐서 살아남은 일부 바운딩 박스만 최종 프레딕션에 포함시켰다. 따라서 Loss Function을 구할 때도 이 박스들을 찾아서 로스를 구하는 것이다. 

Yolo Loss Front Half

로스 펑션의 앞단이다. 크게 어려울 것 없이 최종 프레딕션에 포함된 바운딩 박스를 찾아내어 x, y 좌표, w, h 값, C 값이 예측 값과 ground truth 값의 차를 구해 모두 더해준다. 이 때, x, y, C 값은 그냥 단순 차를 구했고 w, h는 비율 값이기 때문에 루트를 씌워 차이를 구해준 점이 다릅니다만 큰 차이는 없다. 앞에 붙은 람다는 물체가 있을 때의 오차와 없을 때의 오차 간의 비율을 맞춰주기 위한 것인데, 논문에서는 모두 5로 설정했다.

 

찾아낸 물체들이 얼마나 정확한지 못지 않게 중요한 것이 못 찾아낸 물체들에 대한 페널티를 매기는 것이다.  1 noobj ij 라는 것은 물체가 없다고 판단된 i 인덱스의 j번째 바운딩 박스가 사실은 가장 ground truth와 IoU가 가장 높은 인덱스를 말한다. 즉, 물체로 찾아냈어야 하는데 못찾아낸 인덱스이다. 이에 대해선 찾아냈어야 하므로 C의 값의 차를 구해 로스에 더해준다.

 

마지막으로 모든 물체가 있다고 판단된 인덱스 i들에 대해서 모든 클래스들에 대해서 예측 값과 실제 값의 차를 구해 더해준다.

 

  • Limitations

1. 각 그리드는 두개의 bbox를 예측하고 하나의 class를 가질 수 있기 때문에 공간적 제약이 생길 수 밖에 없다. 이렇기 때문에 작은 물체에 대한 탐지가 어려움이 생긴다.

2. 데이터에서 경계 상자를 예측하는 것을 학습하기 때문에 새롭거나 비정상적인 종횡비 또는 구성의 객체로 일반화 하는데 어려움이 생긴다.

3. 여러 다운 샘플링을 하기 때문에 상대적으로 거친 기능(?)을 사용한다.

4. 손실 함수는 작은 경계 상자와 큰 경계 상자의 오류를 동일하게 처리한다. 따라서 작은 상자의 작은 오류가 IOU에 큰 영향을 미친다.

 

- 다른 모델과 성능 비교

 

속도는 매우 빠른 반면 정확도는 Faster R-CNN 보다 약간 낮다. 하지만 아주 최근에 나온 YOLOv5는 속도와 정확도면에서 아주 높은 성능을 발휘하고 있다.

 

[출처] bigdata-analyst.tistory.com/m/154

 

YOLO

본 글은 http://pjreddie.com/yolo 홈페이지를 참고하면 더욱 자세하게 알 수 있고, 제 나름대로의 해석이니 틀릴 가능성이 많습니다. arxiv.org/pdf/1506.02640.pdf (2015)위 논문을 바탕으로 작성했음을 알려드.

bigdata-analyst.tistory.com

arxiv.org/pdf/1506.02640.pdf

yeomko.tistory.com/19

 

갈아먹는 Object Detection [5] Yolo: You Only Look Once

지난 글 갈아먹는 Object Detection [1] R-CNN 갈아먹는 Object Detection [2] Spatial Pyramid Pooling Network 갈아먹는 Object Detection [3] Fast R-CNN 갈아먹는 Object Detection [4] Faster R-CNN 들어..

yeomko.tistory.com

 

'분석 > 논문' 카테고리의 다른 글

EfficientDet 논문 리뷰  (2) 2021.05.12
Faster R-CNN 논문 리뷰  (4) 2021.04.06
FAST R-CNN 논문 리뷰  (0) 2021.04.06
R-CNN 논문 리뷰  (0) 2021.03.29
[논문] VGGNet(2015) 리뷰 및 정리 (3)  (1) 2021.03.16