Kasvontunnistuksen toteuttaminen Pythonilla ja OpenCV: llä

lähde: https://www.ariadnext.com/facial-recognition-new-era-for-online-identification/

Tietokonenäkö on raivoa koneoppimis- ja syväoppimisyhteisössä nykyään. Ja yksi tämän alueen suosituimmista sovelluksista on kasvojentunnistus.

Tätä me opimme rakentamaan tässä yksityiskohtaisessa artikkelissa. Mutta ennen kuin aloitamme sen kanssa, katsotaanpa kahta todellisen käytön tapausta:

1. Autoista turvallisempaa
Autonvalmistajat ympäri maailmaa, kuten Mercedes, Tesla, BMW jne., Keskittyvät yhä enemmän autojen tekemiseen henkilökohtaisemmiksi ja kuljettajille turvallisemmiksi. Yrittäessään rakentaa älykkäämpiä autoominaisuuksia on valmistajille järkevää käyttää AI / ML: ää auttamaan heitä ymmärtämään paremmin ihmisten tunteita. Kasvontunnistuksen avulla älyautot voivat hälyttää kuljettajaa, kun hän on unelias tai unelias.

Yhdysvaltain liikenneministeriö ilmoitti, että ajoon liittyvät virheet aiheuttavat noin 95% kuolemaan johtaneista liikenneonnettomuuksista. Kasvojen tunneiden havaitseminen voi löytää hienostuneita muutoksia kasvojen mikrosekspressioissa, jotka edeltävät uneliaisuutta, ja lähettää henkilökohtaisia ​​hälytyksiä kuljettajalle pyytäen häntä pysäyttämään auto ja menemään kahvitaukoon, vaihtamaan musiikkia tai lämpötilaa jne.

2. Kasvojen tunneiden havaitseminen haastatteluissa
Ehdokashaastattelijan vuorovaikutukseen vaikuttaa liian monta luokkatyyppiä ja jonkinlainen väärinkäsitys. Tällainen arviointi vaikeuttaa sen määrittämistä, soveltuuko ehdokas todella työhön. Sen selvittäminen, mitä ehdokas yrittää kertoa, on haastattelijan käsissä, koska kielitulkinta, kognitiiviset puolueellisuudet ja konteksti sijaitsevat välillä. Sieltä tulee AI, joka voi mitata ehdokkaan ilmeitä mielenosoitustensa ottamiseksi ja heidän persoonallisuusominaisuuksiensa arvioimiseksi edelleen.

Työntekijöiden moraali voidaan myös havaita käyttämällä tätä tekniikkaa pitämällä ja tallentamalla vuorovaikutusta työssä. HR-työkaluna se voi auttaa paitsi suunnittelemaan rekrytointistrategioita, myös suunnittelemalla HR-politiikkoja, jotka tuottavat parhaan mahdollisen tuloksen työntekijöiltä.

Kuten olemme huomanneet, kuinka kasvojentunnistustekniikka voi tehokkaasti auttaa tekemään parempia päätöksiä, kaivokaamme syvemmälle ja ymmärrämme, mikä tarkalleen on kasvontunnistus ja miten voimme luoda yksinkertaisen mallin, joka pystyy tunnistamaan kasvomme.

Mikä on kasvojentunnistus?

Kasvontunnistus on tietotekniikan kyky tunnistaa ihmisten kasvot digitaalikuvissa. Kasvontunnistussovelluksissa käytetään algoritmeja, jotka keskittyvät havaitsemaan ihmisten kasvot suurempien kuvien sisällä, jotka voivat sisältää maisemaa, esineitä jne.

Toimiakseen kasvontunnistussovellukset käyttävät koneoppimisalgoritmeja havaitsemaan ihmisen kasvot kaiken kokoisissa kuvissa. Suuremmat kuvat voivat sisältää lukuisia esineitä, jotka eivät ole päin päin, kuten maisemat, esineet, eläimet, rakennukset ja muut ihmisen osat (esim. Jalat, hartiat ja käsivarret).

