Selamat datang di blogs UNYDeveloperNetwork. Saya telah menulis dua artikel yang berkaitan dengan openCV sebelumnya (Membuat Deteksi Plat Nomer Kendaraan Sederhana Dengan OpenCV (Python) dan Membuat Penghitung Koin Sederhana Dengan OpenCV). Entah kenapa akhir-akhir ini Saya begitu tertarik untuk menulis konten yang berbau Computer Vision. Sehingga, pada artikel kali ini pun Saya memutuskan untuk membuat konten yang berkaitan dengan OpenCV lagi. Baik, bahasan pada artikel kali ini masih disekitar aplikasi-aplikasi dasar OpenCV. Namun kali ini, Saya ingin membagikan sesuatu yang lebih menarik lagi yakni Face Detection. Ingat Ya, Face Detection, bukan Face Recognition. Jadi keluaran dari project ini adalah sebuah program yang dapat mendeteksi wajah, bukan merekognisi wajah. Bagaimana cara membuat program face detection ini? Mari kita simak postingan ini sampai akhir.
Baik, sebelum kita memulai project ini, ada baiknya kita persiapkan terlebih dahulu tool-tool yang kita perlukan. Dalam project ini Saya menggunakan tool-tool berikut ini.
- Python 3.8
- OpenCV 4.5.1.48
- Classifier haarcascades (bisa diunduh melalui tautan ini)
- PyCharm Community Edition
Untuk selanjutnya, Saya asumsikan Anda sudah familiar dengan PyCharm Community Edition. Oleh karena itu, Saya tidak akan menjelaskan panjang lebar tentang bagaimana cara membuat project baru. Baik, tidak perlu membuang banyak waktu lagi, mari kita mulai saja projectnya. Untuk menyelesaikan project ini, kita akan menggunakan beberapa tahap. Tahapan-tahapan ini sengaja Saya buat supaya Anda dapat lebih paham ketika membuat program ini. Berikut adalah tahapan-tahapannya.
Inisiasi
Dalam langkah ini, kita persiapkan terlebih dahulu file-file yang akan kita perlukan dalam project ini. File pertama yang kita perlukan adalah file foto dengan wajah orang. Di sini boleh hanya mengandung satu wajah saja atau banyak wajah. Pada contoh di bawah ini, Saya akan menggunakan foto pribadi berikut ini.
Setelah itu, kita perlu mendownload dua file yang akan kita gunakan sebagai classifier dalam project ini. File tersebut dapat diakses melalui tautan berikut ini. Ketika tautan tersebut diakses, maka kita akan melihat halaman seperti tangkapan layar di bawah ini.
Kita memerlukan dua buah file yakni haarcascade_frontalface_default.xml dan haarcascade_eye.xml. Download kedua file tersebut dan letakkan sembarang di dalam komputer. Nantinya, kita akan memasukkan kedua file tersebut ke dalam project.
Jika seluruh file sudah siap, kini saatnya Anda membuat project baru.
Membuat Project Baru
Silakan buat project baru pada PyCharm dengan nama Simple Face Detection dengan ketentuan Python Interpreter versi 3.8 dan OpenCV 4.5.1.48.
Selanjutnya, masukkan gambar/foto ke dalam project. Berikan nama foto_deteksi. Format foto bebas (JPG / PNG.
Setelah kita memasukkan gambar ke dalam project, selanjutnya adalah kita masukkan juga kedua file classifier yang berbentuk XML tadi ke dalam project. Sehingga di akhir, kita sudah memiliki tiga file di dalam project.
Terakhir, sebelum kita berpindah ke langkah selanjutnya, kita buat terlebih dahulu script python baru dengan nama facedetection.py. Sampai di sini, kita dapat melanjutkan ke tahap selanjutnya.
Memuat Gambar Ke Dalam Program
Seperti pada umumnya, setelah kita selesai membuat project baru, kita lanjutkan dengan memuat gambar ke dalam program. Untuk melakukannya, terlebih dahulu kita import library openCV ke dalam program. Ketikkan kode berikut ini pada script.
import cv2 as cv
Selanjutnya kita muat gambar kita ke dalam program dengan menggunakan fungsi imread().
imgsrc = cv.imread('foto_deteksi.jpg')
Kemudian kita coba tampilkan dengan menggunakan fungsi imshow().
cv.imshow('Original Resource', imgsrc)
Jangan lupa tambahkan fungsi waitKey() dan destroyAllWindows() untuk mengatur timing dan tampilan hasil program.
cv.waitKey(0)
cv.destroyAllWindows()
Kita coba jalankan script yang baru saja kita buat. Maka tampilannya akan seperti tangkapan layar di bawah ini.
Namun, ternyata gambar masih sangat besar ya. Oleh karena itu kita akan melanjutkannya ke langkah selanjutnya. Yakni mengubah ukuran dimensi gambar.
SCRIPT SAAT INI
import cv2 as cv
imgsrc = cv.imread('foto_deteksi.jpg')
cv.imshow('Original Resource', imgsrc)
cv.waitKey(0)
cv.destroyAllWindows()
Mengubah Ukuran Dimensi Gambar
Pada tahap ini, kita akan mengubah ukuran dimensi gambar supaya tidak terlalu besar, dan tidak memenuhi layar komputer kita. Untuk mengubah ukuran dimensi gambar, kita akan menggunakan library imutils(). Oleh karena itu, ketikkan kode berikut ini untuk mengimport library imutils() ke dalam script. Letakkan kode di baris kedua dari script.
import imutils as im
Setelah kita mengimport library imutils(), kita dapat menggunakan fungsi resize() untuk mengubah ukuran dimensi gambar. Ketikkan kode berikut di bawah fungsi imshow().
imgres = im.resize(imgsrc, width=500)
Selanjutnya, kita coba tampilkan gambar hasil resize dengan menggunakan fungsi imshow().
cv.imshow('Resized Image', imgres)
Mari kita coba jalankan script yang sudah kita tambahkan dengan kode di atas. Kita akan melihat keluaran program seperti tangkapan layar di bawah ini.
Sampai di sini, kini kita sudah memiliki resource gambar yang sudah diresized sehingga ukurannya tidak terlalu tebal. Oleh karena itu, kita bisa menghilangkan fungsi imshow() yang menampilkan gambar original. Sehingga hasil akhir script pada tahapan ini adalah sebagai berikut.
import cv2 as cv
import imutils as im
imgsrc = cv.imread('foto_deteksi.jpg')
imgres = im.resize(imgsrc, width=500)
cv.imshow('Resized Image', imgres)
cv.waitKey(0)
cv.destroyAllWindows()
Kita coba jalankan script-nya dan akan mengeluarkan tampilan seperti tangkapan layar di bawah ini.
Selain itu, karena kita sudah melakukan resize ukuran dimensi gambar, maka kita bisa menggunakan variabel tempat menyimpan gambar hasil resize untuk melaju ke langkah selanjutnya.
Mengubah Color Space ke Grayscale
Tahapan selanjutnya adalah mengubah colorspace gambar yang sudah kita resize pada tahap sebelumnya menjadi grayscale. Tujuannya adalah lebih menyederhanakan gambar sehingga proses pendeteksian juga lebih cepat dan lebih akurat. Fungsi yang digunakan adalah fungsi cvtColor() dan flags yang digunakan adalah COLOR_BGR2GRAY. Masukkan kode berikut setelah fungsi imshow()
imggrey = cv.cvtColor(imgres, cv.COLOR_BGR2GRAY)
Seperti biasa, untuk melihat hasilnya, kita tambahkan fungsi imshow()
cv.imshow('Grayscaled Image', imggrey)
Mari kita coba script yang sudah kita tambahkan beberapa kode di atas.
Setelah kita tambahkan beberapa kode di atas, tampak pada tangkapan layar di atas, gambar yang diubah colorspaces nya berubah menjadi grayscale sehingga tampak lebih sederhana untuk dilakukan analisis. Sampai pada tahap ini, kondisi script kita adalah sebagai berikut.
import cv2 as cv
import imutils as im
imgsrc = cv.imread('foto_deteksi.jpg')
imgres = im.resize(imgsrc, width=500)
cv.imshow('Resized Image', imgres)
imggrey = cv.cvtColor(imgres, cv.COLOR_BGR2GRAY)
cv.imshow('Grayscaled Image', imggrey)
cv.waitKey(0)
cv.destroyAllWindows()
Mendeteksi Wajah
Sampailah kita ke tahapan inti dari project face detection sederhana ini. Tahapan ini saya bagi menjadi beberapa bagian, karena memang bagian-bagian ini tidak dapat dipisahkan menjadi tahapan-tahapan tersendiri. Bagian Pertama adalah menginisiasi classifier yang akan digunakan untuk mendeteksi wajah dan mata di sebuah gambar. Anda tentu masih ingat di awal project ini kita telah mengimport beberapa file, dan beberapa diantaranya adalah dua buah file XML. File XML ini yang akan kita gunakan sebagai classifier untuk mendeteksi wajah dan mata di sebuah gambar. Fungsi yang akan kita gunakan adalah fungsi CascadeClassifier() dengan parameternya adalah kedua file XML tadi. Tambahkan kode berikut di bawah kode import.
faces = cv.CascadeClassifier('haarcascade_frontalface_default.xml')
eyes = cv.CascadeClassifier('haarcascade_eye.xml')
Setelah kita menginisiasi classifier bagian selanjutnya adalah mendeteksi wajah. Untuk melakukannya kita akan menggunakan variabel faces dan fungsi detectMultiScale(). Tambahkan kode berikut setelah imshow() grayscale.
faceDetection = faces.detectMultiScale(imggrey, 1.3, 1)
Sampai di tahap ini, kita seharusnya sudah bisa memperoleh data “berapa wajah yang terdeteksi di sebuah gambar”. Untuk memeriksanya, tambahkan fungsi berikut ini tepat di bawah variabel faceDetection.
totalFaces = 0
for(x, y, w, h) in faceDetection:
totalFaces = totalFaces + 1
print(totalFaces)
Sehingga sampai di tahap ini, script kita sudah menjadi seperti di bawah ini.
import cv2 as cv
import imutils as im
faces = cv.CascadeClassifier('haarcascade_frontalface_default.xml')
eyes = cv.CascadeClassifier('haarcascade_eye.xml')
imgsrc = cv.imread('foto_deteksi.jpg')
imgres = im.resize(imgsrc, width=500)
cv.imshow('Resized Image', imgres)
imggrey = cv.cvtColor(imgres, cv.COLOR_BGR2GRAY)
cv.imshow('Grayscaled Image', imggrey)
faceDetection = faces.detectMultiScale(imggrey, 1.3, 1)
totalFaces = 0
for(x, y, w, h) in faceDetection:
totalFaces = totalFaces + 1
print(totalFaces)
cv.waitKey(0)
cv.destroyAllWindows()
Ketika script kita jalankan:
Tampak console PyCharm CE menampilkan angka 4 yang merupakan hasil pendeteksian: Terdapat 4 wajah di dalam gambar. Untuk meyakinkan lagi bahwa kita benar-benar berhasil mendeteksi wajah, maka kita akan menggambar sebuah rectangle di sekitar wajah yang terdeteksi. Oleh karena itu, bagian selanjutnya adalah menggambarkan rectangle. Letakkan kode berikut ini di bawah kode totalFaces = totalFaces + 1
cv.rectangle(imgres, (x,y), (x+w, y+h), (255,0,0), 2)
Setelah itu, tambahkan kode berikut ini untuk menampilkan hasil penggambaran rectangle. Letakkan kode di bawah kode print(totalFaces).
cv.imshow('HASIL AKHIR', imgres)
Sehingga, sampai di tahap ini script kita sudah menjadi seperti ini.
import cv2 as cv
import imutils as im
faces = cv.CascadeClassifier('haarcascade_frontalface_default.xml')
eyes = cv.CascadeClassifier('haarcascade_eye.xml')
imgsrc = cv.imread('foto_deteksi.jpg')
imgres = im.resize(imgsrc, width=500)
cv.imshow('Resized Image', imgres)
imggrey = cv.cvtColor(imgres, cv.COLOR_BGR2GRAY)
cv.imshow('Grayscaled Image', imggrey)
faceDetection = faces.detectMultiScale(imggrey, 1.3, 1)
totalFaces = 0
for(x, y, w, h) in faceDetection:
totalFaces = totalFaces + 1
cv.rectangle(imgres, (x,y), (x+w, y+h), (255,0,0), 2)
print(totalFaces)
cv.imshow('HASIL AKHIR', imgres)
cv.waitKey(0)
cv.destroyAllWindows()
Sekarang, mari kita coba eksekusi script di atas. Maka, hasilnya adalah seperti tangkapan layar di bawah ini.
Anda dapat merapikan script dengan menghapus perintah-perintah di bawah ini.
cv.imshow('Resized Image', imgres)
cv.imshow('Grayscaled Image', imggrey)
Sehingga script akhir kita adalah seperti ini.
import cv2 as cv
import imutils as im
faces = cv.CascadeClassifier('haarcascade_frontalface_default.xml')
eyes = cv.CascadeClassifier('haarcascade_eye.xml')
imgsrc = cv.imread('foto_deteksi.jpg')
imgres = im.resize(imgsrc, width=500)
imggrey = cv.cvtColor(imgres, cv.COLOR_BGR2GRAY)
faceDetection = faces.detectMultiScale(imggrey, 1.3, 1)
totalFaces = 0
for(x, y, w, h) in faceDetection:
totalFaces = totalFaces + 1
cv.rectangle(imgres, (x,y), (x+w, y+h), (255,0,0), 2)
print(totalFaces)
cv.imshow('HASIL AKHIR', imgres)
cv.waitKey(0)
cv.destroyAllWindows()
Apabila dijalankan, maka akan tampil seperti tangkapan layar di bawah ini.
Nah, sampai di sini, project face detection sudah selesai dibuat. Tunggu project saya selanjutnya yakni face recognition. Apa perbedaan antara face detection dengan face recognition? Tunggu postingan Saya selanjutnya.
Demikian postingan saya tentang Membuat Face Detection Sederhana Dengan OpenCV (Python). Semoga postingan ini bermanfaat bagi Anda yang ingin belajar tentang OpenCV. Apabila Anda masih menemukan kendala dalam membuat program ini, Anda dapat meninggalkan pertanyan di kolom komentar. Jika Anda ingin mencuplik sebagian teks dari artikel ini, Saya mohon jangan lupa sertakan sumber dan penulisnya.
Terima Kasih…. ^_^
DOWNLOAD
Izin menyimak & sangat bermanfaat.