opencv

Rozpoznávání tváře OpenCV

Rozpoznávání tváře OpenCV

Rozpoznávání tváře s OpenCV

Složitost strojů se v průběhu let zvýšila a počítače nejsou výjimkou. Počítače pomohly lidstvu vyřešit spoustu problémů a splnit spoustu obtížných úkolů. Časy, kdy všechny počítače dělaly jednoduché aritmetické operace, jsou pryč, počítače nyní řídí svět.

Počítače se staly tak složitými, že jsou trénovány, aby přemýšlely jako lidé.
Ano!

V tomto článku něco takového uděláme. Jako lidé je rozpoznávání tváří jiných lidí jednoduchým úkolem a navzdory schopnostem dnešních počítačů to pro počítač není tak snadné, takže ho musíme trénovat, abychom dokázali dělat totéž.

Mnoho článků, které byste tam viděli, se zastaví při jednoduché detekci obličeje, ale v tomto článku se bude zabývat nejen detekcí obličeje, ale také rozpoznáváním obličeje.

To znamená, že pokud se počítači zobrazují dva moje obrázky, nejen že by rozpoznal, která část obrázku je moje tvář, ale také by poznal, že jsem také já na obou obrázcích.

Nejprve bychom museli na naše počítače nejprve nainstalovat opencv, což lze provést pouze v případě, že máte nainstalovaný Python. Cílem tohoto článku není instalace Pythonu, takže pokud jej ještě na svém počítači nemáte, můžete si nainstalovat Python z webových stránek Pythonu.

Chcete-li nainstalovat Open CV, můžeme to udělat pomocí příkazu pip.

pip nainstalujte opencv-python

V tomto článku také využijeme balíček numpy, který by měl být nainstalován společně s OpenCV pomocí výše uvedeného příkazu.

Pokud se numpy nenainstaloval, můžete to snadno provést pomocí níže uvedeného příkazu:

pip install numpy

Chcete-li potvrdit, že je váš OpenCV nainstalován, zkuste jej při aktivaci interaktivního prostředí Pythonu importovat pomocí:

import cv2

Pokud se chyba nezobrazí, můžete pokračovat.

Abychom provedli rozpoznávání obličeje, psali bychom tři skripty. Jeden k vytvoření datové sady obrázků, další k trénování těchto obrázků a poslední k rozpoznání tváří na základě výsledků tréninku, kterým počítač prochází.

Potřebovali bychom Haarovu kaskádu poskytovanou Open CV. Tento soubor lze získat z adresáře opencv, což je cv2 / data / haarcascade_frontalface_default.xml na mém počítači by to mělo být stejné i na vašem počítači. Zkopírujte soubor do složky, kde chcete provést rozpoznávání obličeje.

Pojďme nyní do toho.
Pokusili bychom se získat naši webovou kameru, abychom získali obrázky potřebné pro datovou sadu.

import cv2
vid_cam = cv2.VideoCapture (0)
face_detector = cv2.CascadeClassifier ('haarcascade_frontalface_default.xml ')
face_id = 1
count = 0
while (vid_cam.isOpened ()):
ret, image_frame = vid_cam.číst()
šedá = cv2.cvtColor (image_frame, cv2.COLOR_BGR2GREY)
tváře = detektor obličeje.detectMultiScale (šedá, 1.3, 5)
pro (x, y, w, h) v obličejích:
cv2.obdélník (image_frame, (x, y), (x + w, y + h), (255,0,0), 2)
počet + = 1
cv2.imwrite ("datová sada / uživatel."+ str (face_id) + '.'+ str (počet) + ".jpg ", šedá [y: y + h, x: x + w])
cv2.imshow ('frame', image_frame)
pokud cv2.waitKey (100) & 0xFF == ord ('q'):
přestávka
počet elifů> 100:
přestávka
vid_cam.uvolnění()
cv2.destruAllWindows ()

Abychom tedy vysvětlili, co dělá každý řádek kódu:

import cv2

Zde je příkaz, který říká pythonu, aby zahrnoval externí knihovnu, která se má použít v tomto kódu, v tomto případě je to Open CV.

vid_cam = cv2.VideoCapture (0)

Tento kód vyzývá importovanou knihovnu Open CV, aby zahájila snímání, a webová kamera je spuštěna v tomto bodě. Pokud Open CV nepodporuje vaši webovou kameru, kód zde selže.

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

Abychom mohli provádět detekci obrazu, je tento kód potřebný. Otevřený životopis používá 'haarcascade_frontalface_default.xml 'pro kaskádovou klasifikaci. Výsledný objekt se poté uloží do proměnné face_detector.

