terbuka

Pengecaman Muka OpenCV

Pengecaman Muka OpenCV

Pengecaman Wajah dengan OpenCV

Kerumitan mesin telah meningkat selama bertahun-tahun dan komputer tidak terkecuali. Komputer telah membantu manusia menyelesaikan banyak masalah dan menyelesaikan banyak tugas sukar. Sudah hari-hari ketika semua komputer melakukan operasi aritmetik sederhana, komputer kini menggerakkan dunia.

Komputer menjadi begitu kompleks, mereka dilatih untuk berfikir seperti manusia.
Ya!

Kami akan melakukan sesuatu yang bersifat semula jadi dalam artikel ini. Sebagai manusia, mengenali wajah orang lain adalah tugas yang mudah dan walaupun dengan kemampuan komputer pada masa kini, tidak semudah itu untuk komputer, jadi kita harus melatihnya agar dapat melakukan perkara yang sama.

Banyak artikel yang anda lihat di luar sana berhenti pada pengesanan wajah yang mudah, tetapi dalam artikel ini akan merangkumi bukan hanya pengesanan wajah tetapi juga pengenalan wajah.

Ini bermaksud jika komputer disertakan dengan dua gambar saya, ia bukan sahaja mengenali bahagian gambar apa yang ada di wajah saya, tetapi juga akan menyedari bahawa saya adalah salah satu gambar di kedua gambar saya juga.

Sebagai permulaan, kita mesti terlebih dahulu memasang opencv pada mesin kita, yang hanya boleh dilakukan sekiranya anda memasang Python. Pemasangan Python bukanlah objektif artikel ini, jadi jika anda belum memilikinya di mesin anda, anda boleh memasang Python dari Laman Web Python.

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

memasang pip opencv-python

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

Sekiranya numpy tidak dipasang, anda boleh melakukannya dengan mudah menggunakan arahan di bawah:

memasang pip numpy

Untuk mengesahkan bahawa OpenCV anda dipasang, semasa anda mengaktifkan persekitaran interaktif Python, cubalah mengimportnya menggunakan:

import cv2

Sekiranya tidak mendapat ralat, maka anda boleh meneruskannya.

Untuk melakukan pengecaman wajah, kami akan menulis tiga skrip. Satu untuk membuat set data gambar, yang lain untuk melatih gambar tersebut dan yang terakhir untuk mengenali wajah berdasarkan hasil latihan yang dilalui komputer.

Kami memerlukan Haar Cascade yang disediakan oleh Open CV. Fail ini dapat diperoleh dari direktori opencv yang cv2 / data / haarcascade_frontalface_default.xml pada mesin saya juga mesti sama pada mesin anda. Salin fail ke folder di mana anda ingin melakukan pengecaman wajah.

Sekarang mari kita masuk ke dalam perkara yang berat.
Kami akan berusaha mendapatkan kamera web kami untuk mendapatkan gambar-gambar yang diperlukan untuk set data.

import cv2
vid_cam = cv2.Rakaman Video (0)
face_detector = cv2.CascadeClassifier ('haarcascade_frontalface_default.xml ')
face_id = 1
kiraan = 0
semasa (vid_cam.Dibuka ()):
ret, image_frame = vid_cam.baca ()
kelabu = cv2.cvtColor (bingkai gambar), cv2.COLOR_BGR2GRAY)
wajah = pengecam muka.mengesanMultiScale (kelabu, 1.3, 5)
untuk (x, y, w, h) di muka:
cv2.segi empat tepat (bingkai_ gambar, (x, y), (x + w, y + h), (255,0,0), 2)
hitung + = 1
cv2.imwrite ("set data / Pengguna."+ str (face_id) + '.'+ str (kiraan) + ".jpg ", kelabu [y: y + h, x: x + w])
cv2.imshow ('bingkai', bingkai_ gambar)
sekiranya cv2.waitKey (100) & 0xFF == ord ('q'):
rehat
kiraan elif> 100:
rehat
vid_cam.pelepasan ()
cv2.hancurkanAllWindows ()

