Hledání obličeje na fotografii v PHP

Mnohé webové služby umožňují kromě nahrání fotografie do webového alba i možnost označit osoby, které na fotografii jsou a vyznačit místo, v němž se nachází jejich obličeje. Někdy algoritmus odhadne, kde by obličeje mohly být, a nabídne už přednastavené oblasti. Jak to dělá a jak to můžete udělat i vy, se dozvíte v článku.

Rozpoznávání tváří na fotografiích je velmi zajímavá funkce, která na první pohled vypadá jako magie na pomezí scifi, vysoce výkonných strojů a špionážního románu. Můžete si podobné funkce všimnout např. ve vyhledávání obrázků na Google nebo ve Facebooku. Ve skutečnosti není vyhledání obličejů (face detection) na fotografii zase tak obtížné, a s trochou štěstí jej můžete svým uživatelům nabídnout i vy. (Pozor, aby nedošlo k omylu: Řeč je o vyhledání obličeje – tedy o nalezení místa v bitmapovém obrázku, kde se pravděpodobně nachází něčí obličej. Rozpoznání obličeje, tedy přiřazení nalezeného obrázku konkrétní osobě, už je úloha složitější, tou se zde nebudeme zabývat.)

Postupy vyhledání obličejů

Postupy, které jsou používané pro detekci obličejů v obrázku, shrnuje Robert Frischholz na stránce Facedetection Techniques. Nabízejí se následující způsoby:

Vyhledání obličeje na známém pozadí

Pokud je na fotografii předem známé pozadí (buď statická scéna, před níž je osoba vyfotografovaná, nebo jednobarevné pozadí), je detekce obličeje prostá – stačí algoritmicky „odmaskovat“ známou scénu nebo „neutrální pozadí“. Postup je tedy podobný známému klíčování (např. v televizi).

Je jasné, že touto technikou zjistíme jakýkoli cizorodý předmět, nemusí se jednat jen o obličej (dokonce nemusí jít ani o žádnou část lidského těla, ale může to být cokoli). Pro příklad uvedený v perexu nebude tedy tento postup nejvhodnější.

Nalezení obličeje podle barvy

Tato metoda využívá skutečnosti, že lidská kůže má poměrně specifické barvy. Což s sebou přináší několik nevýhod – krom toho, že fotografie musí být barevná. Citlivost algoritmu se odvíjí i od toho, jakou barvu kůže mají lidé na fotografii (a nejde jen o různé rasy; takové „umělé opálení“ s odstínem do oranžova také nebude asi v tabulkách lidských barev) a jaké světelné podmínky na fotografii panují.

Nalezení obličeje podle pohybu

Pokud nejsme při hledání omezeni statickou fotografií a máme k dispozici např. vstup z webkamery, můžeme tvář nalézt podle drobných změn. Nevýhoda této metody je opět zjevná: Zachytí jakýkoli pohyblivý objekt. Pokud má obraz v pozadí např. strom, kterému se hýbou listy ve větru, algoritmus jej vyhodnotí coby tvář.

Kombinovaná metoda

Výše zmíněné postupy lze podle možností téměř libovolně kombinovat, např. vyhodnocovat barvu a známé pozadí, nebo kombinovat všechny tři metody.

Rozpoznávání obličejů - ilustrace
Co zvládne člověk jedním pohledem, to může být pro stroj téměř neřešitelný problém – ilustrační foto autor

Hledání obličejů na neznámém a neomezeném pozadí

Existují i metody, které obcházejí omezení výše uvedených metod: Nevyžadují známé pozadí, nevyžadují ani předem známé barvy kůže a vystačí si se statickou fotografií. Vyžadují ovšem mnohem víc matematiky (nebo „magie“, jak kdo chce) než předchozí postupy.

Hledání obličejů na neznámém pozadí je disciplína, na níž jsou nasazovány třeba neuronové sítě, posílené např. o statistické metody. Další metoda využívá hledání modelové tváře (vychází z toho, že obličej je „něco jako ovál“, v němž jsou na určitých místech jiné výrazné geometrické objekty). Používá se měření Hausdorffovy dimenze nalezeného objektu (Hausdorffova dimenze je pojem známý z teorie fraktálů).

Pravděpodobně nejpoužívanější metodou pro vyhledávání obličejů je v současnosti vyhodnocování kaskád slabých klasifikátorů (popis metody Weak classifier cascades, česky je v hrubých rysech vysvětlena např. v prezentaci „Klasifikace a rozpoznávání“). Do podrobností zde nebudeme zabíhat.

Od teorie k praxi

Dobrá, víme tedy jaké metody se k hledání obličejů používají. Pojďme si ukázat, zda něco z toho můžeme použít prakticky.

OpenCV

