A A
[CV] Keras ๊ธฐ๋ฐ˜ YOLO Open Source Package & Object Detection
์ •์‹ ์ด ์—†์–ด์„œ ์ด์–ด์„œ ์“ฐ๋Š”๊ฑธ ๊นŒ๋จน์—ˆ๋„ค์š”.. ์—ด์‹ฌํžˆ ์จ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค ใ… 

Keras YOLO Open source Package ํŠน์ง•

๋” ์‰ฌ์šด ํ™˜๊ฒฝ ์„ค์ •

  • Keras ๊ธฐ๋ฐ˜์˜ YOLO ํŒจํ‚ค์ง€๋Š” Darknet YOLO ํ”„๋ ˆ์ž„์›Œํฌ์— ๋น„ํ•ด ํ™˜๊ฒฝ ์„ค์ •์ด ๋” ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. Keras๋Š” Python์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ๋”ฅ๋Ÿฌ๋‹ ์›Œํฌํ”Œ๋กœ์šฐ์™€ ์ž˜ ํ†ตํ•ฉ๋˜๋ฉฐ, ๋” ์‚ฌ์šฉ์ž ์นœํ™”์ ์ธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•˜์—ฌ ๋‹ค์–‘ํ•œ ์‚ฌ์šฉ์ž๊ฐ€ ์ ‘๊ทผํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

Keras์˜ Callbacks, TensorBoard, Preprocessing ๊ธฐ๋Šฅ ํ™œ์šฉ

  • Keras๋Š” Callbacks ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์—ฌ ํ•™์Šต ๊ณผ์ • ์ค‘์— ๋™์ ์œผ๋กœ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ  ์กฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์กฐ๊ธฐ ์ข…๋ฃŒ(early stopping)๋‚˜ ํ•™์Šต ์†๋„ ์Šค์ผ€์ค„๋ง(learning rate scheduling) ๋“ฑ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋˜ํ•œ TensorBoard์™€์˜ ํ†ตํ•ฉ์„ ํ†ตํ•ด ํ•™์Šต ์ค‘์ธ ๋ชจ๋ธ์˜ ์„ฑ๋Šฅ์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์‹œ๊ฐํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Keras๋Š” ๊ฐ•๋ ฅํ•œ ๋‚ด์žฅ Preprocessing ๋„๊ตฌ๋ฅผ ์ œ๊ณตํ•˜์—ฌ YOLO ๋ชจ๋ธ์„ ์œ„ํ•œ ๋ฐ์ดํ„ฐ ์ค€๋น„ ๊ณผ์ •์„ ๋”์šฑ ์‰ฝ๊ฒŒ ๋งŒ๋“ค์–ด ์ค๋‹ˆ๋‹ค.

๋” ์ฝ๊ธฐ ์‰ฌ์šด ์†Œ์Šค์ฝ”๋“œ์™€ ์†์‰ฌ์šด ์ปค์Šคํ„ฐ๋งˆ์ด์ง•

  • Keras YOLO ํŒจํ‚ค์ง€๋Š” ์ฝ”๋“œ๊ฐ€ ๋” ์ฝ๊ธฐ ์‰ฝ๊ณ  ๋ชจ๋“ˆํ™”๋˜์–ด ์žˆ์–ด, ์‚ฌ์šฉ์ž๊ฐ€ ์ดํ•ดํ•˜๊ณ  ์ˆ˜์ •ํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํŠน์ • ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์— ๋งž๊ฒŒ ๋ชจ๋ธ์„ ์กฐ์ •ํ•˜๊ฑฐ๋‚˜ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์‹คํ—˜ํ•˜๋ ค๋Š” ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์œ ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