face_id = 1

Zde je případ nastavení ID čísla obličeje, takže první obličej dostane ID 1.

count = 0

Budeme pořizovat pár obrázků, protože Open CV potřebuje trénovat obrázky, aby bylo možné rozpoznávat tváře, proměnná count slouží jako počet obrázků.

while (vid_cam.isOpened ()):

To umožňuje pokračovat v následujících operacích, pokud je otevřena videokamera. Metoda isOpened () vrací True nebo False.

ret, image_frame = vid_cam.číst()

Tady vid_cam.read () se podívá na zachycení videa a poté zachytí snímek, který je uložen v proměnné image_frame, pokud je operace úspěšná, vrátí se boolean True a uloží se do proměnné ret

šedá = cv2.cvtColor (image_frame, cv2.COLOR_BGR2GREY)

Metoda cvtColor () se používá k převodu rámečku obrázku na požadovaný typ barvy. V tomto případě jsme jej převedli na stupně šedi.

tváře = detektor obličeje.detectMultiScale (šedá, 1.3, 5)

Toto zkontroluje rámce různých velikostí a pokusí se je nastavit na měřítko, toto se aplikuje na proměnnou, na kterou byla použita Haarova kaskáda.

pro (x, y, w, h) v obličejích:

Zde procházíme plochami a jejich rozměry, kde x a y představují souřadnice a w a h představují šířku a výšku.

cv2.obdélník (image_frame, (x, y), (x + w, y + h), (255,0,0), 2)

Nezapomeňte, že stále pracujeme s videokamerou, která poté ořízne potřebnou část obrazu podle výše uvedených rozměrů.

počet + = 1

Okamžitě je to hotovo, proměnná count, která je počítadlem, se pak zvyšuje.

cv2.imwrite ("datová sada / uživatel."+ str (face_id) + '.'+ str (počet) + ".jpg ", šedá [y: y + h, x: x + w])

Oříznutý obrázek se uloží s názvem User (face_id).(počet).jpg a vložte do složky s názvem datová sada.

cv2.imshow ('frame', image_frame)

Po uložení tento kód zajišťuje, že obraz je snímek videa zobrazen s obdélníkem na tváři jednotlivce po provedení detekce obličeje.

pokud cv2.waitKey (100) & 0xFF == ord ('q'):
přestávka

Po každém obrázku je uživateli povoleno zastavit program v pořizování dalších obrázků, které lze provést stisknutím klávesy „q“ na klávesnici alespoň na 100 ms.

počet elifů> 100:
přestávka

Tento kód dělá to, že zastaví fungování videa v okamžiku, kdy bylo pořízeno 100 snímků, bez ohledu na to, zda uživatel chce pořídit více nebo ne.

vid_cam.uvolnění()

Zde je webová kamera zavřená a nejen zastavena při fotografování.

cv2.destruAllWindows ()

Pak byla všechna okna OpenCV otevřena byla zničena a kód běží k závěru.

Teď, když jsme s tím hotovi, můžeme pak trénovat obrazovou datovou sadu:

import cv2, os
importovat numpy jako np
z PIL import obrázku
rozpoznávač = cv2.tvář.createLBPHFaceRecognizer ()
detektor = cv2.CascadeClassifier ("haarcascade_frontalface_default.xml ");
def getImagesAndLabels (cesta):
imagePaths = [os.cesta.join (cesta, f) pro f v os.listdir (cesta)]
faceSamples = []
ids = []
pro imagePath v imagePaths:
PIL_img = Obrázek.otevřít (imagePath).převést ('L')
img_numpy = np.pole (PIL_img, 'uint8')
id = int (os.cesta.split (imagePath) [- 1].rozdělit(".") [1])
tváře = detektor.detectMultiScale (img_numpy)
pro (x, y, w, h) v obličejích:
faceSamples.připojit (img_numpy [y: y + h, x: x + w])
ID.připojit (id)
návrat faceSamples, ids
tváře, ids = getImagesAndLabels ('datová sada')
rozpoznávač.vlak (tváře, np.pole (ID))
rozpoznávač.uložit ('trenér / trenér.yml ')

Pojďme si vysvětlit i tento kód:

import cv2, os

Stejně jako další kód zde importujeme OpenCV a os, které bychom potřebovali pro cestu k souboru.

importovat numpy jako np

Importujeme také numpy knihovnu, která by byla použita pro maticový výpočet (matice je jen uspořádání polí).

z PIL import obrázku

