Wykrywanie zakrycia twarzy za pomocą sieci neuronowych
Podziel się

Aby wykonać poprawne zdjęcie do dowodu osobistego należy spełnić szereg warunków – jednym z nich jest odsłonięty owal twarzy. Wszystkie kluczowe elementy fizjonomii, takie jak usta, nos, oczy czy brwi powinny być widoczne, a także nic nie powinno zaburzać naturalnego kształtu twarzy. Tak mówi ustawa o Aktach Stanu Cywilnego.

Zastanówmy się co może być najczęstszym powodem zasłonięcia wizerunku osoby znajdującej się na zdjęciu. Ustawodawca podaje nam jako przykłady zasłonięcie twarzy zabawką lub innym przedmiotem oraz włosami. Po zastanowieniu możemy dojść do tego, że przyczyną zasłonięcia może być także za długa grzywka (wchodząca na brwi i oczy), nakrycie głowy (czapki, turbany), duża biżuteria, kołnierze czy szale. Jak mądrze wyeliminować takie przypadki? Z pomocą przyjdą nam dwa rozwiązania z dziedziny sztucznej inteligencji – Face Detection Api z pakietu Google ML Kit oraz sieć do segmentacji semantycznej BiseNet wytrenowana na datasecie CelebAMask-HQ.

Przyjrzyjmy się najpierw drugiej z tych sieci. Jej zadaniem jest segmentacja semantyczna czyli podział obrazu na pewne konkretne, ustalone wcześniej obszary. W przypadku tej sieci są to głównie elementy fizjonomii takie jak skóra twarzy, usta, oczy, brwi, uszy czy włosy, ale także ubranie, czapki i biżuteria. Wyniki takiego podziału możemy obserwować na zdjęciu 2. To dzięki tej właśnie sieci możemy sprawdzić czy osoba znajdująca się na zdjęciu posiada jakieś nakrycie głowy lub kolczyki. Nakrycia głowy na zdjęciach do dokumentów są w Polsce zakazane nie tylko ze względu na możliwość zakrycia twarzy, ale zawsze, o ile ich noszenie nie jest podyktowane względami religijnymi. Dlatego jeśli nakrycie głowy zostanie odkryte na fotografii możemy ją od razu odrzucić jako błędną. W przypadku kolczyków sprawa nie jest tak oczywista, nie są one zakazane, o ile nie są przesadnie duże i nie wpływają na widok twarzy. Samo więc wykrycie biżuterii nie powoduje odrzucenia zdjęcia, ale już sprawdzenie jej wielkości w stosunku do wielkości twarzy jest ważnym wyznacznikiem.

Sprawdzenie czy biżuteria znajdująca się na zdjęciu nie jest zbyt duża odbywa się w ten sposób, że najpierw pozwalamy naszej sieci segmentującej podzielić fotografię twarzy na wszystkie wykrywane przez nią obszary. W kolejnym kroku liczymy pole skóry twarzy i pole zajmowane przez kolczyki. Następnie porównujemy ze sobą te wartości. Na podstawie wielu testów określiliśmy, że kolczyki większe niż 0,5% skóry twarzy można już uznać za zbyt duże dla potrzeb zdjęć do dokumentów.

zdjęcie 2: Semantyczna segmentacja twarzy siecią BiseNet wytrenowaną na zbiorze danych CelebAMask-HQ
źródło: https://github.com/zllrunning/face-parsing.PyTorch

Wyeliminowanie kwestii biżuterii i nakryć głowy daje bardzo duży uzysk, jednak nie są to wcale najczęstsze przypadki zakrycia twarzy na fotografiach. Najbardziej typowe, bowiem, są zakrycia twarzy spowodowane włosami – zbyt długie, zachodzące na brwi i oczy grzywki, rozpuszczone włosy zakrywające boki policzków, luźne kosmyki przechodzące przez twarz. Ten problem był dużo bardziej złożony i nie można było rozwiązać go za pomocą sprawdzania obecności włosów lub nawet liczenia ich powierzchni. Sam fakt posiadania nawet najbujniejszej fryzury nie jest jednoznaczny z zasłonięciem twarzy. Należało wprowadzić zupełnie nowe podejście i w tym pomogło nam kolejne z narzędzi – Face Detection Api z pakietu Google ML Kit.

To rozwiązanie pozwala szybko wykrywać twarze i zaznacza na nich kluczowe punkty opisane na zdjęciu 3. Nie daje nam to informacji jakiej wielkości są konkretne elementy na twarzy, ale szybko daje znać gdzie dokładnie się ona znajduje. Postanowiliśmy to wykorzystać.

Jak możemy zauważyć na poniższym zdjęciu, niebieska linia łączy 36 punktów wyznaczające obrys twarzy, standardowo przebiegający po prawej i lewej stronie twarzy oraz brodę (w środku obrysu twarzy) oraz przez połowę czoła. Połączenie wszystkich tych punktów w jedną, spójną maskę daje nam informację, gdzie według sieci detekcyjnej znajduje się twarz.