Asi nejlepší možností je použít otevřenou knihovnu (licence BSD), která nese název OpenCV (Open source Computer Vision). Tato knihovna nabízí přes 500 funkcí, použitelných v nejrůznějších oblastech, které souvisí s počítačovým zpracováním obrazu. Knihovna byla původně vyvíjena společností IBM a je k dispozici pro Windows i pro Linux. Knihovnu lze přímo používat z C a C++, a pomocí wrapperů i z dalších jazyků, jako je Python.

Kromě jiných funkcí (neméně zajímavých) obsahuje OpenCV i implementaci obdoby výše zmíněného algoritmu, který využívá tzv. „Haar-like příznaky“ (Haar-like features, pojmenované podle podobnosti s Haarovou vlnkou). Lze jej použít právě pro nalezení obličeje na předložené fotce.

Implementaci vyhledání obličeje v jazyku C popisuje přímo dokumentace. My se podíváme na použití této knihovny v jazyce PHP.

PHP Facedetect

Rozpoznávání obličejů - ilustrace
Lena – Dnes už téměř klasická fotografie,
používaná při testování algoritmů pro zpracování obrazu

Pro jazyk PHP existuje rozšíření s názvem Facedetect, které zpřístupňuje funkce pro vyhledání obličejů z knihovny OpenCV. Přidává dvě nové funkce, pojmenované face_count() a face_detect(). Tyto funkce vrací počet detekovaných obličejů v obrázku, resp. pole obsahující souřadnice oblastí s obličeji.

Funkce, které nabízí rozšíření Facedetect, mají dva parametry. Prvním je cesta k souboru s obrázkem, druhým je cesta ke XML souboru s parametry pro algoritmus. Parametry vznikly postupným trénováním algoritmu na velkém množství tváří. Naštěstí si je nemusíte vymýšlet, ale jsou součástí knihovny. Knihovna obsahuje několik takových souborů, pojmenovaných haarcascade_***.xml  – např. haarcascade_fron­talface_alt_tre­e.xml, haarcascade_fu­llbody.xml, haarcascade_pro­fileface.xml, haarcascade_lo­werbody.xml, haarcascade_up­perbody.xml. Už jména souborů naznačují, na jakou část těla či na jaký obličej jsou trénovány.

Různé nastavení souboru s parametry a vliv na výsledné vyhledání obličeje na obrázku naleznete kupříkladu přímo na stránce rozšíření – Face detection in PHP.

Použití

S výše zmíněnými knihovnami není nijak složité využít algoritmu pro detekci lidského obličeje na předložených fotografiích v jazyce PHP. Postup instalace obou softwarových komponent pro linuxové systémy je popsán např. v článku Automatic Face Detection in Photos with PHP (včetně jednoduchého příkladu skriptu v PHP). Detekce je, díky knihovně napsané v C, dostatečně rychlá.

Do jisté míry kuriozita, ovšem funkční, je algoritmus pro detekci tváří, napsaný v čistém PHP, který nepoužívá OpenCV a je postaven pouze na standardní GD knihovně. Implementace vychází z algoritmu, který byl zveřejněn na blogu kpicturebooth (doména je v době psaní článku nedostupná), a který řešil podobnou úlohu v Javascriptu pomocí elementu canvas. Implementace v čistém PHP je ovšem pomalá a pro nasazení na reálném serveru velmi málo vhodná.

Závěr

Ukázali jsme si, že vyhledání obličejů na fotkách není vyhraženo pouze pro velmi výkonné stroje. Už dnes jsou k dispozici dostatečně výkonné algoritmy a knihovny, které lze použít ve vlastních aplikacích, a to včetně webových. Pokud tedy provozujete aplikaci, v níž jsou zpracovány fotografie a má smysl v nich vyhledávat obličeje, můžete zvážit, že tuto funkci uživatelům nabídnete. Je to jednodušší, než si možná myslíte.

Začal programovat v roce 1984 s programovatelnou kalkulačkou. Pokračoval k BASICu, assembleru Z80, Forthu, Pascalu, Céčku, dalším assemblerům, před časem v PHP a teď by rád neprogramoval a radši se věnoval starým počítačům.

Komentáře: 8

Přehled komentářů

v6ak Co tvar?
Jirka Vejrazka Vyborny clanek, dekuji!
Petr Petras Re: Vyborny clanek, dekuji!
Pěkné, ale Re: Hledání obličeje na fotografii v PHP
Martin Malý Re: Hledání obličeje na fotografii v PHP
Pěkné, ale Re: Hledání obličeje na fotografii v PHP
Clock Jak daleko se uz pocitace dostaly
mtd Re: Jak daleko se uz pocitace dostaly
Zdroj: https://www.zdrojak.cz/?p=3180