Darknet YOLO (C/C++ ๊ตฌํ˜„) ๋Œ€๋น„ ์ฒ˜๋ฆฌ ์†๋„ ๋Š๋ฆผ

  • Keras๋Š” YOLO๋ฅผ ๋” ์ ‘๊ทผํ•˜๊ธฐ ์‰ฝ๊ณ  ์‚ฌ์šฉํ•˜๊ธฐ ํŽธ๋ฆฌํ•˜๊ฒŒ ๋งŒ๋“ค์ง€๋งŒ, ์ฒ˜๋ฆฌ ์†๋„๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์›๋ž˜์˜ C/C++๋กœ ๊ตฌํ˜„๋œ Darknet YOLO์— ๋น„ํ•ด ๋Š๋ฆฝ๋‹ˆ๋‹ค. ์ด๋Š” Keras๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋†’์€ ์ˆ˜์ค€์˜ ์ถ”์ƒํ™”๋กœ ์ธํ•œ ์„ฑ๋Šฅ ์ €ํ•˜ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

Keras YOLO Open Source Package ์†Œ๊ฐœ

qqwweee keras-yolo3

 

GitHub - qqwweee/keras-yolo3: A Keras implementation of YOLOv3 (Tensorflow backend)

A Keras implementation of YOLOv3 (Tensorflow backend) - qqwweee/keras-yolo3

github.com

  • ํ•™์Šต ๋ฐ ์ถ”๋ก (Inference)์€ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ํ‰๊ฐ€(Evaluation)๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์Œ.
  • VOC, COCO ๊ฐ™์€ ๋ฐ์ดํ„ฐ์…‹์„ CSV ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜๋ฉฐ, CSV ํ˜•์‹์˜ ๋ฐ์ดํ„ฐ ์ž…๋ ฅ์„ ๋ฐ›์Šต๋‹ˆ๋‹ค.

Experiencor keras-yolo3

 

GitHub - experiencor/keras-yolo3: Training and Detecting Objects with YOLO3

Training and Detecting Objects with YOLO3. Contribute to experiencor/keras-yolo3 development by creating an account on GitHub.

github.com

  • ํ•™์Šต, ์ถ”๋ก ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํ‰๊ฐ€(Evaluation)๋„ ๊ฐ€๋Šฅ.
  • ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๋Š” XML ํ˜•์‹๋งŒ ์ง€์›ํ•˜๋ฉฐ, CSV๋‚˜ JSON ๋ฐ์ดํ„ฐ๋ฅผ ์ž…๋ ฅํ•˜๋ ค๋ฉด XML ํฌ๋งท์œผ๋กœ ๋ณ€ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋‘ ๊ตฌํ˜„์ฒด์˜ ์ฃผ์š” ์ฐจ์ด์ ์€ ํ‰๊ฐ€ ๊ธฐ๋Šฅ ์ง€์› ์—ฌ๋ถ€์™€ ๋ฐ์ดํ„ฐ ์ž…๋ ฅ ํ˜•์‹์ž…๋‹ˆ๋‹ค. Experiencor๋Š” ํ‰๊ฐ€ ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜๋ฉฐ XML ํ˜•์‹์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๋ฐ˜๋ฉด, qqwweee๋Š” ํ‰๊ฐ€ ๊ธฐ๋Šฅ์ด ์—†๊ณ  CSV ํ˜•์‹์„ ๊ธฐ๋ณธ์œผ๋กœ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

qqwweee/kears-yolo3 ํŒจํ‚ค์ง€ ๊ตฌ์„ฑ

model_data ํด๋”

  • YOLO ๋ชจ๋ธ์˜ ํด๋ž˜์Šค์™€ anchor box ์œ„์น˜ ์„ค์ • ํŒŒ์ผ๋“ค์„ ํฌํ•จํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค์–ด, coco_classes.txt, tiny_yolo_anchors.txt, voc_classes.txt, yolo_anchors.txt ํŒŒ์ผ๋“ค์ด ์กด์žฌํ•˜๋ฉฐ, ๊ฐ๊ฐ COCO์™€ VOC ๋ฐ์ดํ„ฐ์…‹์˜ ํด๋ž˜์Šค ๋ฐ YOLO ์•ต์ปค ๋ฐ•์Šค ๊ด€๋ จ ์„ค์ •๋“ค์„ ํฌํ•จํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

