opencv

Prepoznavanje obrazov OpenCV

Prepoznavanje obrazov OpenCV

Prepoznavanje obrazov z OpenCV

Kompleksnost strojev se je z leti povečala in računalniki niso nobena izjema. Računalniki so človeštvu pomagali rešiti veliko težav in opraviti veliko težkih nalog. Časi, ko so vsi računalniki delali preproste računske operacije, so že minili, računalniki zdaj poganjajo svet.

Računalniki so postali tako zapleteni, da so usposobljeni za razmišljanje kot ljudje.
Da!

V tem članku bomo storili nekaj takega. Kot ljudje smo prepoznavanje obrazov drugih ljudi preprosta naloga in kljub sposobnostim današnjih računalnikov računalniku ni tako lahko, zato ga moramo usposobiti, da bo lahko delal enako.

Veliko člankov, ki bi jih videli tam, se ustavi pri preprostem zaznavanju obrazov, v tem članku pa ne bi zajemali samo zaznavanja obrazov, temveč tudi prepoznavanje obrazov.

To pomeni, da če ima računalnik dve moji sliki, ne bi le prepoznal, kateri del slike je moj obraz, temveč bi ugotovil tudi, da sem jaz tisti na obeh slikah.

Za začetek bi morali najprej namestiti opencv na naše računalnike, kar lahko storite le, če imate nameščen Python. Namestitev Pythona ni cilj tega članka, zato, če ga še nimate na svojem računalniku, lahko namestite Python s spletnega mesta Python.

Če želite namestiti Open CV, lahko to storimo z ukazom pip.

pip namestite opencv-python

V tem članku bomo uporabili tudi paket numpy, ki bi ga morali namestiti skupaj z OpenCV z zgornjim ukazom.

Če se numpy ni namestil, lahko to preprosto storite s spodnjim ukazom:

pip namestite numpy

Če želite potrditi, da je vaš OpenCV nameščen, ga med aktiviranjem interaktivnega okolja Python poskusite uvoziti z uporabo:

uvoz cv2

Če se napaka ne prikaže, lahko nadaljujete.

Za izvedbo prepoznavanja obraza bi napisali tri scenarije. Ena za ustvarjanje nabora podatkov, druga za usposabljanje teh slik in nato zadnja, ki prepozna obraze na podlagi rezultatov treninga, skozi katerega gre računalnik.

Potrebovali bi kaskado Haar, ki jo ponuja Open CV. To datoteko lahko dobite iz imenika opencv, ki je cv2 / data / haarcascade_frontalface_default.xml na mojem računalniku bi moralo biti enako tudi na vašem računalniku. Kopirajte datoteko v mapo, v kateri želite prepoznati obraz.

Zdaj pa pojdimo v debelino stvari.
Poskusili bi pridobiti našo spletno kamero, da bi dobili slike, potrebne za nabor podatkov.

uvoz cv2
vid_cam = cv2.VideoCapture (0)
detektor_obraza = cv2.CascadeClassifier ('haarcascade_frontalface_default.xml ')
obraz_id = 1
štetje = 0
medtem ko (vid_cam.isOpened ()):
ret, image_frame = vid_cam.preberi ()
siva = cv2.cvtColor (image_frame, cv2.COLOR_BGR2GREY)
obrazi = obraz_detektor.zaznaMultiScale (siva, 1.3, 5)
za (x, y, w, h) v obrazih:
cv2.pravokotnik (slikovni_okvir, (x, y), (x + w, y + h), (255,0,0), 2)
štetje + = 1
cv2.imwrite ("nabor podatkov / uporabnik."+ str (obraz_id) + '.'+ str (štetje) + ".jpg ", siva [y: y + h, x: x + w])
cv2.imshow ('frame', image_frame)
če je cv2.waitKey (100) & 0xFF == ord ('q'):
odmor
število elifov> 100:
odmor
vid_cam.sprosti ()
cv2.uniči vse Windows ()

Torej, da razložimo, kaj počne vsaka vrstica kode:

uvoz cv2

Tu je ukaz, ki pythonu pove, naj vključi zunanjo knjižnico, ki se bo uporabljala v tej kodi, v tem primeru je Open CV.

vid_cam = cv2.VideoCapture (0)

Ta koda poziva uvoženo knjižnico Open CV, da začne zajemati in spletna kamera se zažene na tej točki. Če Open CV ne podpira vaše spletne kamere, koda tukaj ne bo uspela.

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

