Anonymizace fotek pro službu Panorama

Tým Vyhledávání 26. ledna 2018

Jednou ze služeb, kterou Seznam provozuje, je Panorama, která zprostředkovává virtuální procházku po českých cestách. S pořizováním fotek veřejného prostoru souvisí zákonná povinnost anonymizace obličejů a státních poznávacích značek vozidel. Dosavadní řešení bylo z různých důvodů neuspokojivé, proto jsme dostali zadání najít lepší postup.

Úkolem bylo najít algoritmus pro detekci obličejů a SPZ, který by úspěšně detekoval i objekty, se kterými mělo předchozí řešení problémy, a naopak nedetekoval objekty, které předchozí řešení chybně označilo jako obličej, nebo SPZ. Bonusem by bylo, pokud by se nám podařilo dosáhnout takového výsledku, který by označoval obličeje pouze skutečných lidí a ne obličeje na různých reklamních plakátech. Vzhledem k množství obrázků, které je potřeba zpracovávat, bylo nutné splnit i požadavek na maximální dobu zpracování jednoho obrázku.

Díky úrovni, jaké dosahují hluboké neuronové sítě při zpracování obrázků, bylo rozhodnutí, jakým směrem se při výzkumu vydat, poměrně jednoznačné. Pro naučení neuronové sítě je však potřeba dostatečné množství dat a nejlépe takových, které by odpovídaly datům, která se budou danou sítí zpracovávat. Nejlepší by tak bylo mít oanotované přímo fotky z Panoramy. Neuronové sítě však lze trénovat i pomocí takzvaného transferu znalostí (transfer learning), při kterém se síť naučí na obecném (často volně dostupném) datasetu a potom už se jen odladí na datasetu specifickém pro daný úkol, který tak může být výrazně menší.

Prvním přístupem, který jsme vyzkoušeli, byla zjednodušená implementace algoritmu Mask R-CNN. Kvůli otestování přístupu jsme úkol omezili pouze na detekci obličejů, čímž odpadla nutnost klasifikace detekovaných objektů. Samotná síť byla tvořená 6 konvolučními vrstvami. U konvolučních neuronových sítí platí, že každá buňka sítě “vidí” pouze konkrétní oblast vstupního obrázku, přičemž čím vzdálenější je vrstva dané buňky od vstupního obrázku, tím větší oblast pokrývá. Pokud u výstupní (v tomto případě šesté) konvoluční vrstvy nastavíme jako aktivační funkci sigmoidu, získáme na výstupu sítě dvourozměrné pole, v němž každá hodnota odpovídá pravděpodobnosti, že se v odpovídajícím výřezu obrázku nachází obličej (případně jeho část). Výsledky tohoto přístupu byly poměrně slibné.

Před dalším rozvojem výše popsaného řešení vydal Google TensorFlow Object Detection API. Jedná se o knihovnu obsahující několik modelů pro detekci objektů v obrázcích (obsahuje například modely Faster R-CNN, RFCN a SSD v kombinaci se sítěmi Inception, ResNet a další, v některých případech včetně předučených vah). Dalším krokem tak bylo využití právě této knihovny, která umožňovala vyzkoušet větší množství komplexních modelů bez nutnosti jejich implementace. Sítě byly postupně trénovány a validovány nad datasetem obsahujícím obrázky z Panoramy s anotacemi státních poznávacích značek. Z testovaných modelů dopadla nejlépe neuronová síť Faster R-CNN Inception ResNet v2 (jak může být patrné i z tabulky, modely nad sítí NASNet nebyly v době řešení projektu dostupné).

Jedním z požadavků na výsledné řešení byla maximální doba, po kterou může model zpracovávat jeden obrázek na procesoru (bez využití grafické karty). Tuto podmínku nejlepší model překročil v úvodní konfiguraci více než sedminásobně. Touto úvodní konfigurací byla především instalace tensorflow pomocí aplikace pip. Výrazného zrychlení (u daného modelu ze 110 na 40 sekund pro obrázek o rozlišení 1536 x 1024 pixelů a využití jednoho procesorového vlákna) jsme dosáhli jen tím, že jsme použili tensorflow zkompilované přímo pro daný procesor (tj. při výpočtu byly využity i pokročilé instrukce SSE4.1, AVX a další). I tak čas více než dvojnásobně překračoval požadovanou hranici. Po dalších krocích a ověřování byly obrázky zmenšeny na 90% a na jejich zpracování vybrán model R-FCN ResNet 50, který na zkompilovaném tensorflow a jednom procesorovém vlákně zpracovával 1 obrázek necelých 11 sekund. Tento model měl sice horší výsledky v porovnání s modely založenými na Faster R-CNN, mezi modely splňujícími dané časové omezení však vycházel nejlépe.

Druhým požadavkem bylo snížení počtu detekcí obličejů na plakátech a billboardech. Předchozí řešení tyto obličeje detekovalo, bylo proto možné využít jeho detekce pro předanotování datasetu. Anotátoři následně ručně označili skutečné obličeje. Tímto přístupem jsme získali kromě anotací obličejů a SPZ i anotace těžkých negativních příkladů pro obě třídy. Mezi těžké negativní příklady nepatřily jen obličeje na plakátech, ale například i shluky skvrn, které  vzdáleně připomínaly obličeje (skupiny mraků, skvrny na bříze, okna na domě, …). Výsledný klasifikátor se učil na všech čtyřech třídách objektů (obličej, SPZ, ne-obličej, ne-SPZ). Použití těžkých negativních příkladů snížilo množství falešně pozitivních detekcí a tím i počet detekovaných obličejů na billboardech. Přidání tříd s těžkými negativními příklady tak zlepšilo specializaci detektorů pro obličeje a SPZ.

Od doby práce na projektu došlo ke zveřejnění dalších zajímavých technologií, které by umožnily zlepšení výsledku. Jednou z takových technologií jsou konvoluční sítě z rodiny NASNet, jejichž architektura byla automaticky vygenerována pomocí rekurentní neuronové sítě (více viz Learning Transferable Architectures for Scalable Image Recognition a AutoML for large scale image classification and object detection). Tyto sítě dosahují dobrých výsledků i při snížení počtu operací (díky čemuž jsou rychlejší než srovnatelné neuronové sítě navržené lidmi). Své implementace neuronových sítí pro detekci objektů před nedávnem zveřejnil i Facebook a to v rámci projektu Detectron.

Další zdroje

[1] YANG, Shuo, Ping LUO, Chen Change LOY a Xiaou TANG. WIDER Face: A Face Detection Benchmark. Las Vegas: IEEE Conference on Computer Vision and Pattern Recognition (CVPR). 2016. Dostupné také z: https://arxiv.org/pdf/1511.06523.pdf.

[2] WIDERFace

Tým Vyhledávání

Sdílet na sítích