opencv

Pengenalan Wajah OpenCV

Pengenalan Wajah OpenCV

Pengenalan Wajah dengan OpenCV

Kompleksitas mesin telah meningkat selama bertahun-tahun dan komputer tidak terkecuali. Komputer telah membantu umat manusia memecahkan banyak masalah dan menyelesaikan banyak tugas sulit difficult. Lewatlah sudah hari-hari ketika semua komputer melakukan operasi aritmatika sederhana, komputer sekarang menggerakkan dunia.

Komputer telah menjadi begitu kompleks, mereka dilatih untuk berpikir seperti manusia.
Iya!

Kami akan melakukan sesuatu seperti itu di artikel ini. Sebagai manusia, mengenali wajah orang lain adalah tugas yang sederhana dan terlepas dari kemampuan komputer saat ini tidak semudah komputer sehingga kita harus melatihnya untuk dapat melakukan hal yang sama.

Banyak artikel yang akan Anda lihat di luar sana berhenti pada deteksi wajah sederhana, tetapi dalam artikel ini tidak hanya mencakup deteksi wajah tetapi juga pengenalan wajah.

Ini berarti jika komputer disajikan dengan dua gambar saya, itu tidak hanya akan mengenali bagian mana dari gambar itu adalah wajah saya, tetapi juga mengenali bahwa saya adalah orang di kedua gambar itu juga.

Untuk memulainya, pertama-tama kita harus menginstal opencv pada mesin kita, yang hanya dapat dilakukan jika Anda telah menginstal Python. Instalasi Python bukanlah tujuan artikel ini, jadi jika Anda belum memilikinya di mesin Anda, Anda bisa menginstal Python dari Situs Web Python.

Untuk menginstal Open CV, kita dapat melakukannya dengan menggunakan perintah pip.

pip instal opencv-python

Kami juga akan menggunakan paket numpy dalam artikel ini, yang harus diinstal bersama OpenCV menggunakan perintah di atas.

Jika numpy tidak menginstal, Anda dapat melakukannya dengan mudah menggunakan perintah di bawah ini:

pip install numpy

Untuk mengonfirmasi bahwa OpenCV Anda terinstal, saat Anda mengaktifkan lingkungan interaktif Python, coba impor menggunakan:

impor cv2

Jika tidak mendapatkan kesalahan, maka Anda dapat melanjutkan.

Untuk melakukan pengenalan wajah, kami akan menulis tiga skrip. Satu untuk membuat kumpulan data gambar, yang lain untuk melatih gambar-gambar itu dan yang terakhir untuk mengenali wajah berdasarkan hasil pelatihan yang dilakukan komputer.

Kami akan membutuhkan Haar Cascade yang disediakan oleh Open CV. File ini bisa didapat dari direktori opencv yaitu cv2/data/haarcascade_frontalface_default.xml di mesin saya itu harus sama di mesin Anda juga. Salin file ke folder tempat Anda ingin melakukan pengenalan wajah.

Sekarang mari kita masuk ke hal-hal yang tebal.
Kami akan mencoba untuk mendapatkan web cam kami untuk mendapatkan gambar, yang diperlukan untuk dataset.

impor cv2
vid_cam = cv2.Tangkapan Video(0)
wajah_detektor = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
face_id = 1
hitung = 0
sementara(vid_cam.dibuka()):
ret, image_frame = vid_cam.Baca()
abu-abu = cv2.cvtColor(gambar_bingkai, cv2.WARNA_BGR2GRAY)
wajah = wajah_detektor.deteksiMultiScale(abu-abu, 1.3, 5)
untuk (x,y,w,h) di wajah:
cv2.persegi panjang(bingkai_gambar, (x,y), (x+w,y+h), (255,0,0), 2)
hitung += 1
cv2.imwrite("Dataset/Pengguna." + str(face_id) + '.' + str(hitung) + ".jpg", abu-abu[y:y+h,x:x+w])
cv2.imshow('bingkai', gambar_bingkai)
jika cv2.waitKey(100) & 0xFF == ord('q'):
istirahat
jumlah elif> 100:
istirahat
vid_cam.melepaskan()
cv2.hancurkan SemuaWindows()

