Cara Membuat Face Recognition dengan Python

Ilustrasi Proses Face Recognition Sederhana Wajah Input Fitur Database (Encoding) Dikenali!

Pengenalan wajah atau Face Recognition adalah salah satu aplikasi kecerdasan buatan (AI) yang paling menarik dan banyak digunakan saat ini. Dengan Python, berkat pustaka yang kuat seperti OpenCV dan dlib, membuat sistem dasar pengenalan wajah menjadi lebih mudah diakses daripada sebelumnya.

Apa yang Kita Butuhkan?

Untuk memulai proyek ini, kita akan memerlukan beberapa pustaka utama Python. Ini adalah fondasi bagi semua proses deteksi, ekstraksi fitur, dan perbandingan:

Anda dapat menginstal pustaka ini menggunakan pip. Perlu diperhatikan bahwa instalasi dlib (yang merupakan dependensi face_recognition) terkadang memerlukan kompilator C++ di sistem Anda.

pip install opencv-python
pip install face_recognition
pip install numpy

Langkah 1: Persiapan Data Pelatihan (Encoding)

Sistem pengenalan wajah bekerja dengan membandingkan fitur wajah baru dengan wajah yang sudah dikenal yang tersimpan dalam database. Proses menyimpan fitur wajah yang dikenal ini disebut encoding.

Kita perlu mengambil beberapa foto orang yang ingin kita kenali dan mengubahnya menjadi vektor numerik. Vektor ini adalah "sidik jari" wajah.

Dalam skrip Python, Anda akan membaca gambar-gambar ini dan menggunakan face_recognition.face_encodings().

import face_recognition
import os

known_face_encodings = []
known_face_names = []

# Asumsikan Anda memiliki folder 'data_wajah' berisi gambar-gambar
image_dir = "data_wajah" 

for filename in os.listdir(image_dir):
    if filename.endswith((".jpg", ".png")):
        path = os.path.join(image_dir, filename)
        image = face_recognition.load_image_file(path)
        
        # Asumsi: hanya ada satu wajah per gambar pelatihan
        encoding = face_recognition.face_encodings(image)
        
        if encoding:
            known_face_encodings.append(encoding[0])
            # Menggunakan nama file (tanpa ekstensi) sebagai nama orang
            name = os.path.splitext(filename)[0]
            known_face_names.append(name)

print(f"Total wajah yang berhasil di-encode: {len(known_face_names)}")

Langkah 2: Deteksi dan Perbandingan Wajah Real-Time

Setelah basis data wajah kita siap, kita beralih ke pengambilan input, biasanya dari webcam atau file video. OpenCV sangat berguna di sini.

Kita akan melakukan perulangan untuk menangkap frame demi frame, mendeteksi wajah di frame tersebut, dan membandingkan encoding wajah yang terdeteksi dengan encoding yang tersimpan.

Fungsi kunci di sini adalah face_recognition.compare_faces() yang akan membandingkan encoding baru dengan daftar encoding yang dikenal, dan face_recognition.face_distance() untuk menentukan seberapa dekat kecocokannya.

import cv2

# Inisialisasi kamera
video_capture = cv2.VideoCapture(0)

while True:
    ret, frame = video_capture.read()
    
    # Mengubah warna frame dari BGR (OpenCV) ke RGB (face_recognition)
    rgb_frame = frame[:, :, ::-1]

    # Temukan semua wajah dan encoding dalam frame saat ini
    face_locations = face_recognition.face_locations(rgb_frame)
    face_encodings = face_recognition.face_encodings(rgb_frame, face_locations)

    for (top, right, bottom, left), face_encoding in zip(face_locations, face_encodings):
        # Bandingkan wajah yang terdeteksi dengan wajah yang kita kenal
        matches = face_recognition.compare_faces(known_face_encodings, face_encoding)
        name = "Tidak Dikenal"
        
        # Hitung jarak (semakin kecil semakin mirip)
        face_distances = face_recognition.face_distance(known_face_encodings, face_encoding)
        best_match_index = np.argmin(face_distances)
        
        if matches[best_match_index]:
            name = known_face_names[best_match_index]

        # Gambar kotak di sekitar wajah
        cv2.rectangle(frame, (left, top), (right, bottom), (0, 255, 0), 2)
        
        # Tuliskan nama di bawah kotak
        cv2.rectangle(frame, (left, bottom - 35), (right, bottom), (0, 255, 0), cv2.FILLED)
        font = cv2.FONT_HERSHEY_DUPLEX
        cv2.putText(frame, name, (left + 6, bottom - 6), font, 0.8, (255, 255, 255), 1)

    # Tampilkan hasilnya
    cv2.imshow('Face Recognition Demo', frame)

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

video_capture.release()
cv2.destroyAllWindows()

Batasan dan Pengembangan Lebih Lanjut

Metode yang dijelaskan di atas menggunakan dlib's ResNet model, yang sangat baik dalam menghasilkan embeddings wajah yang robust. Namun, sistem ini memiliki beberapa batasan:

  1. Kebutuhan Data Pelatihan: Akurasi sangat bergantung pada kualitas dan variasi gambar pelatihan. Untuk hasil terbaik, gunakan gambar dengan pencahayaan dan ekspresi berbeda.
  2. Kinerja: Pada perangkat keras yang lambat, memproses video real-time mungkin menghasilkan frame rate yang rendah.
  3. Variasi Ekstrem: Pengenalan mungkin gagal jika ada perubahan signifikan seperti memakai penutup kepala besar, kacamata hitam tebal, atau perubahan wajah yang drastis (misalnya, penambahan atau hilangnya kumis).

Untuk meningkatkan sistem, Anda dapat mengintegrasikan lebih lanjut dengan pembelajaran mesin yang lebih dalam (Deep Learning), seperti menggunakan model berbasis CNN yang sudah dilatih sebelumnya (misalnya, VGG-Face atau FaceNet) yang dapat memberikan akurasi yang jauh lebih tinggi daripada metode berbasis Euclidean distance sederhana yang digunakan oleh pustaka face_recognition secara default.

Dengan menguasai dasar-dasar ini menggunakan Python, Anda telah meletakkan fondasi kuat untuk eksplorasi teknologi biometrik di masa depan.