Obsah:

Real-time Face Recognition: an End-to-end Project: 8 Steps (with Pictures)
Real-time Face Recognition: an End-to-end Project: 8 Steps (with Pictures)

Video: Real-time Face Recognition: an End-to-end Project: 8 Steps (with Pictures)

Video: Real-time Face Recognition: an End-to-end Project: 8 Steps (with Pictures)
Video: Build Real Time Face Detection With JavaScript 2024, Červenec
Anonim
Real-time Face Recognition: an end-to-end project
Real-time Face Recognition: an end-to-end project

Na mém posledním tutoriálu zkoumání OpenCV jsme se naučili AUTOMATICKÉ SLEDOVÁNÍ OBJEKTU VISION. Nyní použijeme náš PiCam k rozpoznávání tváří v reálném čase, jak vidíte níže:

obraz
obraz

Tento projekt byl proveden s touto fantastickou „Open Source Computer Vision Library“, OpenCV. V tomto tutoriálu se zaměříme na Raspberry Pi (tedy Raspbian jako OS) a Python, ale kód jsem také testoval na svém Macu a funguje také dobře. OpenCV byl navržen pro výpočetní efektivitu a se silným zaměřením na aplikace v reálném čase. Je tedy ideální pro rozpoznávání tváří v reálném čase pomocí fotoaparátu.

Abychom vytvořili kompletní projekt na rozpoznávání tváře, musíme pracovat na 3 velmi odlišných fázích:

  1. Detekce obličeje a shromažďování dat
  2. Vycvičte Rozpoznávač
  3. Rozpoznávání obličejů

Níže uvedený blokový diagram obnoví tyto fáze:

obraz
obraz

Krok 1: BoM - kusovník

Hlavní části:

  1. Raspberry Pi V3 - 32,00 USD
  2. 5megapixelový senzor 1080p Mini kamerový video modul OV5647 - US $ 13,00

Krok 2: Instalace balíčku OpenCV 3

Instalace balíčku OpenCV 3
Instalace balíčku OpenCV 3

Používám Raspberry Pi V3 aktualizovaný na poslední verzi Raspbian (Stretch), takže nejlepší způsob, jak mít nainstalovaný OpenCV, je sledovat vynikající tutoriál vyvinutý Adrianem Rosebrockem: Raspbian Stretch: Nainstalujte si na Raspberry Pi OpenCV 3 + Python.

Vyzkoušel jsem několik různých průvodců k instalaci OpenCV na můj Pi. Adriánův tutoriál je nejlepší. Radím vám, abyste udělali totéž a postupovali podle jeho pokynů krok za krokem.

Jakmile skončíte s Adrianovým tutoriálem, měli byste mít připravené virtuální prostředí OpenCV pro spouštění našich experimentů na vašem Pi.

Přejdeme do našeho virtuálního prostředí a potvrdíme, že je OpenCV 3 správně nainstalován.

Adrian doporučuje spustit příkaz „source“pokaždé, když otevřete nový terminál, abyste se ujistili, že vaše systémové proměnné byly správně nastaveny.

zdroj ~/.profile

Dále vstupme do našeho virtuálního prostředí:

workon cv

Pokud vidíte text (cv) před vaší výzvou, jste ve virtuálním prostředí cv:

(cv) pi@malina: ~ $Adrian upozorňuje, že virtuální prostředí cv Python je zcela nezávislé a oddělené od výchozí verze Pythonu, která je součástí stahování Raspbian Stretch. Takže žádné balíčky Pythonu v globálním adresáři site-packages nebudou k dispozici pro virtuální prostředí cv. Podobně žádné balíčky Pythonu nainstalované v balíčcích webů z cv nebudou k dispozici pro globální instalaci Pythonu

Nyní zadejte svůj tlumočník Pythonu:

krajta

a potvrďte, že používáte verzi 3.5 (nebo vyšší)

Do překladače (zobrazí se „>>>“) naimportujte knihovnu OpenCV:

importovat cv2

Pokud se neobjeví žádné chybové zprávy, je OpenCV správně nainstalován NA VAŠEM VIRTUÁLNÍM PROSTŘEDÍ PYTHON.

Můžete také zkontrolovat nainstalovanou verzi OpenCV:

cv2._ verze_

Měl by se objevit 3.3.0 (nebo vyšší verze, která může být vydána v budoucnu). Výše uvedený Terminal PrintScreen ukazuje předchozí kroky.

Krok 3: Testování fotoaparátu

Testování fotoaparátu
Testování fotoaparátu

Jakmile máte v RPi nainstalovaný OpenCV, vyzkoušejte, abychom potvrdili, že vaše kamera funguje správně.

Předpokládám, že máte na Raspberry Pi již nainstalovanou PiCam.

Do IDE zadejte níže uvedený kód Pythonu:

import numpy jako np

import cv2 cap = cv2. VideoCapture (0) cap.set (3, 640) # set Width cap.set (4, 480) # set Height while (True): ret, frame = cap.read () frame = cv2. flip (rámeček, -1) # Převrátit fotoaparát svisle šedě = cv2.cvtColor (rámeček, cv2. COLOR_BGR2GRAY) cv2.imshow ('rámeček', rámeček) cv2.imshow ('šedý', šedý) k = cv2.waitKey (30) & 0xff pokud k == 27: # stiskněte 'ESC' pro ukončení přestávky cap.release () cv2.destroyAllWindows ()

Výše uvedený kód zachytí stream videa, který bude generován vaším PiCam, a zobrazí oba v barevném a šedém režimu BGR.

Všimněte si toho, že jsem kameru otočil svisle kvůli způsobu sestavení. Pokud to není váš případ, komentujte nebo odstraňte příkazový řádek „flip“.

Kód si můžete alternativně stáhnout z mého GitHub: simpleCamTest.py

Chcete -li spustit, zadejte příkaz:

python simpleCamTest.py

Program dokončíte stisknutím klávesy [ESC] na klávesnici.

Před stisknutím klávesy [ESC] klikněte na okno videa

Výsledek ukazuje výše uvedený obrázek.

Někteří výrobci zjistili problémy při pokusu o otevření fotoaparátu (chybové zprávy „Assertion failed“). To se může stát, pokud kamera nebyla během instalace OpenCv povolena, a tak se ovladače kamery nenainstalovaly správně. Chcete -li opravit, použijte příkaz:

sudo modprobe bcm2835-v4l2

Můžete také přidat bcm2835-v4l2 na poslední řádek souboru /etc /modules, aby se ovladač při spuštění načítal.

Chcete-li se dozvědět více o OpenCV, můžete postupovat podle tohoto kurzu: načítání -video-python-opencv-tutorial

Krok 4: Detekce obličeje

Detekce obličeje
Detekce obličeje
Detekce obličeje
Detekce obličeje

Nejzákladnějším úkolem rozpoznávání tváře je samozřejmě „Detekce tváře“. Než něco uděláte, musíte „zachytit“tvář (fáze 1), abyste ji mohli rozpoznat, ve srovnání s novou tváří zachycenou v budoucnosti (fáze 3).

Nejběžnějším způsobem detekce obličeje (nebo jakýchkoli předmětů) je použití „Haar Cascade klasifikátor“

Detekce objektů pomocí kaskádových klasifikátorů založených na Haarových funkcích je účinná metoda detekce objektů, kterou navrhli Paul Viola a Michael Jones ve svém článku „Rychlá detekce objektů pomocí vylepšené kaskády jednoduchých funkcí“v roce 2001. Jedná se o přístup založený na strojovém učení, kde kaskádová funkce je vycvičena z mnoha pozitivních a negativních obrazů. Poté se používá k detekci objektů na jiných obrázcích.

Zde budeme pracovat s detekcí obličeje. Algoritmus zpočátku potřebuje k vycvičení klasifikátoru mnoho pozitivních obrázků (obrázky obličejů) a negativních obrázků (obrázky bez tváří). Potom z něj musíme extrahovat funkce. Dobrou zprávou je, že OpenCV přichází s trenérem i detektorem. Pokud chcete vycvičit svůj vlastní klasifikátor pro jakýkoli objekt, jako je auto, letadlo atd., Můžete jej vytvořit pomocí OpenCV. Jeho úplné podrobnosti jsou uvedeny zde: Školení kaskádového klasifikátoru.