yolo3 ํด๋”

  • ์ฃผ์š” Backend API๋“ค์ด ์žˆ๋Š” ํด๋”์ž…๋‹ˆ๋‹ค.
  • ์ด ํด๋”์—๋Š” __init__.py, model.py, utils.py ํŒŒ์ผ์ด ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉฐ, YOLO ๋ชจ๋ธ์˜ ์ฃผ์š” ๋ฐฑ์—”๋“œ ๋กœ์ง๊ณผ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜๋“ค์ด ์ •์˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

train.py: YOLO ๋ชจ๋ธ์„ ํ•™์Šต์‹œํ‚ค๊ธฐ ์œ„ํ•œ ์ฃผ์š” API๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•ด ๋ชจ๋ธ ํ•™์Šต์„ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

yolo.py: YOLO ๋ชจ๋ธ์„ ๋กœ๋”ฉํ•˜๊ณ  ๊ฐ์ฒด ํƒ์ง€(Detection)๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ํด๋ž˜์Šค์™€ ๊ด€๋ จ๋œ ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.


keras-yolo3 ํŒจํ‚ค์ง€๋ฅผ ์ด์šฉํ•˜์—ฌ Yolo &  tiny Yolo ๊ธฐ๋ฐ˜์œผ๋กœ ์ด๋ฏธ์ง€์™€ ์˜์ƒ Object Detection

  • ๋‹คํฌ๋„ท์—์„œ Pretrained๋œ yolo/tiny-yolo weights ๋ชจ๋ธ์„ ๋‹ค์šด๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.
  • ๋‹ค์šด๋กœ๋“œํ•œ ๋‹คํฌ๋„ท weight ํŒŒ์ผ์„ ๊ธฐ๋ฐ˜์œผ๋กœ keras-yolo3์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” weight ํŒŒ์ผ๋กœ ๋ณ€ํ™˜ ํ›„ ์ด๋ฅผ ์ด์šฉํ•˜์—ฌ Object Detection์„ ์ˆ˜ํ–‰ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
  • ๋‹จ, ์˜›๋‚  ๋ฒ„์ „์ด์—ฌ์„œ ์Šคํ„ฐ๋””ํ•œ ๋‚ด์šฉ๋งŒ ์ •๋ฆฌํ•ด์„œ ์˜ฌ๋ฆฌ๋Š”๊ฑฐ๊ธฐ ๋•Œ๋ฌธ์— ํ˜„์žฌ ์‹คํ–‰์ด ์•ˆ๋ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹จ์ˆœํžˆ ์ฐธ๊ณ ์šฉ์œผ๋กœ๋งŒ ๋ด์ฃผ์„ธ์š”!
๋ณธ์ฝ”๋“œ๋Š” GPU๋ฅผ ํ™œ์šฉํ•˜๋ฏ€๋กœ Colab ์ƒ๋‹จ ๋ฉ”๋‰ด์—์„œ ๋Ÿฐํƒ€์ž„ ์œ ํ˜• ๋ณ€๊ฒฝ์—์„œ GPU๋ฅผ ์„ ํƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
# ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ๋Š” /content์ด๋ฉฐ ์ด ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์‹ค์Šต์ฝ”๋“œ์™€ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์šด๋กœ๋“œ ํ•ฉ๋‹ˆ๋‹ค. 
!pwd
!rm -rf DLCV
!git clone https://github.com/chulminkw/DLCV.git
# DLCV ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ Download๋˜๊ณ  DLCV ๋ฐ‘์— Detection๊ณผ Segmentation ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธ
!ls -lia 
!ls -lia DLCV
# tensorflow 1.15์„ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค. ์ž๋™์œผ๋กœ tensorflow 2.2๊ฐ€ 1.15๋กœ downgrade ๋ฉ๋‹ˆ๋‹ค. 
!pip install tensorflow-gpu==1.15.2 
# keras 2.3๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค. 
!pip install keras==2.3.0
# GPU๊ฐ€ ์„ธํŒ…๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฉด ์ƒ๋‹จ ๋ฉ”๋‰ด์—์„œ ๋Ÿฐํƒ€์ž„->๋Ÿฐํƒ€์ž„ ์œ ํ˜• ๋ณ€๊ฒฝ์—์„œ GPU๋ฅผ ์„ ํƒํ•œ ํ›„ ๋Ÿฐํƒ€์ž„ ๋‹ค์‹œ ์‹œ์ž‘์„ ์„ ํƒํ•˜๊ณ  ์ฒ˜์Œ ๋ถ€ํ„ฐ์ธ tensorflow, keras ์„ค์น˜ ๋ถ€ํ„ฐ ๋‹ค์‹œ ์‹œ์ž‘. 
import tensorflow as tf
import keras