Oleh itu, untuk menerangkan apa yang dilakukan oleh setiap baris kod:

import cv2

Berikut adalah perintah yang memberitahu python untuk memasukkan perpustakaan luaran yang akan digunakan dalam kod ini, dalam hal ini adalah Open CV.

vid_cam = cv2.Rakaman Video (0)

Kod ini memanggil pustaka Open CV yang diimport untuk mula menangkap dan kamera web dimulakan pada saat ini. Sekiranya Open CV tidak menyokong kamera web anda, kodnya akan gagal di sini.

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

Agar kita dapat menjalankan pengesanan gambar, kod ini diperlukan. CV terbuka menggunakan 'haarcascade_frontalface_default.xml 'untuk Pengelasan Cascade. Objek yang dihasilkan kemudian disimpan dalam pemboleh ubah face_detector.

face_id = 1

Berikut adalah kes menetapkan nombor id wajah, jadi wajah pertama mendapat id 1.

kiraan = 0

Kami akan mengambil beberapa gambar kerana Open CV perlu melatih gambar agar dapat mengenali wajah, pembolehubah kiraan berfungsi sebagai kiraan gambar.

semasa (vid_cam.Dibuka ()):

Ini membolehkan operasi berikut diteruskan dengan syarat kamera video dibuka. Kaedah isOpened () mengembalikan Betul atau Salah.

ret, image_frame = vid_cam.baca ()

Di sini, vid_cam.baca () melihat tangkapan video dan kemudian menangkap bingkai yang disimpan dalam pemboleh ubah image_frame, jika operasi berhasil, Boolean True dikembalikan dan disimpan dalam variabel ret

kelabu = cv2.cvtColor (bingkai gambar), cv2.COLOR_BGR2GRAY)

Kaedah cvtColor () digunakan untuk menukar bingkai gambar menjadi jenis warna yang diinginkan. Dalam kes ini, kami telah mengubahnya menjadi skala kelabu.

wajah = pengecam muka.mengesanMultiScale (kelabu, 1.3, 5)

Ini memeriksa bingkai dengan ukuran yang berbeza dan mencuba menetapkannya mengikut skala, ini diterapkan pada pemboleh ubah tempat Haar Cascade digunakan.

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

Di sini kita melihat wajah dan dimensinya, di mana x dan y berdiri untuk koordinat dan w dan h masing-masing berdiri untuk lebar dan tinggi.

cv2.segi empat tepat (bingkai_ gambar, (x, y), (x + w, y + h), (255,0,0), 2)

Ingat bahawa kita masih bekerja dengan kamera video, kamera video kemudian memotong bahagian gambar yang diperlukan mengikut dimensi di atas.

hitung + = 1

Sejurus itu selesai, pemboleh ubah kiraan yang berdiri sebagai pembilang kemudian bertambah.

cv2.imwrite ("set data / Pengguna."+ str (face_id) + '.'+ str (kiraan) + ".jpg ", kelabu [y: y + h, x: x + w])

Gambar yang dipotong disimpan dengan nama Pengguna (face_id).(kiraan).jpg dan masukkan ke dalam folder bernama dataset.

cv2.imshow ('bingkai', bingkai_ gambar)

Setelah menyimpan, kod ini memastikan gambar adalah bingkai video ditampilkan dengan segi empat tepat di wajah individu setelah pengesanan wajah dilakukan.

sekiranya cv2.waitKey (100) & 0xFF == ord ('q'):
rehat

Selepas setiap gambar, pengguna dibenarkan menghentikan program daripada mengambil lebih banyak gambar yang boleh dilakukan dengan menekan 'q' pada papan kekunci sekurang-kurangnya 100ms.

kiraan elif> 100:
rehat

Apa yang dilakukan oleh kod ini adalah untuk menghentikan video daripada berfungsi sebaik sahaja 100 gambar diambil, tidak kira pengguna mahu mengambil lebih banyak atau tidak.