Sieć ta jest odporna na wszelkiego rodzaju przysłonięcia twarzy. Na podstawie wielu informacji, takich jak rozstawienie oczu, umieszczenie nosa itp. dokładnie przewiduje gdzie znajduje się cała twarz, nawet jeśli jej do końca nie widać. Za to wcześniej przez nas przedstawiona sieć segmentacyjna oznacza skórę twarzy tylko tam, gdzie jest ona widoczna. Łatwo zauważyć, że prawdopodobnie tam, gdzie te dwie sieci zwracają niepokrywające się maski nastąpiło jakiegoś rodzaju zakrycie.

zdjęcie 3: Rozmieszczenie kluczowych punktów na twarzy i odpowiadające im numery z ML Kit Face Detection
źródło: https://developers.google.com/ml-kit/vision/face-detection

Ewentualnym problemem przy takim podejściu mogą okazać się… grzywki. W ogólności przecież grzywka nie jest fryzurą zakazaną na zdjęciach do dokumentów, zakazana jest jedynie taka zasłaniająca brwi i/lub oczy. Jednak jak już wcześniej zauważyliśmy punkty detekcji z ML Kit Api przechodzą w połowie czoła. Jeśli poniżej tej linii znajdą się włosy zostaną po prostu uznane za zakrycie twarzy. Nie jest to sytuacja pożądana. Dlatego aby jej zapobiec postanowiliśmy “uciąć” maskę stworzoną za pomocą wykrytych punktów dokładnie nad brwiami. W tym celu ograniczyliśmy wybór punktów z przedziału 0-35 do przedziału 5-31 (zgodnie ze zdjęciem 3). W ten sposób maska wynikająca z detekcji nie będzie uwzględniała przestrzeni nad brwiami, a co za tym idzie – nie będzie odrzucała, poprawnych zdjęć. W tak przygotowanej sytuacji wykonujemy odejmowanie maski segmentacyjnej od maski detekcyjnej. Jeśli w wyniku tej operacji zostają jakieś fragmenty – wiemy, że doszło do zakrycia twarzy. To, czy uznamy to zakrycie za problematyczne, zależy już tylko od przyjętego progu. Ponownie porównujemy pole “ścinków” do całkowitego pola wykrytej twarzy. Na podstawie badań przyjęliśmy, że jeśli wielkość tych “ścinków” przekracza 1% powierzchni skóry twarzy – twarz jest zbyt zakryta. Powyższą sytuację dobrze obrazuje zdjęcie 4.

Wszystkie te rozwiązania razem powodują, że wykrywanie zakrycia twarzy w naszej aplikacji Photo.me jest bardzo szybkie, na tyle, że działa ono w czasie rzeczywistym na uruchomionej kamerze i ponadto jest w zasadzie niezawodne.

Na koniec zastanówmy się do czego jeszcze możemy wykorzystać opisane powyżej narzędzia. Tak jak już wspomniałam Google ML Kit Api jest narzędziem bardzo lekkim i szybkim. Ze względu na to możemy bardzo szybko dostawać informację czy na zdjęciu lub nawet obrazie z kamery znajdują się jakieś twarze. Nie nastąpi dokładne wyznaczenie czapek, biżuterii czy pola twarzy, ale dokładną informację, gdzie twarz znajduje się na przetwarzanej klatce dostajemy bardzo szybko. Ponadto Api zwraca także informację o prawdopodobieństwie z jakim otwarte jest każde z oczu oraz czy osoba na zdjęciu się uśmiecha czy nie. Takie informacje pozwalają nam dociąć zdjęcie źródłowe do wykrytej twarzy i dalej badać jej parametry na zmniejszonym rozmiarze. Na zdjęciach do dokumentów także nie należy się uśmiechać, a oczy muszą być otwarte. Dlatego te informacje mogą się bardzo przydać w wielu miejscach.

W przypadku sieci BiseNet do segmentacji możemy uzyskać jeszcze więcej informacji, np. czy dana osoba posiada okulary, wyciąć je i sprawdzić czy nie mają przypadkiem ciemnych szkieł lub refleksów. Możemy dowiedzieć się też gdzie dokładnie widoczne są wszystkie elementy twarzy i dostosować do tego końcową wielkość zdjęcia. Segmentacja tła pozwala nam sprawdzić czy jest ono wystarczająco jasne i jednolite. Segmentacja skóry twarzy pozwala wyciąć ją i sprawdzić czy jest równomiernie oświetlona, nie zawiera cieni i prześwietleń, a także czy światło ma naturalny kolor. A to wszystko to nadal tylko część możliwości, które w sobie kryją te narzędzia. Ich wykorzystanie ogranicza jedynie wyobraźnia 🙂

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

    Skontaktuj się z nami