print(tf.__version__)
print(keras.__version__)

# gpu๊ฐ€ ์„ธํŒ…๋“œ์–ด ์žˆ๋Š”์ง€ ํ™•์ธ. 
tf.test.gpu_device_name()
import os
import sys
import random
import math
import time
import numpy as np
import tensorflow as tf
import matplotlib
import matplotlib.pyplot as plt
%cd /content/DLCV/Detection/yolo
!git clone https://github.com/qqwweee/keras-yolo3.git
!ls -lia /content/DLCV/Detection/yolo/keras-yolo3

Local Directory ์ƒ์—์„œ yolo package๋ฅผ import.

  • keras-yolo3๋Š” setup์„ ์ œ๊ณตํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ local directory์ƒ์—์„œ ๋ฐ”๋กœ package๋ฅผ importํ•ฉ๋‹ˆ๋‹ค.
  • ์ด๋ฅผ ์œ„ํ•ด keras-yolo3๋ฅผ system path์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  • keras-yolo3 ๋””๋ ‰ํ† ๋ฆฌ์— ์žˆ๋Š” yolo.py์—์„œ YOLO class๋ฅผ importํ•˜์—ฌ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
from keras.layers import LeakyReLU, BatchNormalization

default_dir = '/content/DLCV'
default_yolo_dir = os.path.join(default_dir, 'Detection/yolo')

LOCAL_PACKAGE_DIR = os.path.abspath(os.path.join(default_yolo_dir,'keras-yolo3'))
print(LOCAL_PACKAGE_DIR)
sys.path.append(LOCAL_PACKAGE_DIR)

from yolo import YOLO
# YOLO ํด๋ž˜์Šค๋Š” model_path, achors_path, classes_path๋ฅผ model_data ๋ฐ‘์— ํŒŒ์ผ๋กœ ๊ฐ€์ง. ๋ณ€๊ฒฝ์„ ์œ„ํ•ด์„œ๋Š” yolo.py ํŒŒ์ผ์—์„œ YOLO ํด๋ž˜์Šค์ฝ”๋“œ๋ฅผ  ์ง์ ‘ ๋ณ€๊ฒฝ ํ•„์š”. 

print(LOCAL_PACKAGE_DIR)
!ls /home/chulmin.kwon45/DLCV/Detection/yolo/keras-yolo3
!cat /home/chulmin.kwon45/DLCV/Detection/yolo/keras-yolo3/yolo.py

YOLO ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๋ชจ๋ธ ํŒŒ์ผ ์„ค์ • ๋ฐ ์†Œ์Šค ์ฝ”๋“œ ๋ณ€๊ฒฝ

  • ๋‹คํฌ๋„ท์—์„œ Yolo V3 Weight ๋ชจ๋ธ ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œ ๋ฐ›์€ ๋’ค ์ด๋ฅผ keras-yolo3์šฉ์œผ๋กœ ๋ชจ๋ธ ํŒŒ์ผ์œผ๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.
  • model_data ๋””๋ ‰ํ† ๋ฆฌ ๋ฐ‘์— yolo_anchors.txt, coco_classes.txt ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
