Implementacija prepoznavanja lica pomoću Pythona i OpenCV-a

izvor: https://www.ariadnext.com/facial-recognition-new-era-for-online-identification/

Računalni vid ovih je dana bijes zajednice strojnog učenja i dubokog učenja. A jedna od najpopularnijih aplikacija ove domene je prepoznavanje lica.

To ćemo naučiti u ovom detaljnom članku. Prije nego što počnemo s tim, pogledajmo dva slučaja stvarnog korištenja:

1. Sigurnost automobila
Proizvođači automobila širom svijeta poput Mercedesa, Tesle, BMW-a itd. Sve se više fokusiraju na to da automobile učine osobnijim i sigurnijim za vozača. U njihovom pokušaju da naprave pametnije značajke automobila, proizvođači imaju smisla koristiti AI / ML kako bi im pomogli da bolje razumiju ljudske emocije. Korištenje pametnih automobila za otkrivanje lica može upozoriti vozača kad se osjeća pospano ili letargično.

Američko Ministarstvo transporta izvijestilo je da pogreške u vožnji uzrokuju oko 95% prometnih nesreća sa smrtnim ishodom. Prepoznavanje lica može otkriti suptilne promjene na mikro izrazima lica koji prethodi pospanosti i vozaču poslati personalizirane upozorenja tražeći da zaustavi automobil i krene na pauzu za kavu, promijeni glazbu ili temperaturu itd.

2. Detekcija izrazitih emocija u intervjuima
Na interakciju kandidata i anketara utječe previše kategorija prosudbi i neka vrsta pogrešnog tumačenja. Takva vrsta prosudbe teško je utvrditi je li kandidat stvarno sposoban za posao. Prepoznavanje onoga što kandidat pokušava prenijeti nije od ruke anketara zbog višestrukih slojeva jezične interpretacije, kognitivnih pristranosti i konteksta koji se nalaze između. Tu dolazi AI koji može mjeriti izraze lica kandidata kako bi se uhvatio raspoloženje i procijenio njihove osobnosti.

Moral zaposlenika također se može primijetiti pomoću ove tehnologije držanjem i bilježenjem interakcija na poslu. Kao alat za upravljanje ljudskim resursima može pomoći ne samo u osmišljavanju strategije zapošljavanja, već i u osmišljavanju HR politika koje postižu najbolji učinak zaposlenika.

Pošto smo vidjeli kako tehnologija otkrivanja lica može učinkovito pomoći u donošenju boljih odluka, dozvolimo nam da dublje iskopamo i razumemo što je točno prepoznavanje lica i kako možemo stvoriti jednostavan model koji može prepoznati naše lice.

Što je prepoznavanje lica?

Prepoznavanje lica sposobnost je računalne tehnologije da identificira lica ljudi unutar digitalnih slika. Aplikacije za otkrivanje lica koriste algoritme usredotočene na otkrivanje ljudskih lica unutar većih slika koje mogu sadržavati krajolike, predmete itd.

Da bi radili, aplikacije za otkrivanje lica koriste algoritme strojnog učenja za otkrivanje ljudskih lica unutar slika bilo koje veličine. Veće slike mogu sadržavati brojne predmete koji nisu okrenuti, poput pejzaža, predmeta, životinja, zgrada i drugih dijelova ljudi (npr. Noge, ramena i ruke).

Tehnologija otkrivanja / prepoznavanja lica ranije se povezivala samo sa sigurnosnim sektorom, ali danas se aktivno širi u druge industrije, uključujući maloprodaju, marketing, zdravstvo itd.

Kako funkcionira prepoznavanje lica?

Iako je postupak pomalo složen, algoritmi otkrivanja lica često počinju traženjem ljudskih očiju. Oči čine ono što je poznato kao područje doline i jedno je od najlakših obilježja za otkrivanje. Nakon otkrivanja očiju algoritam bi mogao pokušati otkriti regije lica, uključujući obrve, usta, nos, nosnice i šarenicu. Nakon što algoritam zaključi da je otkrio područje lica, tada može primijeniti dodatne testove kako bi potvrdio da li je u stvari otkrio lice. - https://www.facefirst.com/blog/face-detection-vs-face-recognition/

OpenCV

izvor: https://medium.com/@gsari/digit-recognition-with-opencv-and-python-cbf962f7e2d0

OpenCV (Open Source Computer Vision Library), knjižnica za obradu slika i videozapisa s vezama u C ++, C, Python i Java. OpenCV se koristi za sve vrste slike i video analize, poput prepoznavanja i otkrivanja lica, čitanja registarskih tablica, uređivanja fotografija, naprednog robotskog vida, optičkog prepoznavanja znakova i puno više.

OpenCV ima tri ugrađena prepoznavača lica, a zahvaljujući čistom kodiranju, bilo koji od njih možete koristiti samo promjenom jednog retka koda. Evo imena tih prepoznavača lica i njihovih poziva OpenCV:

EigenFaces - cv2.face.createEigenFaceRecognizer ()
FisherFaces - cv2.face.createFisherFaceRecognizer ()
Histogrami lokalnog binarnog uzorka (LBPH) - cv2.face.createLBPHFaceRecognizer ()

Kako pronaći lica pomoću OpenCV-a?

Postoje dva osnovna načina za pronalaženje lica pomoću OpenCV-a:

Haar klasifikator
LBP kaskadni klasifikator

Većina programera koristi Haar jer je precizniji, ali je i puno sporiji od LBP-a. Idem također s Haarovim klasifikatorom za ovaj vodič. OpenCV paket zapravo sadrži sve podatke potrebne za učinkovitu upotrebu Haara. U osnovi, samo vam treba XML datoteka s podacima o desnoj strani. Možete i izraditi vlastiti ako ste znali što radite ili jednostavno možete koristiti ono što dolazi s OpenCV-om. Da biste saznali više o Haar klasifikatoru i LBP kaskadnom klasifikatoru, kliknite ovo i ovo.

Sada ćemo napisati jednostavan program python koji će uzeti uzorke slika kao ulaza i pokušati otkriti lica i oči pomoću OpenCV. Možete preuzeti XAR datoteku Haar Classifier za otkrivanje lica i otkrivanje očiju odavde i ovdje i zadržati XML datoteke u vašem radnom imeniku.

ovisnosti:

pip instalacija glupa
pip instalirati matplotlib
pip instalirati opencv-python

Ulazne slike:

Izvorni kod:

uvoz cv2
uvesti numpy kao np
iz matplotlib uvoz pyplot kao plt
uvoz glob
txtfiles = []
za datoteku u glob.glob ("*. jpg"):
    txtfiles.append (datoteka)
    
za ix u txtfilesu:
    img = cv2.imread (ix, cv2.IMREAD_COLOR)
    imgtest1 = img.copy ()
    imgtest = cv2.cvtColor (imgtest1, cv2.COLOR_BGR2GRAY)
    facecascade = cv2.CascadeClassifier ('D: \\ KJ \\ Nagesh \\ Downloads \\ face_recognition \\ haarcascade_frontalface_default.xml')
    eye_cascade = cv2.CascadeClassifier ('D: \\ KJ \\ Nagesh \\ Downloads \\ face_recognition \\ haarcascade_eye.xml')
   
    face = facecascade.detectMultiScale (imgtest, scaleFactor = 1,2, minNeighbors = 5)
 
    ispis ("Ukupan broj pronađenih lica", len (lica))
    
    za (x, y, w, h) u licima:
        face_detect = cv2.rectangle (imgtest, (x, y), (x + w, y + h), (255, 0, 255), 2)
        roi_gray = imgtest [y: y + h, x: x + w]
        roi_color = imgtest [y: y + h, x: x + w] plt.imshow (face_detect)
        eyes = eye_cascade.detectMultiScale (roi_gray)
        za (ex, ey, ew, eh) u očima:
            eye_detect = cv2.rectangle (roi_color, (ex, ey), (ex + ew, ey + eh), (255,0255), 2)
            plt.imshow (eye_detect)

A sada, shvatimo ovaj jednostavan program:

Korak 1: Uvoz numpy, matplotlib, open-cv i glob

uvesti numpy kao np
iz matplotlib uvoz pyplot kao plt
uvoz cv2
uvoz glob

Korak 2: Korištenje globalne petlje kroz svaku .jpg datoteku prisutnu u vašoj trenutnoj radnoj mapi i spremite ih na popis "txtfiles". Da biste znali kako čitati datoteke pomoću globusa, kliknite ovdje.

txtfiles = []
za datoteku u glob.glob ("*. jpg"):
    txtfiles.append (datoteka)

Korak 3: Pročitajte svaku .jpg datoteku pomoću cv2.imread (). Funkcija cv2.imread () zahtijeva dva argumenta: prvi je put do same slike, a drugi određuje način na koji bi slika trebala biti očitana. Kao drugi argument možemo upotrijebiti bilo koji od sljedeća tri.

cv2.IMREAD_COLOR - koristi se za učitavanje slike u boji. Zanemaruje transparentnost slike i zadana je zastava. To je za 8-bitne slike koje nemaju alfa kanal.
cv2.IMREAD_GRAYSCALE - odgovoran za učitavanje naših slika u sivim tonovima.
cv2.IMREAD_UNCHANGED - Učitava sliku pomoću alfa kanala (RGBA).

Kad učitate sliku pomoću OpenCV-a, ona je zadano postavlja u prostor boja BGR.

Nakon toga napravite kopiju slike koja je proslijeđena, tako da proslijeđena slika nije promijenjena.

