Face Detection Sederhana dengan Dlib

Face Detection Sederhana dengan Dlib

Face Detection merupakan salah satu bentuk pemanfaatan paling umum di bidang Computer Vision. Sistem ini bekerja dengan mengidentifikasi posisi wajah dalam gambar atau video. Pada tulisan ini, kita akan menggunakan library yang menggunakan algoritma HOG untuk membuat program face detection sederhana.

HOG atau Histogram of Oriented Gradients merupakan algoritma yang digunakan untuk menangkap informasi gradient dari gambar. Dengan kata lain, variasi intensitas (perubahan kecerahan atau warna) di setiap bagian gambar akan dilihat. Ide utamanya adalah mengasumsikan bahwa bentuk dan tampilan objek seperti wajah dapat terlihat dari distribusi gradien. Penjelasan lebih lanjut terkait cara kerja dari algoritma ini dapat dilihat pada artikel-artikel berikut:

Overview Projek

Sekarang, kita akan mencoba untuk membuat program face detection sederhana menggunakan Python. Struktur projek yang akan kita buat adalah sebagai berikut:

hog-face-detection/
- img/
-- image1.png
-- image2.jpeg
- hogfacedetection.py
import argparse
import dlib
import cv2

Library yang digunakan pada projek ini adalah argparse , dlib dan cv2. Libraryargparse digunakan untuk menambahkan argumen dalam program, hal ini berguna untuk memasukkan path dari gambar yang akan dideteksi, dlib digunakan untuk memuat detektor yang sebelumnya sudah dilatih menggunakan HOG, cv2 digunakan untuk melakukan pemrosesan gambar.

def detect_faces(image_path):
    detector = dlib.get_frontal_face_detector()
    img = cv2.imread(image_path)
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    faces = detector(gray)
    for face in faces:
        x, y, w, h = (face.left(), face.top(), face.width(), face.height())
        cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
    cv2.imshow('Face Detection', img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

Selanjutnya adalah kita membuat detect_faces yang berisi proses untuk deteksi wajah di dalam gambar yang diberikan. Kemudian membuat variabel detector dengan memanggil fungsi get_frontal_face_detector() dari dlib. Gambar dari image_path dibaca menggunakan cv2.imread() kemudian dimasukkan ke dalam variabel img. Variabel img kemudian dikonversi menjadi grayscale dngan cv2.cvtColor(). Objek detector kemudian diterapkan pada gambar yang sudah dikonversi menjadi abu, output yang didapatkan berupa objek yang mewakili wajah-wajah terdeteksi yang disimpan ke dalam variabel faces.

Untuk menandai wajah yang terdeteksi, pertama-tama adalah mendapatkan koordinat beserta ukuran wajah terdeteksi yang disimpan ke dalam variabel x, y, w, h. Berdasarkan nilai pada variabel-variabel tersebut lah yang kemudian dibuat bounding box menggunakan cv2.rectangle. Proses ini kemudian diulang untuk setiap wajah yang terdeteksi di dalam variabel faces.

if __name__ == "__main__":
    parser = argparse.ArgumentParser(description='Face detection on an image')
    parser.add_argument('image_path', type=str, nargs='?', default='./img/image1.png', 
                        help='Path to the input image (default: ./img/image1.png)')
    args = parser.parse_args()
    detect_faces(args.image_path)

Terakhir adalah membuat argument parser agar kita bisa menggunakan argumen saat menjalankan program dari terminal. Program memanggil fungsi detect_faces pada path gambar yang diberikan atau nilai default sebagai argumen.

Kode:

GitHub