본문 바로가기

AI/Object Detection

[OD] YOLO v1

 

 

[Object Detection] YOLOv1 ~ YOLOv3

2021 Snowy Paper Project 안녕하세요. 오늘은 현재 제가 속해 있는 연구실 세미나에서 다른 분이 발표 했던 YOLOv1~YOLOv3에 대하여 매우 간단하게 정리만 할 예정이오니, 가볍게 읽고자 하시는 분들에게

nepersica.tistory.com

 

갈아먹는 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

 

 

You Only Look Once — 다.. 단지 한 번만 보았을 뿐이라구!

이번 포스팅에서는 객체 탐지(Object Detection)분야에서 많이 알려진 논문인 “You Only Look Once: Unified, Real-Time Object Detection (2016)”을 다룬다[1]. 줄여서 흔히 YOLO라고…

medium.com

real time object detection의 혁명을 몰고 온 yolo입니다. 우선 결과부터 보시죠.

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

 

 Fast R-CNN이 0.5 FPS(초당 프레임 수)의 성능을 가진 반면에 YOLO는 45 FPS의 성능을 가진다. 이는 영상을 스트리밍 하면서 동시에 화면 상의 물체를 부드럽게 구분할 수 있을 정도다.

 

YOLO는 지도학습이고 논문에서 사용한 PASCAL VOC 데이터 셋에는 물체에 대한 클래스 C와 위치 정보인 X, Y, WIDTH, HEIGHT가 트레이닝 셋으로 제공된다. 아래 그림은 학습 데이터로 제공된 이미지이다. 이 때 X, Y의 기준점은 좌측 위가 아닌 물체의 정중앙을 말한다.

[그림 5] PASCAL VOC(Visual Object Classes) 데이터 셋

 

Unified Detection

이미지 한 장을 SxS 그리드로 분할 => 이미지의 크기가 448x448인 경우, 7x7 그리드 사용

각 gride cell 당 2개의 Bounding Box((x,y,w,h, confidence score) + class probability)를 가짐

 

 

 

Yolo가 기존의 Object Dection과 가장 크게 구분되는 부분은 기존에 1) region proposal 2) classification 이렇게 두 단계로 나누어서 진행하던 방식에서 region proposal 단계를 제거하고 한번에 Object Detection을 수행하는 구조를 갖는다는 점입니다. 이것이 어떻게 가능할까요? 아래 그림은 yolo의 1 Step 구조를 간단히 보여줍니다.

Yolo Unified Detection

 

먼저 입력 이미지를 S X S 그리드 영역으로 나눕니다. (실제 입력 이미지를 나누는 것이 아닙니다! 이 부분의 세부 내용은 아래에 더 자세히 다룹니다.) 이제 각 그리드 영역에서 먼저 물체가 있을 만한 영역에 해당하는 B개의 Bounding Box를 예측합니다. 이는 (x, y, w, h)로 나타내어 지는데 (x, y)는 bounding box의 중심점 좌표이며 w, h는 넓이와 높이입니다. 다음으로 해당 박스의 신뢰도를 나타내는 Confidence를 계산합니다. 이는 해당 그리드에 물체가 있을 확률 Pr(Object)와 예측한 박스와 Ground Truth 박스와의 겹치는 영역을 비율을 나타내는 IoU를 곱해서 계산합니다.

Confidence

 

그 다음으로 각각의 그리드마다 C개의 클래스에 대하여 해당 클래스일 확률을 계산하며 수식은 아래와 같습니다. 이 때, 특이한 점은 기존의 Object Detection에서는 항상 클래스 수 + 1 (배경)을 집어넣어 클래시피케이션을 하는데, yolo는 그렇지 않습니다.

이렇게 yolo는 입력 이미지를 그리드로 나누고, 각 그리드 별로 바운딩 박스와 클래시피케이션을 동시에 수행합니다. 여기까지만 들어서는 어떻게 구현될지 잘 감이 오질 않습니다. 구체적인 네트워크 디자인을 보면서 더 알아보겠습니다.

 

 

Network Design

Pre-trained Network, Training Network 그리고 Reduction Layer 영역을 그려서 구분

 

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

Yolo Network

 

  • Predict Tensor: 7x7x30

<그림 3> YOLOv1 Predict Tensor

 

 

 

이제 네트워크의 출력인 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이 됩니다. 하나의 바운딩 박스는 하나의 클래스에 속하므로, 벡터에서 최대 값을 계산하여 해당하는 클래스를 이미지 위에 박스와 함께 그려주면 됩니다.

 

 

 

