opencv

Prepoznavanje lica OpenCV

Prepoznavanje lica OpenCV

Prepoznavanje lica s OpenCV-om

Složenost strojeva povećavala se tijekom godina, a računala nisu iznimka. Računala su pomogla čovječanstvu da riješi puno problema i izvrši puno teških zadataka. Prošla su vremena kada su sva računala radila jednostavne aritmetičke operacije, računala sada pokreću svijet.

Računala su postala toliko složena, da su obučena da razmišljaju poput ljudi.
Da!

Učinit ćemo nešto takve prirode u ovom članku. Kao ljudi, prepoznavanje lica drugih ljudi jednostavan je zadatak i unatoč sposobnostima današnjih računala računalu nije tako lako pa ga moramo osposobiti da bi moglo raditi isto.

Mnogo članaka koje biste tamo vidjeli zaustavit će se na jednostavnom otkrivanju lica, ali ovaj članak ne bi obuhvaćao samo prepoznavanje lica već i prepoznavanje lica.

To znači da ako se računalu predstave dvije moje slike, ono ne samo da prepoznaje koji je dio slike moje lice, već bi prepoznalo i da sam ja taj na obje slike.

Za početak bismo prvo morali instalirati opencv na naše strojeve, što se može učiniti samo ako imate instaliran Python. Instalacija Pythona nije cilj ovog članka, pa ako ga već nemate na svom stroju, možete instalirati Python s web stranice Python.

Da bismo instalirali Open CV, to možemo učiniti pomoću naredbe pip.

pip instalirati opencv-python

U ovom ćemo članku također koristiti paket numpy, koji bi trebao biti instaliran zajedno s OpenCV-om pomoću gornje naredbe.

Ako se numpy nije instalirao, to možete jednostavno učiniti pomoću naredbe u nastavku:

pip instalirati numpy

Da biste potvrdili da je vaš OpenCV instaliran, kada aktivirate Pythonovo interaktivno okruženje, pokušajte ga uvesti pomoću:

uvoz cv2

Ako ne dobijete pogrešku, možete nastaviti.

Da bismo izvršili prepoznavanje lica, napisali bismo tri scenarija. Jedan za stvaranje skupa podataka, drugi za treniranje tih slika, a posljednji za prepoznavanje lica na osnovu rezultata treninga kroz koji računalo prolazi.

Trebala bi nam Haar Cascade koju pruža Open CV. Ovu datoteku možete dobiti iz direktorija opencv koji je cv2 / data / haarcascade_frontalface_default.xml na mom stroju to bi trebalo biti isto i na vašem stroju. Kopirajte datoteku u mapu u kojoj želite prepoznati lice.

Ajmo sada u dubinu stvari.
Pokušali bismo dobiti našu web kameru kako bismo dobili slike potrebne za skup podataka.

uvoz cv2
vid_cam = cv2.VideoCapture (0)
detektor lica = cv2.CascadeClassifier ('haarcascade_frontalface_default.xml ')
lice_id = 1
brojanje = 0
dok (vid_cam.isOpened ()):
ret, image_frame = vid_cam.čitati()
siva = cv2.cvtColor (slikovni okvir, cv2.COLOR_BGR2GREY)
lica = lice_detektor.deteMultiScale (siva, 1.3, 5)
za (x, y, w, h) u licima:
cv2.pravokutnik (okvir_ slike, (x, y), (x + w, y + h), (255,0,0), 2)
broji + = 1
cv2.imwrite ("skup podataka / korisnik."+ str (face_id) + '.'+ str (brojanje) + ".jpg ", siva [y: y + h, x: x + w])
cv2.imshow ('okvir', okvir_ slike)
ako je cv2.waitKey (100) & 0xFF == ord ('q'):
pauza
elif count> 100:
pauza
vid_cam.otpustiti ()
cv2.uništitiAllWindows ()

Pa da objasnimo što čini svaki redak koda:

uvoz cv2

Evo naredbe koja Pythonu govori da uključi vanjsku knjižnicu koja će se koristiti u ovom kodu, u ovom slučaju to je Open CV.

vid_cam = cv2.VideoCapture (0)

Ovaj kod poziva uvoznu biblioteku Open CV da započne s hvatanjem i web kamera je pokrenuta u ovom trenutku. Ako Open CV ne podržava vašu web kameru, kod ovdje neće uspjeti.

detektor lica = cv2.CascadeClassifier ('haarcascade_frontalface_default.xml ')