Kasvojentunnistustekniikka oli aiemmin liitetty vain turvallisuusalaan, mutta nykyään sitä laajennetaan aktiivisesti muihin toimialoihin, mukaan lukien vähittäiskauppa, markkinointi, terveydenhuolto jne.

Kuinka kasvojentunnistus toimii?

Vaikka prosessi on melko monimutkainen, kasvojentunnistusalgoritmit alkavat usein etsimällä ihmisen silmiä. Silmät muodostavat niin sanotun laaksoalueen ja ovat yksi helpoimmista ominaisuuksista havaita. Kun silmät on havaittu, algoritmi voi sitten yrittää havaita kasvoalueet mukaan lukien kulmakarvat, suu, nenä, sieraimet ja iiris. Kun algoritmi on havainnut, että se on havainnut kasvoalueen, se voi sitten käyttää lisätestejä varmistaakseen, onko se todella havainnut kasvot. - https://www.facefirst.com/blog/face-detection-vs-face-recognition/

OpenCV

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

OpenCV (Open Source Computer Vision Library), joka on kuvan ja videon prosessointikirjasto, jonka sidokset ovat C ++, C, Python ja Java. OpenCV: tä käytetään kaikenlaisissa kuvien ja videoiden analysoinnissa, kuten kasvojentunnistuksessa ja havainnoinnissa, rekisterikilven lukemisessa, valokuvien muokkaamisessa, edistyneessä robottivisiossa, optisessa merkkitunnistuksessa ja paljon muussa.

OpenCV: ssä on kolme sisäänrakennettua kasvotunnistinta ja puhtaan koodauksen ansiosta voit käyttää mitä tahansa näistä vain vaihtamalla yhden koodirivin. Tässä on näiden kasvojentunnistimien nimet ja heidän OpenCV-puhelut:

EigenFaces - cv2.face.createEigenFaceRecognizer ()
FisherFaces - cv2.face.createFisherFaceRecognizer ()
Paikallisten binaarikuvioiden histogrammit (LBPH) - cv2.face.createLBPHFaceRecognizer ()

Kuinka löytää kasvot OpenCV: n avulla?

Pohjimmiltaan kaksi tapaa löytää kasvot käyttämällä OpenCV: tä:

Haar-luokitin
LBP Cascade -luokitin

Useimmat kehittäjät käyttävät Haaria, koska se on tarkempi, mutta se on myös paljon hitaampaa kuin LBP. Aion myös osallistua Haar Classifierin kanssa tähän opetusohjelmaan. OpenCV-paketissa on todella kaikki tarvitsemasi tiedot Haarin tehokkaaseen käyttämiseen. Periaatteessa tarvitset vain XML-tiedoston, jossa on oikeat kasvotiedot. Voit myös luoda oman, jos tiesit mitä olet tekemässä tai voit vain käyttää OpenCV: n mukana tulevaa. Jos haluat tietää enemmän Haar-luokittelijasta ja LBP Cascade -luokittelijasta, napsauta tätä ja tätä.

Joten nyt kirjoitamme yksinkertaisen python-ohjelman, joka ottaa näytekuvia tulona ja yrittää tunnistaa kasvot ja silmät OpenCV: n avulla. Voit ladata Haar Classifier XML-tiedoston kasvojentunnistusta ja silmien havaitsemista varten täältä ja täältä ja pitää XML-tiedostot työhakemistossasi.

riippuvuudet:

pip asentaa tylsä
pip asenna matplotlib
pip asenna opencv-python

Syöttökuvat:

Lähdekoodi:

Tuo cv2
Tuo numerot kuin np
alkaen matplotlib tuota pyplot plt
Tuo maailmanlaajuisesti
txtfiles = []
tiedostolle glo.glob ("*. jpg"):
    txtfiles.append (file)
    
