Pengenalan Wajah (Face Recognition) dengan OpenCV dan Python

Pada tutorial sebelumnya sudah kita pelajari bagaimana mendeteksi wajah (face detection) pada sebuah gambar yang ditangkap kamera. Pada tutorial kali ini, kita coba melakukan percobaan yang lebih advanced lagi, yakni dengan mengenali wajah yang terdeteksi tadi sesuai identitasnya masing-masing (face recognition). Dengan demikian, setiap ada wajah yang terdeteksi kamera, maka komputer akan langsung menerjemahkannya menjadi sebuah nama dari wajah orang tersebut.

Sama seperti sebelumnya, kita masih menggunakan openCV dan Python untuk script-nya dan menggunakan metode algoritma Local Binary Patterns Histograms (LBPH) untuk project pengenalan wajah kali ini.

 

Pengenalan Local Binary Patterns Histograms (LBPH)

Local Binary Patterns Histograms (LBPH) adalah suatu metode untuk ekstraksi fitur dari citra digital yang digunakan pada pengenalan wajah dan pengenalan pola. Metode ini menggabungkan konsep Local Binary Patterns (LBP) dan histogram untuk menghasilkan deskripsi wajah yang dapat dikenali.

LBP adalah suatu teknik pengolahan citra yang menggambarkan tekstur citra dengan membandingkan nilai intensitas piksel. Dalam LBPH, LBP digunakan untuk mengekstraksi fitur dari setiap piksel pada citra wajah, kemudian histogram dihitung untuk masing-masing blok piksel. Histogram ini kemudian digunakan untuk merepresentasikan wajah sebagai suatu vektor fitur.

Jika intensitas piksel objek sebelahnya lebih besar dari intensitas piksel yang sedang dianalisis, maka nilai LBP pada piksel tersebut diatur menjadi 1, sedangkan jika intensitas piksel objek sebelahnya lebih kecil, maka nilai LBP diatur menjadi 0. Nilai LBP pada setiap piksel kemudian digabungkan menjadi suatu bilangan desimal untuk merepresentasikan fitur tekstur pada piksel tersebut.

Setelah nilai LBP dihitung untuk setiap piksel pada citra wajah, citra tersebut dibagi menjadi beberapa blok piksel yang saling tumpang tindih. Histogram dihitung untuk setiap blok piksel, yang merepresentasikan distribusi nilai LBP pada blok tersebut. Histogram ini kemudian digunakan untuk merepresentasikan blok piksel sebagai suatu vektor fitur. Vektor fitur dari seluruh blok piksel kemudian digabungkan untuk merepresentasikan citra wajah secara keseluruhan.

Baca Juga  Tutorial Python #7 : Operator pada Python

LBPH telah terbukti cukup efektif dalam mengenali wajah pada berbagai kondisi pencahayaan dan variasi pose. Metode ini telah digunakan pada aplikasi keamanan seperti pemantauan kamera CCTV dan pengenalan wajah pada smartphone.

LBPH memiliki beberapa kelebihan dibandingkan metode pengenalan wajah lainnya. Metode ini relatif cepat dan sederhana dalam ekstraksi fitur, dan juga cukup stabil dalam mengenali wajah pada kondisi pencahayaan dan pose yang bervariasi. Namun, LBPH juga memiliki kekurangan, seperti sensitif terhadap perubahan skala dan rotasi pada citra wajah. Oleh karena itu, diperlukan teknik lain untuk menangani kelemahan ini.

Dalam LBPH setidaknya ada 4 parameter yang harus kita pahami, yakni ‘Radius‘ (radius pusat pixel acuan), ‘Neighbors‘ (tetangga pixel acuan), ‘Grid X‘ dan ‘Grid Y‘ (pembagian gambar). Untuk grid X dan Y, semakin banyak hasilnya akan semakin baik/presisi.

Dalam openCV sudah ada subrutin (class) yang sudah mengenkapsulasi semua yang kita butuhkan dalam algoritma LBPH ini, yakni class cv::face::LBPHFaceRecognizer. Dengan class ini kita dapat dengan mudah mengklasifikasikan objek yang terdeteksi sesuai dengan dataset yang kita buat sebelumnya, sehingga tujuan akhir pengenalan objek dapat tercapai.

 

Persiapan Face Recognition dengan OpenCV dan Python

Dalam percobaan kali ini, saya menggunakan environment sebagai berikut :

  1. Windows 10 – 64 bit
  2. OpenCV 4.1.2 (Cara instal bisa dibaca di sini)
  3. Python 3.11.1 (Cara instal bisa dibaca di sini)

Untuk kelancaran project sebaiknya kita tambahkan perintah berikut lewat command prompt :

pip install pillow

kemudian

pip install opencv-contrib-python --user

 

Tahapan Pengenalan Wajah (Face Recognition) dengan OpenCV dan Python

Untuk dapat mengenali wajah sesuai identitasnya menggunakan OpenCV dan Python, setidaknya kita harus melakukan 3 tahap sebagai berikut :

  1. Membuat dataset referensi wajah
  2. Mentraining data
  3. Melakukan pengenalan wajah (Face Recognition)
Baca Juga  Deteksi Wajah (Face Detection) dengan OpenCV dan Python