img = cv2.imread (ix, cv2.IMREAD_COLOR)
    imgtest1 = img.copy ()

Korak 4: Pretvorite sliku u sivu sliku jer OpenCV detektor lica očekuje sive slike.

imgtest = cv2.cvtColor (imgtest1, cv2.COLOR_BGR2GRAY)

Korak 5: Sada moramo učitati naše Haar-ove klasifikatore (preuzete XML datoteke) za otkrivanje lica i prepoznavanje očiju, koji uzimaju kao ulaznu datoteku Haar-ovog klasifikatora.

facecascade = cv2.CascadeClassifier ('D: \\ KJ \\ Nagesh \\ Downloads \\ face_recognition \\ haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier ('D: \\ KJ \\ Nagesh \\ Downloads \\ face_recognition \\ haarcascade_eye.xml')

6. korak: Kako sada pomoću CascadeClassifier-a možemo otkriti lice sa slike?

Pa, opet, OpenCV-ov CascadedClassifier olakšao nam je postupak zbog detectMultiScale (), koji otkriva upravo ono što trebate.

detectMultiScale (slika, skaliFactor, minNeighbors)

Ispod su argumenti koji bi trebali proći u otkrivanjuMultiScale ().

Ovo je opća funkcija za otkrivanje objekata, u ovom slučaju će detektirati lica otkad smo pozvali u kaskadu lica. Ako nađe lice, vraća popis položaja navedenog lica u obliku "Rect (x, y, w, h).", Ako ne, tada vraća "None".

  • Slika: Prvi ulaz je slika sive boje.
  • scaleFactor: Ova funkcija kompenzira pogrešnu percepciju u veličini koja se javlja kada se čini da je jedno lice veće od drugog, jednostavno zato što je bliže fotoaparatu.
  • minNeighbors: Algoritam za otkrivanje koji koristi pokretni prozor za otkrivanje objekata, to određuje koliko se objekata nalazi u blizini trenutnog prije nego što može proglasiti pronađeno lice.
face = facecascade.detectMultiScale (imgtest, scaleFactor = 1,2, minNeighbors = 5)

Korak 7: Sada ispisujte broj lica sa svake slike:

ispis ("Ukupan broj pronađenih lica", len (lica))

Korak 8: Pregledajte popis lica i nacrtajte pravokutnike na slikama. Ovdje u osnovi nalazimo lica, razbijamo lica, njihove veličine i crtamo pravokutnike

za (x, y, w, h) u licima:
face_detect = cv2.rectangle (imgtest, (x, y), (x + w, y + h), (255, 0, 255), 2)
roi_gray = imgtest [y: y + h, x: x + w]
roi_color = imgtest [y: y + h, x: x + w]
plt.imshow (face_detect)

Korak 9: Zatim ćemo izvršiti otkrivanje oka, a zanimljiv dio je da vjerojatno ne bismo pronašli očnu jabučicu za otkrivanje oka. Većina algoritama za otkrivanje očiju koriste i okolnu kožu, kapke, trepavice i obrve da bi se otkrilo.

eyes = eye_cascade.detectMultiScale (roi_gray)
za (ex, ey, ew, eh) u očima:
eye_detect = cv2.rectangle (roi_color, (ex, ey), (ex + ew, ey + eh), (255,0255), 2)
plt.imshow (eye_detect)

Konačno naš rezultat:

Izlazna datoteka: friends.PNGIzlazna datoteka: Leonardo.PNGIzlazna datoteka: Nagesh.PNGIzlazna datoteka: Rahul.PNGIzlazna datoteka: Amar.PNGIzlazna datoteka: Sachin.PNGIzlazna datoteka: Vishak.PNGIzlazna datoteka: Shahrukh.PNGIzlazna datoteka: Dog.PNGIzlazna datoteka: download1.PNG

Super !!! Zar ne?

Ovdje možete primijetiti da na posljednja dva izlaza koja su nam otkrivena ne postoji nijedna detekcija lica, što očito zato što te dvije slike nemaju lice koje bi se moglo prepoznati. Jedno je slika psa, a drugo plava ruža.

Zaključak:

Tako možemo vidjeti da smo sa samo nekoliko redaka koda započeli s prepoznavanjem lica. Odavde možemo ići naprijed i stvoriti model prepoznavanja lica koristeći openCV koji će predvidjeti ime i druge informacije povezane s tom određenom osobom. Ovaj je blog namijenjen početnicima koji žele izgraditi nešto super koristeći ovaj nevjerojatan programski jezik Python.

Postoje mnogi Haar-ovi klasifikatori za otkrivanje raznih dijelova ljudskog tijela. Pogledajte ovdje.

Pa, to je sve na ovom blogu. Hvala na čitanju :)

sretno učenje !!!

Možete me kontaktirati u LinkedInu.