!ls /content/DLCV/Detection/yolo/keras-yolo3
# ์ฝ”๋žฉ ๋ฒ„์ „์€ ์•„๋ž˜๋ฅผ ์ด์šฉํ•˜์—ฌ yolov3.weights ํŒŒ์ผ์„ download ๋ฐ›๊ณ , convert.py ๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ model_data ๋ฐ‘์— yolo.h5 ํŒŒ์ผ ์ƒ์„ฑ ์ˆ˜ํ–‰. 
%cd /content/DLCV/Detection/yolo/keras-yolo3 
!wget https://github.com/chulminkw/DLCV/releases/download/1.0/yolov3.weights

# yolov3.weights๋ฅผ keras-yolo3์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก yolo.h5 ๋กœ ๋ณ€ํ™˜
!python convert.py yolov3.cfg yolov3.weights model_data/yolo.h5
# model_data ๋ฐ‘์— yolo.h5 ํŒŒ์ผ์ด ์ƒ์„ฑ๋˜์—ˆ๋Š”์ง€ ํ™•์ธ. 
!ls /content/DLCV/Detection/yolo/keras-yolo3/model_data
import sys
import argparse
from yolo import YOLO, detect_video
#keras-yolo์—์„œ image์ฒ˜๋ฆฌ๋ฅผ ์ฃผ์š” PIL๋กœ ์ˆ˜ํ–‰. 
from PIL import Image

# YOLO ๊ฐ์ฒด ์ƒ์„ฑ. config๋Š” default๋กœ keras-yolo3 ๋””๋ ‰ํ† ๋ฆฌ์— ์žˆ๋Š” yolov3.cfg๋ฅผ ์ ์šฉ. 
# ์ฝ”๋žฉ ๋ฒ„์ „์€ ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋กœ ๊ฐ ์ƒ์„ฑ ์ธ์ž๊ฐ’ ์ž…๋ ฅ
default_yolo_dir = '/content/DLCV/Detection/yolo'
config_dict = {}
yolo = YOLO(model_path=os.path.join(default_yolo_dir, 'keras-yolo3/model_data/yolo.h5'),
            anchors_path=os.path.join(default_yolo_dir, 'keras-yolo3/model_data/yolo_anchors.txt'),
            classes_path=os.path.join(default_yolo_dir, 'keras-yolo3/model_data/coco_classes.txt'))

๋‹จ์ผ Image Object Detection

# ์›๋ณธ ์ด๋ฏธ์ง€ ๋ณด๊ธฐ 
default_dir = '/content/DLCV'
img = Image.open(os.path.join(default_dir, 'data/image/beatles01.jpg'))

plt.figure(figsize=(12, 12))
plt.imshow(img)

# yolo.detect_image() ๋ฉ”์†Œ๋“œ๋Š” PIL package๋ฅผ ์ด์šฉํ•˜์—ฌ image ์ž‘์—… ์ˆ˜ํ–‰. keras-yolo3/font ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ƒ์œ„ ๋””๋ ‰ํ† ๋ฆฌ๋กœ ๋ณต์‚ฌ ํ•ด์•ผํ•จ.  
%cd /content/DLCV/Detection/yolo
!cp -rf keras-yolo3/font ./font
img = Image.open(os.path.join(default_dir, 'data/image/beatles01.jpg'))
detected_img = yolo.detect_image(img)

plt.figure(figsize=(12, 12))
plt.imshow(detected_img)


Video Object Detection ์ˆ˜ํ–‰

YOLO V3 Model ์ด ์žˆ๋Š” github์—์„œ detect_video.py์šฉ code๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
 

GitHub - qqwweee/keras-yolo3: A Keras implementation of YOLOv3 (Tensorflow backend)