ix: lle txt-tiedostoissa:
    img = cv2.imread (ix, cv2.IMREAD_COLOR)
    imgtest1 = img.copy ()
    imgtest = cv2.cvtColor (imgtest1, cv2.COLOR_BGR2GRAY)
    facecascade = cv2.CascadeClassifier ('D: \\ KJ \\ Nagesh \\ Lataukset \\ face_recognition \\ haarcascade_frontalface_default.xml')
    eye_cascade = cv2.CascadeClassifier ('D: \\ KJ \\ Nagesh \\ Lataukset \\ face_recognition \\ haarcascade_eye.xml')
   
    faces = facecascade.detectMultiScale (imgtest, scaleFactor = 1,2, minNeighbors = 5)
 
    tulosta ('Löydettyjen kasvojen kokonaismäärä', len (kasvot))
    
    (x, y, w, h) kasvoille:
        face_detect = cv2.korjauskulma (viimeisin, (x, y), (x + w, y + h), (255, 0, 255), 2)
        roi_gray = viimeisin [y: y + h, x: x + w]
        roi_color = viimeisin [v: y + h, x: x + w] plt.imshow (face_detect)
        eyes = eye_cascade.detectMultiScale (roi_gray)
        (ex, ey, ew, eh) silmissä:
            eye_detect = cv2.korotuskulma (roi_color, (ex, ey), (ex + ew, ey + eh), (255,0255), 2)
            plt.imshow (eye_detect)

Ymmärretään nyt tämä yksinkertainen ohjelma:

Vaihe 1: Tuo numpy, matplotlib, open-cv ja glob

Tuo numerot kuin np
alkaen matplotlib tuota pyplot plt
Tuo cv2
Tuo maailmanlaajuisesti

Vaihe 2: Käytä glo-silmukkaa jokaisessa nykyisessä työhakemistossasi olevan .jpg-tiedoston läpi ja tallenna ne txt-tiedostojen luetteloon. Jos haluat tietää kuinka lukea tiedostoja glo-sovelluksella, napsauta tätä

txtfiles = []
tiedostolle glo.glob ("*. jpg"):
    txtfiles.append (file)

Vaihe 3: Lue kaikki .jpg-tiedostot cv2.imreadilla (). Toiminto cv2.imread () vaatii kahta argumenttia: ensimmäinen on polku itse kuvaan ja toinen määrittelee kuvan lukemistavan. Voimme käyttää mitä tahansa seuraavista kolmesta toisena argumenttina.

cv2.IMREAD_COLOR - käytetään värikuvan lataamiseen. Se jättää kuvan läpinäkyvyyden huomiotta ja on oletuslippu. Se on tarkoitettu 8-bittisille kuville, joilla ei ole alfa-kanavaa.
cv2.IMREAD_GRAYSCALE - vastaa kuvien lataamisesta harmaasävyinä.
cv2.IMREAD_UNCHANGED - Se lataa kuvan käyttämällä alfa-kanavaa (RGBA).

Kun lataat kuvan OpenCV: llä, se lataa sen oletusarvoisesti BGR-väriavaruuteen.

Tee sen jälkeen kopio ohitetusta kuvasta niin, että kuljettua kuvaa ei muuteta.

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

Vaihe 4: Muunna kuva harmaakokoiseksi, koska OpenCV-kasvotunnistin odottaa harmaita kuvia.

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

Vaihe 5: Nyt meidän on ladattava Haar-luokittelijamme (ladatut XML-tiedostot) kasvojentunnistusta ja silmien havaitsemista varten, mikä otetaan syötteenä Haar-luokittelijan harjoitustiedostoon.

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

vaihe 6: Kuinka havaitsemme kasvot kuvasta CascadeClassifier -sovelluksella?

No, jälleen kerran OpenCV: n CascadedClassifier on tehnyt siitä meille yksinkertaisen, koska tuvastaMultiScale (), joka havaitsee tarkalleen, mitä tarvitset.

detectMultiScale (kuva, scaleFactor, minNeighbors)

Alla on argumentteja, jotka tulisi siirtää havaitaMultiScale ().

