Face Recognition (part 2)

Gifa Delyani Nursyafitri
6 min readJan 2, 2020

--

Hola people!

Pada postingan sebelumnya, kita telah berhasil menangkap gambar wajah dan menyimpannya di dalam sebuah folder serta memberi label untuk semua gambar.

Selanjutnya pada postingan ini, kita akan mencoba mengenali gambar dalam folder dataset secara terus menerus, hal ini bertujuan untuk melatih sistem sehingga dapat mengenali gambar wajah tersebut dengan tepat. Oleh karena itu dibutuhkan sebuah algoritma recognizer yang telah disediakan oleh OpenCV, yakni

recognizer = cv2.face.LBPHFaceRecognizer_create()

Kemudian kita mendefinisikan suatu fungsi perulangan untuk melatih sistem mengenali gambar secara tepat. Hal itu dapat dilakukan dengan menggunakan koding berikut:

def getImagesWithLabels(path):

Sehingga diperlukan mengambil data gambar dari folder dataset dan melakukan training untuk keseluruhan gambar yang ada, dimana fungsi di bawah ini bertujuan untuk menelusuri setiap gambar di folder

import osimagePaths=[os.path.join(path,f) for f in os.listdir(path)]

Selanjutnya dibuat definisi untuk gambar wajah dan labelnya dengan koding berikut.

faceSamples = []
Ids = []

Untuk mempelajari setiap gambar wajah dapat menggunakan looping pada koding ini, dimana perintah tersebut digunakan untuk mengkonversi gambar menjadi gray terlebih dahulu kemudian dikonversikan lagi menjadi array.

for imagePath in imagePaths:
pilImage=Image.open(imagePath).convert(‘L’)

Kemudian dibutuhkan juga modul untuk mengelola gambar yakni PIL (Python Imaging Library) yang digunakan untuk membuka, memanipulasi dan menyimpan dari berbagai format file gambar.