Da bismo mogli provesti detekciju slike, potreban nam je ovaj kôd. Otvoreni životopis koristi 'haarcascade_frontalface_default.xml 'za kaskadnu klasifikaciju. Dobiveni objekt se zatim sprema u varijablu face_detector.

lice_id = 1

Evo slučaja postavljanja ID broja lica, tako da prvo lice dobiva ID 1.

brojanje = 0

Snimit ćemo nekoliko slika jer Open CV treba da trenira slike da bi mogli prepoznati lica, varijabla count služi kao broj slika.

dok (vid_cam.isOpened ()):

To omogućuje nastavak sljedećih operacija pod uvjetom da se otvori video kamera. Metoda isOpened () vraća True ili False.

ret, image_frame = vid_cam.čitati()

Evo, vid_cam.read () pregledava video snimanje, a zatim snima okvir koji je pohranjen u varijablu image_frame, ako je operacija uspješna, vraća se logička vrijednost True i pohranjuje se u varijablu ret

siva = cv2.cvtColor (slikovni okvir, cv2.COLOR_BGR2GREY)

Metoda cvtColor () koristi se za pretvaranje okvira slike u željeni tip boje. U ovom smo ga slučaju pretvorili u sive tonove.

lica = lice_detektor.detectMultiScale (siva, 1.3, 5)

Ovim se provjeravaju okviri različitih veličina i pokušava se prilagoditi skali, to se primjenjuje na varijablu na koju je primijenjena Haar Cascade.

za (x, y, w, h) u licima:

Ovdje prolazimo kroz lica i njegove dimenzije, gdje x i y predstavljaju koordinate, a w i h širinu i visinu.

cv2.pravokutnik (okvir_ slike, (x, y), (x + w, y + h), (255,0,0), 2)

Imajte na umu da još uvijek radimo s video kamerom, a video kamera zatim izrezuje potrebni dio slike prema gornjim dimenzijama.

broji + = 1

Odmah se to učini, varijabla count koja stoji kao brojač zatim se povećava.

cv2.imwrite ("skup podataka / korisnik."+ str (face_id) + '.'+ str (brojanje) + ".jpg ", siva [y: y + h, x: x + w])

Izrezana slika sprema se s imenom Korisnik (face_id).(računati).jpg i stavite u mapu koja se naziva skup podataka.

cv2.imshow ('okvir', okvir_ slike)

Nakon spremanja, ovaj kod osigurava da se slika video okvira prikazuje pravokutnikom na licu pojedinca nakon što je izvršena detekcija lica.

ako je cv2.waitKey (100) & 0xFF == ord ('q'):
pauza

Nakon svake slike, korisnik može zaustaviti program da snima više slika, što se može učiniti pritiskom na 'q' na tipkovnici najmanje 100 ms.

elif count> 100:
pauza

Ovaj kôd zaustavlja rad videozapisa u trenutku kad je snimljeno 100 slika, bez obzira želi li korisnik napraviti više ili ne.

vid_cam.otpustiti ()

Ovdje je web kamera zatvorena i nije samo zaustavljena u fotografiranju.

cv2.uništitiAllWindows ()

Tada su uništeni svi prozori OpenCV-a i kôd se završava.

Sad kad smo završili s tim, možemo trenirati skup podataka:

uvoz cv2, os
uvoz numpy kao np
s PIL import Image
prepoznavač = cv2.lice.createLBPHFaceRecognizer ()
detektor = cv2.CascadeClassifier ("haarcascade_frontalface_default.xml ");
def getImagesAndLabels (put):
imagePaths = [os.staza.join (put, f) za f u os.listdir (put)]
faceSamples = []
ID-ovi = []
za imagePath u imagePaths:
PIL_img = Slika.otvori (imagePath).pretvoriti ('L')
img_numpy = np.niz (PIL_img, 'uint8')
id = int (os.staza.split (imagePath) [- 1].podjela(".") [1])
lica = detektor.identifyMultiScale (img_numpy)
za (x, y, w, h) u licima:
liceUzorci.dodati (img_numpy [y: y + h, x: x + w])
id.dodati (id)
return faceSamples, ids
lica, ids = getImagesAndLabels ('skup podataka')
prepoznavač.vlak (lica, np.niz (id))
prepoznavač.save ('trener / trener.yml ')

Idemo naprijed i objasniti i ovaj kod:

uvoz cv2, os

Baš kao i drugi kod, ovdje uvozimo OpenCV i os koji bi nam trebali za put do datoteke.