Jadi untuk menjelaskan apa yang dilakukan setiap baris kode:

impor cv2

Berikut adalah perintah yang memberitahu python untuk menyertakan perpustakaan eksternal untuk digunakan dalam kode ini, dalam hal ini adalah Open CV.

vid_cam = cv2.Tangkapan Video(0)

Kode ini memanggil perpustakaan Open CV yang diimpor untuk mulai menangkap dan webcam dimulai pada saat ini. Jika Open CV tidak mendukung webcam Anda, kode akan gagal di sini.

wajah_detektor = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

Agar kami dapat melakukan deteksi gambar, kode ini diperlukan. Buka CV menggunakan 'haarcascade_frontalface_default.xml' untuk Klasifikasi Kaskade. Objek yang dihasilkan kemudian disimpan dalam variabel face_detector.

face_id = 1

Berikut adalah kasus pengaturan nomor id wajah, sehingga wajah pertama mendapat id 1.

hitung = 0

Kami akan mengambil beberapa gambar karena Open CV perlu melatih gambar untuk dapat mengenali wajah, variabel count berfungsi sebagai jumlah gambar.

sementara(vid_cam.dibuka()):

Ini memungkinkan operasi berikut untuk melanjutkan asalkan kamera video dibuka. Metode isOpened() mengembalikan True atau False.

ret, image_frame = vid_cam.Baca()

Di sini, vid_cam.read() melihat ke dalam video capture dan kemudian menangkap frame yang disimpan dalam variabel image_frame, jika operasi berhasil boolean True dikembalikan dan disimpan dalam variabel ret

abu-abu = cv2.cvtColor(gambar_bingkai, cv2.WARNA_BGR2GRAY)

Metode cvtColor() digunakan untuk mengubah bingkai gambar menjadi jenis warna yang diinginkan. Dalam hal ini kami telah mengubahnya menjadi skala abu-abu.

wajah = wajah_detektor.deteksiMultiScale(abu-abu, 1.3, 5)

Ini memeriksa bingkai dengan ukuran berbeda dan mencoba mengaturnya ke skala, ini diterapkan pada variabel tempat Haar Cascade diterapkan.

untuk (x,y,w,h) di wajah:

Di sini kita mengulang melalui wajah dan dimensinya, di mana x dan y mewakili koordinat dan w dan h masing-masing mewakili lebar dan tinggi.

cv2.persegi panjang(bingkai_gambar, (x,y), (x+w,y+h), (255,0,0), 2)

Ingatlah bahwa kami masih bekerja dengan kamera video, kamera video kemudian memotong bagian gambar yang diperlukan sesuai dengan dimensi di atas.

hitung += 1

Segera setelah itu selesai, variabel hitungan yang berdiri sebagai penghitung kemudian bertambah.

cv2.imwrite("Dataset/Pengguna." + str(face_id) + '.' + str(hitung) + ".jpg", abu-abu[y:y+h,x:x+w])

Gambar yang di-crop disimpan dengan nama User(face_id).(menghitung).jpg dan masukkan ke dalam folder bernama dataset.

cv2.imshow('bingkai', gambar_bingkai)

Setelah disimpan, kode ini memastikan gambar adalah bingkai video ditampilkan dengan persegi panjang di wajah individu setelah deteksi wajah dilakukan.

jika cv2.waitKey(100) & 0xFF == ord('q'):
istirahat

Setelah setiap gambar, pengguna diperbolehkan untuk menghentikan program dari mengambil lebih banyak gambar yang dapat dilakukan dengan menekan 'q' pada keyboard untuk minimal 100ms.

jumlah elif> 100:
istirahat

Apa yang dilakukan kode ini adalah menghentikan video agar tidak berfungsi saat 100 gambar telah diambil, terlepas dari apakah pengguna ingin mengambil lebih banyak atau tidak.