Pokud si nepřejete vytvořit svůj vlastní klasifikátor, OpenCV již obsahuje mnoho předem vyškolených klasifikátorů pro obličej, oči, úsměv atd. Tyto soubory XML lze stáhnout z adresáře haarcascades.

Dost teorie, pojďme vytvořit detektor obličeje s OpenCV!

Stáhněte si soubor: faceDetection.py z mého GitHubu.

import numpy jako np

import cv2 faceCascade = cv2. CascadeClassifier ('Cascades/haarcascade_frontalface_default.xml') cap = cv2. VideoCapture (0) cap.set (3, 640) # set Width cap.set (4, 480) # set Height while True: ret, img = cap.read () img = cv2.flip (img, -1) grey = cv2.cvtColor (img, cv2. COLOR_BGR2GRAY) tváře = faceCascade.detectMultiScale (šedá, scaleFactor = 1,2, minNeighbors = 5, minSize = (20, 20)) pro (x, y, w, h) v plochách: cv2.rectangle (img, (x, y), (x+w, y+h), (255, 0, 0), 2) roi_gray = šedá [y: y+h, x: x+w] roi_color = img [y: y+h, x: x+w] cv2.imshow ('video', img) k = cv2.waitKey (30) & 0xff pokud k == 27: # stiskněte 'ESC' pro ukončení přestávky cap.release () cv2.destroyAllWindows ()

Věřte tomu nebo ne, výše uvedených několik řádků kódu je vše, co potřebujete k detekci obličeje pomocí Pythonu a OpenCV.

Když porovnáte s posledním kódem použitým k testování kamery, zjistíte, že do něj bylo přidáno několik částí. Všimněte si níže uvedeného řádku:

faceCascade = cv2. CascadeClassifier ('Cascades/haarcascade_frontalface_default.xml')

Toto je řádek, který načte „klasifikátor“(který musí být v adresáři s názvem „Cascades/“pod adresářem projektu).

Poté nastavíme kameru a uvnitř smyčky načteme naše vstupní video v režimu stupňů šedi (stejné, jaké jsme viděli dříve).

Nyní musíme zavolat naši funkci klasifikátoru a předat jí některé velmi důležité parametry, jako měřítko, počet sousedů a minimální velikost detekované tváře.

Faces = faceCascade.detectMultiScale (šedá, měřítko Faktor = 1,2, min Sousedé = 5, min Velikost = (20, 20))

Kde,

  • šedá je vstupní obrázek ve stupních šedi.
  • scaleFactor je parametr určující, jak moc se velikost obrázku zmenší v každém měřítku obrázku. Slouží k vytvoření pyramidy měřítka.
  • minNeighbors je parametr určující, kolik sousedů by měl mít každý kandidátský obdélník, aby byl zachován. Vyšší číslo dává nižší falešně pozitivní výsledky.
  • minSize je minimální velikost obdélníku, která má být považována za plochu.

Funkce detekuje tváře na obrázku. Dále musíme „označit“tváře na obrázku, například pomocí modrého obdélníku. To se provádí s touto částí kódu:

pro (x, y, w, h) v plochách:

cv2.rectangle (img, (x, y), (x+w, y+h), (255, 0, 0), 2) roi_gray = šedá [y: y+h, x: x+w] roi_color = obr [y: y+h, x: x+w]

Pokud jsou nalezeny tváře, vrátí polohy detekovaných tváří jako obdélník s levým horním rohem (x, y) a s „w“jako jeho šířkou a „h“jako jeho výškou ==> (x, y, w, h). Podívejte se na výše uvedený obrázek.

Jakmile získáme tato umístění, můžeme pro obličej vytvořit „ROI“(nakreslený obdélník) a výsledek prezentovat funkcí imshow ().

Spusťte výše uvedený pythonový skript ve svém pythonovém prostředí pomocí terminálu Rpi:

python faceDetection.py

Výsledek:

obraz
obraz

Můžete také zahrnout klasifikátory pro „detekci očí“nebo dokonce „detekci úsměvu“. V těchto případech zahrnete funkci klasifikátoru a vykreslení obdélníku uvnitř smyčky obličeje, protože by nemělo smysl detekovat oko nebo úsměv mimo obličej.

