Implementasi Deep Learning YOLO dalam Mendeteksi Objek Gambar, Webcam dan Video

Original article can be found here (source): Deep Learning on Medium

Implementasi Deep Learning YOLO dalam Mendeteksi Objek Gambar, Webcam dan Video

Tak terasa sekarang kita sudah masuk ke Part 7 dalam serial ini. Sebelumnya kita sudah membahas dari pengertian dasar dari Artificial Intelligence sampai salah satu algoritma deep learning yaitu YOLO. You Only Look Once sampai saat ini terdiri dari 3 versi, yaitu YOLO, YOLOv2 dan YOLOv3.

Dalam tutorial ini, aku akan coba implementasikan algoritma deep learning ini untuk mendeteksi objek dalam bentuk gambar, webcam maupun video. Sebelum memulai ini, alangkah lebih baiknya untuk membaca terlebih dahulu pembahasan dasar tentang YOLO dan efek dari penggunaan GPU dalam menjalankan proses deep learning di part sebelumnya.

Seperti sudah dijelaskan di part sebelumnya, YOLO dapat dijalankan dalam 2 bahasa, yaitu C dan Python. Pada tutorial kali ini aku akan jalankan YOLO dengan bahasa Python sehingga kita wajib menggunakan framework Darkflow, bagi temen-temen yang belum tau 2 framework dari YOLO bisa dibuka artikel di part sebelumnya.

Apa saja sih spesifikasi atau syarat yang harus disiapkan untuk menjalankan algoritma YOLO ? secara urutan dapat ditampilkan seperti ini :

  1. Install Anaconda dengan Python 3.6
  2. Install NVIDIA CUDA toolkit untuk penggunaan GPU.
  3. Tensorflow ( dalam hal ini disarankan install menggunakan GPU).
  4. OpenCV cp 36.
  5. Download Darkflow Repo dan build library di CMD.
  6. Download CFG dan Weights YOLOv2.

Untuk lebih lengkapnya, aku punya rekomendasi video yang bagus banget untuk install YOLO dengan performa GPU di windows.

YOLO object Detection Image Processing

Pertama, kita akan coba implementasi algoritma YOLO untuk mendeteksi objek dalam bentuk image. Aku sarankan untuk menggunakan Jupyter Notebook dari Anaconda. Jalankan program ini didalam folder Darkflow yang sudah di build.

import cv2
from darkflow.net.build import TFNet
import matplotlib.pyplot as plt
%config inlineBackend.figure_format = 'svg'options = {
'model' : 'cfg/yolov2.cfg',
'load' : 'bin/yolov2.weights',
'threshold' : 0.3,
'gpu' : 0.6
}
tfnet = TFNet(options)

Pertama adalah import opencv, darkflow dan matplotlib untuk plot image yang akan dideteksi nanti. Kemudian atur options dari YOLO sesuai keinginan kalian. Untuk pengaturan GPU bisa disesuaikan dengan spesifikasi laptop kalian dari besaran 0–1. Laptop yang aku gunakan ini dengan spesifikasi NVIDIA GTX 1070, RAM 8GB dan VRAM 2GB optimal di kisaran 0,6 (60%) penggunaan GPU untuk image processing.

img = cv2.imread('koceng.jpg', cv2.IMREAD_COLOR)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
result = tfnet.return_predict(img)
img.shapetl = (result[0] ['topleft']['x'], result[0]['topleft']['y'])
br = (result[0] ['bottomright']['x'], result[0]['bottomright']['y'])
label = result[0]['label']
img = cv2.rectangle(img, tl, br, (0, 255, 0), 7)
img = cv2.putText(img, label, tl, cv2.FONT_HERSHEY_COMPLEX, 2, (0, 0, 0), 2)
plt.imshow(img)
plt.show()

kemudian kita load file gambar yang ingin kita deteksi, misalnya aku ingin deteksi file gambar dengan nama koceng.jpg. Variabel tl (top left) dan br( bottom right) singkatnya berfungsi untuk menampilkan sebuah rectangle dari sisi kiri atas sampai kanan bawah. Selanjutnya dengan perintah cv2.rectangle, kita akan menampilkan sebuah persegi panjang dengan warna hijau (0, 255, 0) dan ketebalannya 7. Selanjutnya kita masukkan label atau hasil deteksi obeknya dengan font HERSHEY_COMPLEX, warna text hitam dan ketebalan 2. Jika yang masih belum mengerti cara membaca perintah OpenCV beserta parameternya, kalian bisa pelajari dulu disini.

