(YOLO) You Only Look Once: Unifed, Real-Time Object Detection

cvpr
detection
singleshot-detector
convolutional
cvpr2016

#1

2015년에 YOLO 라는 모델명으로 나온 논문입니다. 당시 주로 RCNN 류의 Two Stage Detector가 대세였는데, Neural Network Single Forward 만으로 여러 Object를 검출할 수 있는 모델링을 제시했다는 의의가 있습니다.

  • Single Neural Network Forward 만으로 결과를 얻을 수 있으므로 빠르다
  • 다소 성능은 아쉽다.
    • 작은 object에서 성능이 특히 떨어진다.
  • 대신 기존 디텍터에 비해 False Alarm은 더 적다고 주장한다.

Previous Works

RCNN 으로 대표되는 당시의 대표적인 Detector들은 Two Stage Detector라고 할 수 있습니다.

  • Object Proposal
  • Object Classification & Bounding Box Regression

즉, 이미지 하나로부터 수천개에 이르는 proposal을 만들고 각각에 대해 분류기(classifier)를 돌려 물체를 검출하는 형태입니다. 이러한 방식에는 크게 2가지의 문제가 있는데, 아래와 같습니다.

  • 1장을 처리하는데 너무 많은 연산양을 필요로 함. RCNN의 경우 수 초의 시간이 필요.
  • background noise를 물체로 오인식하는 경우가 많음.

또, 각 Stage를 이루는 모듈을 각각 개발해야 하기 때문에, 전체 Pipeline을 아우르는 통합적인 최적화가 불가합니다.

Unified Detection

YOLO의 기본적인 방식은 이미지를 Input으로 받아 여러개의 Bounding Box를 Regression 하겠다는 것에서 출발합니다. Figure 2에서 처럼 Output은 7x7 Grid에 20+4 Channel이 있는 Tensor 형태로 모델링이 되어 있습니다.

7x7 Grid

이미지를 7x7 로 나누고, 해당 Object의 중심점이 위치한 Grid에서 해당 물체의 Bounding Box와 Class를 출력하도록 합니다. 위 그림에서 강아지는 7x7 Grid에서 보면 5번째 행-2번째 열에 그 중심점이 위치하므로, 강아지의 좌표 x, y, w, h 는 해당 grid에서 출력합니다.

20+4 Channel

그리드의 위치는 위와 같이 선정되었으므로, 필요한 정보가 그리드의 위치에 맞게 출력되는 것이 필요합니다. VOC와 같은 데이터셋은 Object Class의 수가 20개 이고, 우리가 필요로 하는 좌표는 4개(x, y, w, h)이므로 20+4개의 Channel을 필요로 합니다. 따라서 최종적으로 Output Tensor는 7x7x(20+4) 의 형태를 띄게 됩니다.

Loss Function

위와 같은 나타낸 Output Tensor에 대해 Loss Function은 아래와 같이 모델링했습니다.

i=0~48 까지 49개(=7x7)는 각각의 Grid를 의미합니다.

첫번째 텀은 해당 그리드에 object가 존재할 경우 x, y, w, h를 L2 Norm으로 거리를 줄이기 위한 부분입니다. x,y 에 비해서 w,h가 값이 커질 수 있으므로 w,h에는 Square Root를 씌워둔 것을 볼 수 있습니다.

그리고 두번째 텀에서 각각의 class에 대해 probability를 L2 Norm으로 계산합니다. (개인적으로 이 부분은 Cross Entropy로 넣는게 낫지 않았을까 합니다만)

그리고 \lambda 는 그 두 텀 사이에 Weight를 주기 위함인데, 논문에서는 첫번째 텀에 4배의 가중치를 주었다고 합니다. 아무래도 위치를 배우는 것이 훨씬 어려웠을 거라고 생각이 듭니다.

Limitations

1개의 그리드 셀은 1개의 바운딩 박스만을 포함한다는 강한 가정이 있습니다. 새 뗴와 같이 여러 물체가 동시에 그리드 셀을 공유하면 여러 물체를 찾을 수 없습니다. 그래서 작은 물체가 떼로 나타나는 것에 매우 취약합니다.

다운샘플된 피쳐 레벨로부터 결과를 내는 것 역시도 작은 물체에 대한 취약점을 드러냅니다.

또 Loss Function 디자인 역시 큰 물체에서 틀리는 정도를 더 강한 페널티를 주는 형태이기 때문에, 작은 물체에 불리합니다.

Results

YOLO는 Single Stage Detector로써 모델링을 제시했다는 의의가 있습니다. 매우 빠르지만 YOLO 단독적으로는 54.5%의 mAP만을 보여줍니다.

Fast R-CNN에 YOLO를 함께 사용하면 Background에 대한 False Detection이 줄어들어 mAP가 다소 상승하는 것도 볼 수 있습니다.

속도에 대해서는 당시의 다른 Detector 대비 매우 우수함을 볼 수 있습니다.

왼쪽의 차트는 YOLO가 잘못 Detect하는 비율, 특히 Background와 혼동하는 케이스에 대한 것인데, Fast R-CNN에 비해 매우 월등합니다. 즉 Background인 경우에 특정 물체로 오판정하는 경우가 적습니다.

오른쪽의 차트는 Bounding Box의 위치가 얼마나 정확한지에 대한 것인데, Single Stage Detector의 초기 버전이다보니 아무래도 Box의 정확도 면에서는 다소 떨어짐을 보여줍니다. YOLO가 Object Class를 잘못 파악하는 케이스보다는 Bounding Box Regression에서 상대적으로 많이 취약함을 알 수 있습니다.

또, Generalization 성능이 상대적으로 낫다는 이야기도 있습니다. 사진 데이터로 학습하고, 그림 데이터에 대해 테스트했을 때 다른 방법론에 비해 성능이 좋다고 합니다.

  • 속도가 빠름
  • 이미지 전체(컨텍스트)를 통해 디텍션하기 때문에, 상대적으로 False positive에 강한 몇몇 클래스가 있음
  • 일반화에 강점이 있음
  • 성능이 다소 떨어지는데, 특히 물체의 위치가 부정확한 점이 가장 큰 문제임

Reference


YOLOv3: An incremental Improvement
#2

변승윤님이 쓰신 리뷰입니다.


#3

#cvpr2016 에 실린 버전에서 약간의 변화가 있었습니다.

  1. 각 Grid 위치에서 1개의 Box를 Prediction하던 것을 2개로 늘림.

기존에는 각 Grid 위치에서 1개의 Box만을 Prediction 했습니다. 그러나, 새 버전에서는 2개를 예측하면서, 예측한 Box의 Confidence까지도 출력하도록 추가했습니다. 따라서 x,y,w,h에 confidence c까지 더해져서 5개의 output이 각각의 셀에서 2개 나오는 형태이며, VOC의 경우 20개의 class를 가지므로 class confidecne까지 합치면, 5x2 + 20 = 30개의 output을 갖게 됩니다.

각 Box에서 나온 confidence와 class confidence를 곱해서 최종적인 confidence로 사용하는 형태입니다.

  1. Loss Function

Loss에서 큰 변화는

  • 좌표를 학습하는 loss에 대한 가중치를 높여주었다는 점
  • object가 있는 grid와 없는 grid를 따로 나누어 loss에 가중치를 다르게 주었다는 점

이 있겠습니다.

기존 대비 약간의 성능 향상이 있습니다.