Všimněte si, že na Pi, když několik klasifikátorů na stejném kódu zpomalí zpracování, jakmile tato metoda detekce (HaarCascades) využívá velké množství výpočetního výkonu. Na ploše je jednodušší jej spustit.

Na mém GitHubu najdete další příklady:

faceEyeDetection.py

faceSmileDetection.py

faceSmileEyeDetection.py

A na výše uvedeném obrázku vidíte výsledek.

Můžete také postupovat podle níže uvedeného návodu, abyste lépe porozuměli rozpoznávání tváře:

Haar Cascade Object Detection Face & Eye OpenCV Python Tutorial

Krok 5: Shromažďování dat

Sběr dat
Sběr dat
Sběr dat
Sběr dat

Nejprve musím poděkovat Ramizovi Rajovi za jeho skvělou práci na rozpoznávání tváře na fotografiích:

UZNÁNÍ TVÁŘE S POUŽITÍM OPENCV A PYTHONU: PŘÍRUČKA PRO ZAČÁTEČNÍKY

a také Anirban Kar, který vyvinul velmi komplexní výukový program pomocí videa:

UZNÁNÍ TVÁŘE - 3 díly

Opravdu doporučuji podívat se na oba návody.

Když to řekneme, začněme první fází našeho projektu. To, co zde uděláme, začíná od posledního kroku (Detekce obličejů), jednoduše vytvoříme datovou sadu, kam pro každé ID uložíme skupinu fotografií v šedé barvě s částí, která byla použita pro detekci obličeje.

Nejprve vytvořte adresář, kde vyvíjíte svůj projekt, například FacialRecognitionProject:

mkdir FacialRecognitionProject

V tomto adresáři jsme kromě 3 skriptů pythonu, které pro náš projekt vytvoříme, museli mít uložený klasifikátor obličejů. Můžete si jej stáhnout z mého GitHub: haarcascade_frontalface_default.xml

Dále vytvořte podadresář, kam budeme ukládat naše vzorky obličeje a pojmenujeme jej „dataset“:

datový soubor mkdir

A stáhněte si kód z mého GitHub: 01_face_dataset.py

importovat cv2

import os cam = cv2. VideoCapture (0) cam.set (3, 640) # set video width cam.set (4, 480) # set video height face_detector = cv2. CascadeClassifier ('haarcascade_frontalface_default.xml') # For each person, zadejte jedno číselné ID obličeje face_id = vstup ('\ n zadejte ID uživatele konec stiskněte ==>') tisk ("\ n [INFO] Inicializace snímání obličeje. Podívejte se na kameru a počkejte …") # Inicializujte počet jednotlivých vzorkovacích obličejů = 0 while (True): ret, img = cam.read () img = cv2.flip (img, -1) # flip video image vertically grey = cv2.cvtColor (img, cv2. COLOR_BGR2GRAY) Faces = face_detector.detectMultiScale (šedá, 1,3, 5) pro (x, y, w, h) v plochách: cv2.rectangle (img, (x, y), (x+w, y+h), (255, 0, 0), 2) count + = 1 # Uložte zachycený obrázek do složky datových sad cv2.imwrite ("dataset/User." + str (face_id) + '.' + str (count) + ".jpg", šedá [y: y + h, x: x+w]) cv2.imshow ('image', img) k = cv2.waitKey (100) & 0xff # Stiskněte 'ESC' pro ukončení videa, pokud k == 27: počet přerušení elif> = 30: # Vezměte 30 vzorků tváří a zastavte přestávku videa # Do ab it of cleanup print ("\ n [INFO] Ukončení programu a vyčištění věcí") cam.release () cv2.destroyAllWindows ()

Kód je velmi podobný kódu, který jsme viděli pro detekci obličeje. To, co jsme přidali, byl „vstupní příkaz“k zachycení ID uživatele, což by mělo být celé číslo (1, 2, 3 atd.)

face_id = vstup ('\ n zadejte ID uživatele konec stiskněte ==>')

A pro každý jeden ze zachycených rámců bychom jej měli uložit jako soubor v adresáři „datové sady“:

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

Pro uložení výše uvedeného souboru musíte mít importovanou knihovnu „os“. Název každého souboru bude mít strukturu:

User.face_id.count.jpg

Například pro uživatele s face_id = 1 bude 4. ukázkový soubor v datové sadě/ adresáři něco jako:

Uživatel.1.4.jpg

jak je znázorněno na výše uvedené fotografii z mého Pi. Na mém kódu zachycuji 30 vzorků z každého ID. Můžete to změnit na posledním „elifu“. Počet vzorků se používá k přerušení smyčky, kde jsou zachyceny vzorky obličeje.

Spusťte skript Python a zachyťte několik ID. Skript musíte spustit pokaždé, když chcete agregovat nového uživatele (nebo změnit fotografie za již existujícího).

Krok 6: Trenér

Trenér
Trenér

V této druhé fázi musíme převzít všechna uživatelská data z naší datové sady a „školit“OpenCV Recognizer. To se provádí přímo konkrétní funkcí OpenCV. Výsledkem bude soubor.yml, který bude uložen do adresáře „trenér/“.

Začněme tedy vytvářet podadresář, kam budeme ukládat natrénovaná data:

trenér mkdir

Stáhněte si z mého GitHubu druhý skript pythonu: 02_face_training.py

importovat cv2

import numpy as np from PIL import Image import os # Path for face image database path = 'dataset' recognitionnizer = cv2.face. LBPHFaceRecognizer_create () detector = cv2. CascadeClassifier ("haarcascade_frontalface_default.xml"); # funkce pro získání obrázků a dat štítků def getImagesAndLabels (cesta): imagePaths = [os.path.join (cesta, f) pro f v os.listdir (cesta)] faceSamples = ids = pro imagePath v imagePaths: PIL_img = Image.open (imagePath).convert ('L') # převede jej na stupně šedi img_numpy = np.array (PIL_img, 'uint8') id = int (os.path.split (imagePath) [-1]. rozdělit (".") [1]) Faces = detector.detectMultiScale (img_numpy) for (x, y, w, h) in faces: faceSamples.append (img_numpy [y: y+h, x: x+w]) ids.append (id) return faceSamples, ids print ("\ n [INFO] Tréninkové tváře. Bude to trvat několik sekund. Počkejte …") tváře, ids = getImagesAndLabels (cesta) rozpoznávání.train (tváře, np.array (ids)) # Uložte model do trenéra/trenéra.yml ("\ n [INFO] {0} tváře vyškoleny. Ukončení programu".format (len (np.unique (ids))))

Potvrďte, zda máte ve svém Rpi nainstalovanou knihovnu PIL. Pokud ne, spusťte v Terminálu následující příkaz:

pip install polštář

Jako rozpoznávač použijeme rozpoznávač tváří LBPH (LOCAL BINARY PATTERNS HISTOGRAMS), který je součástí balíčku OpenCV. Děláme to v následujícím řádku:

rozpoznávač = cv2.face. LBPHFaceRecognizer_create ()

Funkce „getImagesAndLabels (cesta)“pořídí všechny fotografie v adresáři: „dataset/“a vrátí 2 pole: „ID“a „obličeje“. S těmito poli jako vstupem „vycvičíme náš rozpoznávač“:

Reconizer.train (tváře, ID)

V důsledku toho bude soubor s názvem „trainer.yml“uložen do adresáře trenéra, který jsme dříve vytvořili.

A je to! Zahrnul jsem poslední tiskový výpis, kde jsem zobrazil pro potvrzení počet obličejů Uživatele, které jsme trénovali.

Pokaždé, když provedete Fázi 1, musí být spuštěna také Fáze 2

Krok 7: Rozpoznávač

Rozpoznávač
Rozpoznávač
Rozpoznávač
Rozpoznávač

Nyní jsme se dostali do finální fáze našeho projektu. Zde na naši kameru zachytíme čerstvý obličej a pokud tato osoba předtím zachytila a vycvičila svůj obličej, náš rozpoznávač vytvoří „predikci“, která vrátí jeho ID a index, což ukazuje, jak si je rozpoznávač s touto shodou jistý.

Pojďme si stáhnout skript třetí fáze pythonu z mého GitHub: 03_face_recognition.py.

importovat cv2

