Które z państw nie marzyło o tym, aby w każdym mieście, na każdym rogu znajdowała się kamera automatycznie identyfikująca wszystkich obecnych w pobliżu obywateli? Korzyści z tego typu systemu byłyby ogromne - w ciągu kilku minut można byłoby odszukać skradzione samochody, zlokalizować potencjalnych przestępców, czy też wysłać patrol do dziwnie zachowującego się Kowalskiego. Permanentna inwigilacja. Pomysł, który już niestety nie zalicza się do fikcji naukowej. Technologia ta, prężnie rozwijana, powoli wkracza do użytku codziennego. A my zabawimy się jej namiastką w naszych domach ;-)
Niniejszy wpis poruszy czystko praktyczne aspekty lokalizowania i rozpoznawania twarzy oraz obiektów. Co przez to rozumiem? To, iż poniżej zaprezentuję oprogramowanie z którego ostatnimi czasy korzystałem, a wykorzystanie którego w efektowny sposób prezentuje możliwości obecnych rozwiązań. Aby wzmocnić ten efekt warto uzbroić się w jakiś rodzaj kamerki (dobrej jakości kamera internetowa lub nawet kamera analogowa podłączona poprzez kartę wideo). Odnosząc się do teorii wspomnę jedynie, iż każde oprogramowanie służące do rozpoznawania twarzy wykorzystuje algorytmy mające na celu odnalezienie tejże i wycięcie z kontekstu, jakim jest tło. Z racji tego na rynku znacznie łatwiej znaleźć oprogramowanie prostsze, czyli służące jedynie do lokalizacji twarzy.

Na samym początku wspomnę o programie (oraz SDK) o nazwie VeriLook - komercyjnym projekcie firmy NEUROtechnology. Sam program to właściwie demo SDK (C/C++, C#, Java, Visual Basic, Delphi), które służy do rozpoznawania twarzy. Samo demo jest przeznaczone dla systemu Microsoft Windows, ale SDK radzi sobie również z Mac OS-em oraz Linuksem (C/C++). Program jest w stanie wykryć twarz znajdującą się na obrazku/wideo, zapisać ją do bazy danych i porównać z innymi, które wcześniej zostały w niej zapisane. W ten oto sposób można stworzyć prosty system autoryzacji użytkowników. Równie interesującym programem jest SentiSight tej samej firmy. Program umożliwia nauczenie się tego w jaki sposób wyglądają przedstawione mu przedmioty (źródłem obrazu jest kamera), a następnie wykrycie i oznaczenie ich w przyszłości. Nie robi to takiego wrażenia, jak poprzedni program ze względu na stosunkowo niską skuteczność, ale i tak jest godny uwagi.

Powyżej widzimy SentiSight w akcji. Program został nauczony do rozpoznawania i oznaczania na obrazie dwóch przedmiotów - metalowego kubka oraz komputerowego wiatraczka. Jak widać program rozpoznaje teraz zarówno wiatrak (powyżej) oraz kubek (poniżej). Aczkolwiek nic nie stoi na przeszkodzie, aby Wasza noga również została uznana przez program za wiatrak ;-)

Darmową do wykorzystania niekomercyjnego biblioteką jest FDlib. Wspierając Matlaba i C/C++ zarówno pod Windowsem, jak i Linuksem oferuje wykrywanie wielu twarzy na obrazach. Przeznaczone dla Windowsa demo tejże biblioteki robi spore wrażenie w momencie wykorzystania dobrej jakości kamery i przy obecności dużej grupy osób :-)

FaceCropper to prosty program (freeware) pracujący pod kontrolą systemu operacyjnego Windows. Umożliwia odnajdowanie twarzy (wielu w tym samym momencie) w plikach wideo typu avi. Nie zachwyca niestety prędkością działania, ani jakością efektów.

Nie można tutaj też nie wspomnieć o otwartym OpenCV (licencja BSD, wielosystemowe SDK, C++/Visual Basic/Python). Narzędzie to umożliwia (oprócz wielu innych funkcji) zlokalizowanie i rozpoznanie twarzy przy użyciu algorytmu wykorzystującego Eigenfaces (najstarsze i najgorsze podejście). Nie udało mi się uruchomić programu przykładowego (OpenCV\samples\c\facedetect.exe w wersji Win32), ale chodzą słuchy, iż samą lokalizację wykonuje całkiem sprawnie.
Oto na co jeszcze natknąłem się podczas moich poszukiwań: faceAPI, BetaFace (m.in. SimpsonizeMe oraz MyFaceID), Luxand FaceSDK oraz dedykowana "ciekawostka". Guardia tutaj też pasuje ;-]
W przypadku większego zainteresowania opisywaną technologią warto zajrzeć na stronę Face Recognition Vendor Test na której, jak sama nazwa wskazuje, znajdują się wyniki oceny jakości rozwiązań służących do rozpoznawania twarzy.
Oczywiście, samo zagadnienie jest o wiele ciekawsze i dotyczy wielu interesujących problemów m.in. rozpoznawanie twarzy, które w miarę upływu czasu, zmieniają się (fryzura, blizny, biżuteria, czy też zwyczajne starzenie), rozpoznawanie emocji, praca w trudnych warunkach oświetleniowych itp.
[EDIT] Filtr Haar używany przy lokalizowaniu twarzy - coś dla teoretyków ;-)