A Keras implementation of YOLOv3 (Tensorflow backend) - qqwweee/keras-yolo3

github.com

import cv2
import time

def detect_video_yolo(model, input_path, output_path=""):
    
    start = time.time()
    cap = cv2.VideoCapture(input_path)
    
    #codec = cv2.VideoWriter_fourcc(*'DIVX')
    codec = cv2.VideoWriter_fourcc(*'XVID')
    vid_fps = cap.get(cv2.CAP_PROP_FPS)
    vid_size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)),int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
    vid_writer = cv2.VideoWriter(output_path, codec, vid_fps, vid_size)
    
    frame_cnt = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
    print('์ด Frame ๊ฐฏ์ˆ˜:', frame_cnt, '์›๋ณธ ์˜์ƒ FPS:',vid_fps)
    index = 0
    while True:
        hasFrame, image_frame = cap.read()
        if not hasFrame:
            print('ํ”„๋ ˆ์ž„์ด ์—†๊ฑฐ๋‚˜ ์ข…๋ฃŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.')
            break
        start = time.time()
        # PIL Package๋ฅผ ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ cv2์—์„œ ์ฝ์€ image_frame array๋ฅผ ๋‹ค์‹œ PIL์˜ Imageํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•ด์•ผ ํ•จ.  
        image = Image.fromarray(image_frame)
        # ์•„๋ž˜๋Š” ์ธ์ž๋กœ ์ž…๋ ฅ๋œ yolo๊ฐ์ฒด์˜ detect_image()๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.
        detected_image = model.detect_image(image)
        # cv2์˜ video writer๋กœ ์ถœ๋ ฅํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์‹œ PIL์˜ Imageํ˜•ํƒœ๋ฅผ arrayํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ 
        result = np.asarray(detected_image)
        index +=1
        print('#### frame:{0} ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ์‹œ๊ฐ„:{1}'.format(index, round(time.time()-start,3)))
        
        vid_writer.write(result)
    
    vid_writer.release()
    cap.release()
    print('### Video Detect ์ด ์ˆ˜ํ–‰์‹œ๊ฐ„:', round(time.time()-start, 5))
default_dir = '/content/DLCV'
detect_video_yolo(yolo, os.path.join(default_dir, 'data/video/Night_Day_Chase.mp4'),
                  os.path.join(default_dir, 'data/output/Night_Day_Chase_yolo_01.avi'))
## colab ๋ฒ„์ „์€ Object Detection ์ ์šฉ๋œ ์˜์ƒ ํŒŒ์ผ์„ google drive์—์„œ download ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด google drive๋ฅผ colab์— mount ์ˆ˜ํ–‰. 
import os, sys 
from google.colab import drive 

drive.mount('/content/gdrive')
## colab ๋ฒ„์ „์€ Object Detection ์ ์šฉ๋œ ์˜์ƒ ํŒŒ์ผ์„ google drive์—์„œ download ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. 
## My Drive ๋””๋ ‰ํ† ๋ฆฌ ์ด๋ฆ„์— ๊ณต๋ž€์ด ์žˆ์œผ๋ฏ€๋กœ ' '๋กœ ๋ฌถ์Šต๋‹ˆ๋‹ค. 
!cp /content/DLCV/data/output/Night_Day_Chase_yolo_01.avi '/content/gdrive/My Drive/Night_Day_Chase_yolo_01.avi'
  • ๊ฒฐ๊ณผ ํ™”๋ฉด (ํ™”๋ฉด ์บก์ฒ˜)
    • SSD ๋ณด๋‹จ ์ •ํ™•๋„๊ฐ€ ์˜ฌ๋ผ๊ฐ€๋Š”๊ฑธ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