YOLO

YOLO You Only Look Once: Unified, Real-Time Object Detection Joseph Redmon, Santosh Divvala, Ross Girshick, Ali Farhadi

docs.google.com

Loss Function

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

 

수식이 좀 긴데 전혀 쫄 필요가 없습니다. 이를 이해하기 위해선 먼저 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들에 대해서 모든 클래스들에 대해서 예측 값과 실제 값의 차를 구해 더해줍니다.

 

위 Loss Function을 이용해서 네트워크를 학습한 뒤, 예측을 하면 각 셀마다 여러 장의 바운딩 박스가 생기게 된다. 그 중 물체의 중심에 있는 셀이 보통 Loss Function의 연두색 2번 기호에 해당하기 때문에 물체의 중심을 중심으로 그려진 바운딩 박스는 Confidence Score가 더 높게 나오고, 물체의 중심으로 부터 먼 셀이 만드는 바운딩 박스는 Score가 작게 나오게 된다. 그리고 최종적으로 여러 개의 바운딩 박스를 합치는 Non-max suppression 과정을 거쳐 이미지의 객체를 탐지할 수 있게 된다.

 

 

 

You Only Look Once — 다.. 단지 한 번만 보았을 뿐이라구!

이번 포스팅에서는 객체 탐지(Object Detection)분야에서 많이 알려진 논문인 “You Only Look Once: Unified, Real-Time Object Detection (2016)”을 다룬다[1]. 줄여서 흔히 YOLO라고…

medium.com

 

YOLO v1, YOLO v2, YOLO v3

지금까지 YOLO v1에 대한 기본적인 개념을 소개했다. YOLO는 2016년에 처음 발표된 이후 v4 버전까지 공개되었는데 v4는 저자가 다르므로 우리는 조셉 레드몬이 작성한 v1~v3 버전의 YOLO가 어떤 차이점이 있는지 대략적으로 정리하고 넘어가고자 한다.

YOLO v2

YOLO v2는 2017년 CVPR 컨퍼런스에서 “YOLO9000: Better, Faster, Stronger”라는 이름으로 논문이 발표되었다. YOLO v1이 20개의 이미지를 분류하는 모델을 소개했다면 v2는 논문 제목 그대로 무려 9000개의 이미지를 탐지하면서 분류할 수 있는 모델을 개발하였다. 또한 Batch Normalization, Direct Location Prediction, Multi-Scale Training기법을 도입해서 FPS와 mAP를 높였다. 이 때 논문이 발표될 당시만 하더라도 YOLO v2는 가장 빠르면서 정확한 모델이었다.

YOLO v3

YOLO v3는 v2버전을 더욱 개량한 것이다. 현재는 거의 모든 영역에서 사용되는 ResNet의 Residual Block이 v2버전에서는 존재하지 않았다. 그래서 레이어 신경망 층이 최근에 나온 연구보다는 상대적으로 얇았는데, v3에서는 이 기법을 사용해서 106개의 신경망 층을 구성하였다.

YOLO v1의 한계점

결론 파트에서는 논문에서 소개된 YOLOv1의 한계점에 대해서 서술하자면, YOLO의 접근법은 객체 탐지 모델의 FPS를 높였지만 너무나도 작은 물체에 대해서는 탐지가 잘 되지 않는다는 단점이 있다. 그 이유는 Loss Function에서 바운딩 박스 후보군을 선정할 때 사물이 큰 객체는 바운딩 박스간의 IOU의 값이 크게 차이나기 때문에 적절한 후보군을 선택할 수 있는 반면, 작은 사물에 대해서는 약간의 차이가 IOU의 결과값을 뒤짚을 수 있기 때문이라고 진단하였다. 이 문제는 YOLO의 후속 버전에서 어느 정도 개선되었다.

그리고 YOLO가 데이터를 제공받고 바운딩 박스를 학습하기 때문에 사물이란 무엇인지, 그리고 이상한 비율로 되어있는 물체라던지, 일반화된 지식이 있어야 구별할 수 있는 학습은 하지 못한다는 점이 있다.

'AI > Object Detection' 카테고리의 다른 글

[OD] FPN: Feature Pyramid Network  (0) 2021.07.02
[OD] SSD: SIngle Shot Multibox Detector  (0) 2021.06.30
[OD] Faster R-CNN  (0) 2021.06.29
[OD] Non-Maximum Suppression(NMS)  (0) 2021.06.28
[OD] SPPnet  (0) 2021.06.25