Implementasi Face Recognition menggunakan OpenCV-Python

Nadya Anis F
4 min readSep 22, 2021

Hai teman-teman!

Saya ingin membagikan salah satu project yang saya coba, yaitu face recognition. Face recognition merupakan bagian dari face processing yang dapat memferifikasi / meng-identifikasi wajah melalui gambar atau video digital. Disini saya menggunakan metode Haar Cascade Classifier dengan library OpenCV di Python. Maka dari itu, silahkan untuk install OpenCV anda!

Tahap-Tahap yang dilakukan:

  1. Test Kamera

Kita harus mengecek apakah kamera berfungsi dengan baik.

import numpy as np
import cv2
camera = 0
cap = cv2.VideoCapture(camera, cv2.CAP_DSHOW)
cap.set(3,640) # set Width
cap.set(4,480) # set Height
while(True):
ret, frame = cap.read()
frame = cv2.flip(frame, 1) # Flip camera vertically
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

cv2.imshow('frame', frame)
cv2.imshow('gray', gray)

k = cv2.waitKey(30) & 0xff
if k == ord('x'): # press 'ESC' to quit
break
cap.release()
cv2.destroyAllWindows()

2. Face detection

Disini akan mendeketksi wajah dengan menggunakan metode Haar Cascade Classifier

import numpy as np
import cv2
camera = 0
faceCascade = cv2.CascadeClassifier(cv2.data.haarcascades +'haarcascade_frontalface_default.xml')
cap = cv2.VideoCapture(camera, cv2.CAP_DSHOW)
cap.set(3,640) # set Width
cap.set(4,480) # set Height
while True:
ret, img = cap.read()
img = cv2.flip(img, 1)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = faceCascade.detectMultiScale(
gray,
scaleFactor=1.2,
minNeighbors=5,
minSize=(20, 20)
)
for (x,y,w,h) in faces:
cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
roi_gray = gray[y:y+h, x:x+w]
roi_color = img[y:y+h, x:x+w]
cv2.imshow('video',img)
k = cv2.waitKey(30) & 0xff
if k == ord('x'): # tekan x untuk keluar
break
cap.release()
cv2.destroyAllWindows()

Terdapat bagian yang perlu diperhatikan:

faceCascade = cv2.CascadeClassifier(cv2.data.haarcascades +'haarcascade_frontalface_default.xml')

Ini adalah baris yang memuat “classifier wajah” (yang harus berada di bawah direktori proyek)

3. Data gathering

Pada proses ini digunakan untuk melakukan tangkapan wajah yang akan dijadikan dataset.

import cv2
import os
camera = 0
cam = cv2.VideoCapture(camera, cv2.CAP_DSHOW)
cam.set(3, 640) # set video width
cam.set(4, 480) # set video height
face_detector = cv2.CascadeClassifier(cv2.data.haarcascades +’haarcascade_frontalface_default.xml’)
# untuk masing2 orang, masukkan id
face_id = input(‘\n masukkan id ==> ‘)
print(“\n [INFO] Lihat Kamera…”)
# mengambil sampel face (sebanyak 30 take)
count = 0
while(True):
ret, img = cam.read()
img = cv2.flip(img, 1) # flip video image vertically
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_detector.detectMultiScale(gray, 1.3, 5)
for (x,y,w,h) in faces:
cv2.rectangle(img, (x,y), (x+w,y+h), (255,0,0), 2)
count += 1
# menyimpan foto di DataSet
cv2.imwrite(‘D:/fga/DataSet/User.’ + str(face_id) + ‘.’ +
str(count) + “.jpg”, gray[y:y+h,x:x+w])
cv2.imshow(‘image’, img)
k = cv2.waitKey(100) & 0xff # Tekan ESC untuk keluar
if k == 27:
break
elif count >= 30: # Mengambil 30 foto
break
# Do a bit of cleanup
print(“\n [INFO] kluar dari Program”)
cam.release()
cv2.destroyAllWindows()

Saat running sintaks diatas kita akan diminta untuk memasukkan ID dan program akan otomatis mengambil 30 tangkapan gambar secara langsung tersimpan di file directory yang ditentukan, berikut sintaks yang perlu diperhatikan:

cv2.imwrite(‘D:/fga/DataSet/User.’ + str(face_id) + ‘.’ + 
str(count) + “.jpg”, gray[y:y+h,x:x+w])

4. Trainer

Pada proses ini kita akan melakukan training dari dataset.

import cv2
import numpy as np
from PIL import Image
import os
# Path untuk dataset
path = 'D:/fga/DataSet'
recognizer = cv2.face.LBPHFaceRecognizer_create()
detector = cv2.CascadeClassifier(cv2.data.haarcascades +'haarcascade_frontalface_default.xml');
# mengambil foto dan label data
def getImagesAndLabels(path):
imagePaths = [os.path.join(path,f) for f in os.listdir(path)]
faceSamples=[]
ids = []
for imagePath in imagePaths:
PIL_img = Image.open(imagePath).convert('L') # grayscale
img_numpy = np.array(PIL_img,'uint8')
id = int(os.path.split(imagePath)[-1].split(".")[1])
faces = detector.detectMultiScale(img_numpy)
for (x,y,w,h) in faces:
faceSamples.append(img_numpy[y:y+h,x:x+w])
ids.append(id)
return faceSamples,ids
print ("\n [INFO] Sedang melakukan training, mohon tunggu sebentar")
faces,ids = getImagesAndLabels(path)
recognizer.train(faces, np.array(ids))
# menyimpan hasil training
recognizer.write('D:/fga/DataSet/training.xml')
# jika sudah selesai maka akan keluar:
print("\n [INFO] {0} face sudah di training".format(len(np.unique(ids))))

Hasil training akan disimpan pada file direktori yang sudah ditentukan dengan format .xml. Berikut sintaks yang perlu diperhatikan:

# menyimpan hasil training 
recognizer.write('D:/fga/DataSet/training.xml')

5. Recognizer

Pada proses ini akan meng-capture wajah dan akan memprediksi apakah wajah tersebut termasuk dalam dataset atau tidak.

import cv2
import numpy as np
import os
recognizer = cv2.face.LBPHFaceRecognizer_create()
recognizer.read('D:/fga/DataSet/training.xml')
cascadePath = cv2.data.haarcascades +'haarcascade_frontalface_default.xml'
faceCascade = cv2.CascadeClassifier(cascadePath);
font = cv2.FONT_HERSHEY_SIMPLEX
#memulai dari id=0
id = 0
# merelasikan nama dgn id spt id 1 sbagai Nadya Anis
names = ['None','Nadya Anis']
# Untuk Video capture
camera = 0
cam = cv2.VideoCapture(camera, cv2.CAP_DSHOW)
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()
img = cv2.flip(img, 1) # Flip vertically
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])

# If confidence is less them 100 ==> "0" : 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 # ESC untuk close
if k == 27:
break
# Do a bit of cleanup
print("\n [INFO] Exiting Program and cleanup stuff")
cam.release()
cv2.destroyAllWindows()

Jika wajah yang di capture sesuai dengan dataset, maka program akan mengambil index atau nama yang telah dijalankan. Karena pada program ini hanya menggunakan satu wajah, yaitu ID 1 dengan nama Nadya Anis maka akan tampil nama Nadya Anis jika running sintaks program diatas.

#memulai dari id=0
id = 0
# merelasikan nama dgn id spt id 1 sbagai Nadya Anis
names = ['None','Nadya Anis']

Sekian dari saya! Semoga bermanfaat ^^

--

--