Tämä on yleinen toiminto esineiden havaitsemiseksi, tässä tapauksessa se tunnistaa kasvot, koska soitimme kasvojen kaskadiin. Jos se löytää kasvot, se palauttaa luettelon mainittujen kasvojen sijainneista muodossa ”Rect (x, y, w, h).” Jos ei, palauttaa sitten “Ei mitään”.

  • Kuva: Ensimmäinen tulo on harmaasävykuva.
  • scaleFactor: Tämä toiminto kompensoi väärän käsityksen koosta, joka tapahtuu, kun toinen kasvot näyttävät olevan suurempia kuin toiset yksinkertaisesti siksi, että se on lähempänä kameraa.
  • minNeighbors: Tunnistusalgoritmi, joka käyttää liikkuvaa ikkunaa objektien havaitsemiseen, se tekee sen määrittelemällä kuinka monta objektia löytyy nykyisen läheltä, ennen kuin se voi julistaa löydetyt kasvot.
faces = facecascade.detectMultiScale (imgtest, scaleFactor = 1,2, minNeighbors = 5)

Vaihe 7: Tulosta nyt kasvojen lukumäärä jokaisesta kuvasta:

tulosta ('Löydettyjen kasvojen kokonaismäärä', len (kasvot))

Vaihe 8: Selaa kasvoluetteloa ja piirrä kuviin suorakulmiot. Periaatteessa löydämme kasvot, murskaamme kasvot, niiden koon ja piirrämme suorakulmioita

(x, y, w, h) kasvoille:
face_detect = cv2.korjauskulma (viimeisin, (x, y), (x + w, y + h), (255, 0, 255), 2)
roi_gray = viimeisin [y: y + h, x: x + w]
roi_color = viimeisin [y: y + h, x: x + w]
plt.imshow (face_detect)

Vaihe 9: Seuraavaksi suoritamme silmien havaitsemisen, ja mielenkiintoinen osa on se, että se ei todennäköisesti löytäisi silmämunaa tunnistamaan silmää. Suurin osa silmien havaitsemisalgoritmeista käyttää ympäröivää ihoa, silmäluomet, ripset ja kulmakarvat myös havaitsemiseen.

eyes = eye_cascade.detectMultiScale (roi_gray)
(ex, ey, ew, eh) silmissä:
eye_detect = cv2.korotuskulma (roi_color, (ex, ey), (ex + ew, ey + eh), (255,0255), 2)
plt.imshow (eye_detect)

Viimeinkin tuotantomme:

Tulostiedosto: friends.PNGTulostiedosto: Leonardo.PNGTulostiedosto: Nagesh.PNGTulostiedosto: Rahul.PNGTulostiedosto: Amar.PNGTulostiedosto: Sachin.PNGTulostiedosto: Vishak.PNGTulostiedosto: Shahrukh.PNGTulostiedosto: Dog.PNGTulostiedosto: download1.PNG

Hienoa !!! Eikö olekin?

Yksi asia, jonka voit huomata, että kahdessa viimeisimmässä lähdössämme ei suoriteta kasvojentunnistusta, mikä johtuu selvästi siksi, että näillä kahdella kuvalla ei ole havaittavissa olevia kasvoja. Yksi on kuva koirasta ja toinen on sininen ruusu.

johtopäätös:

Joten voimme nähdä, että muutamalla koodirivillä aloitimme kasvojentunnistuksen. Tästä eteenpäin voimme luoda kasvotunnistusmallin käyttämällä openCV: tä, joka ennustaa nimen ja muut kyseiseen henkilöyn liittyvät tiedot. Tämä blogi on tarkoitettu aloittelijoille, jotka haluavat rakentaa jotain hienoa käyttämällä tätä uskomattoman ohjelmakielen Pythonia.

Haar-luokittelijoita on monia saatavissa ihmisen kehon eri osien havaitsemiseksi. Katso täältä.

No, tässä kaikki tässä blogissa. Kiitos lukemisesta :)

onnellinen oppiminen !!!

Voit tavoittaa minut LinkedInissä.