앎을 경계하기

Machine Learning/For CV

[YOLO 정독] YOLO v1

양갱맨 2021. 5. 29. 15:44

YOLO는 "You Only Look Once"라는 논문으로 세상에 나오게 되었다.

작명센스가 미쳤다.. You only live once 아님 ^^

 

YOLO의 핵심은 "one stage object detection"이라는 것이다.

YOLO가 발표되기전 최신논문이었던 R-CNN 계열은 바운딩박스 후보군을 생성하는 region propose part와 bounding box 정보를 예측하는 Bounding box regressor와 해당 바운딩박스의 클래스를 분류하는 classfier를 따로 따로 나눠서 학습시킨다. 이것을 two-stage object detection이라고 함.

아무튼 그러다보니 R-CNN은 학습이 느리고 최적화가 어렵다. (각 역할마다 모델을 다 따로따로 분리해놨으니 당연히 최적화가 어려움)

YOLO는 이러한 구조를 완전 심플하게 바꿔버림

그림처럼 단순하게 CNN을 사용해서 bounding box regression과 classification을 동시에 수행하는 구조를 구성함.

그래서 YOLO는 매우 빠르다. R-CNN처럼 모델 구성이 복잡하지 않기 때문에 매우 단순하고 빠르게 동작한다.

그리고 YOLO는 single CNN으로 detector를 구현했기 때문에 RPNet(Region Proposal Network)을 적용하여 sliding window하는 Fast R-CNN과는 달리 큰 사이즈의 컨텍스트에 대해 더 좋은 성능을 보인다. 즉, background error가 더 낮다는 것. 하지만 YOLO가 정확도가 더 좋은 것은 아님. 실험에서 속도는 빨랐지만 정확도는 낮다는 것을 확인했다.

YOLO의 grid cell, bounding box, confidence score, class probabilities

YOLO는 S*S개의 grid cell로 입력 이미지를 나눈다.

그리고 각 셀마다 B개의 바운딩박스가 생긴다.

바운딩박스의 정보는 5가지로 구성된다.

  • 중심좌표 x 값 (cell에 대한 상대적 값)
  • 중심좌표 y 값 (cell에 대한 상대적 값)
  • 상자너비 w (이미지에 대한 상대적 값)
  • 상자높이 h (이미지에 대한 상대적 값)
  • confidence score
    • Pr(Object)∗IOUpredtruthPr(Object) * IOU^_

 

셀 안에 객체가 없을 때는 confidence 값이 0이 된다. 반대로 객체가 있으면, confidence score가 위 식의 IOU값과 같은 것이 이상적이다. (object의 확률값을 정확히 구별한다면 1이니까 온전히 IOU값만 남는 것이 best)

각 셀은 C라는 Class 별 확률값을 예측한다. 이 확률은 object가 있을 때 클래스 별 확률을 계산할 수 있어야한다.

테스트할 때 조건부 클래스 확률과 각 바운딩 박스의 confidence predictions를 곱한 형태를 사용한다.

Pr(Classi∣Object)∗Pr(Object)∗IOUpredtruth=Pr(Classi)∗IOUpredtruthPr(Class_i|Object)*Pr(Object)*IOU^_=Pr(Class_i)*IOU^_

위는 YOLO의 detection 과정을 설명한 그림이다.

  1. S*S 격자를 그린다.
  1. 각 셀 별로 B개의 bounding box를 예측한다. 이때 bounding box 예측결과는 5개의 bounding box 정보이다.
  1. 그리고 바운딩박스와 상관없이 각 격자별로 클래스 별 확률을 구한다.
  1. 검출 결과 텐서는 그리드 셀 수 * (바운딩박스 개수 * 바운딩박스 정보 수 + 클래스 수) 차원이 된다.S*S*(B*5+C)이다.

하나의 셀을 넘는 크기의 바운딩 박스는 어떻게 만들어지는거지라는 의문이 들었는데, width와 height 예측값이 이미지 크기에 상대적이기 때문에 가능한 것이라고 생각했다.

YOLO Network Architecture

PASCAL VOC를 대상으로 구현했기 떄문에 마지막 레이어의 출력이 7x7x30이 된다.

논문에 따르면 학습은 ImageNet 1000-classfh 사전학습시킨 모델을 사용해서 PASCAL VOC에 대해 학습시켰다고 함.

224x224 사이즈의 ImageNet dataset을 사용하는데, 디텍션을 하기 위해서는 종종 세밀한 시각적 정보들이 필요하기 때문에 448x448로 해상도를 키운다.

bounding box에 대한 정보들은 모두 정규화하여 [0,1] 범위의 값으로 바꾼다. confidence score는 확률*IOU라서 [0,1] 범위 값으로 나옴.

마지막 레이어에만 선형 활성화 함수를 넣고 나머지는 leaky relu(0.1)을 사용한다.

YOLO의 loss function

손실함수는 Sum-squared error를 사용하는데, 이유는 최적화가 쉬워서다.

그리고 바운딩박스의 좌표 손실을 크게 하고 객체가 없는 바운딩 박스에 대한 손실을 줄이기 위해λcoord=5,λnoobj=0.5\lambda_=5, \lambda_=0.5로 설정한다.

SSE에서 큰 박스와 작은 박스의 에러를 똑같이 가중한다. yolo의 손실함수는 큰 박스에서의 편차가 작은 박스보다 덜 문제가 되기 때문에 그대로 width와 height 값을 쓰지 않고 square root를 사용한다.

그리고 식을 보면 각 항마다 indicator function이 적용되어 있다.

더 구체적인 내용은 논문을 확인..

Inference

PASCAL VOC에서 각 이미지당 98개의 바운딩박스가 생성된다. (S=7, B=2, 7*7*2 = 98)

각 셀마다 깔끔하게 객체가 명확히 포함될수도 있지만, 이미지에서 큰 스케일을 갖는 객체는 여러 셀에 걸쳐서 표현된다. 이렇게 되면 중복 박스가 많이 생기게 되는데, 중복 박스 제거는 Non-maximal suppression을 사용한다. NMS는 confidence score를 기준으로 박스를 정렬한 뒤 가장 큰 값의 score를 갖는 박스만 놔두고 모두 제거하는 과정을 반복한다.

YOLO의 한계?

  1. YOLO는 grid cell로 영역을 나눠서 1개의 클래스를 갖기 때문에 공간적 제한이 매우 강하다. 그래서 작은 객체가 군집되어있는 경우 모델이 제대로 검출을 하지 못한다.
  1. 새롭거나 흔치 않은 비율이나 셋팅의 객체에 대해서도 잘 작동하지 않음. YOLO의 모델이 사용하는 CNN 구조상 downsampling을 여러번하기 때문에 상대적으로 coarse features를 사용한다.
  1. 큰 바운딩 박스의 IOU error보다 작은 상자의 IOU error가 더 크게 작용한다. (같은 거리의 오차가 나더라도 작은 객체에 대한 바운딩박스는 아예 객체를 포함하지 않게 되는 경우가 발생하는 문제에 대한 언급이라고 생각함)

실험 결과는 따로 정리 안함