vid_cam.melepaskan()

Di sini, web cam ditutup dan tidak hanya berhenti mengambil gambar.

cv2.hancurkan SemuaWindows()

Kemudian semua jendela OpenCV yang telah dibuka telah dihancurkan dan kodenya berjalan ke kesimpulan.

Sekarang setelah kita selesai melakukannya, kita dapat melatih dataset gambar:

impor cv2, os
impor numpy sebagai np
dari Gambar impor PIL
pengenal = cv2.wajah.buatLBPHFaceRecognizer()
detektor = cv2.CascadeClassifier("haarcascade_frontalface_default.xml");
def getImagesAndLabels (jalur):
imagePaths = [os.jalan.join(path,f) untuk f di os.listdir(jalur)]
sampel wajah=[]
ID = []
untuk imagePath di imagePaths:
PIL_img = Gambar.buka (jalur gambar).konversi ('L')
img_numpy = np.array(PIL_img,'uint8')
id = int(os.jalan.split(jalur gambar)[-1].membagi(".")[1])
wajah = detektor.mendeteksiMultiScale(img_numpy)
untuk (x,y,w,h) di wajah:
sampel wajah.tambahkan(img_numpy[y:y+h,x:x+w])
id.tambahkan(id)
kembalikan sampel wajah, id
wajah,id = getImagesAndLabels('set data')
pengenal.kereta api (wajah, np.array(id))
pengenal.simpan('pelatih/pelatih.yml')

Mari kita lanjutkan dan jelaskan kode ini juga:

impor cv2, os

Sama seperti kode lainnya, di sini kita mengimpor OpenCV dan os yang kita perlukan untuk jalur file.

impor numpy sebagai np

Kami juga mengimpor perpustakaan numpy yang akan digunakan untuk perhitungan matriks (matriks hanyalah susunan array).

dari Gambar impor PIL

Kami mengimpor Perpustakaan Gambar Python dan kemudian darinya kami mendapatkan perpustakaan Gambar dari paket ini juga.

pengenal = cv2.wajah.buatLBPHFaceRecognizer()

Apa yang dilakukan adalah menerapkan metode createLBPHFaceRecognizer() ke cv2.objek wajah, ini akan membantu memudahkan pengenalan wajah karena kita tidak harus membuat set algoritme sendiri.

detektor = cv2.CascadeClassifier("haarcascade_frontalface_default.xml");

Jika Anda telah mengikuti tutorial, Anda akan menemukan ini sebelumnya. Ini membantu dengan deteksi wajah menggunakan "haarcascade_frontalface_default".xml” untuk Klasifikasi Kaskade.

def getImagesAndLabels (jalur):

Sekarang, kita akan memulai pelatihan gambar dengan benar, jadi kita membuat fungsi.

imagePaths = [os.jalan.join(path,f) untuk f di os.listdir(jalur)]

Kode ini memeriksa direktori file saat ini dan memeriksa file gambar kemudian menambahkannya ke daftar ini this.

sampel wajah=[]

Ini menginisialisasi daftar sampel, kosong pada saat ini tetapi wajah akan ditambahkan saat kode berjalan.

ID = []

Inisialisasi daftar id, yang awalnya kosong.

untuk imagePath di imagePaths:

Ingat kode yang memeriksa file gambar di direktori? Iya? Sekarang, kita akan mengulang setiap file tersebut dan melakukan operasi pada mereka.

PIL_img = Gambar.buka (jalur gambar).konversi ('L')

Sekarang hal pertama yang kita lakukan pada gambar adalah mengubahnya menjadi skala abu-abu, dan kode ini melakukannya.

img_numpy = np.array(PIL_img,'uint8')

Gambar skala abu-abu hanyalah serangkaian angka di satu tempat, jadi kami membuat array numpy dari mereka dan menetapkannya ke variabel.

id = int(os.jalan.split(jalur gambar)[-1].membagi(".")[1])

