[TUTORIAL - LENGKAP] Pengolahan Citra Untuk Deteksi Wajah Menggunakan Python Dalam 25 Baris Kode
Posting berikut merupakan ulasan dari Shantnu Tiwari, ia yang telah bekerja didomain tingkat rendah/embedded selama sepululuh tahun. Shantnu menderita dalam genggaman C/C++ dalam beberapa tahun sebelum dirinya menemukan Python, hal itu terasa seperti menghirup udara segar baginya. Dan sekarang ia mencoba untuk berbagi cintanya untuk kita semua.
Dalam artikel ini kita akan mengulas sebuah cara sederhana yang mengejutkan tentang bagaimana kita memulai teknik pengenalan wajah menggunakan Python dan pustaka open source OpenCV.
OpenCV
OpenCV merupakan pustaka paling populer untuk computer vision. Aslinya ditulis dalam C/C++, namun sekarang telah tersedia jilidan untuk Python.
OpenCV menggunakan algoritma pembelajaran oleh mesin untuk mencari wajah dalam sebuah gambar. Untuk suatu hal yang rumit serumit sebuah wajah, tidak ada sebuah test sederhana yang akan memberi tahu Anda jika telah ditemukan sebuah wajah atau tidak dalam sebuah foto. Sebaliknya, terdapat ribuan motif/fitur kecil yang harus dicocokan. Algoritma memecah-mecah tugas untuk mengidentifikasi wajah menjadi ribuan tugas yang lebih kecil, seukuran petak kecil, yang mana setiap petaknya mudah untuk dipecahkan. Tugas tersebut juga dinamakan classifier.
Untuk suatu hal seperti wajah, Anda mungkin punya sekitar 6000 classifier atau lebih, yang mana semuanya mesti benar-benar cocok agar sebuah wajah dapat dikenali (dalam batasan error tentunya). Tapi justru disitulah letak masalahnya: Untuk pendeteksian wajah, algoritma akan berjalan mulai dari pojok kiri atas dari gambar dan bergerak turun melalui blok-blok kecil data, mencari pada setiap blok, dengan konstan seperti bertanya, "Apakah ini wajah ? ... Apakah ini wajah ? .... Apakah ini wajah ?" Karena ada 6000 atau lebih test per blok, Anda akan memerlukan jutaan perhitungan yang harus dilakukan, yang mana dapat memanggang komputer Anda hingga mati.
Untuk memecahkan masalah ini, OpenCV menggunakan cascades. Apa itu cascade ? Jawaban terbaik dapat ditemukan dari arti katanya: Sebuah air terjun atau serangkaian air terjun.
Seperti serangkaian air terjun, OpenCV cascade memecahkan masalah dalam mendeteksi wajah menjadi beberapa tahapan. Untuk setiap blok, pertama ia melakukan pengujian yang sifatnya acak dan cepat. Jika test tersebut terlewati, ia akan melakukan test yang lebih mendetail, dan begitu seterusnya. Algoritmanya mungkin memiliki 30-50 tahapan/cascade tersebut, dan ia hanya akan mendeteksi sebuah wajah apabila semua testnya telah terlewati. Keunggulannya adalah mayoritas dari gambar yang tidak memiliki wajah akan terdeteksi negatif selama beberapa tahapan awal, yang mana berarti algoritmanya tidak akan membuang waktu untuk menguji semua fitur sebanyak 6000 pada gambar. Oleh sebab itu, ketimbang memerlukan berjaman, pendeteksian wajah kini dapat dilakukan secara real time.
Cascade dalam praktek
Meskipun dalam teori terdengar ribet, dalam praktek sebenarnya cukup mudah. Cascade sendiri sebernarnya hanya sebuah file XML yang berisi data OpenCV yang digunakan untuk mendeteksi objek. Anda menginisialisasi kode Anda dengan cascade yang Anda perlukan, dan kemudian ia akan mengerjakan semuanya untuk Anda.
Karena pendeteksian wajah merupakan kasus umum, OpenCV datang dengan beberapa cascade built-in yang dapat digunakan untuk mendeteksi apapun mulai dari wajah hingga mata hingga tangan dan kaki. Bahkan ada cascade untuk hal yang bukan manusia. Sebagai contoh, jika Anda punya toko jualan pisang dan ingin melacak orang yang mencuri pisang Anda, orang ini sudah membuat satu untuk tujuan tersebut!
Menginstall OpenCV
Pertama, Anda perlu mencari file setup yang cocok untuk sistem operasi yang Anda gunakan.
Saya merasakan menginstall OpenCV merupakan bagian tersulitnya. Jika Anda mengalami error aneh atau yang tak dapat dijelaskan, itu mungkin karena kelas pustaka (library classes) ada yang kurang/missing, perbedaan arsitektur 32/64bit, dll. Saya menemukan cara termudah untuk menggunakan OpenCV adalah menggunakan Linux, baik langsung maupun menggunakan virtual machine dan menginstall OpenCV dari awal.
Cara menginstall OpenCV untuk Python pada Linux berbasis Debian (Ubuntu / Raspbian) pada Raspberry Pi misalnya, cukup gunakan perintah $ sudo apt-get install python-opencv
Setelah terinstall, Anda bisa mengetes apakah sudah mau atau tidak dengan membuka sesi Python dan mengetik:
$ python >>> import cv2 >>>
Jika tidak menemukan pesan error, Anda bisa lanjut ke tahap berikutnya.
Mengertikan kodenya
Mari bahas satu persatu kodenya, yang mana dapat Anda unduh melalui repo. Ambil skrip face_detec.py, gambar abba.png, dan file cascade haarcascade_frontalface_default.xml. Taruh dalam satu folder.
# Get user supplied values imagePath = sys.argv[1] cascPath = sys.argv[2]
Pertama Anda lewatkan nama file gambar dan cascade ke program face_detec.py menggunakan command-line argument. Kita akan menggunakan gambar Abba begitu juga dengan cascade untuk mendeteksi wajah yang disediakan oleh OpenCV.
# Create the haar cascade faceCascade = cv2.CascadeClassifier(cascPath)
Sekarang kita membuat cascade-nya dan menginisialisasinya dengan cascade wajah kita. Ini akan memuat cascade wajah ke dalam memori sehingga siap digunakan. Ingat, cascade hanya sebuah file XML yang berisi data untuk mendeteksi wajah.
# Read the image image = cv2.imread(imagePath) gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
Disini kita membaca gambarnya dan merubah ke grayscale. Banyak operasi pada OpenCV dilakukan dalam mode grayscale (hitam putih/abu).
# Detect faces in the image faces = faceCascade.detectMultiScale( gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30), flags = cv2.cv.CV_HAAR_SCALE_IMAGE )
Fungsi ini mendeteksi adalah fungsi deteksi wajah yang sebenarnya - dan merupakan bagian kunci dari kode kita, jadi mari lanjut ke opsinya:
- Fungsi detectMultiScale merupakan fungsi umum yang mendeteksi objek. Karena kita memanggilnya pada cascade wajah, itulah yang akan ia deteksi. Opsi pertama adalah sebuah variabel citra dalam mode grayscale.
- Kedua adalah scaleFactor. Karena beberapa wajah mungkin lebih dekat ke kamera, wajah tersebut akan terlihat lebih besar daripada yang berada dibelakang. Scale factor akan mengkompensasikan untuk hal ini.
- Algoritma pendeteksian menggunakan window bergerak untuk mendeteksi objek. minNeighbors mendefinisikan seberapa banyak objek yang terdeteksi di dekat yang sekarang sebelum fungsi menyatakan menemukan wajah. minSize, sementara itu, memberikan ukuran dari setiap window.
Saya menggunakan nilai yang umum digunakan untuk field tersebut. Dalam dunia nyata, Anda bisa bereksperimen dengan nilai yang berbeda untuk window size, scale factor dll., hingga Anda menemukan yang paling bagus.
Fungsi tersebut mereturn daftar persegi dimana pada bagian tersebut terdapat wajah. Selanjutnya, kita akan melakukan perulangan untuk mencatat dimana saja fungsi telah menemukan sesuatu.
print "Found {0} faces!".format(len(faces)) # Draw a rectangle around the faces for (x, y, w, h) in faces: cv2.rectangle(image, (x, y), (x+w, y+h), (0, 255, 0), 2)
Fungsi ini mereturn 4 nilai: lokasi x dan y dari segi empat, dan lebar dan tinggi dari segi empat (w, h).
Kita menggunakan nilai tersebut untuk menggambar segi empat menggunakan fungsi built-in rectangle().
Memeriksa hasilnya
Mari kita coba dengan gambar Abba yang telah diunduh tadi:
$ python face_detect.py abba.png haarcascade_frontalface_default.xml
Foto diatas berhasil. Bagaimana dengan foto lain:
Nahh... itu bukan wajah. Mari kita coba lagi. Saya mengganti parameternya dan menemukan bahwa mengubah scaleFactor nya menjadi 1.2 dapat menyingkirkan wajah yang salah.
Apa yang terjadi ? Baik, foto yang pertama diambil cukup dekat dengan kamera berkualitas tinggi. Yang kedua terlihat seperti diambil dari jarak jauh dan kemungkinan menggunakan kamera HP. Inilah mengapa scaleFactor nya mesti dimodifikasi. Seperti yang saya katakan, Anda perlu men-setup algoritmanya pada kasus per kasus untuk menghindari false positif.
Berhati-hatilah karena ini berdasarkan pada pembelajaran oleh mesin, hasilnya tidak akan pernah 100% akurat. Anda akan mendapat hasil yang cukup bagus pada kebanyakan kasus, tapi kadang-kadang algoritmanya juga mengidentifikasi objek yang salah sebagai wajah.
Baik, demikian ulasan singkatnya. Kode finalnya dapat diambil disini. Selamat mencoba dan semoga bermanfaat.
Referensi realpython.com
Mari Gabung
Halo
, Ada yang ingin disampaikan? Jangan sungkan untuk gabung diskusi ini. Silahkan Login dulu atau Daftar baru.