opencv

OpenCV rozpoznávanie tváre

OpenCV rozpoznávanie tváre

Rozpoznávanie tváre s OpenCV

Zložitosť strojov sa rokmi zvyšovala a počítače nie sú výnimkou. Počítače pomohli ľudstvu vyriešiť veľa problémov a splniť veľa náročných úloh. Časy, keď všetky počítače robili jednoduché aritmetické operácie, sú dávno preč, počítače dnes riadia svet.

Počítače sa stali tak zložitými, že sa trénujú, aby mysleli ako ľudia.
Áno!

V tomto článku sa chystáme niečo také urobiť. Ako ľudia je rozpoznávanie tvárí iných ľudí jednoduchá úloha a napriek schopnostiam dnešných počítačov to pre počítač nie je také ľahké, takže ho musíme trénovať, aby sme dokázali robiť to isté.

Mnoho článkov, ktoré by ste tam mohli vidieť, sa zastavilo pri jednoduchej detekcii tváre, ale v tomto článku by sa venovalo nielen detekcii tváre, ale aj rozpoznávaniu tváre.

To znamená, že ak sa počítaču zobrazia dva moje obrázky, nielen že by rozpoznal, ktorá časť obrázka je moja tvár, ale tiež by rozpoznal, že ja som ten istý na oboch obrázkoch.

Na začiatok by sme si na naše stroje museli najskôr nainštalovať opencv, čo je možné urobiť iba ak máte nainštalovaný Python. Inštalácia Pythonu nie je cieľom tohto článku, takže ak ho ešte nemáte na svojom počítači, môžete si nainštalovať Python z webovej stránky Pythonu.

Ak si chceme nainštalovať Open CV, môžeme to urobiť pomocou príkazu pip.

pip nainštaluj opencv-python

V tomto článku tiež využijeme balíček numpy, ktorý by mal byť nainštalovaný spolu s OpenCV pomocou vyššie uvedeného príkazu.

Ak sa numpy nenainštaloval, môžete to ľahko urobiť pomocou nižšie uvedeného príkazu:

pip nainštalovať numpy

Ak chcete potvrdiť, že je váš OpenCV nainštalovaný, pri aktivácii interaktívneho prostredia Pythonu sa ho pokúste importovať pomocou:

importovať cv2

Ak sa chyba nezobrazí, môžete pokračovať.

Na uskutočnenie rozpoznávania tváre by sme napísali tri skripty. Jeden na vytvorenie datasetu obrázkov, druhý na trénovanie týchto obrázkov a posledný na rozpoznanie tvárí na základe výsledkov tréningu, ktorým počítač prechádza.

Potrebovali by sme Haarovu kaskádu, ktorú poskytuje Open CV. Tento súbor je možné získať z adresára opencv, ktorý je cv2 / data / haarcascade_frontalface_default.xml na mojom počítači by to malo byť rovnaké aj na vašom počítači. Skopírujte súbor do priečinka, v ktorom chcete vykonať rozpoznávanie tváre.

Poďme teraz na to.
Pokúsili by sme sa dostať našu webovú kameru na získanie obrázkov potrebných pre množinu údajov.

importovať cv2
vid_cam = cv2.VideoCapture (0)
face_detector = cv2.CascadeClassifier ('haarcascade_frontalface_default.xml ')
face_id = 1
počet = 0
while (vid_cam.isOpened ()):
ret, image_frame = vid_cam.čítať()
sivá = cv2.cvtColor (image_frame, cv2.COLOR_BGR2GREY)
face = face_detector.detectMultiScale (šedá, 1.3, 5)
pre (x, y, w, h) v tvárach:
cv2.obdĺžnik (image_frame, (x, y), (x + w, y + h), (255,0,0), 2)
počet + = 1
cv2.imwrite ("množina údajov / používateľ."+ str (face_id) + '.'+ str (pocet) + ".jpg ", šedá [y: y + h, x: x + w])
cv2.imshow ('frame', image_frame)
ak cv2.waitKey (100) & 0xFF == ord ('q'):
prestávka
počet elifov> 100:
prestávka
vid_cam.uvoľniť ()
cv2.destruAllWindows ()

