Recenze  |  Aktuality  |  Články
Doporučení  |  Diskuze
Fotoškola  |  Seriály
Fotoaparáty  |  Objektivy
Fotomobily  |   Software
Příslušenství  |  Ostatní
Svět hardware  |  TV Freak
Svět mobilně

Detekce a rozpoznání tváří: vím, kdo jsi!

19.3.2014, Milan Šurkala, článek
Detekce tváří se ve větším začala ve fotoaparátech používat zhruba před 7 lety. Dnes už vás fotoaparát i pozná. Problematika je ale širší, rozpoznávání tváří je velkém záležitostí i bezpečnosti a boji proti terorismu. Podívejme se na rozmach "Velkého Bratra".
Rozpoznání tváře se skládá v podstatě ze čtyř kroků. Prvním krokem je nalezení tváře v obraze. Následuje normalizace tak, aby obraz tváře měl předem dané standardizované rozměry a byl srovnatelný se vzorem nebo jinak akceptovatelný pro zvolený detektor. Následuje nalezení jednotlivých prvků, které budou pozorovány (kraje očí, nosu, úst, umístění brady, obočí a dalších významných bodů na tváři) s čímž souvisí čtvrtý krok, samotné rozpoznání tváře (oba tyto kroky jsou často prováděny současně). Třetí krok může fungovat i na základě konverze obrazové informace do jiného "úspornějšího" formátu, který ale bude dostatečně popisovat variabilitu rysů tváře (přestože s těmito rysy jako takovými v podstatě nebude pracovat). Nebudeme zabíhat do přílišných vědeckých podrobností, spíše se jen podíváme na principy.

Detekovat tvář můžete mnoha různými algoritmy. Jedním z nejznámějších je algoritmus Violy a Jonese. Ten pracuje na myšlence integrálního obrazu, algoritmu AdaBoost a kaskádového klasifikátoru. Počítají se jasové rozdíly mezi předem zvolenými ploškami ve výřezu, kde hledáme tvář. Tento výřez se posouvá obrazem, jde o jakési vyhledávací okno. K tomu se využívá již zmíněný integrální obraz. Díky němu lze spočítat hodnotu jasů v libovolně velké obdélníkové ploše s libovolným počtem pixelů pouhým jedním součtem a dvěma rozdíly. Snadno tak spočítáte rozdíl hodnot pixelů pod bílou a černou plochou, viz obrázek níže.





Algoritmus AdaBoost se pak na základě trénovací množiny (portréty lidí) snaží vytvořit soustavu slabých klasifikátorů, kterým jsou nastaveny co nejvhodnější váhy pro detekci a výsledkem je pak kaskádový klasifikátor. Ten funguje tak, že první klasifikátory v kaskádě se snaží co nejdříve vyloučit oblasti, které nejsou tváří s aspoň nějakou pravděpodobností. Pokud zkoumaný výřez přežije celou kaskádu, obličej je nalezen. Samozřejmě nelze čekat 100% úspěšnost. Z vlastní zkušenosti vím, že tak dobré úspěšnosti nedostanete, ani když algoritmus pustíte na datech, na kterých byl klasifikátor trénován (natož na datech v reálném životě). Jak již bylo řečeno, využívá se skenovacího okna, které "jezdí" po obraze a pro každý výřez kaskádovým klasifikátorem zkouší, zda tam je nebo není obličej. Algoritmus lze naučit na detekci v podstatě čehokoli, stačí mu jen předhodit jinou trénovací množinu.

Normalizace jako druhý krok má na starosti převedení detekované tváře na nějakou standardizovanou formu. To znamená nejen rozlišení, ale i vyrovnání jasů a případné lehké korekce perspektivy a natočení. Případně se obraz může převést na gradientní (v podstatě na hrany). Následuje detekce významných bodů ve tváři. Jak už jsme si naznačili, je potřeba najít kraje očí, jejich výšku, vzdálenosti mezi nimi, šířku nosu, vzdálenost od úst, šířku a výšku úst a mnoho dalších parametrů a na základě tohoto následuje rozpoznání tváře (toto je samozřejmě možné provést mnoha způsoby, třeba přikládáním šablony jednotlivých rysů).

Hlavně se tedy posuzují relativní polohy jednotlivých významných bodů ve tváři. Hodnoty se mohou srovnávat přímo, jednou z dalších metod je EBGM, kdy se jednotlivé rysy tváří projektují na graf a systém pak srovnává tyto grafy, může se využít také metoda SVM nebo neuronové sítě (ty mají počet vstupů podle počtu parametrů, na základě naučených vah jednotlivých vstupů se tyto vstupy "přechroustají" a vypadne výsledek). Počty těchto rysů se u prvních vědeckých prací zabývajících se touto technikou pohybovaly mezi 16 až 35. V dalších vědeckých pracích stoupaly i přes stovku, ale v zásadě se vždy přišlo na to, že stačí jen několik málo desítek parametrů.

Další možností je pracovat přímo s obrazem a jeho složitými matematickými reprezentacemi. Zde to platí např. o algoritmech PCA a LDA a jejich vylepšených verzích. Např. v případě PCA algoritmu se z každého obrazu vytvoří jednorozměrný vektor (hodnoty pixelů z celého obrazu v řádku za sebou), ze všech snímků se pak udělá průměr (první krok PCA algoritmu, posunou se tím souřadné osy dat tak, aby byly vzdálenosti jasu pixelů od souřadných os - průměrného jasu pixelu na dané pozici - co nejmenší) a každý snímek se odečte od tohoto průměru. Vznikne matice rozdílů jednotlivých pixelů v nové souřadné soustavě a následuje složitější matematika zahrnující kovarianční matice, vlastní čísla a vlastní vektory.

