Hledání tváří na starých fotkách
Vyšší rozlišení dávalo horší výsledky a licence MIT neznamenala volnou ruku. Co jsme naměřili, než jsme si vybrali nástroj.
4 minuty čtení
Když máte v digitálním archivu stovky naskenovaných rodinných fotografií, ruční ořezávání jednotlivých obličejů k pojmenování je práce na týdny. Logickým krokem je nechat počítač, aby tváře vyhledal sám a nabídl vám hotové výřezy. Na první pohled to vypadá jako dávno vyřešená úloha. Když jsme však začali hledat vhodný nástroj pro vlastní zpracování, narazili jsme na několik překvapení, která běžné návody nezmiňují. Rozhodli jsme se nespoléhat na obecná doporučení a všechno jsme si sami změřili na reálných historických snímcích. Zde jsou výsledky a důvody, proč jsme nakonec zvolili konkrétní řešení.
Licence, která se tváří jako svobodná
Při výběru softwaru jsme nejprve narazili na právní zádrhel. Nejkvalitnější a nejčastěji doporučovaný nástroj InsightFace (využívající detektor RetinaFace) má samotný zdrojový kód publikovaný pod licencí MIT. To na první pohled slibuje volnou ruku. Jenže v dokumentaci projektu stojí zásadní věc: předtrénované modely jsou určené výhradně pro nekomerční výzkum. Kód a samotný model jsou dvě různé věci a licence se u nich liší. Pro čistě soukromé bádání v rodinném archivu to sice stačí, ale ve chvíli, kdy by se z nástroje měla stát placená služba pro další zájemce, narazíte na licenční omezení. Druhé časté doporučení, YOLO-face, stojí na knihovně pod licencí AGPL-3.0. Tato licence při provozu formou síťové služby vyžaduje zveřejnit celý vlastní zdrojový kód. Nástroj, který nám nakonec vyšel nejlépe, je model YuNet z knihovny OpenCV. Samotný kód má licenci Apache 2.0 a model MIT - obojí bez omezujících podmínek. Velkou výhodou je i to, že model má velikost pouhých 225 kB a je přímou součástí běžné instalace knihovny, takže není potřeba stahovat a konfigurovat žádné další soubory.
Vyšší rozlišení je horší, ne lepší
Při práci se starými fotografiemi intuice velí předložit modelu sken v co nejvyšším rozlišení, aby zachytil i nezřetelné detaily. Zkoušeli jsme chování na dvanácti skutečných rodinných fotografiích a výsledek byl přesně opačný.
| delší strana obrázku | nalezeno tváří | fotek bez jediného nálezu |
|---|---|---|
| 800 px | 22 | 0 |
| 1 600 px | 25 | 0 |
| 3 000 px | 23 | 4 |
Při rozlišení 3 000 px byly obličeje pro model příliš velké a čtyři fotografie ze dvanácti skončily úplně bez nálezu. Jako optimum nám vyšlo zmenšení delší strany snímku kolem 1 600 px. Je potřeba dodat, že toto pravidlo platí pro náš zkušební vzorek rodinných portrétů a menších skupin. U velkých společenských či školních fotografií s třiceti lidmi může vyjít optimum jinak, protože jednotlivé tváře jsou na ploše snímku podstatně menší.
Práh jistoty rozhoduje o tom, koho ztratíte
Každý detektor vrací ke každé nalezené tváři hodnotu jistoty od 0 do 1. Výchozí nastavení bývá poměrně přísné, aby program neukazoval falešné rámečky. Pro genealogický archiv je to však nevhodný přístup.
| práh jistoty | nalezeno tváří | fotek bez jediného nálezu |
|---|---|---|
| 0,9 | 12 | 6 |
| 0,6 | 25 | 0 |
| 0,3 | 78 | 0 |
| 0,1 | 213 | 0 (už jen šum) |
Přísný práh 0,9 nechal polovinu fotografií úplně bez nálezu. Přehlédli jsme tak i zcela zřetelné tváře. Naopak při snížení prahu na 0,1 model označil přes dvě stě míst, z nichž většinu tvořily stíny, knoflíky nebo vzory na pozadí. Zvolili jsme proto dvoustupňové řešení. Prahovou hodnotu 0,5-0,6 používáme pro tváře, které se badateli rovnou nabídnou k pojmenování. Méně jisté nálezy v rozmezí 0,2-0,5 jsme schovali pod tlačítko „Někdo tu chybí?". Důvod je jednoduchý: přehlédnutý člověk je ztráta navždy, kterou už nikdo nemusí objevit, kdežto smazání falešného nálezu stojí jedno kliknutí.
Výřez musí být větší než obličej
Detektor vrátí souřadnice těsného obdélníku od brady k čelu. Když takový detail předložíte badateli, málokdo příbuzného pozná. Poznávacím znamením na starých fotografiích bývají vlasy, účes, límec šatů nebo klobouk. Nalezený výřez proto automaticky zvětšujeme zhruba 1,5x až 2x oproti původnímu rámečku. Zároveň nenatáčíme nakloněné hlavy do vodorovné polohy. Algoritmům takové narovnání sice pomáhá, ale člověk vytržený a pootočený obličej bez původního náklonu těla poznává jen velmi obtížně. Detekce tváří na starých fotografiích není vyřešený problém, který stačí odbýt univerzálním skriptem. Nastavení rozlišení, prahů i práce s výřezy představuje volbu kompromisů, která se na jiných typech fotek může chovat odlišně. Naše měření však ukázalo, že s otevřeným modelem YuNet a vhodně nastavenými parametry lze dosáhnout spolehlivých výsledků přímo na vlastním počítači.