Jika Anda mengingat file yang mendapatkan gambar, Anda akan ingat bahwa kami menamai file tersebut Pengguna(face_id).menghitung.jpg. Jadi di sini kita membagi nama dengan “.” dan kemudian kami mengekstrak face_id dan menetapkan variabel di sini. Kami akan membutuhkan id untuk pengakuan.

wajah = detektor.mendeteksiMultiScale(img_numpy)

Dari array numpy, metode detectMultiScale() akan mencoba mendeteksi wajah dari pola yang ditemukannya dalam array numpy. Kemudian memberikan nilai dalam variabel wajah.

untuk (x,y,w,h) di wajah:

Di sini, kita mengulang nilai yang diberikan ke variabel. Nilai di sini adalah koordinat x dan y yang dapat kita ambil sebagai titik asal, dan kemudian w dan h masing-masing mewakili lebar dan tinggi.

sampel wajah.tambahkan(img_numpy[y:y+h,x:x+w])

Sebelumnya kami membuat daftar sampel wajah, tapi itu kosong. Di sini kita bisa menambahkan wajah ke daftar itu, dan kita menambahkan y ke h untuk mendapatkan dua nilai koordinat y dan hal yang sama dilakukan untuk x.

id.tambahkan(id)

Kami sekarang memiliki wajah di daftar sampel wajah, jadi kami mendapatkan id dan menambahkannya ke daftar id juga.

kembalikan sampel wajah, id

Kemudian setelah semuanya, kami mengembalikan daftar sampel wajah dan daftar id.

wajah,id = getImagesAndLabels('set data')

Ingat bahwa getImagesAndLabels() hanyalah sebuah fungsi. Jadi kita bisa memanggil fungsi di sini, dan nilai yang dikembalikan disimpan dalam variabel face dan id.

pengenal.kereta api (wajah, np.array(id))

Di sinilah pelatihan yang sebenarnya terjadi. Kami menerapkan metode createLBPHFaceRecognizer() beberapa waktu sebelumnya dan ditetapkan ke variabel pengenal. Saatnya latihan!

pengenal.simpan('pelatih/pelatih.yml')

Setelah pelatihan, kita bisa menyimpan hasil dari pelatihan.
Setelah menjalankan kode, itu membuat file bernama trainer.yml yang kemudian akan digunakan oleh kode pengenalan wajah.

Berikut adalah kode pengenalan wajah:

impor cv2
impor numpy sebagai np
pengenal = cv2.wajah.buatLBPHFaceRecognizer()
pengenal.beban('pelatih/pelatih.yml')
cascadePath = "haarcascade_frontalface_default.xml"
faceCascade = cv2.CascadeClassifier(Jalur Kaskade)
font = cv2.FONT_HERSHEY_SIMPLEX
kamera = cv2.Tangkapan Video(0)
sementara Benar:
ret, saya =cam.Baca()
abu-abu = cv2.cvtColor(im,cv2.WARNA_BGR2GRAY)
wajah = wajahCascade.deteksiMultiScale(abu-abu, 1.2,5)
untuk (x,y,w,h) di wajah:
cv2.persegi panjang(im, (x-20,y-20), (x+w+20,y+h+20), (0,255,0), 4)
Id = pengenal.prediksi(abu-abu[y:y+h,x:x+w])
jika (Id == 1):
Id = "Nazmi"
lain:
Id = "Tidak diketahui"
cv2.persegi panjang(im, (x-22,y-90), (x+w+22, y-22), (0,255,0), -1)
cv2.putText(im, str(Id), (x,y-40), font, 2, (255.255.255), 3)
cv2.imshow('aku',im)
jika cv2.waitKey(10) & 0xFF == ord('q'):
istirahat
kamera.melepaskan()
cv2.hancurkan SemuaWindows()

Jika Anda telah mengikuti artikel dari awal, kami telah melakukan ini sebelumnya. Jika Anda belum melakukannya dengan baik.

pengenal.beban('pelatih/pelatih.yml')

Ingat kami melatih pengenal dan menyimpan file? Iya? Kami sedang memuat file itu sekarang.