Tiga tahap di atas akan kita lakukan menggunakan script yang berbeda. Untuk mudahnya, silahkan download dulu source code-nya di sini. Kemudian ekstrak dalam folder kerja kita. Kemudian buat subfolder baru di folder tersebut dengan nama ‘dataset‘ dan ‘trainer‘.

Catatan: script di atas di share dari tutorial ini. Dalam tutorial tersebut menggunakan Raspberry Pi, saya coba mem-porting-nya ke Windows 10 dan membuat tutorial step by step-nya dalam artikel ini supaya lebih mudah dipahami dan dipraktekkan

  1. Langkah 1: Jalankan script 01_face_dataset.py, tunggu sampai muncul window dan meng-capture wajah kita dalam 30 detik. Program ini akan menghasilkan 30 gambar jpg (grayscale) dalam folder ‘dataset’. Ketika ada prompt ‘enter user id end press ==>’ ketik angka 1 untuk user 1 (misal kita), 2 untuk wajah orang kedua, 3 untuk orang ketiga, dan seterusnya. Catatan: di tutorial aslinya, menggunakan kamera Raspberry Pi yang diinstal secara terbalik, jadi kita hilangkan dulu baris ‘img = cv2.flip(img, -1) # flip video image vertically‘ pada file 01_face_dataset.py
  2. Langkah kedua jalankan program kedua (02_face_training.py). Program ini akan menghasilkan file ‘trainer.yml‘ di folder trainer (pastikan file ini ada). Catatan: pastikan path file yang akan dijalankan ya. Contoh: ‘python d:/ai/lat/py 02_face_training.py’.
  3. Langkah ketiga tinggal kita jalankan file yang ketiga, yakni 03_face_recognition.py. Jangan lupa hapus baris script ‘img = cv2.flip(img, -1)‘ terlebih dahulu. Selanjutnya, edit dulu nama user id sesuai dengan yang kita masukkan pada langkah 1 pada script 03_face_recognition.py pada baris
    names = ['None', 'Agus', 'Dzi', 'Dza', 'Z', 'W']

    (baris 16 pada script di bawah). Berikut script pengenalan wajah (face recognition) dengan OpenCV dan Python, dengan sedikit modifikasi dari versi aslinya. 

    import cv2
    import numpy as np
    import os 
    
    recognizer = cv2.face.LBPHFaceRecognizer_create()
    recognizer.read('trainer/trainer.yml')
    cascadePath = "haarcascade_frontalface_default.xml"
    faceCascade = cv2.CascadeClassifier(cascadePath);
    
    font = cv2.FONT_HERSHEY_SIMPLEX
    
    #iniciate id counter
    id = 0
    
    # names related to ids: example ==> Marcelo: id=1,  etc
    names = ['None', 'Agus', 'Dzi', 'Dza', 'Z', 'W']
    
    # Initialize and start realtime video capture
    cam = cv2.VideoCapture(0)
    cam.set(3, 640) # set video widht
    cam.set(4, 480) # set video height
    
    # Define min window size to be recognized as a face
    minW = 0.1*cam.get(3)
    minH = 0.1*cam.get(4)
    
    while True:
    
        ret, img =cam.read()
    
        gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    
        faces = faceCascade.detectMultiScale( 
            gray,
            scaleFactor = 1.2,
            minNeighbors = 5,
            minSize = (int(minW), int(minH)),
           )
    
        for(x,y,w,h) in faces:
    
            cv2.rectangle(img, (x,y), (x+w,y+h), (0,255,0), 2)
    
            id, confidence = recognizer.predict(gray[y:y+h,x:x+w])
    
            # Check if confidence is less them 100 ==> "0" is perfect match 
            if (confidence < 100):
                id = names[id]
                confidence = "  {0}%".format(round(100 - confidence))
            else:
                id = "unknown"
                confidence = "  {0}%".format(round(100 - confidence))
            
            cv2.putText(img, str(id), (x+5,y-5), font, 1, (255,255,255), 2)
            cv2.putText(img, str(confidence), (x+5,y+h-5), font, 1, (255,255,0), 1)  
        
        cv2.imshow('camera',img) 
    
        k = cv2.waitKey(10) & 0xff # Press 'ESC' for exiting video
        if k == 27:
            break
    
    # Do a bit of cleanup
    print("\n [INFO] Exiting Program and cleanup stuff")
    cam.release()
    cv2.destroyAllWindows()
    

Jika semuanya berjalan lancar, maka ketika file 03_face_recognition.py kita jalankan, tampilan di laptop/PC kita seperti berikut ini :

Baca Juga  Tutorial Python #6 : Fungsi Input dan Output di Python

 

Silahkan dicoba program-program di atas, jika ada kesulitan bisa dituliskan di kolom komentar. Dari contoh script di atas, selanjutnya bisa kita kembangkan untuk membuat mesin absensi siswa berbasis pengenalan wajah, door-lock yang hanya bisa membuka pintu jika wajahnya dikenali (authorized), dan project lainnya. 

Semoga bermanfaat.

 

 

Referensi :

  • https://www.hackster.io/mjrobot/real-time-face-recognition-an-end-to-end-project-a10826

Related Post

2 Comments

Leave a Reply

Your email address will not be published.


*


error: Ga bisa dicopy