from PIL import Imagefor imagePath in imagePaths:
pilImage=Image.open(imagePath).convert(‘L’)
imageNp=np.array(pilImage,’uint8')
Id=int(os.path.split(imagePath)[-1].split(“.”)[1])
faces=detector.detectMultiScale(imageNp)
for (x,y,w,h) in faces:
faceSamples.append(imageNp[y:y+h,x:x+w])
Ids.append(Id)
return faceSamples, Ids

Jika semua looping telah selesai, maka disimpan dalam sebuah file dengan eksteni .xml.

faces, Ids = getImagesWithLabels(‘DataSet’)
recognizer.train(faces, np.array(Ids))
recognizer.save(‘training/training.xml’)

Sehingga ketika digabungkan menjadi koding berikut:

import cv2, osimport numpy as npfrom PIL import Imagerecognizer = cv2.face.LBPHFaceRecognizer_create()detector = cv2.CascadeClassifier(“haarcascade_frontalface_default.xml”);def getImagesWithLabels(path):imagePaths=[os.path.join(path,f) for f in os.listdir(path)]faceSamples=[]Ids=[]for imagePath in imagePaths:pilImage=Image.open(imagePath).convert(‘L’)imageNp=np.array(pilImage,’uint8')Id=int(os.path.split(imagePath)[-1].split(“.”)[1])faces=detector.detectMultiScale(imageNp)for (x,y,w,h) in faces:faceSamples.append(imageNp[y:y+h,x:x+w])Ids.append(Id)return faceSamples, Idsfaces, Ids = getImagesWithLabels(‘DataSet’)recognizer.train(faces, np.array(Ids))recognizer.save(‘training/training.xml’)

Atau dapat disesuaikan dengan gambar berikut.

Ketika sudah benar, selanjutnya “Save” dengan nama training.py. Namun sebelumnya, buatlah folder yang bernama training di dalam c:/capture sehingga menjadi c:/capture/training. Simpan koding di atas di dalam folder c:/capture.

Selanjutnya berikan perintah di command promp untuk menjalankan koding tersebut.

c:/capture/> python training.py

Jika tidak terjadi eror, maka ketika folder training di cek, akan muncul tampilan seperti gambar berikut. Dimana training.xml telah berhasil disimpan di dalam folder c:/capture/training.

Selanjutnya untuk menandai gambar wajah user tersebut, gunakan koding di bawah ini.

import cv2, timefrom PIL import Imagevideo = cv2.VideoCapture(0)a = 0recognizer = cv2.face.LBPHFaceRecognizer_create()faceDetect = cv2.CascadeClassifier(‘haarcascade_frontalface_default.xml’)recognizer.read(‘c://capture//training//training.xml’)id = 0fontFace = cv2.FONT_HERSHEY_SIMPLEXfontScale = 1fontColor = (0,255,255)while True:a = a + 1check, frame = video.read()print(check)print(frame)gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)faces=faceDetect.detectMultiScale(gray,1.3,5);for (x,y,w,h) in faces:cv2.imwrite(“DataSet/User.”+str(id)+”.”+str(a)+”.jpg”, gray[y:y+h,x:x+w])cv2.rectangle(frame,(x,y),(x+w,y+h),(0,0,255),2)id, conf=recognizer.predict(gray[y:y+h,x:x+w])cv2.putText(frame,str(id),(x+w,y+h),fontFace,fontScale,fontColor)cv2.imshow(“wajah”,frame)#key = cv2.waitKey(1)if (cv2.waitKey(1)==ord(‘q’)):breakprint(a)video.release()cv2.destroyAllWindows()

Atau dapat disesuaikan seperti tampilan pada gambar berikut ini.

Kemudian simpan koding tersebut dengan nama, misal kenalwajah.py di dalam folde c:/capture. Selanjutnya panggil perintah tersebut,

c:/capture/> python kenalwajah.py

Jika tidak ada eror, maka hasilnya akan seperti gambar dibawah ini. Wajah dapat ditandai sebagai wajah dengan id 1.

Jika ingin menambahkan nama, maka dapat menggunakan koding berikut,

if (id==1) :
id = “nama”

Sehingga ketika dimasukkan ke dalam koding sebelumnya menjadi seperti koding di bawah ini.

import cv2, timefrom PIL import Imagevideo = cv2.VideoCapture(0)a = 0recognizer = cv2.face.LBPHFaceRecognizer_create()faceDetect = cv2.CascadeClassifier(‘haarcascade_frontalface_default.xml’)recognizer.read(‘c://capture/training/training.xml’)id = 0fontFace = cv2.FONT_HERSHEY_SIMPLEXfontScale = 1fontColor = (255,0,0)while True:a = a + 1check, frame = video.read()print(check)print(frame)gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)faces=faceDetect.detectMultiScale(gray,1.3,5);for (x,y,w,h) in faces:cv2.imwrite(“DataSet/User.”+str(id)+”.”+str(a)+”.jpg”, gray[y:y+h,x:x+w])cv2.rectangle(frame,(x,y),(x+w,y+h),(0,255,0),2)id, conf=recognizer.predict(gray[y:y+h,x:x+w])if (id == 1) :id = “gifa”cv2.putText(frame,str(id),(x+w,y+h),fontFace,fontScale,fontColor)cv2.imshow(“wajah”,frame)if (cv2.waitKey(1)==ord(‘q’)):breakprint(a)video.release()cv2.destroyAllWindows()

Simpan koding tersebut dengan nama yang sama dengan koding sebelumnya. Kemudian panggil dengan perintah yang sama,

c:/capture/> python kenalwajah.py

Kemudian akan menampilkan hasil berikut ini,

Pada gambar tersebut, sistem mengenali bahwa itu adalah wajah dengan id 1, dimana wajah dengan id 1 bernama gifa.

Selanjutnya untuk menambahkan wajah lain, kita dapat mengulang langkah langkah yang telah kita lakukan sebelumnya, yaitu:

  1. Jalankan koding untuk mengambil gambar wajah dengan koding berikut
  2. Kemudian jalankan perintah training, namun sebelumnya beberapa koding diganti untuk membedakan dengan training sebelumnya.
c:/capture/> python tangkapwajah.py

Setelah koding ini berhasil dijalankan, kemudian akan diminta untuk memasukkan id baru. Masukkan id selain angka 1 yang telah digunakan. Misalkan kita memasukkan angka 5 (angka yang dimasukkan bebas), sehingga menghasilkan gambar seperti ini.

2. Kemudian jalankan perintah training, namun sebelumnya beberapa koding diganti untuk membedakan dengan training sebelumnya.

Berikut adalah koding terbarunya,

import cv2, osimport numpy as npfrom PIL import Imagerecognizer = cv2.face.LBPHFaceRecognizer_create()detector = cv2.CascadeClassifier(“haarcascade_frontalface_default.xml”);def getImagesWithLabels(path):imagePaths=[os.path.join(path,f) for f in os.listdir(path)]faceSamples=[]Ids=[]for imagePath in imagePaths:pilImage=Image.open(imagePath).convert(‘L’)imageNp=np.array(pilImage,’uint8')Id=int(os.path.split(imagePath)[-1].split(“.”)[1])faces=detector.detectMultiScale(imageNp)for (x,y,w,h) in faces:faceSamples.append(imageNp[y:y+h,x:x+w])Ids.append(Id)return faceSamples, Idsfaces, Ids = getImagesWithLabels(‘DataSetyaya’)recognizer.train(faces, np.array(Ids))recognizer.save(‘training/trainingbaru.xml’)

Simpan koding tesebut dengan nama yang sama dengan sebelumnya. Kemudian panggil dengan perintah,

c:/capture/> python training.py

Jika berhasil, maka di folder c:/capture/training akan terdapat hasil seperti ini.

3. Langkah selanjutnya adalah membedakan antara wajah dengan id 1 dan wajah dengan id 5.

Untuk proses ini dapat menambahkan koding berikut pada koding “kenalwajah.py”,

if (id==1):
id = “nama1”
elif (id==2):
id = “nama2”

Sehingga kodingnya menjadi,

import cv2, timefrom PIL import Imagevideo = cv2.VideoCapture(0)a = 0recognizer = cv2.face.LBPHFaceRecognizer_create()faceDetect = cv2.CascadeClassifier(‘haarcascade_frontalface_default.xml’)recognizer.read(‘c://capture/training/trainingbaru.xml’)id = 0fontFace = cv2.FONT_HERSHEY_SIMPLEXfontScale = 1fontColor = (255,0,0)while True:check, frame = video.read()print(check)print(frame)gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)faces=faceDetect.detectMultiScale(gray,1.3,5);for (x,y,w,h) in faces:a = a+1cv2.rectangle(frame,(x,y),(x+w,y+h),(0,255,0),2)id, conf=recognizer.predict(gray[y:y+h,x:x+w])if (id == 1):id = “gifa”elif (id == 5):id = “Yaya”cv2.putText(frame,str(id),(x+w,y+h),fontFace,fontScale,fontColor)cv2.imshow(“wajah”,frame)if (cv2.waitKey(1)==ord(‘q’)):breakprint(a)video.release()cv2.destroyAllWindows()

Simpan koding tersebut dengan nama yang sama, yaitu “kenalwajah.py”. Kemudian panggil dengan perintah,

c:/capture/> python kenalwajah.py

Jika tidak terjadi eror, maka hasilnya adalah sebagai berikut,

Yeay! Part ini udah selesai! Komputer telah berhasil membedakan wajah yang berbeda.

Dimana komputer dapat membedakan yang mana wajah dengan id 1, dan yang mana wajah dengan id 5. Wajah dengan id 1 akan memunculkan nama “gifa”, sedangkan wajah dengan id 5 akan memunculkan nama “yaya”.

Selanjutnya, di postingan terakhir tentang Face Recognition kita akan membahas tentang pengenalan wajah dengan lebih detail dengan menggunakan SQLite. Penasaran kan?

Stay tune ya!

Referensi:

  1. The Codacus, Face Recognition OpenCV — Training A Face Recognizer
  2. https://medium.com/@986110101/pengenalan-wajah-3-c05a6422113e
  3. https://medium.com/@986110101/pengenalan-wajah-4-a00b3213e49d

--

--

Gifa Delyani Nursyafitri
Gifa Delyani Nursyafitri

Written by Gifa Delyani Nursyafitri

Ku abadikan disini, karena aku paham betul bahwa ingatan manusia terbatas.

Responses (1)