import numpy jako np import os rozpoznávač = cv2.face. LBPHFaceRecognizer_create () font = cv2. FONT_HERSHEY_SIMPLEX #iniciate id counter id = 0 # names related to ids: example ==> Marcelo: id = 1, etc names = ['None', 'Marcelo', 'Paula', 'Ilza', 'Z ',' W '] # Inicializujte a spusťte nahrávání videa v reálném čase cam = cv2. VideoCapture (0) cam.set (3, 640) # nastavte šířku videa cam.set (4, 480) # nastavte výšku videa # Definujte minimální velikost okna být rozpoznán jako obličej minW = 0,1*cam.get (3) minH = 0,1*cam.get (4) zatímco True: ret, img = cam.read () img = cv2.flip (img, -1) # Překlopit svisle šedě = cv2.cvtColor (img, cv2. COLOR_BGR2GRAY) tváře = faceCascade.detectMultiScale (šedá, scaleFactor = 1,2, minNeighbors = 5, minSize = (int (minW), int (minH)),) pro (x, y, w, h) v obličejích: cv2.rectangle (img, (x, y), (x+w, y+h), (0, 255, 0), 2) id, spolehlivost = rozpoznávač.predvídat (šedá [y: y+h, x: x+w]) # Zkontrolujte, zda je důvěra menší než 100 ==> „0“je dokonalá shoda, pokud (spolehlivost <100): id = jména [id] spolehlivost = "{0}% ".formát (kulatý (100 - spolehlivost)) else: id =" neznámý "spolehlivý =" {0}%". formát (kulatý (100 - konf. idence)) cv2.putText (img, str (id), (x+5, y-5), font, 1, (255, 255, 255), 2) cv2.putText (img, str (spolehlivost), (x+5, y+h-5), písmo, 1, (255, 255, 0), 1) cv2.imshow ('kamera', obrázek) k = cv2.waitKey (10) & 0xff # Stiskněte 'ESC' pro ukončení videa, pokud k == 27: break # Proveďte trochu vyčištění tisku ("\ n [INFO] Ukončení programu a vyčištění věcí") cam.release () cv2.destroyAllWindows ()

Zahrnujeme zde nové pole, takže místo očíslovaných ID zobrazíme „jména“:

names = ['None', 'Marcelo', 'Paula', 'Ilza', 'Z', 'W']

Například: Marcelo provede uživatele s id = 1; Paula: id = 2 atd.

Dále budeme detekovat obličej, stejně jako předtím s klasifikátorem haasCascade. S rozpoznanou tváří můžeme volat nejdůležitější funkci ve výše uvedeném kódu:

id, spolehlivost = rozpoznávač.predvídat (šedá část obličeje)

Reconizer.predict () vezme jako parametr zachycenou část obličeje, která má být analyzována, a vrátí svého pravděpodobného vlastníka, přičemž uvede jeho ID a jak velkou důvěru má rozpoznávač ve vztahu k této shodě.

Všimněte si, že index spolehlivosti vrátí „nulu“, pokud bude považován za dokonalou shodu

A nakonec, pokud rozpoznávač mohl předpovědět obličej, vložíme na obrázek text s pravděpodobným ID a kolik je „pravděpodobnost“v %, že shoda je správná („pravděpodobnost“= 100 - index spolehlivosti). Pokud ne, na obličej se umístí štítek „nevědět“.

Pod gifem s výsledkem:

obraz
obraz

Na výše uvedeném obrázku ukazuji několik testů provedených s tímto projektem, kde jsem také použil fotografie k ověření, zda rozpoznávání funguje.

Krok 8: Závěr

Závěr
Závěr

Jako vždy doufám, že tento projekt pomůže ostatním najít cestu do vzrušujícího světa elektroniky!

Podrobnosti a konečný kód naleznete v mém depozitáři GitHub: OpenCV-Face-Recognition

Pro více projektů navštivte můj blog: MJRoBot.org

Níže letmý pohled na budoucí tutoriál, kde prozkoumáme „automatické sledování obličeje a další metody detekce obličeje“:

obraz
obraz

Saludos z jihu světa!

Uvidíme se v mém dalším pokynu!

Děkuji, Marcelo

Doporučuje: