상세 컨텐츠

본문 제목

YOLO - PyImageSearch

Coding/Image

by linguana 2021. 5. 6. 12:07

본문

YOLO object detection with OpenCV - PyImageSearch 번역 [1] 

들어가며

  이 글에서는 YOLO를 활용하여 이미지 및 비디오에서 객체를 탐지하는 방법을 알아본다. 객체 탐지란 이미지 안에 어떤 객체가 "어디에" 있는지와 "무엇인지" 알려주는 기술이다.

  • Object Detection = Localization + Classification

YOLO에 대해서 간단히 설명하고, 이미지 및 비디오에 구현한 뒤, YOLO의 제한점과 단점을 다루면서 글을 마무리하겠다.


Part 1. YOLO에 대한 간단한 개념

  객체 탐지에서 주로 사용되는 기술들은 다음과 같이 3가지 계열로 나뉜다:

  1. RCNN 계열 (RCNN, Fast RCNN, Faster RCNN 등)
  2. SSD (Single Shot Detector) 계열
  3. YOLO (You Only Look Once) 계열

RCNN 계열: 딥러닝을 활용한 객체 탐지 기술의 선구자이며, 대표적인 two-stage detector이다.

RCNN: 2013년에 가장 먼저 나온 RCNN 모델은

(1) Selective Search라는 알고리즘을 활용하여 객체가 있을만한 구역을 제안하고
(2) 해당 구역을 일일히 CNN 분류기에 주입하는 두 단계 방식으로 작동되었다.

하지만 문제점은 (1) 속도가 너무 느렸고 (2) end-to-end 구조가 아니었다는 점이다.

Fast RCNN: 그리하여 RCNN 모델을 보완한 Fast RCNN은 2015년에 발표되었다. Fast RCNN은 기존 RCNN의 정확도와 속도 측면에서 성능을 상당히 향상시켰는데, 그럼에도 불구하고 모델 외부에 존재하는 구역 제안 알고리즘(region proposal algorithm)에 의존하는 문제가 여전히 남아있었다. (모델 외부에 있으니까 end-to-end가 될 수 없음)

Faster RCNN: 잇따라 2015년에 발표된 Faster RCNN 정도 되서야 Selective Search 알고리즘을 벗어던지고 Region Proposal Network (RPN)을 도입하여 진정한 end-to-end 객체 탐지 모델이 만들어졌다. RPN은 (1) 완전히 합성곱(convolutional)한 신경망을 활용하고 (2) 객체의 bounding box와 objectness 점수를 예측할 수 있는 장점이 있다. (objectness 점수: 이미지 상 어떤 region이 객체를 담고 있을 점수) RPN의 출력은 최종적인 분류와 라벨링을 위해 모델의 마지막 부분인 RCNN에 넘겨진다. (자세한 아키텍쳐는 2021.04.20 - [Coding/Image] - Faster R-CNN implementation 포스팅 참고)

RCNN 계열 모델은 정확성이 높은 경향을 보이지만 가장 큰 문제점은 느린 속도이다. GPU에서 작업을 해도 5 FPS밖에 도달하지 못 한다.


객체 탐지의 느린 속도를 해결하기 위해 SSD와 YOLO는 one-stage detector로 만들어졌다. 이들은 객체 탐지를 회귀(regression) 문제로 취급한다. 즉, 이미지를 입력받을 때 bounding box의 좌표와 class label 확률값을 동시에 학습한다.

일반적으로, one-stage 객체 탐지 모델은 two-stage 모델보다 정확성은 다소 낮지만 훨씬 빠른 속도를 보인다. YOLO 모델은 one-stage 모델의 가장 대표적인 모델이다.

YOLO: 2015년에 소개된 이 모델은 GPU 기준으로 45 FPS를 도달하면서 실시간으로 작동하는 객체 탐지 모델을 선보였다. (참고: YOLO의 변종인 Fast YOLO는 GPU 기분으로 155 FPS의 성능을 보인다고 한다)

YOLOv2: YOLO 모델의 업그레이드 버전인 YOLOv2은 해당 논문에서 9,000개 이상의 객체를 탐지할 수 있다고 주장하였다.

이 모델이 대량의 객체를 탐지할 수 있던 비결은 객체 탐지(detection)와 분류(classification)를 통합적으로 훈련(joint training)시켰다는 점에 있다. YOLOv2는 ImageNet 분류 데이터셋과 더불어 COCO 탐지 데이터셋을 동시에 훈련시켰다. 그 결과 객체의 위치 정보가 포함된 detection label이 없는 객체에 대해서 객체 탐지를 할 수 있게 되었다. 대량의 객체를 탐지할 수 있다는 건 흥미로운 내용이긴 하지만 YOLOv2의 성능은 그닥 좋지 못하였다. 156개의 클래스가 있는 COCO 데이터셋에 대해서 YOLOv2의 성능은 겨우 mAP 16%인 수준이었다. 

YOLOv3: 2018년에 발표된 YOLOv3는 전작에 비해 구조가 훨씬 큰 모델이지만 성능은 가장 뛰어나다. 이 글에서 사용할 모델은 바로 이 YOLOv3이며, COCO 데이터셋에 훈련된 것을 사용할 것이다.

COCO 데이터셋은 80개의 레이블이 있는데 사람, 자전거, 자동차, 트럭, 비행기, 교통표지판, 소화전, 동물, 주방식기 등이 포함되어 있다. (해당 목록은 다음 링크에서 확인 가능: darknet/coco.names at master · pjreddie/darknet (github.com))

YOLOv3 논문은 6페이지로 분량도 적고 상당히 재밌게 작성되었기 때문에 시간 여유가 있다면 읽어보길 강력히 권장한다.


 

Part 2. 코드로 YOLOv3 구현하기

(추후에 할 예정)


어깨 너머 들은 YOLOv4 (2021/05/24)

DATASET
기본적인 y_label 구조는 YOLOv1 과 동일하게 3차원으로, depth에 각 anchor box에 대한 정보를 가지고 있음.

하지만 YOLOv1이 [p1, x1, y1, w1, h1, p2, x2, y2, w2, h2, ..., c1, c2, ..., cn] 같이 anchor box에 대한 confidence 값과 좌표값이 있고 난 다음에 class에 대한 정보를 가지고 있는 반면,
YOLOv4는 [c1, c2, ..., cn, p1, x1, w1, h1, c1, c2, ..., cn, p2, x2, w2, h2, ...] 같이 각 class에 대한 정보와 anchor box의 confidence 및 좌표값이 잇따라서 존재한다.

ARCHITECTURE
이러한 data 구성에서, 모델은 Down-sampling, Up-sampling을 하는 구조를 가지고 있고,
소, 중, 대 크기의 물체를 포착할 수 있게 Up-sampling하는 각 layer에서 y_label이 S_box, M_box, L_box로 도출된다.

LOSS
이 모델이 학습해서 최소화시켜야 할 loss는 3가지다: (1) giou_loss (generalized iou) (2) conf_loss (3) prob_loss.

  • giou_loss: 각 바운딩 박스의 좌표가 얼마나 정답과 일치하는지 알려주는 지표. 단, 분모에 더 큰 값을 설정해서 기본 iou보다 틀린 것에 대해 더 큰 패널티를 준다.
  • conf_loss: 각 바운딩 박스 안에 물체가 있는지 없는지. p1, p2, ... 를 담당하는 loss라고 볼 수 있다.
  • prob_loss: 어떤 클래스에 해당하는지 알려주는 loss. 단, sigmoid binary crossentropy라서 각 클래스에 대해서 On/Off를 알려주는 기능을 가짐.

위의 모든 loss는 최종적으로 하나의 loss로 더해져서 통합적으로 optimize할 수 있게 정리된다.


YOLO v1 Loss function 그래픽 자료

YOLO 자료구조
loss function


YOLO_Hwang.pptx
2.94MB

Reference

[1] YOLO object detection with OpenCV - PyImageSearch

Papers link

RCNN: [1311.2524] Rich feature hierarchies for accurate object detection and semantic segmentation (arxiv.org)

Fast RCNN: [1504.08083] Fast R-CNN (arxiv.org)

Faster RCNN: [1506.01497] Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks (arxiv.org)

YOLO: [1506.02640] You Only Look Once: Unified, Real-Time Object Detection (arxiv.org)

YOLOv2: [1612.08242] YOLO9000: Better, Faster, Stronger (arxiv.org)

YOLOv3: [1804.02767] YOLOv3: An Incremental Improvement (arxiv.org)

YOLOv4 Review:

YOLOv4_Review_CGMoon.pdf
5.53MB

 

'Coding > Image' 카테고리의 다른 글

Object Detection Terminology Overview  (0) 2021.05.06
IoU (Intersection over Union)  (0) 2021.05.06
Removing Duplicate Images  (0) 2021.05.04
Faster RCNN (PyTorch implementation)  (0) 2021.04.22
Faster R-CNN implementation (FurkanOM Github)  (0) 2021.04.20

관련글 더보기