avamine

OpenCV näotuvastus

OpenCV näotuvastus

Näotuvastus OpenCV abil

Masinate keerukus on aastatega kasvanud ja arvutid pole erand. Arvutid on aidanud inimkonnal lahendada palju probleeme ja täita palju keerulisi ülesandeid. Möödas on ajad, mil kõik arvutid olid lihtsad aritmeetilised toimingud, arvutid juhivad nüüd maailma.

Arvutid on muutunud nii keerukaks, et neid õpetatakse mõtlema nagu inimesed.
Jah!

Selles artiklis teeme midagi sellist. Inimestena on teiste inimeste nägude äratundmine lihtne ülesanne ja hoolimata tänapäevaste arvutite võimekusest pole see arvuti jaoks nii lihtne, nii et me peame seda sama harjutama.

Paljud artiklid, mida näete seal, saavad peatuda lihtsal näotuvastusel, kuid see artikkel ei hõlma mitte ainult näotuvastust, vaid ka näotuvastust.

See tähendab, et kui arvutile esitatakse kaks minupilti, ei tunneks see mitte ainult seda, milline osa pildist on minu nägu, vaid ka seda, et ka mina olen mõlemal pildil.

Alustuseks peaksime kõigepealt oma masinatesse installima opencv, mida saab teha ainult siis, kui olete installinud Pythoni. Selle artikli eesmärk pole Pythoni installimine, nii et kui teil seda veel arvutis pole, saate Pythoni installida Pythoni veebisaidilt.

Open CV installimiseks saame seda teha käsu pip abil.

pip installida opencv-python

Samuti kasutame selles artiklis paketti numpy, mis tuleks installida koos OpenCV-ga ülaltoodud käsu abil.

Kui numpy ei installinud, saate seda hõlpsalt teha alltoodud käsu abil:

pip install numpy

Kui kinnitate, et teie OpenCV on installitud, proovige Pythoni interaktiivse keskkonna aktiveerimisel see importida, kasutades järgmist:

import CV2

Kui viga ei õnnestu, saate jätkata.

Näotuvastuse tegemiseks kirjutaksime kolm stsenaariumi. Üks piltide andmekogumi loomiseks, teine ​​nende piltide treenimiseks ja siis viimane nägu tuvastamiseks arvuti läbitud koolituse tulemuste põhjal.

Meil oleks vaja Open CV pakutavat Haari kaskaadi. Selle faili saab hankida kataloogist opencv, mis on cv2 / data / haarcascade_frontalface_default.xml minu masinas peaks see olema sama ka teie masinas. Kopeerige fail kausta, kuhu soovite näotuvastuse teha.

Nüüd võtame ette asjade pungi.
Andmekogumi jaoks vajalike piltide saamiseks proovime hankida oma veebikaamera.

import CV2
vid_cam = cv2.Video jäädvustamine (0)
näo_detektor = cv2.CascadeClassifier ('haarcascade_frontalface_default.xml ')
näo_id = 1
arv = 0
samas (vid_cam.isOpened ()):
ret, pildi_raam = vid_cam.loe ()
hall = cv2.cvtColor (pildi_raam, cv2.COLOR_BGR2GRAY)
näod = näo tuvastaja.detectMultiScale (hall, 1.3, 5)
(x, y, w, h) nägudes:
cv2.ristkülik (pildiraam, (x, y), (x + w, y + h), (255,0,0), 2)
loend + = 1
cv2.imwrite ("andmekogum / Kasutaja."+ str (näo_id) + '.'+ str (arv) + ".jpg ", hall [y: y + h, x: x + w])
cv2.imshow ('raam', pildiraam)
kui cv2.waitKey (100) & 0xFF == ord ('q'):
murda
elifide arv> 100:
murda
vid_cam.vabastama ()
cv2.destrAllWindows ()

Nii et selgitada, mida iga koodirida teeb:

import CV2

Siin on käsk, mis käsib pythonil lisada selles koodis kasutatava välise teegi, antud juhul on see Open CV.

vid_cam = cv2.Video jäädvustamine (0)

See kood kutsub imporditud avatud CV-teeki üles püüdma ja veebikaamera käivitatakse selles punktis. Kui avatud CV ei toeta teie veebikaamerat, nurjub kood siin.

näo_detektor = cv2.CascadeClassifier ('haarcascade_frontalface_default.xml ')

Selle pildi tuvastamise jaoks on vaja seda koodi. Avatud CV kasutab 'haarcascade_frontalface_default.xml 'kaskaadi klassifikatsiooni jaoks. Seejärel salvestatakse saadud objekt muutujasse face_detector.