Cílem toho všeho je, aby bylo možno výrazně zredukovat dimenzi celého prostoru. Z deseti tisíců pixelů dostanete třeba jen 20-50 čísel (koeficientů) a "vlastních tváří" (eigenfaces), které dohromady reprezentují každý obraz (díky kombinaci eigenfaces a těchto čísel lze také zpětně rekonstruovat průměrnou tvář na původní - každá tvář má jiné koeficienty a tedy kombinace s jednotlivými eigenfaces vytvoří adekvátní původní obraz). A jistě už dobře tušíte, že nyní jen porovnáte mezi sebou tato čísla a pokud jsou si velmi podobná s některým záznamem v databázi, je pravděpodobnost shody (rozpoznání osoby) vysoká.





Rozpoznání tváře je možné v zásadě použít ke třem různým účelům. Prvním je verifikace. Tento proces má za úkol ověřit, zda jsem ten, za koho se vydávám, jde tedy o porovnání 1:1. Tedy naměřený obraz porovnám s jediným záznamem v databázi a zjišťuji, zda odpovídá. Pokud rádi sledujete americké filmy, určitě znáte proces, kdy při vstupu do nějakého zabezpečeného prostoru člověk nějak zadá svou identitu (např. zadá svůj specifický kód) a nechá sejmout i např. otisk prstu a podobně (verifikaci). Systém tedy už předem ví, koho má nasnímat a verifikuje, zda jej opravdu nasnímal. Jinak řečeno, verifikace je jak zadání hesla k uživatelskému jménu.

Druhým problémem je identifikace, která je velmi podobná předchozímu. Zde jde však o to, poskytnout biometrická data a k nim se hledá odpovídající identita. Systému poskytneme data a ten nám "vyplivne" výsledek, zda v databázi našel daného člověka. Jde o problém 1:N. Teda např. to, že máme otisk prstu na místě zločinu a v databázi hledáme odpovídající záznam. Tuto problematiku můžeme rozdělit ještě na dvě části. Buď máme uzavřenou množinu dat nebo otevřenou. Uzavřená znamená, že víme, že daný člověk v databázi je a hledáme jeho záznam (na základě poskytnutých biometrických dat neverifikujeme identitu - nevíme totiž kterou, ale teprve ji zjišťujeme), v otevřené jen zjišťujeme, zda už tam záznam náhodou není (např. hledání zločince za základě otisků prstů).

Poslední problémem je seznam hledaných. Máme seznam lidí, které hledáme (např. již zmínění zločinci) a v poskytnutých obrazech hledáme, zda se náhodou někdo z nich neobjeví. Zatímco první dva problémy se často využívají při ověřování přístupu, poslední je využíván (lépe řečeno jsou zde pokusy o jeho využití) v otázce bezpečnosti, např. při hledání teroristů.





A jak vůbec získáme data? Získání databáze je jednoduché v případě verifikace a identifikace. Jde totiž o vyžádaná biometrická data, ať už jde o snímek duhovky, otisk prstu, záznam hlasu nebo fotografie pro detekci tváří. Ty většinou poskytujete dobrovolně za předem kontrolovaných podmínek a nasnímaná data mohou být velmi kvalitní. Podstatně slabší je to u seznamu hledaných. Kriminální živly určitě dobrovolně nepřijdou, aby poskytly svá biometrická data a byly pak snáze k nalezení. Asi si jde opravdu těžko představit, že terorista přijde poskytnout do databáze své otisky prstů, nechat se kvalitně vyfotit, aby jej později bezpečnostní složky mohly snáze identifikovat a zadržet.

Získání dat pro vyhodnocování rozpoznání tváře (tedy reálný provoz) je další "vtipná" záležitost. Opět není moc velký problém u verifikace a identifikace, kdy např. pro vstup do určitého prostoru nebo pro prokázání své totožnosti např. v bance a jiných lze vcelku snadno zajistit dostatečně kvalitní pořízení biometrického záznamu za dostatečně podobných podmínek jaké byly u záznamu, který je v databázi a se kterým budeme pořízenou fotografii (nebo jiný biometrický záznam) porovnávat. V oblasti bezpečnosti je ale problém. Běžné CCTV kamery nemají nějak dramaticky vysoké rozlišení a tváře jsou na nich dost malé (ono ani na Full HD videu nebude tvář tvořit nějak velké množství pixelů), navíc jsou často umístěné ve vysokých výškách. Tváře tak snímají seshora, což způsobuje větší zkreslení nemluvě např. o tom, že např. kšiltovka z takového úhlu zakryje v podstatě celý obličej.

Další problém je v běžných reálných podmínkách osvětlení, jiné stíny v různých denních dobách a takto bychom mohli pokračovat dále. To, jak jsou tyto aplikace úspěšné, uvidíme v další kapitole. Data pro porovnání můžeme získat z fotografií (zde by neměl být problém s kvalitou kvůli nízkému šumu a vysokému rozlišení), z videa (problém s kvalitou), 3D snímky/video (pomocí dvojice kamer, promítáním strukturovaného obrazce pro zpětnou rekonstrukci 3D povrchu), dokonce se dá použít i snímání infračerveného světla a tedy různé teploty v různých oblastech tváře. Pro zajímavost, dokonce i dvojčata, která jsou vizuálně velmi podobná, mají rozdílnou strukturu cév pod pokožkou a díky tomuto jsou rozeznatelná.
Autor: Milan Šurkala
Vystudoval doktorský program v oboru informatiky a programování se zaměřením na počítačovou grafiku. Nepřehlédněte jeho seriál Fotíme s Koalou o základech fotografování.