uvoz numpy kao np

Također uvozimo numpy biblioteku koja bi se koristila za izračunavanje matrice (matrica je samo raspored nizova).

s PIL import Image

Uvozimo Python biblioteku slika, a zatim iz nje dobivamo biblioteku slika i iz ovog paketa.

prepoznavač = cv2.lice.createLBPHFaceRecognizer ()

Ovo se primjenjuje na metodu createLBPHFaceRecognizer () na cv2.lice objekt, ovo bi pomoglo da se prepoznavanje lica učini jednostavnim jer ne moramo osmisliti vlastiti skup algoritama.

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

Ako ste slijedili tutorial, na ovo biste već naišli. Pomaže u prepoznavanju lica pomoću funkcije "haarcascade_frontalface_default".xml ”za kaskadnu klasifikaciju.

def getImagesAndLabels (put):

Sad ćemo započeti pravilan trening slika, pa kreiramo funkciju.

imagePaths = [os.staza.join (put, f) za f u os.listdir (put)]

Ovaj kod provjerava trenutni direktorij datoteke i provjerava slikovne datoteke, a zatim ih dodaje na ovaj popis.

faceSamples = []

Ovim se inicijalizira popis uzoraka, u ovom je trenutku prazan, ali lica će se dodavati kako se kôd izvodi.

ID-ovi = []

Inicijalizirajte popis ID-ova koji je u početku prazan.

za imagePath u imagePaths:

Sjetite se koda koji je provjeravao slikovne datoteke u direktoriju? Da? Sada ćemo petlju proći kroz svaku od tih datoteka i izvršiti radnje na njima.

PIL_img = Slika.otvori (imagePath).pretvoriti ('L')

Sada prvo što napravimo na slici je da je pretvorimo u sive tonove, a ovaj kôd to čini.

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

Slika u sivim skalama samo je niz brojeva na jednom mjestu, pa od njih stvaramo numpyni niz i dodjeljujemo ga varijabli.

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

Ako se prisjetite datoteke koja dobiva slike, prisjetili biste se da smo datotekama dali ime Korisnik (face_id).računati.jpg. Dakle, ovdje dijelimo imena s ".”, A zatim izdvajamo face_id i ovdje dodjeljujemo varijabli. Trebao bi nam ID za prepoznavanje.

lica = detektor.identifyMultiScale (img_numpy)

Iz polja numpy, metoda identifyMultiScale () pokušat će otkriti lica iz uzorka koji pronađe u polju numpy. Zatim dodjeljuje vrijednosti u varijabli lica.

za (x, y, w, h) u licima:

Ovdje prolazimo kroz vrijednosti dodijeljene varijabli. Ovdje su vrijednosti koordinate x i y koje bismo mogli uzeti kao ishodište, a zatim w i h, odnosno širina i visina.

liceUzorci.dodati (img_numpy [y: y + h, x: x + w])

Ranije smo stvorili popis uzoraka lica, ali bio je prazan. Ovdje dodajemo lica na taj popis, a y dodajemo h da bismo dobili dvije vrijednosti y koordinata i isto se radi na x.

id.dodati (id)

Sada imamo lice na popisu uzoraka lica, pa dobivamo njegov ID i dodajemo ga i na popis ID-ova.

return faceSamples, ids

Zatim nakon svega vraćamo popis uzoraka lica i popis ID-ova.

lica, ids = getImagesAndLabels ('skup podataka')

Zapamtite da je getImagesAndLabels () samo funkcija. Dakle, ovdje moramo pozvati funkciju, a povratne vrijednosti spremaju se u varijable lica i ids.

prepoznavač.vlak (lica, np.niz (id))

Ovdje se događa pravi trening. Primijenili smo metodu createLBPHFaceRecognizer () nešto ranije i dodijelili varijabli prepoznavača. Vrijeme je za trening!

prepoznavač.save ('trener / trener.yml ')

Nakon treninga moramo sačuvati rezultate treninga.
Nakon pokretanja koda stvara datoteku koja se naziva trener.yml koji bi tada koristio kod za prepoznavanje lica.

Evo koda za prepoznavanje lica:

uvoz cv2
uvoz numpy kao np
prepoznavač = cv2.lice.createLBPHFaceRecognizer ()
prepoznavač.load ('trener / trener.yml ')
cascadePath = "haarcascade_frontalface_default.xml "
faceCascade = cv2.Klasifikator Cascade (cascadePath)
font = cv2.FONT_HERSHEY_SIMPLEX
cam = cv2.VideoCapture (0)
dok je Istina:
ret, im = cam.čitati()
siva = cv2.cvtColor (im, cv2.COLOR_BGR2GREY)
lica = faceCascade.deteMultiScale (siva, 1.2,5)
za (x, y, w, h) u licima:
cv2.pravokutnik (im, (x-20, y-20), (x + w + 20, y + h + 20), (0,255,0), 4)
Id = prepoznavač.predvidjeti (sivo [y: y + h, x: x + w])
if (Id == 1):
Id = "Nazmi"
drugo:
Id = "Nepoznato"
cv2.pravokutnik (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)
ako je cv2.waitKey (10) & 0xFF == ord ('q'):
pauza
cam.otpustiti ()
cv2.uništitiAllWindows ()

Ako članak pratite od početka, to smo već radili. Ako to niste učinili ljubazno.

prepoznavač.load ('trener / trener.yml ')

Sjetite se da smo obučili prepoznavač i spremili datoteku? Da? Učitavamo tu datoteku.

cascadePath = "haarcascade_frontalface_default.xml "

Radili bismo s datotekom haarcascade i ovdje smo dodijelili naziv datoteke varijabli.

# Stvorite klasifikator iz unaprijed izgrađenog modela
faceCascade = cv2.CascadeClassifier (cascadePath)

Ovdje ćemo izvršiti klasifikaciju Cascade na haarcascade datoteci.

font = cv2.FONT_HERSHEY_SIMPLEX

Postavljamo vrstu fonta koja će se koristiti kada kod prepoznaje lice na slici i prikazuje ime.

cam = cv2.VideoCapture (0)

Bili smo ovdje i ranije, ali ovaj put je vrijeme da prepoznamo lica. Ako ne znate što ovaj kôd radi, on pokreće web kameru.

dok je Istina:
ret, im = cam.čitati()
siva = cv2.cvtColor (im, cv2.COLOR_BGR2GREY)
lica = faceCascade.deteMultiScale (siva, 1.2,5)
za (x, y, w, h) u licima:

Sve je to već učinjeno, ljubazno provjerite kod koji je korišten za spremanje slika ako ne znate što kôd radi.

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

Dakle, ovo pomaže web kameri da otkrije gdje su lica i postavi pravokutnik koji označava lice.

Id = prepoznavač.predvidjeti (sivo [y: y + h, x: x + w])

Već smo učitali datoteku vlaka u prepoznavač, tako da je sada u stanju prepoznati lice.

if (Id == 1):
Id = "Sebe"
drugo:
Id = "Nepoznato"

Nakon pokušaja prepoznavanja o kojem se licu radi, provjerava identitet i provjerava postoji li. Ovdje bi vrijednost Id bilo ime onoga tko je bio u vlasništvu suočen s takvim ID-om prilikom stvaranja skupa slika.

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

Kôd nakon pronalaska vlasnika identiteta crta pravokutnik oko lica i stavlja ime vlasnika lica. Lice prepoznato!

cv2.imshow ('im', im)

Ovdje se video okvir prikazuje s ograničenim pravokutnikom.

ako je cv2.waitKey (10) & 0xFF == ord ('q'):
pauza
cam.otpustiti ()
cv2.uništitiAllWindows ()

Dakle, po završetku možete zaustaviti program pritiskom na tipku 'q', a web-kamera zaustavlja i zatvara.

Eto, vaša web kamera sada može prepoznati lica i možete je koristiti kad god želite. Osim korištenja web kamere, možete učitati i sliku, no za to su potrebni neki drugi koraci osim onih poduzetih u ovom članku.

Izvorni kôd možete pronaći na njegovom github repo-u. Tweetajte nas i ako imate komentare ili želite razgovarati o @linuxhint

Vodič za bitku za Wesnoth
Bitka za Wesnoth jedna je od najpopularnijih strateških igara otvorenog koda koje trenutno možete igrati. Ne samo da se ova igra razvija već jako dugo...
0 A.D. Vodič
Od mnogih strateških igara tamo, 0 A.D. uspijeva se istaknuti kao sveobuhvatan naslov i vrlo duboka, taktička igra unatoč tome što je otvoren izvor. R...
Vodič za Unity3D
Uvod u Unity 3D Unity 3D moćan je motor za razvoj igara. Cross platforma je to što vam omogućuje stvaranje igara za mobilne uređaje, web, stolne račun...