näo_id = 1

Siin on näo ID numbri määramise juhtum, nii et esimese näo ID saab 1.

arv = 0

Teeme paar pilti, kuna Open CV peab nägude tuvastamiseks pilte koolitama. Loendur muutuja on piltide arv.

samas (vid_cam.isOpened ()):

See võimaldab järgmisi toiminguid jätkata, kui videokaamera on avatud. IsOpened () meetod tagastab tõese või vale.

ret, pildi_raam = vid_cam.loe ()

Siin vid_cam.read () vaatab videohõive ja hõivab seejärel kaadri, mis on salvestatud muutujasse image_frame, kui toiming õnnestub, tagastatakse tõeväärtus True, mis salvestatakse muutujale ret

hall = cv2.cvtColor (pildi_raam, cv2.COLOR_BGR2GRAY)

Pildiraami teisendamiseks soovitud värvitüübiks kasutatakse meetodit cvtColor (). Sel juhul oleme selle teisendanud halltooniks.

näod = näo tuvastaja.detectMultiScale (hall, 1.3, 5)

See kontrollib erineva suurusega raame ja proovib neid skaalal seada, seda rakendatakse muutujale, millele Haar Cascade rakendati.

(x, y, w, h) nägudes:

Siin läheme läbi tahkude ja nende mõõtmete, kus x ja y tähistavad koordinaate ning w ja h vastavalt laiust ja kõrgust.

cv2.ristkülik (pildiraam, (x, y), (x + w, y + h), (255,0,0), 2)

Pidage meeles, et me töötame endiselt videokaameraga, videokaamera kärpib seejärel pildi vajaduse vastavalt ülaltoodud mõõtmetele.

loend + = 1

Kohe, kui see on tehtud, siis loendurina seisev loendusmuutuja suureneb.

cv2.imwrite ("andmekogum / Kasutaja."+ str (näo_id) + '.'+ str (arv) + ".jpg ", hall [y: y + h, x: x + w])

Kärbitud pilt salvestatakse nimega User (face_id).(loenda).JPG ja pange kausta nimega andmekogum.

cv2.imshow ('raam', pildiraam)

Pärast salvestamist tagab see kood, et pärast näotuvastuse tegemist on pildi videokaader kuvatud ristkülikuga inimese näol.

kui cv2.waitKey (100) & 0xFF == ord ('q'):
murda

Pärast iga pilti lubatakse kasutajal peatada programmi pildistamine, mida saab teha, kui vajutate klaviatuuril 'q' vähemalt 100 ms.

elifide arv> 100:
murda

Selle koodi abil peatatakse video töötamine hetkel, kui 100 pilti on tehtud, olenemata sellest, kas kasutaja soovib teha rohkem või mitte.

vid_cam.vabastama ()

Siin on veebikaamera suletud ja mitte lihtsalt pildistamise peatatud.

cv2.destrAllWindows ()

Seejärel on kõik OpenCV avatud aknad hävitatud ja kood lõpeb.

Nüüd, kui oleme sellega valmis, saame seejärel pildi andmekogumit koolitada:

import cv2, os
impordi numpy kui np
PIL-i impordipildist
tuvastaja = cv2.nägu.createLBPHFaceRecognizer ()
detektor = cv2.CascadeClassifier ("haarcascade_frontalface_default.xml ");
def getImagesAndLabels (tee):
imagePaths = [os.tee.liitu (tee, f) f jaoks os.listdir (tee)]
faceSamples = []
id = []
imagePathi jaoks rakenduses imagePaths:
PIL_img = Pilt.avatud (imagePath).teisendada ('L')
img_numpy = np.massiiv (PIL_img, 'uint8')
id = int (os.tee.split (imagePath) [- 1].split (".") [1])
näod = detektor.detectMultiScale (img_numpy)
(x, y, w, h) nägudes:
näguProovid.lisa (img_numpy [y: y + h, x: x + w])
id.lisa (id)
tagastamise näguProovid, id
faces, ids = getImagesAndLabels ('andmekogum')
äratundja.rong (näod, np.massiiv (ids))
äratundja.salvesta ('treener / treener.yml ')

Läheme edasi ja selgitage ka seda koodi:

import cv2, os

Täpselt nagu teine ​​kood, impordime ka siin OpenCV-d ja operatsioonisüsteemi, mida meil oleks vaja failitee jaoks.

impordi numpy kui np

Samuti impordime numpy teeki, mida kasutatakse maatriksi arvutamiseks (maatriks on lihtsalt massiividest koosnev korraldus).

