Anda di sini

Pemrograman

[TUTORIAL - LENGKAP] Pengolahan Citra Untuk Deteksi Wajah Menggunakan Python Dalam 25 Baris Kode

Aditya Suranata - 20 November 2015 17:29:25 0

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:

  1. 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.
  2. 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.
  3. 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

20.849
Image

Aditya Suranata

Aditya suka menulis, bukan hanya sekedar hobi, menulis menjadi medianya untuk mencurahkan pikiran dan perasaan. Di TutorKeren.com kebanyakan menyumbang tulisan sesuai dengan minat dan keahliannya yaitu pada kategori pemrograman dan elektronika. Selain itu juga gemar menulis mengenai hal-hal umum, seperti ilmu alam, sosial dan beberapa pengalamannya yang mungkin bisa berguna untuk orang lain.

Artikel Menarik Lainnya
Mari Gabung

Halo Emo 51 , Ada yang ingin disampaikan? Jangan sungkan untuk gabung diskusi ini. Silahkan Login dulu atau Daftar baru.