Tiny YOLO๋ฅผ ์ด์šฉํ•˜์—ฌ Image & Video Object Detection

  • tiny yolo weightsํŒŒ์ผ์€ https://pjreddie.com/media/files/yolov3-tiny.weights ์—์„œ ๋‹ค์šด๋กœ๋“œ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋‹ค์šด๋กœ๋“œ ๋ฐ›์€ tiny-yolo weightํŒŒ์ผ์„ keras-yolo3์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ Convert ์ˆ˜ํ–‰ ํ›„ YOLO๊ฐ์ฒด์—์„œ ๋กœ๋”ฉํ•˜์—ฌ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
# wget https://pjreddie.com/media/files/yolov3-tiny.weights
#!python convert.py yolov3-tiny.cfg ./model_data/yolov3-tiny.weights model_data/yolo-tiny.h5
# yolov3-tiny.weights ํŒŒ์ผ์„ download ๋ฐ›๊ณ , convert.py ๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ model_data ๋ฐ‘์— yolo-tiny.h5 ํŒŒ์ผ ์ƒ์„ฑ. 
%cd /content/DLCV/Detection/yolo/keras-yolo3 
!wget https://pjreddie.com/media/files/yolov3-tiny.weights
!python convert.py yolov3-tiny.cfg yolov3-tiny.weights model_data/yolo-tiny.h5
# model_data ๋ฐ‘์— yolo-tiny.h5 ํŒŒ์ผ์ด ์ƒ์„ฑ๋˜์—ˆ๋Š”์ง€ ํ™•์ธ. 
!ls /content/DLCV/Detection/yolo/keras-yolo3/model_data

tiny yolo weight ํŒŒ์ผ๊ณผ anchor ํŒŒ์ผ, coco ํด๋ž˜์Šค ํŒŒ์ผ์„ YOLO ๊ฐ์ฒด ์ƒ์„ฑ ์‹œ ์ธ์ž๋กœ ์ž…๋ ฅ

default_yolo_dir = '/content/DLCV/Detection/yolo'
config_dict = {}

tiny_yolo = YOLO(model_path=os.path.join(default_yolo_dir,'keras-yolo3/model_data/yolo-tiny.h5'),
            anchors_path=os.path.join(default_yolo_dir,'keras-yolo3/model_data/tiny_yolo_anchors.txt'),
            classes_path=os.path.join(default_yolo_dir,'keras-yolo3/model_data/coco_classes.txt'))

Single Image Object Detection

default_dir = '/content/DLCV'
img = Image.open(os.path.join(default_dir, 'data/image/beatles01.jpg'))
detected_img = tiny_yolo.detect_image(img)

plt.figure(figsize=(12, 12))
plt.imshow(detected_img)

Video Object Detection

default_dir = '/content/DLCV'
detect_video_yolo(tiny_yolo, os.path.join(default_dir, 'data/video/Night_Day_Chase.mp4'), os.path.join(default_dir, 'data/output/Night_Day_Chase_tiny_yolo01.avi'))
## colab ๋ฒ„์ „์€ Object Detection ์ ์šฉ๋œ ์˜์ƒ ํŒŒ์ผ์„ google drive์—์„œ download ํ•ด์•ผํ•จ. ์ด๋ฅผ ์œ„ํ•ด google drive๋ฅผ colab์— mount ์ˆ˜ํ–‰. 
import os, sys 
from google.colab import drive 

drive.mount('/content/gdrive')
## colab ๋ฒ„์ „์€ Object Detection ์ ์šฉ๋œ ์˜์ƒ ํŒŒ์ผ์„ google drive์—์„œ download ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. 
## My Drive ๋””๋ ‰ํ† ๋ฆฌ ์ด๋ฆ„์— ๊ณต๋ž€์ด ์žˆ์œผ๋ฏ€๋กœ ' '๋กœ ๋ฌถ์Šต๋‹ˆ๋‹ค. 
!cp /content/DLCV/data/output/Night_Day_Chase_tiny_yolo01.avi '/content/gdrive/My Drive/Night_Day_Chase_tiny_yolo01.avi'