Importujeme Python Image Library a poté z ní získáváme také Image Image Library z tohoto balíčku.

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

Co to dělá, je použít metodu createLBPHFaceRecognizer () na cv2.objekt tváře, to by pomohlo usnadnit rozpoznávání tváří, protože nemusíme přicházet s vlastní sadou algoritmů.

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

Pokud jste sledovali tutoriál, narazili byste na to dříve. Pomáhá s detekcí obličeje pomocí „haarcascade_frontalface_default.xml “pro kaskádovou klasifikaci.

def getImagesAndLabels (cesta):

Nyní se chystáme zahájit správné školení obrazu, takže vytvoříme funkci.

imagePaths = [os.cesta.join (cesta, f) pro f v os.listdir (cesta)]

Tento kód zkontroluje aktuální adresář souboru a zkontroluje soubory obrázků a poté je přidá do tohoto seznamu.

faceSamples = []

Tím se inicializuje seznam vzorků, v tomto okamžiku je prázdný, ale tváře by byly přidány při spuštění kódu.

ids = []

Inicializujte seznam ID, který je zpočátku prázdný.

pro imagePath v imagePaths:

Pamatujte si kód, který kontroloval obrazové soubory v adresáři? Ano? Nyní projdeme každý z těchto souborů a provedeme na nich operace.

PIL_img = Obrázek.otevřít (imagePath).převést ('L')

První věc, kterou obrázek uděláme, je převést jej na stupně šedi a tento kód to dělá.

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

Obrázek ve stupních šedi je jen řada čísel na jednom místě, takže z nich vytvoříme numpy pole a přiřadíme jej k proměnné.

id = int (os.cesta.split (imagePath) [- 1].rozdělit(".") [1])

Pokud si vzpomenete na soubor, který získá obrázky, vzpomenete si, že jsme soubory pojmenovali User (face_id).počet.jpg. Tady tedy rozdělujeme jména na „.“A poté extrahujeme face_id a přiřadíme sem proměnnou. Potřebovali bychom ID pro uznání.

tváře = detektor.detectMultiScale (img_numpy)

Z pole numpy se metoda detectMultiScale () pokusí detekovat tváře ze vzoru, který najde v poli numpy. Poté přiřadí hodnoty v proměnné plochy.

pro (x, y, w, h) v obličejích:

Zde procházíme hodnotami přiřazenými proměnné. Hodnoty zde jsou souřadnice xay, které bychom mohli vzít jako počátek, a potom w a h znamenající šířku a výšku.

faceSamples.připojit (img_numpy [y: y + h, x: x + w])

Dříve jsme vytvořili seznam vzorků obličeje, ale byl prázdný. Zde přidáme do tohoto seznamu tváře a přidáme y až h, abychom získali dvě hodnoty souřadnic y a to samé se provede s x.

ID.připojit (id)

Nyní máme tvář v seznamu vzorků tváře, takže získáme její ID a přidáme jej také do seznamu ID.

návrat faceSamples, ids

Potom po tom všem vrátíme seznam vzorků obličejů a seznam ID.

tváře, ids = getImagesAndLabels ('datová sada')

Nezapomeňte, že getImagesAndLabels () je jen funkce. Tuto funkci tedy zavoláme a návratové hodnoty se uloží do proměnných tváře a ID.

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

Zde se odehrává skutečné školení. Metodu createLBPHFaceRecognizer () jsme použili někdy dříve a přiřadili jsme ji k proměnné rozpoznávače. Je čas na trénink!

rozpoznávač.uložit ('trenér / trenér.yml ')

Po tréninku se dostaneme k uložení výsledků z tréninku.
Po spuštění kódu vytvoří soubor s názvem trenér.yml, který by pak použil kód pro rozpoznávání obličeje.

Zde je kód rozpoznávání tváře:

import cv2
importovat numpy jako np
rozpoznávač = cv2.tvář.createLBPHFaceRecognizer ()
rozpoznávač.náklad („trenér / trenér.yml ')
cascadePath = "haarcascade_frontalface_default.xml "
faceCascade = cv2.CascadeClassifier (cascadePath)
font = cv2.FONT_HERSHEY_SIMPLEX
cam = cv2.VideoCapture (0)
zatímco je pravda:
ret, im = vačka.číst()
šedá = cv2.cvtColor (im, cv2.COLOR_BGR2GREY)
tváře = faceCascade.detectMultiScale (šedá, 1.2,5)
pro (x, y, w, h) v obličejích:
cv2.obdélník (im, (x-20, y-20), (x + w + 20, y + h + 20), (0,255,0), 4)
Id = rozpoznávač.předpovídat (šedá [y: y + h, x: x + w])
if (Id == 1):
Id = "Nazmi"
jiný:
Id = "Neznámý"
cv2.obdélník (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)
pokud cv2.waitKey (10) & 0xFF == ord ('q'):
přestávka
vačka.uvolnění()
cv2.destruAllWindows ()

Pokud sledujete článek od začátku, udělali jsme to dříve. Pokud jste to laskavě neudělali.

rozpoznávač.náklad („trenér / trenér.yml ')

Nezapomeňte, že jsme proškolili rozpoznávač a uložili soubor? Ano? Tento soubor nyní načítáme.

cascadePath = "haarcascade_frontalface_default.xml "

Pracovali bychom se souborem haarcascade a zde jsme přiřadili název souboru proměnné.

# Vytvořte klasifikátor z předem připraveného modelu
faceCascade = cv2.CascadeClassifier (cascadePath)

Zde můžeme provést klasifikaci kaskády v souboru haarcascade.

font = cv2.FONT_HERSHEY_SIMPLEX

Nastavíme typ písma, který se použije, když kód rozpozná tvář v obrázku a zobrazí název.

cam = cv2.VideoCapture (0)

Už jsme tu byli, ale tentokrát je čas poznat tváře. Pokud nevíte, co tento kód dělá, spustí webovou kameru.

zatímco je pravda:
ret, im = vačka.číst()
šedá = cv2.cvtColor (im, cv2.COLOR_BGR2GREY)
tváře = faceCascade.detectMultiScale (šedá, 1.2,5)
pro (x, y, w, h) v obličejích:

Všechny tyto kroky byly provedeny dříve. Pokud nevíte, co kód dělá, laskavě zkontrolujte kód, který byl použit k uložení obrázků.

cv2.obdélník (im, (x-20, y-20), (x + w + 20, y + h + 20), (0,255,0), 4)

To pomáhá webové kameře zjistit, kde jsou tváře, a umístí obdélník, který označuje tvář.

Id = rozpoznávač.předpovídat (šedá [y: y + h, x: x + w])

Alrerady jsme načetli soubor vlaku do rozpoznávače, takže je nyní schopen rozpoznat tvář.

if (Id == 1):
Id = "Já"
jiný:
Id = "Neznámý"

Po pokusu rozpoznat, o jakou tvář jde, zkontroluje ID a zjistí, zda existuje. Tady by hodnota Id byla jménem toho, kdo byl vlastněn tváří v tvář takovému ID, když se vytvářela datová sada obrazu.

cv2.obdélník (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 po nalezení vlastníka Id nakreslí kolem obličeje obdélník a umístí jméno vlastníka obličeje. Rozpoznán obličej!

cv2.imshow ('im', im)

Zde se snímek videa zobrazí s ohraničeným obdélníkem.

pokud cv2.waitKey (10) & 0xFF == ord ('q'):
přestávka
vačka.uvolnění()
cv2.destruAllWindows ()

Po dokončení můžete program zastavit stisknutím klávesy „q“, webová kamera se zastaví a zavře se.

Tam to máte, vaše webová kamera nyní dokáže rozpoznávat tváře a můžete ji použít, kdykoli budete chtít. Kromě použití webové kamery můžete také načíst obrázek, který však vyžaduje další kroky, než které jsou uvedeny v tomto článku.

Zdrojový kód použitý v jeho repozitáři github najdete. Napište nám také tweet, pokud máte nějaké komentáře nebo chcete diskutovat o @linuxhint

Hry Jak zachytit a streamovat vaši herní relaci v systému Linux
Jak zachytit a streamovat vaši herní relaci v systému Linux
V minulosti bylo hraní her považováno pouze za koníček, ale postupem času došlo v herním průmyslu k obrovskému nárůstu z hlediska technologie a počtu ...
Hry Nejlepší hry pro ruční sledování
Nejlepší hry pro ruční sledování
Oculus Quest nedávno představil skvělou myšlenku ručního sledování bez ovladačů. S neustále se zvyšujícím počtem her a aktivit, které provádějí podpor...
Hry Jak zobrazit překrytí OSD v linuxových aplikacích a hrách na celou obrazovku
Jak zobrazit překrytí OSD v linuxových aplikacích a hrách na celou obrazovku
Hraní her na celou obrazovku nebo používání aplikací v režimu celé obrazovky bez rozptýlení vás mohou odříznout od příslušných systémových informací v...