vid_cam.pelepasan ()

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

cv2.hancurkanAllWindows ()

Kemudian semua tingkap OpenCV yang telah dibuka telah dimusnahkan dan kodnya sampai kesimpulan.

Setelah kita selesai dengan itu, kita kemudian dapat melatih set data gambar:

import cv2, os
import numpy sebagai np
dari PIL import Imej
pengecam = cv2.muka.buatLBPHFaceRecognizer ()
pengesan = cv2.CascadeClassifier ("haarcascade_frontalface_default.xml ");
def getImagesAndLabels (jalan):
imagePaths = [os.jalan.bergabung (jalan, f) untuk f dalam os.listdir (jalan)]
wajahSampel = []
id = []
untuk imagePath dalam imagePaths:
PIL_img = Gambar.buka (imagePath).menukar ('L')
img_numpy = np.susunan (PIL_img, 'uint8')
id = int (os.jalan.perpecahan (imagePath) [- 1].berpecah (".") [1])
muka = ​​pengesan.detakMultiScale (img_numpy)
untuk (x, y, w, h) di muka:
wajahSampel.tambahkan (img_numpy [y: y + h, x: x + w])
id.tambahkan (id)
kembali wajahSampel, id
wajah, ids = getImagesAndLabels ('dataset')
pengecam.kereta api (muka, np.tatasusunan (id))
pengecam.simpan ('pelatih / pelatih.yml ')

Mari kita jelaskan kod ini juga:

import cv2, os

Sama seperti kod lain, di sini kita mengimport OpenCV dan os yang kita perlukan untuk laluan fail.

import numpy sebagai np

Kami juga mengimport perpustakaan numpy yang akan digunakan untuk pengiraan matriks (matriks hanyalah susunan array).

dari PIL import Imej

Kami mengimport Perpustakaan Imej Python dan dari situ kami juga memperoleh pustaka Imej dari pakej ini.

pengecam = cv2.muka.buatLBPHFaceRecognizer ()

Apa yang dilakukannya adalah menggunakan kaedah createLBPHFaceRecognizer () ke cv2.objek muka, ini akan memudahkan pengecaman wajah kerana kita tidak perlu membuat algoritma sendiri.

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

Sekiranya anda mengikuti tutorial, anda pasti pernah menemui perkara ini sebelumnya. Ia membantu pengesanan wajah menggunakan “haarcascade_frontalface_default.xml ”untuk Pengelasan Cascade.

def getImagesAndLabels (jalan):

Sekarang, kita akan memulakan latihan gambar dengan betul, jadi kita membuat fungsi.

imagePaths = [os.jalan.bergabung (jalan, f) untuk f di os.listdir (jalan)]

Kod ini memeriksa ke direktori semasa fail dan memeriksa fail gambar kemudian menambahkannya ke senarai ini.

wajahSampel = []

Ini menginisialisasi senarai sampel, kosong pada ketika ini tetapi wajah akan ditambahkan ketika kod berjalan.

id = []

Memulakan senarai id, yang pada mulanya kosong.

untuk imagePath dalam imagePaths:

Ingat kod yang memeriksa fail gambar di direktori? Ya? Sekarang, kita akan melihat setiap fail tersebut dan menjalankan operasi ke atasnya.

PIL_img = Gambar.buka (imagePath).menukar ('L')

Sekarang perkara pertama yang kita lakukan pada gambar adalah menukarnya ke skala kelabu, dan kod ini melakukannya.

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

Imej skala kelabu hanyalah rangkaian nombor di satu tempat, jadi kami membuat susunan numpy dari mereka dan memberikannya kepada pemboleh ubah.

id = int (os.jalan.perpecahan (imagePath) [- 1].berpecah (".") [1])

Sekiranya anda mengingati fail yang mendapat gambar, anda akan ingat bahawa kami menamakan fail Pengguna (face_id).mengira.jpg. Jadi di sini kita membahagikan nama dengan "."Dan kemudian kami mengekstrak face_id dan memberikan pemboleh ubah di sini. Kami memerlukan id untuk pengiktirafan.