cascadePath = "haarcascade_frontalface_default.xml"

Kami akan bekerja dengan file haarcascade, dan di sini kami telah menetapkan nama file ke variabel.

# Buat pengklasifikasi dari model bawaan
faceCascade = cv2.CascadeClassifier(Jalur Kaskade)

Di sini kita dapat melakukan klasifikasi Cascade pada file haarcascade.

font = cv2.FONT_HERSHEY_SIMPLEX

Kami mengatur jenis font yang akan digunakan ketika kode mengenali wajah dalam gambar dan menampilkan nama.

kamera = cv2.Tangkapan Video(0)

Kami pernah ke sini sebelumnya, tapi kali ini saatnya untuk mengenali wajah-wajah itu. Jika Anda tidak tahu apa yang dilakukan kode ini, ia meluncurkan webcam.

sementara Benar:
ret, saya =cam.Baca()
abu-abu = cv2.cvtColor(im,cv2.WARNA_BGR2GRAY)
wajah = wajahCascade.deteksiMultiScale(abu-abu, 1.2,5)
untuk (x,y,w,h) di wajah:

Semua ini telah dilakukan sebelumnya, silakan periksa kode yang digunakan untuk menyimpan gambar jika Anda tidak tahu apa kodenya.

cv2.persegi panjang(im, (x-20,y-20), (x+w+20,y+h+20), (0,255,0), 4)

Jadi ini membantu webcam mendeteksi di mana wajah berada dan menempatkan persegi panjang untuk menunjukkan wajah.

Id = pengenal.prediksi(abu-abu[y:y+h,x:x+w])

Kami sudah memuat file kereta ke dalam pengenal, sehingga dapat mengenali wajah sekarang.

jika (Id == 1):
Id = "Saya sendiri"
lain:
Id = "Tidak diketahui"

Setelah mencoba mengenali wajah apa itu, ia memeriksa id dan melihat apakah itu ada. Di sini, nilai Id akan menjadi nama siapa pun yang dimiliki menghadapi id tersebut ketika dataset gambar sedang dibuat.

cv2.persegi panjang(im, (x-22,y-90), (x+w+22, y-22), (0,255,0), -1)
cv2.putText(im, str(Id), (x,y-40), font, 2, (255.255.255), 3)

Kode setelah menemukan pemilik Id, menggambar persegi panjang di sekitar wajah dan menempatkan nama pemilik wajah. Wajah dikenali!

cv2.imshow('aku',im)

Di sini, bingkai video ditampilkan dengan persegi panjang yang dibatasi.

jika cv2.waitKey(10) & 0xFF == ord('q'):
istirahat
kamera.melepaskan()
cv2.hancurkan SemuaWindows()

Jadi setelah selesai, Anda dapat menghentikan program dengan menekan tombol 'q', dan itu menghentikan webcam dan menutupnya.

Itu dia, webcam Anda sekarang dapat mengenali wajah dan Anda dapat menggunakannya kapan pun Anda mau. Selain menggunakan webcam, Anda juga dapat memuat gambar, namun itu memerlukan beberapa langkah lain selain yang diambil dalam artikel ini.

Anda dapat menemukan kode sumber yang digunakan pada repo githubnya. Juga tweet kami jika Anda memiliki komentar atau ingin mendiskusikan @linuxhint

Shadow of the Tomb Raider untuk Tutorial Linux
Shadow of the Tomb Raider adalah tambahan kedua belas untuk seri Tomb Raider - waralaba game aksi-petualangan yang dibuat oleh Eidos Montreal. Permain...
Cara Meningkatkan FPS di Linux?
FPS adalah singkatan dari Bingkai per detik. Tugas FPS adalah mengukur kecepatan bingkai dalam pemutaran video atau pertunjukan game. Dengan kata sede...
Game Lab Aplikasi Oculus Teratas
Jika Anda adalah pemilik headset Oculus maka Anda harus tahu tentang sideloading. Sideloading adalah proses menginstal konten non-toko di headset Anda...