PIL-i impordipildist

Impordime Pythoni pilditeeki ja sealt saame ka sellest paketist pilditeegi.

tuvastaja = cv2.nägu.createLBPHFaceRecognizer ()

See on meetodi createLBPHFaceRecognizer () rakendamine cv2-le.näoobjekt, see aitaks muuta nägude tuvastamise lihtsaks, kuna me ei pea välja pakkuma oma algoritmide komplekti.

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

Kui olete juhendamist järginud, oleksite sellega varem kokku puutunud. See aitab näotuvastusel kasutada haarcascade_frontalface_default.xml ”kaskaadi klassifikatsiooni jaoks.

def getImagesAndLabels (tee):

Nüüd hakkame kohe tegelema pildikoolitusega, seega loome funktsiooni.

imagePaths = [os.tee.liitu (tee, f) f jaoks os.listdir (tee)]

See kood kontrollib faili praegust kataloogi ja kontrollib, kas pildifailid lisatakse need sellesse loendisse.

faceSamples = []

See lähtestab näidiste loendi, see on praegu tühi, kuid koodi käivitamisel lisatakse näod.

id = []

Initsialiseeri id-de loend, mis on esialgu tühi.

imagePathi jaoks imagePathsis:

Pidage meeles koodi, mis kontrollis kataloogis olevaid pildifaile? Jah? Nüüd tutvume kõigi nende failidega ja teeme nendega toiminguid.

PIL_img = Pilt.avatud (imagePath).teisendada ('L')

Esimene asi, mida me pildile teeme, on selle teisendamine halltooniks ja see kood teeb seda.

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

Halltooniline pilt on vaid arvude seeria ühes kohas, nii et loome neist numpy massiivi ja määrame selle muutujale.

id = int (os.tee.split (imagePath) [- 1].split (".") [1])

Kui meenutate faili, kuhu pildid saadetakse, peaksite meeles pidama, et panime failidele nimeks Kasutaja (face_id).loendama.jpg. Nii et siin jagame nimed tähega.”Ja seejärel eraldame näo_id ja määrame siin muutujale. Meil oleks vaja tunnustamiseks tunnust.

näod = detektor.detectMultiScale (img_numpy)

Numpy massiivist üritab meetod DetectMultiScale () tuvastada nägusid numpy massiivist leitud mustri järgi. Seejärel määrab see muutuja face väärtused.

(x, y, w, h) nägudes:

Siin vaatame muutujale omistatud väärtusi. Väärtused on siin x- ja y-koordinaadid, mille võiksime võtta alguspunktiks, ja seejärel w ja h vastavalt laiusele ja kõrgusele.

näguProovid.lisa (img_numpy [y: y + h, x: x + w])

Varem lõime näoproovide loendi, kuid see oli tühi. Siin saame lisada loendisse näod ja lisame y h-le, et saada y-koordinaatide kaks väärtust ja sama tehakse ka x-le.

id.lisa (id)

Näonäidiste loendis on nüüd nägu, nii et saame selle ID ja lisame selle ka ID-de loendisse.

tagastamise nägu: proovid, ID-d

Seejärel tagastame pärast kõike näonäidiste loendi ja ID-de loendi.

faces, ids = getImagesAndLabels ('andmekogum')

Pidage meeles, et getImagesAndLabels () on lihtsalt funktsioon. Niisiis saame siin kutsuda funktsiooni ja tagastusväärtused salvestatakse muutujate näod ja ids.

äratundja.rong (näod, np.massiiv (ids))

Siin toimub tõeline koolitus. Rakendasime meetodit createLBPHFaceRecognizer () millalgi varem ja määrati tuvastaja muutujale. On koolitusaeg!

äratundja.salvesta ('treener / treener.yml ')

Pärast treeningut saame salvestada koolituse tulemused.
Pärast koodi käivitamist loob see faili nimega treener.yml, mida siis näotuvastuskood kasutaks.

Siin on näotuvastuse kood:

import CV2
impordi numpy kui np
tuvastaja = cv2.nägu.createLBPHFaceRecognizer ()
äratundja.koormus ('treener / treener.yml ')
cascadePath = "haarcascade_frontalface_default.xml "
faceCascade = cv2.CascadeClassifier (cascadePath)
font = cv2.FONT_HERSHEY_SIMPLEX
nukk = cv2.Video jäädvustamine (0)
tõsi:
ret, im = nukk.loe ()
hall = cv2.cvtColor (im, cv2.COLOR_BGR2GRAY)
näod = faceCascade.detectMultiScale (hall, 1.2,5)
(x, y, w, h) nägudes:
cv2.ristkülik (im, (x-20, y-20), (x + w + 20, y + h + 20), (0,255,0), 4)
Id = äratundja.ennustama (hall [y: y + h, x: x + w])
kui (Id == 1):
Id = "Nazmi"
muu:
Id = "Tundmatu"
cv2.ristkülik (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 ('im', im)
kui cv2.waitKey (10) & 0xFF == ord ('q'):
murda
nukk.vabastama ()
cv2.destrAllWindows ()

Kui olete artiklit algusest peale jälginud, oleme seda ka varem teinud. Kui te pole seda lahkelt teinud.

äratundja.koormus ('treener / treener.yml ')

Pidage meeles, et koolitasime tuvastaja ja salvestasime faili? Jah? Laadime selle faili praegu.

cascadePath = "haarcascade_frontalface_default.xml "

Töötaksime haarcascade-failiga ja siin määrasime muutujale failinime.

# Loo klassifikaator eelnevalt ehitatud mudelist
faceCascade = cv2.CascadeClassifier (cascadePath)

Siit saame läbi viia kaskaadi klassifikatsiooni haarcascade failil.

font = cv2.FONT_HERSHEY_SIMPLEX

Määrasime fondi tüübi, mida kasutatakse siis, kui kood tuvastab pildil näo ja kuvab nime.

nukk = cv2.Video jäädvustamine (0)

Oleme siin varem olnud, kuid seekord on aeg näod ära tunda. Kui te ei tea, mida see kood teeb, käivitab see veebikaamera.

tõsi:
ret, im = nukk.loe ()
hall = cv2.cvtColor (im, cv2.COLOR_BGR2GRAY)
näod = faceCascade.detectMultiScale (hall, 1.2,5)
(x, y, w, h) nägudes:

Kõiki neid on varem tehtud, kontrollige piltide salvestamiseks kasutatud koodi, kui te ei tea, mida kood teeb.

cv2.ristkülik (im, (x-20, y-20), (x + w + 20, y + h + 20), (0,255,0), 4)

Nii aitab see veebikaameral nägusid tuvastada ja asetab näo tähistamiseks ristküliku.

Id = äratundja.ennustama (hall [y: y + h, x: x + w])

Alrerady laadisime rongifaili tuvastamisse, nii et see suudab nüüd näo ära tunda.

kui (Id == 1):
Id = "Mina ise"
muu:
Id = "Tundmatu"

Pärast seda, kui ta on püüdnud ära tunda, mis nägu see on, kontrollib ta ID-d ja vaatab, kas see on olemas. Siin oleks ID väärtus selle isiku nimi, kes oli pildi andmekogumi loomisel sellise ID-ga silmitsi.

cv2.ristkülik (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)

Pärast ID omaniku leidmist tõmbab kood näo ümber ristküliku ja asetab näo omaniku nime. Nägu ära tunda!

cv2.imshow ('im', im)

Siin kuvatakse videoraam piiratud ristkülikuga.

kui cv2.waitKey (10) & 0xFF == ord ('q'):
murda
nukk.vabastama ()
cv2.destrAllWindows ()

Nii et kui olete valmis, saate programmi peatada, vajutades klahvi 'q', see peatab veebikaamera ja sulgeb selle.

Seal see teil on, teie veebikaamera tunneb nüüd nägusid ära ja saate seda kasutada, kui soovite. Lisaks veebikaamera kasutamisele saate ka pildi laadida, kuid see nõuab mõningaid muid samme kui käesolevas artiklis.

Lähtekoodi leiate selle github repost. Piiksutage meid ka siis, kui teil on kommentaare või soovite arutada @linuxhint

Kursor hüppab või liigub juhuslikult Windows 10-s kirjutamise ajal
Kui leiate, et hiire kursor hüppab või liigub Windowsi sülearvutisse või arvutisse kirjutades automaatselt, juhuslikult, võivad mõned neist soovituste...
Kuidas muuta hiire ja puuteplaatide kerimise suund Windows 10-s ümber
Hiir ja PuuteplaatNeed muudavad arvutamise mitte ainult lihtsaks, vaid ka tõhusamaks ja vähem aeganõudvaks. Me ei kujuta ette elu ilma nende seadmetet...
Kuidas muuta hiirekursori ja kursori suurust, värvi ja skeemi Windows 10-s
Windows 10 hiirekursor ja kursor on operatsioonisüsteemi väga olulised aspektid. Seda võib öelda ka teiste opsüsteemide kohta, nii et tegelikult pole ...