muka = ​​pengesan.detakMultiScale (img_numpy)

Dari susunan numpy, kaedah deteksiMultiScale () akan cuba mengesan wajah dari corak yang dijumpainya dalam susunan numpy. Kemudian memberikan nilai dalam pemboleh ubah wajah.

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

Di sini, kita mencari nilai yang diberikan kepada pemboleh ubah. Nilai di sini adalah koordinat x dan y yang dapat kita ambil sebagai asal, dan kemudian w dan h masing-masing berdiri untuk lebar dan tinggi.

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

Sebelumnya kami membuat senarai sampel wajah, tetapi kosong. Di sini kita dapat menambahkan wajah ke dalam senarai itu, dan kita menambah y ke h untuk mendapatkan dua nilai koordinat y dan yang sama dilakukan untuk x.

id.tambahkan (id)

Kami kini mempunyai senarai contoh wajah, jadi kami mendapatkan idnya dan menambahkannya ke senarai id juga.

kembali wajahSampel, id

Kemudian setelah itu, kami mengembalikan senarai sampel wajah dan senarai id.

wajah, ids = getImagesAndLabels ('dataset')

Ingat bahawa getImagesAndLabels () hanyalah fungsi. Oleh itu, kita dapat memanggil fungsi di sini, dan nilai kembali disimpan dalam pembolehubah wajah dan id.

pengecam.kereta api (muka, np.tatasusunan (id))

Di sinilah latihan sebenar berlaku. Kami menggunakan kaedah createLBPHFaceRecognizer () beberapa waktu sebelumnya dan diberikan kepada pemboleh ubah pengecam. Ini masa latihan!

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

Selepas latihan, kita dapat menyelamatkan hasil dari latihan.
Setelah menjalankan kod, ia membuat fail yang disebut trainer.yml yang kemudian akan digunakan oleh kod pengenalan wajah.

Inilah kod pengecaman wajah:

import cv2
import numpy sebagai np
pengecam = cv2.muka.buatLBPHFaceRecognizer ()
pengecam.beban ('pelatih / pelatih.yml ')
cascadePath = "haarcascade_frontalface_default.xml "
faceCascade = cv2.CascadeClassifier (cascadePath)
fon = cv2.FONT_HERSHEY_SIMPLEX
cam = cv2.Rakaman Video (0)
Walaupun Betul:
ret, im = cam.baca ()
kelabu = cv2.cvtColor (im, cv2.COLOR_BGR2GRAY)
muka = ​​mukaCascade.mengesanMultiScale (kelabu, 1.2,5)
untuk (x, y, w, h) di muka:
cv2.segi empat tepat (im, (x-20, y-20), (x + w + 20, y + h + 20), (0,255,0), 4)
Id = pengecam.ramalkan (kelabu [y: y + h, x: x + w])
jika (Id == 1):
Id = "Nazmi"
lain:
Id = "Tidak diketahui"
cv2.segi empat tepat (im, (x-22, y-90), (x + w + 22, y-22), (0,255,0), -1)
cv2.putText (im, str (Id), (x, y-40), fon, 2, (255,255,255), 3)
cv2.imshow ('im', im)
sekiranya cv2.waitKey (10) & 0xFF == ord ('q'):
rehat
cam.pelepasan ()
cv2.hancurkanAllWindows ()

Sekiranya anda mengikuti artikel ini sejak awal, kami telah melakukannya sebelum ini. Sekiranya anda tidak melakukannya dengan baik.

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

Ingat, kami melatih pengecam dan menyimpan fail? Ya? Kami memuatkan fail itu sekarang.

cascadePath = "haarcascade_frontalface_default.xml "

Kami akan bekerjasama dengan fail haarcascade, dan di sini kami telah memberikan nama fail tersebut kepada pemboleh ubah.