Vysvetlenie, čo robí každý riadok kódu:

importovať cv2

Tu je príkaz, ktorý hovorí pythonu, aby zahrnul externú knižnicu, ktorá sa má použiť v tomto kóde, v tomto prípade je to Open CV.

vid_cam = cv2.VideoCapture (0)

Tento kód vyzýva importovanú knižnicu Open CV, aby začala snímať, a v tomto okamihu sa spustí webová kamera. Ak Open CV nepodporuje vašu webovú kameru, kód tu zlyhá.

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

Aby sme mohli vykonávať detekciu obrázkov, je tento kód potrebný. Otvorené CV používa 'haarcascade_frontalface_default.xml 'pre kaskádovú klasifikáciu. Výsledný objekt sa potom uloží do premennej face_detector.

face_id = 1

Tu je prípad nastavenia identifikačného čísla tváre, takže prvá tvár dostane id 1.

počet = 0

Budeme robiť pár obrázkov, pretože Open CV potrebuje trénovať obrázky, aby dokázal rozpoznávať tváre, premenná count slúži ako počet obrázkov.

while (vid_cam.isOpened ()):

To umožňuje pokračovanie nasledujúcich operácií za predpokladu, že je videokamera otvorená. Metóda isOpened () vracia hodnotu True alebo False.

ret, image_frame = vid_cam.čítať()

Tu vid_cam.read () sa pozrie na zachytenie videa a potom zachytí rám, ktorý je uložený v premennej image_frame, ak je operácia úspešná, vráti sa boolean True a uloží sa do premennej ret

sivá = cv2.cvtColor (image_frame, cv2.COLOR_BGR2GREY)

Metóda cvtColor () sa používa na prevedenie obrazového rámu do požadovaného farebného typu. V tomto prípade sme ho previedli do odtieňov sivej.

face = face_detector.detectMultiScale (šedá, 1.3, 5)

Toto skontroluje rámce rôznych veľkostí a pokúsi sa ich nastaviť na mierku. Aplikuje sa to na premennú, na ktorú bola použitá Haarova kaskáda.

pre (x, y, w, h) v tvárach:

Tu prechádzame cez tváre a ich rozmery, kde x a y znamenajú súradnice a w a h znamenajú šírku a výšku.

cv2.obdĺžnik (image_frame, (x, y), (x + w, y + h), (255,0,0), 2)

Pamätajte, že s videokamerou stále pracujeme. Videokamera potom orezá potrebnú časť obrázka podľa vyššie uvedených rozmerov.

počet + = 1

Okamžite je to hotové, premenná count, ktorá slúži ako počítadlo, sa potom zvyšuje.

cv2.imwrite ("množina údajov / používateľ."+ str (face_id) + '.'+ str (pocet) + ".jpg ", šedá [y: y + h, x: x + w])

Orezaný obrázok sa uloží s menom User (face_id).(počet).jpg a vložte do priečinka s názvom dataset.

cv2.imshow ('frame', image_frame)

Po uložení tento kód zabezpečí, aby sa obraz videa zobrazil s obdĺžnikom na tvári jednotlivca po vykonaní detekcie tváre.

ak cv2.waitKey (100) & 0xFF == ord ('q'):
prestávka

Po každom obrázku môže užívateľ zastaviť program v snímaní ďalších obrázkov, ktoré je možné vykonať stlačením klávesu „q“ na klávesnici najmenej na 100 ms.

počet elifov> 100:
prestávka

Tento kód robí to, že zastaví fungovanie videa v okamihu, keď bolo urobených 100 obrázkov, bez ohľadu na to, či chce užívateľ urobiť viac alebo nie.