Za izvedbo zaznavanja slik je potrebna ta koda. Odprti življenjepis uporablja 'haarcascade_frontalface_default.xml 'za kaskadno klasifikacijo. Nastali objekt se nato shrani v spremenljivko face_detector.

obraz_id = 1

Tu je primer nastavitve identifikacijske številke obraza, tako da prvi obraz dobi ID 1.

štetje = 0

Posneli bomo nekaj slik, saj mora Open CV trenirati slike, da bodo lahko prepoznale obraze, spremenljivka count služi kot število slik.

medtem ko (vid_cam.isOpened ()):

To omogoča nadaljevanje naslednjih postopkov, če je video kamera odprta. Metoda isOpened () vrne True ali False.

ret, image_frame = vid_cam.preberi ()

Tukaj je vid_cam.read () pogleda v video zajem in nato zajame okvir, ki je shranjen v spremenljivki image_frame, če je operacija uspešna, se vrne logična vrednost True in shrani v spremenljivko ret

siva = cv2.cvtColor (image_frame, cv2.COLOR_BGR2GREY)

Metoda cvtColor () se uporablja za pretvorbo okvirja slike v želeno barvno vrsto. V tem primeru smo ga pretvorili v sivine.

obrazi = obraz_detektor.zaznaMultiScale (siva, 1.3, 5)

Ta preveri okvirje različnih velikosti in jih poskuša prilagoditi na velikost, to velja za spremenljivko, na katero je bila uporabljena Haar Cascade.

za (x, y, w, h) v obrazih:

Tu se zapeljemo skozi ploskve in njegove dimenzije, kjer x in y pomenita koordinate, w in h pa širino in višino.

cv2.pravokotnik (slikovni_okvir, (x, y), (x + w, y + h), (255,0,0), 2)

Ne pozabite, da še vedno delamo z video kamero, nato pa kamera obreže potrebni del slike v skladu z zgornjimi dimenzijami.

štetje + = 1

Takoj, ko končamo, se spremenljivka štetja, ki je števec, nato poveča.

cv2.imwrite ("nabor podatkov / uporabnik."+ str (obraz_id) + '.'+ str (štetje) + ".jpg ", siva [y: y + h, x: x + w])

Obrezana slika se shrani z imenom Uporabnik (face_id).(štetje).jpg in ga shranite v mapo z imenom nabor podatkov.

cv2.imshow ('frame', image_frame)

Po shranitvi ta koda zagotavlja, da je slika videoposnetka, ko je zaznavanje obraza končano, na obrazu posameznika prikazan s pravokotnikom.

če je cv2.waitKey (100) & 0xFF == ord ('q'):
odmor

Po vsaki sliki lahko uporabnik ustavi program, da ne bi posnel več slik, kar je mogoče storiti s pritiskom na q na tipkovnici vsaj 100 ms.

število elifov> 100:
odmor

Ta koda preprečuje, da bi video deloval takoj, ko je bilo posnetih 100 slik, ne glede na to, ali uporabnik želi posneti več ali ne.

vid_cam.sprosti ()

Tu je spletna kamera zaprta in ne samo zaustavljena pri fotografiranju.

cv2.uniči vse Windows ()

Nato so bila vsa okna OpenCV odprta uničena in koda se zaključi.

Zdaj, ko smo s tem končali, lahko nato usposobimo nabor podatkovnih slik:

uvoz cv2, os
uvozi numpy kot np
iz PIL import Image
prepoznavalec = cv2.obraz.createLBPHFaceRecognizer ()
detektor = cv2.CascadeClassifier ("haarcascade_frontalface_default.xml ");
def getImagesAndLabels (pot):
imagePaths = [os.pot.join (pot, f) za f v os.listdir (pot)]
faceSamples = []
ids = []
za imagePath v imagePaths:
PIL_img = Slika.odpri (imagePath).pretvori ('L')
img_numpy = np.matrika (PIL_img, 'uint8')
id = int (os.pot.split (imagePath) [- 1].razdeli (".") [1])
obrazi = detektor.zaznajMultiScale (img_numpy)
za (x, y, w, h) v obrazih:
obrazVzorci.dodaj (img_numpy [y: y + h, x: x + w])
id.dodaj (id)
return faceVzorci, id
obrazi, ids = getImagesAndLabels ('nabor podatkov')
prepoznavalnik.vlak (obrazi, np.matrika (id))
prepoznavalnik.save ('trener / trener.yml ')

Pojdimo naprej in razložimo tudi to kodo:

uvoz cv2, os

Tako kot druga koda tudi tu uvozimo OpenCV in os, ki bi jih potrebovali za pot do datoteke.

