본문 바로가기
딥러닝/CV 논문

[Object Detection] YOLO

by 혜 림 2021. 8. 3.

 들어가는 사족  

더보기

 우왕 한 1시간 반만에 다 읽었다 짧아서 다행ㅎㅎ 

 그리고 R-CNN 가족들보다 훨씬 쉬웠다.. 아닌가 경험치가 쌓여서 그런가 

 예전에 yolo는 아니고 yolact 깃헙에서 다운 받아서 쓸려고 했었는데 슬프게도 그게 도커 컨테이너에서 실행시킨 거라 팝업이라고 해야 하나 하여튼 그게 안 떠서 결과를 확인 못 해봄 (관리자 권한으로 실행하는 법을 몰랐음.. 지금도 모름) 하여튼 되게 깃헙에서도 쓰기 쉽게 되어있으니 혹시 관심있으면 한 번 보시길.. 컴파일러도 안 깔아도 되고 나름 쉬웠던 것 같음 다른 오픈 소스 깔다가 화병날뻔 했던거에 비하면 

 근데 darknet 사이트가 꽤나 중2병스럽게 생겼음..ㅋㅋ그래서 웃김 

 

 

 

You Look Only Once: Unified, Real-Time Object Detection

 

초록 Abstract


Yolo는 새로운 방법으로 object detection에 접근한다. object detection의 다른 모델들은 classifcation따로, region proposal따로, region refining 따로 학습하는 방식이었다. 하지만 YOLO에서는 object detection 문제를 회귀문제로 본다. 즉, 하나의 neural network 를 이용해서 바운딩 박스와 클래스 확률을 전체 이미지에서 바로 뽑아냄으로써 object detection을 수행했다. 
 이를 통해서 얻는 이점은 (1) unified 구조를 통해 얻은 매우 빠른 속도 (2) localization 에러가 많이 발생하지만, 배경이미지에 대해서 무언가 있을 것이라고 추측(false positive)할 가능성이 적다.

 

 

 1. Introduction

 YOLO는 인간이 바로 이미지에서 사물의 위치를 인지하고, 행동을 파악할 수 있는 것처럼 정확하고 빠른 알고리즘을 구현하고자 했다.

 

 기존의 R-CNN 같은 경우 (1) 이미지에서 바운딩 박스 후보를 생성하고 (2) 그 박스에 대해서 클래스를 예측한 후에 (3) 그 박스의 위치를 조정하는 과정 을 겪는다. 이렇게 복잡한 파이프라인은 매우 느리고, 따로 학습을 하기 때문에 최적화시키기가 어렵다. 

 

 따라서 본 논문 저자들은 이 모든 과정을 single regression problem의 관점에서 해결하고자 한다. 

 (* R-CNN 친구들은 2-stage detector라고 부르고, YOLO들은 1-stage detector라고 부른다. 이 부분 이해가 어렵다면 https://ganghee-lee.tistory.com/34 요기 참조)

 

 YOLO는 매우 심플하다. 그러니까 내가 금방 읽었겠지.

Figure 1

 

 위 이미지는 개략적인 과정을 나타낸다. single convolutional network를 이용해서 여러개의 바운딩 박스와 그 박스들에 대한 클래스 확률을 동시에 예측한다. R-CNN 같은 경우 selective search를 이용한 후에 클래스 예측하는 등, 조각적인 이미지에 대해서 클래스를 확률하지만 위와 괕은 과정을 거침으로써 얻을 수 있는 이점은 전체 이미지를 input 으로 한다는 점이다. (자세한 내용은 추후에) 

 

 이를 통해서 얻는 YOLO의 이점은 

 (1) 빠른 속도 : 하지만 동시에 real-time 으로 detection 하게 만들어진 다른 모델들에 비해서는 두 배 정도 높은 mAP를 얻는다( real-time으로 만들어진 친구들이다! R-CNN 같은 친구들 말고)

 (2) 예측을 할 때 전체 이미지를 고려한다: sliding window나 region proposal based 기술(R-CNN에서 쓰인 selective search같은)과는 달리, YOLO는 학습 및 테스트 시간에 전체 이미지를 고려하기 때문에 클래스에 대해서 contextual information도 같이 고려할 수 있다. Fast R-CNN 같은 경우, 배경을 object로 잘못 판단하는 false positive가 많은 이유는 전체 이미지를 고려하지 못하기 때문이다. 따라서 YOLO는 Fast R-CNN에 비해서 background error의 반 정도 된다고 한다. 

 (3) 일반화할 수 있다: 자연 이미지로 학습하고 화가의 그림으로 테스트 했을 때 다른 것들에 비해서 훨씬 더 outperform 했다고 한다. (그 이유에 대해서는 언급을 안 하고 있다. 왜 generalizable 한지?_

 

 그럼에도 불구하고 YOLO에도 한계점이 존재하는데, 이가 곧 정확성이다. 빠르게 이미지에서 개체를 찾을 수 있지만, 특히 작은 개체들은 정확하게 위치를 잡는 것에 어려움이 있다. 

 정확성과 속도는 어쩔 수 없는 trade off 인듯. 1-stage detector들의 운명...☆

 

 2.  Unified Detection

 사실 이 챕터만 읽으면 끝난거라고 할 수 있다. 

 

 

 

Figure 2

 (1) 이미지를 S  x S 개의 그리드로 나눈다
 (2) 그 그리드 셀에 개체obeject의 중심center이 있다면, 해당 그리드에 object가 있다고("responsible") 판단한다
 (3) 각 그리드 셀은 B 개의 바운딩 박스를 예측하고, 그 박스에 대한 confidence score을 계산한다

 (1), (2) 

 무슨 말인가? 한국어로 설명하기 어렵다.

 (+개인적인 해석이라 틀릴 수 있다) 

 일단 기본적으로 지도 학습이기 때문에 정답 레이블이 필요하다. 자 그런데 우리는 그리드 셀을 나눴다. 그래서  output도 그리드 셀 마다 나온다. (output이 7 x 7 x (5 * B + C) 인데, 이때 7 x 7 그리드마다 5*B + C 만큼의 결과값이 나온다고  생각하면 된다. 이해가 어렵다면 figure 3 참조) 

 모든 그리드 셀마다 객체가 있는지 없는지 이걸 레이블을 달아줘야 하는데 모든 거에 달아주느냐? 그렇게는 하지 않고 객체의 중점이 있는 그리드에만 이 "객체가 있다" 는 레이블을 달아준다는 뜻 같다. 

 

(3) 

 confidence score는 수식으로 이해하면 편하다. Pr(object ) * $IOU^{truth pred}$

 따라서 해당 박스 안에 개체가 없다면 confidence score은 제로가 되고, 그게 아니라면 IOU 값이 되는 게 바람직하다는 생각을 반영한 식이다. 

 

 한편 바운딩 박스는 5개의 예측을 수반한다: (x, y, w, h, confidence) 이때 (x,y)는 바스의 중심을 의미하고, width 와 height는 전체 이미지의 상대적인 비율?로 계산된다. 마지막으로 confidence prediction은 예측과 아무 ground truth box 사이의 IOU를 나타낸다. 

 (4) 또한 각 그리드 셀은 conditional class probabilites, C를 예측한다. 수식으로 나타내면 Pr($Class_{i} | Object$) 
 그러니까 어떤 오브젝트가 있을 때, 클래스를 무엇으로 예측하는가에 대한 결합확률이다. 바운딩 박스의 수와 상관없이 그리드 셀마다 한 세트의 클래스 확률을 예측한다. 

따라서 

 

 

 (3)과 (4)을 합쳐서

 한 그리드당 저만한 길이의 벡터가 생긴다. 이거를 이제 output으로 도출해야 하는 것이다. 

 이때 p는 개체가 있는지 없는지를 나타내고, 있다면 박스의 좌표값들, 그리고 마지막으로 있는 c 값들은 어떤 클래스일지 예측하는 값이다. 물론 p가 0이라면 class 역시도 0이 되겠찌! 

 

 (bbox는 해당 그리드 셀을 넘어가도 괜찮다) 

 

 

 

 한편 테스트 할 때는 이 C와 각각 박스의 confidence predicion을 곱한다. 

 

 Pr($Class_{i}$|Object) * Pr(Object) * $IOU^{truth pred}$ = Pr($Class_{i}$) * $IOU^{truth pred}$)

 

따라서 우리가 얻는 것은, 각 박스에 대한 class-specific한 confidence score이다. 

 

Pascal VOC로 테스트 했을 때, S=7 B=2 C=20을 사용했다고 한다. (Pascal VOC의 클래스가 20개이다) 

따라서 결과는 7 X 7 X 30 텐서가 되겠다. 

 

2.1 Network Design 

 

figure 3

 GoogLeNet을 참고해서 image classification 모델을 만들었다고 한다(!!!!) 

 24개의 convolutional layer, 그리고 2개의 FC layer.

 이때 GoogLeNet의 인셉션 모듈을 그대로 쓰지 않고, 1 X 1 필터로 차원을 축소하고 3 X 3 필터로 합성곱 계산을 했다고 한다. 

 

 그런데 왜 저런 full architecture 그림은 항상 위에가 잘려있는가..??

 

한편 더 속도를 높이기 위해서 fast버전의 YOLO가 있는데, 이거는 24개 대신 9개의 합성곱 망을 섰다고 한다. 네트워크의 사이즈를 제외하고선 모든 설정이 같았다고 한다.

 

2.2 Training 

 

 ImageNet(1000개의 클래스가 있는 데이터 셋) 으로 pre-train을 우선 했다. 이때 figrue 3에서 보이는 첫 합성곱 신경망을 pre-trian 했다고 한다. 처음부터 모든 구조를 다 pre-train하지 않고 일부만 한 이유는, pretrain 한 모델에 합성곱 레이어랑 fc 레이어를 동시에 추가하면 더 좋은 성능이 나왔다는 선행 연구 때문이다. 

 따라서 pre-train한 모델에 4개의 합성곱 레이어와 2개의 FC 레이어를 추가하여 train했다. 랜덤하게 초기화했다고 한다. 또한 이때는 이미지 화상도를 448 * 448로 올렸다. ( pre-train 때는 224 * 224)

 

마지막 레이어에서는 클래스 확률고 바운딩 박스 좌표값을 예측한다. 바운딩 박스의 width 와 height는 0~1 사이의 값을 갖도록 normalize 해준다. 

 

 마지막 레이어와 그 외 다른 레이어 모두 leaky ReLU 활성화 함수를 이용했다.

 

 최적화를 할 때는 sum-squared error를 이용했다. 쉽게 계산할 수 있다는 장점 때문이다. 

 하지만 문제가 크게 두가지

 (1) localization과 classification error를 동일한 비중으로 고려한다는 것이다. 이는 별로 이상적이지 않다. 

 (2) 모든 그리드 셀에 객체가 있지 않다. 하지만 이를 고려하지 않으면 객체를 포함하는 그리드 셀들이 지나치게 영향을 끼치는 경향이 있다. 

 

 따라서 이를 해결하기 위해서 

 (1) 바운딩 박스 즉 localization 에러의 비중을 더 크게, classification 에러의 비중을 더 작게 고려했다. 이후 수식에서 보겠지만 $\lambda_{coord} = 5, \lambda_{noobj} = .5$ 의 파라미터를 이용했다. 

 

 (2) 한편 위에서 언급하지 않았지만, sum-squared error는 바운딩 박스의 크기는 고려하지 않고 동일하게 에러를 계산한다. 하지만 동일한 절대적인 에러 크기이더라도, 이가 작은 바운딩 박스에 더 크게 영향을 준다는 점을 떠올리며 이는 마찬가지로 이상적이지 않다. 따라서 이를 해결하기 위해서 로스를 계산할 때 바운딩 박스 height, weight 값에 루트를 씌워줬다고 한다. (추후 식으로 보면 이해가 더 쉽다)

 

 한편 YOLO에서는 한 그리드 셀에서 여러 개의 바운딩 박스를 예측한다. 하지만 우리는 한 개체에 대해서 동일하게 예측하는 여러 가지 박스를 원한다기 보다는, 비교적 가장 정확한 박스 하나만을 원한다. 따라서 우리는 NMS 를 시행하게 된다. 아래 그림과 같은 결과를 얻게 된다. 

 

NMS가 익숙하다? 하면 처음으로 다뤘던 포스팅 R-CNN에서 확인할 수 있다. 

 

후 그래서 정리해가지고 loss 수식을 쓰면 다음과 같다. 

지난주에 latex 대 참사가 있어서 도저히 latex를 쓰고 싶지가 않다. 

Equation 3

 

 저 멋드러진 1 은 뭐라고 읽는지도 몰라서 검색조차 할 수 없다. 그래서 그냥 1이라고 쓰겠다. 

 

 $1_{i}^{obj}$ 는 셀 i에 오브젝트가 있는지 없는지 나타내는 값이고, $1{ij}^{obj}$는 셀 i의 j 번째 바운딩 박스에 개체가 있는지 없는지 나타내는 값이다. 

 

$1_{i}^{obj}$ denotes if object appears in cell i and $1{ij}^{obj}$ denotes that the jth bounding box predictor in cell i is "resposible" for that prediction.

 

 이런 notation 이 존재하는 이유는 무엇인가? 오직 그 그리드 셀 안에 개체가 있을 때만 classification error를 계산하고, ground truth box에 "responsible"할 때만 bounding box coordinate error를 계산하기 위해서다. (ex 그 그리드 셀에서 가장 높은 IOU를 가진 box 에 대해 loss를 계산하는 어쩌구)

 

 한편 총 135번의 epoch를 거쳤다고 한다. 

 배치 사이즈는 64.

 momentum은 0.9 decay는 0.0005

 

 학습률 스케줄려는 다음과 같다

: 첫 epoch 에서는 서서히 lr을 증가시킴 ($10^{-3} => 10^{-2}$) 

 75번 epoch까지는 $10^{-2}$로 시행, 다음 30epoch에서는 $10^{-3}$로 시행, 그리고 마지막 30 epoch에서는 $10^{-4}$로 시행했다. 

 

 과적합 문제를 피하기 위해서 드롭아웃과 extensive한 데이터 어그멘테이션을 시행했다. 

 이때 과적합은 0.5의 확률 , 어그멘테이션은 랜덤 스케일링과 translation을 최대 이미지 사이즈의 20%만큼 시행했다. 

 

2.3 Inference

 

 train때와 거의 비슷하다. Pascal Voc에 이 모델을 시험해봤을 때 98개의 바운딩 박스를 추출했다고 한다. 

 

 비교적 작은 개체는 어떤 그리드 셀에 중점이 있는지 찾기 쉽다. 하지만 꽤 큰 사이즈의 개체 혹은 그리드 셀의 경계 근처에 개체가 있는 경우에는 여러 개의 셀에 거쳐서 localized 되는 경향이 있을 것이다. 따라서 NMS를 시행해줬고, 이는 다른 모델(DPM, R-CNN)에 비해서 중요한 요소였다고 한다. 

 

2.4 Limitations of YOLO

 

- 작은 물체를 잡아내기 어려움 ( 새떼 이런거)

- 새로운 형태의 물체에 일반화하기 어려움(이상하다 서론에서 장점이라 그랬는데??)

- 작은 바운딩 박스와 큰 바운딩 박스의 에러를 동일하게 고려함 => 전체 에러 중 로컬리제이션 에러 비율이 매우 높음 

 

3. Comparison to Other Detection Systems 

 

 (다른 모델들과 비교를 하고 있다) 

 

- DPM(Deformable parts models) 

  DPM은 슬라이딩 윈도우 기법을 이용해서 객체 탐지를 수행한다. 또한 분리된 pipeline을 이용해서 특성을 추출하고, region을 분류하고, 높은 점수의 region에 대해서 바운딩 박스를 예측한다. 하지만 YOLO에서는 이렇게 분리된 pipeline을 하나의 convolutional neural network로 대체했다. 이 네트워크를 통해서 특성 추출, 바운딩 박스 예측, nms, 그리고 contextual 사고 까지 모두 수행한다. 따라서 DPM보다 더 빠르고 정확하다. 

 

- R- CNN

 R-CNN은 슬라이딩 윈도우 대신 selective search를 이용한다. 이를 통해 바운딩 박스 후보들을 추출하고, 이것들을 대상으로 합성곱 계산을 해서 특성 추출한 후에 각 박스에 대한 SVM 점수를 매긴 후에 마지막으로 이 바운딩 박스를 refine한다. 각 단계가 역시 분리되어 있기 때문에 정확하게 각각 tuning 하는 게 중요해진다. 따라서 매우 느리다. 

 YOLO는 R-CNN과 공통적인 부분이 있는데, 각 그리드 셀을 통해서 잠재적인 바운딩 박스를 추출하고 그 바운딩 박스의 특성을 통해서 class 점수를 매긴다는 점이다. 하지만 그 그리드 셀을 통해서 나온 proposal 에 공간적 한계를 둬서 같은 물체를 여러번 탐지하는 것을 완화시켰다. 따라서 98개라는 적은 바운딩 박스를 이용한다. (한편 R-CNN은 2000개) 또한 single, jointly optimized model이라는 점도 다르다. 

 

- Other Fast Detectors 

 fast, faster-RCNN(이게 나왔던 때라니!) 들은 기존의 R-CNN 모델의 속도를 높이는 데 중점을 두고 있다. 연산을 공유하거나 selective search 대신에 신경망을 통해서 지역을 추출하는 등의 방식으로. 분명히 R-CNN에 비해서 속도를 많이 올린 것은 사실이지만, 여전히 실시간 처리는 어려운 정도다. 

 기타 연구도 기존의 DPM, HOG 같은 것의 성능을 개선하기 위한 연구에 해당한다. 

 하지만 YOLO는 그렇게 기존 모델의 어떤 요소를 바꿔서 성능을 개선하기 보다는, 새로운 관점에서 문제를 해결하고자 했으며 그렇게 탄생한 새로운 pipeline을 통해서 실시간 처리의 가능성이 더욱 커졌다. 

 

 - Deep MultiBox, OverFeat, MultiGrasp

 직접 읽어보시길... ★

 

4. Experiments 

 다른 모델과의 성능 비교를 통해서 알아낸 사실들 ! YOLO를 통해서 Fast R-CNN의 false positive 결과를 수정함으로써 보다 성능을 개선할 수 있다는 것

 

 4.1 Comparison to Other Real-Time Systems

Fast YOLO (앞에서 나왔던 것을 기억하는가? 작은 사이즈의 합성곱을 가진 YOLO) 는 PASCAL 데이터 셋을 가장 빠르게 객체 탐지를 할 수 있었다. 다른 실시간 처리 모델들에 비해서 2배에 가까운 mAP 값을 얻었다고 한다. 

 한편 YOLO를 VGG16을 이용해서 학습을 시켜봤다고 한다. 즉 앞서 말한 Fast YOLO와는 반대로, 큰 네트워크 구조를 이용한 셈이다. 이 경우 YOLO에 비해서는 정확하지만 확실히 느려졌다고 한다. 

 

Table1

정확한 사항은 위 테이블 참고 

 

4.2 VOC 2007 error Analysis 

 

 YOLO와 Fast R-CNN을 이용했다. (당시에 가장 높은 성능을 가지고 있었고 모델이 공개되어있었기 때문)

 어떤 에러들이 많은지 분석했다. 에러의 종류는 크게 다섯 개 

 

 - Correct: correct class and IOU > .5

 - Localization: correct class, 0.1<IOU<0.5

 - Similar: similar class, IOU>0.1

 - Other: class is wrong, IOU>0.1

 - Background: IOU<0.1 for any object 

 

Figure 4

 보면 YOLO는 localization의 비율이 Fast R-CNN에 비해서 매우 높은 것을 알 수 있다. 

 한편 Fast R-CNN은 훨씬 더 많은 background error가 있는 것을 알 수 있다. 

 

4.3 Combining Fast R-CNN and YOLO

 

 그래서 4.2의 결과로 이 팀은 Fast R-cnn과 YOLO를 함께 이용하기로 한다. 

 YOLO를 이용해서 fast R-cnn이 예측한 배경 이미지를 제거하는 것이다. 

 

Table 2

 

 단품으로 썼을 때는 Fast R-CNN이 성능이 가장 좋지만, 섞는다면? YOLO와 섞는 것이 가장 효과가 좋아 보인다. 

 

 이것은 단순히 모델 앙상블해서 얻은 효과라기 보다는, fast R-cnn과 yolo가 만드는 에러의 종류가 다른 것 때문이라고 한다. 

 

 하지만 이를 통해서 속도를 개선한다거나는 절대 불가능했다. 왜냐하면 각 모델을 따로 돌린 다음에 결과를 합친 것이기 때문이다. "결과를 합쳤기" 때문이다. 

 

 4.4 VOC 2012 Results 

 

Table 3

 

보면  YOLO 자체의 성능은 별로인 것을 알 수 있다. 

특히 작은 물체들, bottle, sheep, tv/monitor 같은 경우 더 작은 걸 알 수 있다. 

 

4.5 Generalizability: Person Detection in Artwork

 

 실제로 트레이닝과 테스트 데이터 셋 분포가 같길 기대하긴 무리가 있지. 그래서 완전 다른 데이터 셋으로 테스트를 해봤다고 한다. 

 

Figure 5

 

성능은 보시다시피. 

자연스러운 이미지(자연의 모습을 담았다는 뜻 x) 로 학습하고 그림으로 테스트했더니 YOLO만 보시다시피 여전히 성능이 좋은 것을 확인 할 수 있다. 

 

 (* 보통 머신러닝에서는 ROC 곡선을 이용해서 성능을 평가하는 메트릭으로 쓰는 모양이지만, cv 분야에서 ROC 곡선은 난 본적이 없고... 거의 PR 곡선을 이용해서 AP를 측정한다. 왜 ROC를 이용하지 않는지는 모르겠다. 언젠가 알게 될 듯)

양적인 평가 말고 질적인 평가를 보여주는 Figure 6

 5. Real Time Detection in the Wild

 

웹캠에 YOLO 달아가지고 결과를 봤다고 한다. 재밌었겠다. 

 

 6.  Conclusion 

 

 full image에서 바로 훈련할 수 있는 모델을 구성했기 때문에 실시간 성능이 좋다. 

 이런 이야기... 

 

 

더보기

아니 회사는 왜 퇴사하려고 하니까 더 난리 난리 아 놔 진짜 

 

헉 reference 까먹음

이제 동영상의 소중함을 깨달았다... 물론 전에 봤었지만

 

https://arxiv.org/pdf/1506.02640.pdf

https://www.youtube.com/watch?v=9s_FpMpdYW8 

 

댓글