vid_cam.uvoľniť ()

Tu je webová kamera zatvorená a nielen zastavená pri fotografovaní.

cv2.destruAllWindows ()

Potom boli všetky okná OpenCV otvorené, zničené a kód sa skončil.

Keď sme s tým hotoví, môžeme trénovať obrazovú množinu údajov:

import cv2, os
importovať numpy ako np
z importovaného obrázka PIL
rozpoznávač = cv2.tvár.createLBPHFaceRecognizer ()
detektor = cv2.CascadeClassifier ("haarcascade_frontalface_default.xml ");
def getImagesAndLabels (cesta):
imagePaths = [os.cesta.spojiť (cesta, f) pre f v os.listdir (cesta)]
faceSamples = []
ids = []
pre imagePath v imagePaths:
PIL_img = Obrázok.otvorené (imagePath).konvertovať („L“)
img_numpy = np.pole (PIL_img, 'uint8')
id = int (os.cesta.split (imagePath) [- 1].rozdeliť („.") [1])
tváre = detektor.detectMultiScale (img_numpy)
pre (x, y, w, h) v tvárach:
faceSamples.pridať (img_numpy [y: y + h, x: x + w])
ids.append (id)
návrat faceSamples, ids
Faces, ids = getImagesAndLabels ('dataset')
rozpoznávač.vlak (tváre, np.pole (ID))
rozpoznávač.uložiť ('tréner / tréner.yml ')

Poďme si vysvetliť aj tento kód:

import cv2, os

Rovnako ako ďalší kód, aj tu importujeme OpenCV a OS, ktoré by sme potrebovali na cestu k súboru.

importovať numpy ako np

Importujeme tiež numpy knižnicu, ktorá by sa použila na výpočet matice (matica je len usporiadanie polí).

z importovaného obrázka PIL

Importujeme knižnicu obrázkov Python a potom z nej získame knižnicu obrázkov aj z tohto balíka.

rozpoznávač = cv2.tvár.createLBPHFaceRecognizer ()

Čo to urobí, je použiť metódu createLBPHFaceRecognizer () na cv2.objekt tváre, to by pomohlo uľahčiť rozpoznávanie tvárí, pretože nemusíme prichádzať s vlastnou sadou algoritmov.

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

Ak ste sledovali návod, narazili by ste na to už skôr. Pomáha pri detekcii tváre pomocou „haarcascade_frontalface_default.xml “pre kaskádovú klasifikáciu.

def getImagesAndLabels (cesta):

Teraz sa chystáme začať správne s výcvikom obrazu, takže vytvoríme funkciu.

imagePaths = [os.cesta.spojiť (cesta, f) pre f v os.listdir (cesta)]

Tento kód skontroluje aktuálny adresár súboru, skontroluje súbory s obrázkami a potom ich pridá do tohto zoznamu.

faceSamples = []

Týmto sa inicializuje zoznam vzoriek, ktorý je v tomto okamihu prázdny, ale tváre by sa pridali pri spustení kódu.

ids = []

Inicializujte zoznam ID, ktorý je spočiatku prázdny.

pre imagePath v imagePaths:

Pamätajte na kód, ktorý kontroloval súbory obrázkov v adresári? Áno? Teraz budeme prechádzať každý z týchto súborov a vykonávať s nimi operácie.

PIL_img = Obrázok.otvorené (imagePath).konvertovať („L“)

Prvá vec, ktorú urobíme s obrázkom, je jeho prevedenie do odtieňov sivej a tento kód to robí.

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

Obrázok v šedej škále je iba radom čísel na jednom mieste, takže z nich vytvoríme početné pole a priradíme ho k premennej.

id = int (os.cesta.split (imagePath) [- 1].rozdeliť („.") [1])

Ak si spomeniete na súbor, ktorý získava obrázky, pamätáte si, že sme súbory pomenovali User (face_id).počítať.jpg. Takže tu rozdeľujeme mená na „.”A potom extrahujeme face_id a tu priradíme premennú. Potrebovali by sme id na uznanie.

tváre = detektor.detectMultiScale (img_numpy)

Z poľa numpy sa metóda detectMultiScale () pokúsi zistiť tváre zo vzoru, ktorý nájde v poli numpy. Potom priradí hodnoty v premennej plochy.

pre (x, y, w, h) v tvárach:

Tu prechádzame slučkami cez hodnoty priradené k premennej. Hodnoty sú tu súradnice xay, ktoré by sme mohli brať ako počiatok, a potom w a h zastupujúce šírku a výšku.

faceSamples.pridať (img_numpy [y: y + h, x: x + w])

Predtým sme vytvorili zoznam vzoriek tváre, ale bol prázdny. Tu pridáme tváre do tohto zoznamu a pridáme y až h, aby sme dostali dve hodnoty súradníc y a to isté sa deje s x.

ids.append (id)

Teraz máme tvár v zozname vzoriek tváre, takže získame jej ID a pripojíme ju tiež k zoznamu ID.

návrat faceSamples, ids

Potom po tom všetkom vrátime zoznam vzorov tvárí a zoznam id.

face, ids = getImagesAndLabels ('dataset')

Pamätajte, že getImagesAndLabels () je iba funkcia. Túto funkciu teda zavoláme a návratové hodnoty sa uložia do premenných tvárí a idov.

rozpoznávač.vlak (tváre, np.pole (ID))

Tu sa deje skutočné školenie. Metódu createLBPHFaceRecognizer () sme použili niekedy skôr a priradili sme ju k premennej rozpoznávača. Je čas na tréning!

rozpoznávač.uložiť ('tréner / tréner.yml ')

Po tréningu sa dostaneme k uloženiu výsledkov z tréningu.
Po spustení kódu vytvorí súbor s názvom tréner.yml, ktorý by potom použil kód na rozpoznávanie tváre.

Tu je kód rozpoznávania tváre:

importovať cv2
importovať numpy ako np
rozpoznávač = cv2.tvár.createLBPHFaceRecognizer ()
rozpoznávač.náklad („tréner / tréner.yml ')
cascadePath = "haarcascade_frontalface_default.xml "
faceCascade = cv2.CascadeClassifier (cascadePath)
font = cv2.FONT_HERSHEY_SIMPLEX
cam = cv2.VideoCapture (0)
zatiaľ čo je pravda:
ret, im = vačka.čítať()
sivá = cv2.cvtColor (im, cv2.COLOR_BGR2GREY)
tváre = faceCascade.detectMultiScale (šedá, 1.2,5)
pre (x, y, w, h) v tvárach:
cv2.obdĺžnik (im, (x-20, y-20), (x + w + 20, y + h + 20), (0,255,0), 4)
Id = rozpoznávač.predpovedať (sivá [y: y + h, x: x + w])
if (Id == 1):
Id = "Nazmi"
inak:
Id = "Neznáme"
cv2.obdĺžnik (im, (x-22, y-90), (x + w + 22, y-22), (0,255,0), -1)
cv2.putText (im, str (Id), (x, y-40), písmo, 2, (255 255 255), 3)
cv2.imshow ('im', im)
ak cv2.waitKey (10) & 0xFF == ord ('q'):
prestávka
vačka.uvoľniť ()
cv2.destruAllWindows ()

Ak sledujete článok od začiatku, urobili sme to už predtým. Ak ste to láskavo neurobili.

rozpoznávač.náklad („tréner / tréner.yml ')

Pamätajte, že sme trénovali rozpoznávač a uložili súbor? Áno? Tento súbor sa práve načítava.

cascadePath = "haarcascade_frontalface_default.xml "

Pracovali by sme so súborom haarcascade a tu sme priradili názov súboru premennej.

# Vytvorte klasifikátor z vopred zostaveného modelu
faceCascade = cv2.CascadeClassifier (cascadePath)

Tu môžeme vykonať kaskádovú klasifikáciu v súbore haarcascade.

font = cv2.FONT_HERSHEY_SIMPLEX

Nastavíme typ písma, ktorý sa použije, keď kód rozpozná tvár v obrázku a zobrazí meno.

cam = cv2.VideoCapture (0)

Už sme tu boli, ale tentoraz je čas spoznať tváre. Ak neviete, čo tento kód robí, spustí sa webová kamera.

zatiaľ čo je pravda:
ret, im = vačka.čítať()
sivá = cv2.cvtColor (im, cv2.COLOR_BGR2GREY)
tváre = faceCascade.detectMultiScale (šedá, 1.2,5)
pre (x, y, w, h) v tvárach:

Všetky tieto kroky už boli urobené. Ak neviete, čo kód robí, láskavo skontrolujte kód, ktorý bol použitý na ukladanie obrázkov.

cv2.obdĺžnik (im, (x-20, y-20), (x + w + 20, y + h + 20), (0,255,0), 4)

Toto pomáha webovej kamere zistiť, kde sú tváre, a umiestniť obdĺžnik, ktorý označuje tvár.

Id = rozpoznávač.predpovedať (sivá [y: y + h, x: x + w])

Alrerady sme načítali vlakový súbor do rozpoznávača, takže je teraz schopný rozpoznať tvár.

if (Id == 1):
Id = "Ja"
inak:
Id = "Neznáme"

Po pokuse rozpoznať, o akú tvár ide, skontroluje ID a zistí, či existuje. Hodnota ID by tu bola meno toho, kto bol vlastníkom, ktorý čelil takémuto ID pri vytváraní obrazovej množiny údajov.

cv2.obdĺžnik (im, (x-22, y-90), (x + w + 22, y-22), (0,255,0), -1)
cv2.putText (im, str (Id), (x, y-40), písmo, 2, (255 255 255), 3)

Kód po nájdení majiteľa Id nakreslí okolo tváre obdĺžnik a umiestni meno vlastníka tváre. Tvár rozpoznaná!

cv2.imshow ('im', im)

Tu sa rám videa zobrazí s ohraničeným obdĺžnikom.

ak cv2.waitKey (10) & 0xFF == ord ('q'):
prestávka
vačka.uvoľniť ()
cv2.destruAllWindows ()

Po dokončení teda môžete program zastaviť stlačením klávesu „q“, webová kamera sa zastaví a zatvorí sa.

Tam to máte, vaša webová kamera teraz dokáže rozpoznávať tváre a môžete ju použiť, kedykoľvek budete chcieť. Okrem použitia webovej kamery môžete tiež načítať obrázok, ktorý si však vyžaduje ďalšie kroky, ako sú kroky uvedené v tomto článku.

Zdrojový kód použitý v jeho repozitári github nájdete. Ak máte nejaké komentáre alebo chcete diskutovať o @linuxhint, napíšte nám

Kurzor pri písaní v systéme Windows 10 skáče alebo sa pohybuje náhodne
Ak zistíte, že kurzor myši skáče alebo sa pohybuje sám, automaticky a náhodne pri písaní na notebooku alebo počítači so systémom Windows, niektoré z t...
Ako zmeniť smer posúvania myši a touchpadu v systéme Windows 10
Myš a TouchpadNielenže uľahčujú výpočty, ale sú aj efektívnejšie a menej časovo náročné. Nemôžeme si predstaviť život bez týchto zariadení, ale je pra...
Ako zmeniť veľkosť, farbu a schému ukazovateľa myši a kurzora v systéme Windows 10
Ukazovateľ myši a kurzor vo Windows 10 sú veľmi dôležité aspekty operačného systému. Dá sa to povedať aj pre iné operačné systémy, takže v skutočnosti...