Output Image Processing.

YOLO Object Detection Video Proccessing

Selanjutnya kita akan mencoba implementasikan YOLO untuk video processing. Dengan catatan terdapat perbedaan tingkat akurasi maupun kecepatan process video tergantung dari pengaturan penggunaan GPU maupun dari spesifikasi PC yang digunakan.

  1. Video Processing on WebCam Real Time.

Code kali ini kita akan jalankan YOLO untuk webcam, code ini jika dikembangkan bisa digunakan untuk membuat aplikasi absensi dengan sensor muka dll.

import cv2
from darkflow.net.build import TFNet
import numpy as np
import time
import os
os.environ["CUDA_DEVICE_ORDER"]="PCI_BUS_ID"
os.environ["CUDA_VISIBLE_DEVICES"]="0" # specify which GPU(s) to be used
option = {
'model' : 'cfg/yolov2.cfg',
'load': 'bin/yolov2.weights',
'threshold' : 0.2,
'gpu' : 0.3

Tidak terlalu berbeda seperti sebelumnya, tetapi disarankan untuk menurunkan penggunaan GPU karena dalam video processing membutuhkan proses yang lebih berat.

tfnet = TFNet(option)
colors = [tuple(255 * np.random.rand(3)) for i in range(10)]
capture = cv2.VideoCapture(0)
capture.set(cv2.CAP_PROP_FRAME_WIDTH, 1920)
capture.set(cv2.CAP_PROP_FRAME_HEIGHT, 1080)
while True:
stime = time.time()
ret, frame = capture.read()
results = tfnet.return_predict(frame)
if ret:
for color, result in zip(colors, results):
tl = (result['topleft']['x'], result['topleft']['y'])
br = (result['bottomright']['x'], result['bottomright']['y'])
label = result['label']
confidence = result['confidence']
text = '{}: {:.0f}%'.format(label, confidence * 100)
frame = cv2.rectangle(frame, tl, br, color, 5)
frame = cv2.putText(
frame, text, tl, cv2.FONT_HERSHEY_COMPLEX, 1, (0,0,0), 2)
cv2.imshow('frame', frame)
print('FPS {:.1f}'.format(1/(time.time() - stime)))
if cv2.waitKey(1) & 0xFF == ord('q'):
break
capture.release()
cv2.destroyAllWindows()

Yang perlu dicatat adalah pada syntax capture = cv2.VideoCapture(0). Angka 0 tersebut mengidentifikasikan jika kita ingin menggunakan webcam untuk video processing. Jalankan code tersebut dengan perintah:

C:...\darkflow>python namafile.py

2. Video Processing on Your Video Selection.

Code ini pernah aku gunakan untuk mendeteksi berbagai macam kendaraan. Sebenarnya code nya sama seperti webcam sebelumnya, tetapi di bagian VideoCapture, kita masukkan nama video yang ingin diproses.

capture = cv2.VideoCapture('vkend.mp4')

Jika dijalankan, kurang lebih hasilnya seperti ini.

BONUS

Mungkin muncul pertanyaan, apakah bisa kita meningkatkan FPS dan tingkat akurasi dari video yang ingin kita proses? Jawabannya adalah iya. Sebelumnya dengan webcam maupun video selection, kita menjalankan video processing tersebut dengan perintah opencv. Video yang dijalankan pun mungkin akan menurun dari segi resolusi video dan kecepatan videonya tergantung dari spesifikasi dan pengaturan GPU yang kalian atur. Tetapi sebenarnya ada 1 cara jika kita ingin mendeteksi objek dari suatu video dengan hasil yang lebih optimal, yaitu dengan cara me-render video tersebut secara langsung. Jadi kita hanya perlu menunggu proses render tersebut dan akan tercipta satu video baru dengan hasil pendeteksian objek kalian.

Tak perlu ngoding, kalian hanya masukan perintah ini di command line kalian.

C:...\darkflow>python flow --model cfg/yolov2.cfg --load bin/yolov2.weights --demo namafile.mp4 --gpu 0.7 --saveVideo

Jadi kita hanya memasukkan 2 file penting dari yolo, yaitu .cfg dan .weights dan jangan lupa atur penggunaan GPUnya. Aku sarankan jika proses render ini lebih baik penggunaan GPU ditingkatkan lagi dibandingkan dengan menjalankan video processing dengan perintah OpenCV, nanti hasilnya akan muncul video baru yang biasanya berbentuk .avi