# Buat pengkelasan dari model prebuilt
faceCascade = cv2.CascadeClassifier (cascadePath)

Di sini kita dapat menjalankan klasifikasi Cascade pada fail haarcascade.

fon = cv2.FONT_HERSHEY_SIMPLEX

Kami menetapkan jenis font yang akan digunakan ketika kod mengenali wajah dalam gambar dan menampilkan namanya.

cam = cv2.Rakaman Video (0)

Kami pernah ke sini sebelum ini, tetapi kali ini sudah tiba masanya untuk mengenali wajah. Sekiranya anda tidak tahu apa yang dilakukan oleh kod ini, ia melancarkan kamera web.

Walaupun Betul:
ret, im = cam.baca ()
kelabu = cv2.cvtColor (im, cv2.COLOR_BGR2GRAY)
wajah = mukaCascade.mengesanMultiScale (kelabu, 1.2,5)
untuk (x, y, w, h) di muka:

Semua ini telah dilakukan sebelumnya, sila periksa kod yang digunakan untuk menyimpan gambar sekiranya anda tidak tahu apa kod tersebut.

cv2.segi empat tepat (im, (x-20, y-20), (x + w + 20, y + h + 20), (0,255,0), 4)

Oleh itu, ini membantu kamera web mengesan wajah dan meletakkan segi empat tepat untuk menunjukkan wajah.

Id = pengecam.ramalkan (kelabu [y: y + h, x: x + w])

Kami telah memuatkan fail kereta api ke pengecam, sehingga dapat mengenali wajahnya sekarang.

jika (Id == 1):
Id = "Diriku"
lain:
Id = "Tidak diketahui"

Setelah berusaha mengenali wajahnya, ia memeriksa id dan melihat apakah ia wujud. Di sini, nilai Id akan menjadi nama siapa sahaja yang memiliki wajah seperti id ketika set data gambar sedang dibuat.

cv2.segi empat tepat (im, (x-22, y-90), (x + w + 22, y-22), (0,255,0), -1)
cv2.putText (im, str (Id), (x, y-40), fon, 2, (255,255,255), 3)

Kod setelah menemui pemilik Id, melukis sebuah segi empat tepat di seluruh wajah dan meletakkan nama pemilik wajah tersebut. Muka dikenali!

cv2.imshow ('im', im)

Di sini, bingkai video dipaparkan dengan segi empat tepat yang dibatasi.

sekiranya cv2.waitKey (10) & 0xFF == ord ('q'):
rehat
cam.pelepasan ()
cv2.hancurkanAllWindows ()

Oleh itu, anda boleh menghentikan program dengan menekan kekunci 'q' dan menghentikan kamera web dan menutupnya.

Di sana anda memilikinya, kamera web anda kini dapat mengenali wajah dan anda boleh menggunakannya bila-bila masa yang anda mahukan. Selain menggunakan kamera web, anda juga boleh memuatkan gambar, namun memerlukan beberapa langkah lain daripada yang diambil dalam artikel ini.

Anda boleh mendapatkan kod sumber yang digunakan di repo githubnya. Juga tweet kami jika anda mempunyai komen atau ingin membincangkan @linuxhint

WinMouse membolehkan anda menyesuaikan & meningkatkan pergerakan penunjuk tetikus pada PC Windows
Sekiranya anda ingin meningkatkan fungsi lalai penunjuk tetikus anda gunakan perisian percuma WinMouse. Ia menambah lebih banyak ciri untuk membantu a...
Butang klik kiri tetikus tidak berfungsi pada Windows 10
Sekiranya anda menggunakan tetikus khusus dengan komputer riba, atau komputer desktop anda tetapi butang klik kiri tetikus tidak berfungsi pada Window...
Kursor melompat atau bergerak secara rawak semasa menaip di Windows 10
Sekiranya anda mendapati kursor tetikus anda melompat atau bergerak sendiri, secara automatik, secara rawak semasa menaip komputer riba atau komputer ...