uvozi numpy kot np

Uvažamo tudi knjižnico numpy, ki bi jo uporabili za izračun matrike (matrika je le razporeditev nizov).

iz PIL import Image

Uvažamo knjižnico slik Python, nato pa iz nje tudi knjižnico slik iz tega paketa.

prepoznavalec = cv2.obraz.createLBPHFaceRecognizer ()

To naredi uporabo metode createLBPHFaceRecognizer () za cv2.obraz, bi to pomagalo olajšati prepoznavanje obrazov, saj nam ni treba ustvariti lastnih algoritmov.

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

Če bi sledili vadnici, bi to že naleteli. Pomaga pri zaznavanju obrazov z uporabo »haarcascade_frontalface_default«.xml "za kaskadno klasifikacijo.

def getImagesAndLabels (pot):

Zdaj bomo začeli pravilno trenirati podobo, zato ustvarimo funkcijo.

imagePaths = [os.pot.join (pot, f) za f v os.listdir (pot)]

Ta koda preveri trenutni imenik datoteke in poišče slikovne datoteke, nato pa jih doda na ta seznam.

faceSamples = []

S tem se inicializira seznam vzorcev, v tem trenutku je prazen, obrazi pa bi bili dodani med izvajanjem kode.

ids = []

Inicializirajte seznam id, ki je sprva prazen.

za imagePath v imagePaths:

Zapomnite si kodo, ki je preverila slikovne datoteke v imeniku? Da? Zdaj bomo pregledali vsako od teh datotek in izvajali operacije na njih.

PIL_img = Slika.odpri (imagePath).pretvori ('L')

Zdaj je prva stvar, ki jo naredimo s sliko, pretvoriti v sivino in ta koda to stori.

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

Slika v sivini je le niz številk na enem mestu, zato iz njih ustvarimo numpy matriko in jo dodelimo spremenljivki.

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

Če se spomnite datoteke, ki dobi slike, se spomnite, da smo datoteke poimenovali uporabnik (face_id).štetje.jpg. Tukaj torej imena delimo z "."In nato izvlečemo face_id in tukaj dodelimo spremenljivki. Za prepoznavanje bi potrebovali osebni dokument.

obrazi = detektor.zaznajMultiScale (img_numpy)

Iz polja numpy bo metoda identifyMultiScale () poskušala zaznati obraze iz vzorca, ki ga najde v polju numpy. Nato dodeli vrednosti spremenljivki obrazov.

za (x, y, w, h) v obrazih:

Tu pregledujemo vrednosti, dodeljene spremenljivki. Tu sta vrednosti koordinati x in y, ki bi ju lahko vzeli kot izhodišče, nato pa w in h pomeni širino oziroma višino.

obrazVzorci.dodaj (img_numpy [y: y + h, x: x + w])

Prej smo ustvarili seznam vzorcev obrazov, vendar je bil prazen. Tu lahko na ta seznam dodamo obraze, y pa dodamo y, da dobimo dve vrednosti koordinat y in enako naredimo z x.

id.dodaj (id)

Zdaj imamo obraz na seznamu vzorcev obrazov, zato dobimo njegov ID in ga dodamo tudi na seznam id.

return faceVzorci, id

Potem vrnemo seznam vzorcev obrazov in seznam id.

obrazi, ids = getImagesAndLabels ('nabor podatkov')

Ne pozabite, da je getImagesAndLabels () le funkcija. Tako lahko funkcijo pokličemo tukaj, vrnjene vrednosti pa se shranijo v spremenljivke obrazov in ID-jev.

prepoznavalnik.vlak (obrazi, np.matrika (id))

Tu se zgodi pravi trening. Nekdaj prej smo uporabili metodo createLBPHFaceRecognizer () in jo dodelili prepoznavni spremenljivki. Čas je za trening!

prepoznavalnik.save ('trener / trener.yml ')

Po treningu bomo rezultate vadbe shranili.
Po zagonu kode ustvari datoteko z imenom trener.yml, ki bi ga nato uporabila koda za prepoznavanje obrazov.

Tu je koda za prepoznavanje obrazov:

uvoz cv2
uvozi numpy kot np
prepoznavalec = cv2.obraz.createLBPHFaceRecognizer ()
prepoznavalnik.obremenitev ('trener / trener.yml ')
cascadePath = "haarcascade_frontalface_default.xml "
faceCascade = cv2.CascadeClassifier (cascadePath)
pisava = cv2.FONT_HERSHEY_SIMPLEX
cam = cv2.VideoCapture (0)
medtem ko je True:
ret, im = cam.preberi ()
siva = cv2.cvtColor (im, cv2.COLOR_BGR2GREY)
obrazi = faceCascade.zaznaMultiScale (siva, 1.2,5)
za (x, y, w, h) v obrazih:
cv2.pravokotnik (im, (x-20, y-20), (x + w + 20, y + h + 20), (0,255,0), 4)
Id = prepoznalec.napovedi (siva [y: y + h, x: x + w])
če (Id == 1):
Id = "Nazmi"
sicer:
Id = "Neznano"
cv2.pravokotnik (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)
če je cv2.waitKey (10) & 0xFF == ord ('q'):
odmor
kamera.sprosti ()
cv2.uniči vse Windows ()

Če ste članek spremljali od začetka, smo to storili že prej. Če še niste prijazno.

prepoznavalnik.obremenitev ('trener / trener.yml ')

Ne pozabite, da smo usposobili prepoznavnik in shranili datoteko? Da? Zdaj nalagamo to datoteko.

cascadePath = "haarcascade_frontalface_default.xml "

Delali bi z datoteko haarcascade in tukaj smo spremenljivki dodelili ime datoteke.

# Ustvari klasifikator iz vnaprej izdelanega modela
faceCascade = cv2.CascadeClassifier (cascadePath)

Tukaj bomo izvedli klasifikacijo Cascade na datoteki haarcascade.

pisava = cv2.FONT_HERSHEY_SIMPLEX

Nastavili smo vrsto pisave, ki naj se uporablja, ko koda prepozna obraz na sliki in prikaže ime.

cam = cv2.VideoCapture (0)

Tu smo že bili, tokrat pa je čas, da prepoznamo obraze. Če ne veste, kaj počne ta koda, zažene spletno kamero.

medtem ko je True:
ret, im = cam.preberi ()
siva = cv2.cvtColor (im, cv2.COLOR_BGR2GREY)
obrazi = faceCascade.zaznaMultiScale (siva, 1.2,5)
za (x, y, w, h) v obrazih:

Vse to smo že storili, prosimo, preverite kodo, ki je bila uporabljena za shranjevanje slik, če ne veste, kaj koda počne.

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

Tako spletna kamera pomaga zaznati, kje so obrazi, in postavi pravokotnik, ki označuje obraz.

Id = prepoznalec.napovedi (siva [y: y + h, x: x + w])

Datoteko vlaka smo že naložili v prepoznavnik, tako da lahko zdaj prepozna obraz.

če (Id == 1):
Id = "Sebe"
sicer:
Id = "Neznano"

Ko poskuša prepoznati, za kakšen obraz gre, preveri identiteto in ugotovi, ali obstaja. Tu bi bila vrednost Id ime tistega, ki je bil v lasti, ki se je soočil s takšnim ID-jem, ko je bil ustvarjen nabor slikovnih podatkov.

cv2.pravokotnik (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)

Koda po iskanju lastnika identitete nariše pravokotnik okoli obraza in postavi ime lastnika obraza. Obraz prepoznan!

cv2.imshow ('im', im)

Tu je video okvir prikazan z omejenim pravokotnikom.

če je cv2.waitKey (10) & 0xFF == ord ('q'):
odmor
kamera.sprosti ()
cv2.uniči vse Windows ()

Ko končate, lahko program ustavite s pritiskom na tipko 'q', ta pa zaustavi spletno kamero in jo zapre.

Tukaj je, vaša spletna kamera lahko zdaj prepozna obraze in jo lahko uporabite kadar koli želite. Poleg uporabe spletne kamere lahko naložite tudi sliko, vendar to zahteva nekatere druge korake, razen tistih, opisanih v tem članku.

Izvorno kodo najdete v njenem github repo. Pišite nam tudi, če imate komentarje ali želite razpravljati o @linuxhint

Kako prikazati prekrivanje zaslonskega menija v celozaslonskih aplikacijah in igrah za Linux
Igranje celozaslonskih iger ali uporaba aplikacij v celozaslonskem načinu brez motenj vam lahko odreže ustrezne sistemske informacije, ki so vidne na ...
Top 5 kartic za zajemanje iger
Vsi smo v YouTubu videli in oboževali pretakanje iger. PewDiePie, Jakesepticye in Markiplier so le nekateri izmed najboljših igralcev, ki so zaslužili...
Kako razviti igro na Linuxu
Pred desetletjem le malo uporabnikov Linuxa napoveduje, da bo njihov najljubši operacijski sistem nekoč priljubljena igralna platforma za komercialne ...