Van abban valami csodálatos, ahogy egy korábban évtizedekig megvalósíthatatlannak tartott feladatot, az emberi arc felismerését ma már a legegyszerűbb IoT-eszközök, filléres IP-kamerák is hibátlanul elvégzik, noha anno az volt a legnagyobb probléma, hogy “nincs elég számítási tejesítmény” az arcfelismeréshez. Sokat fejlődtek az IoT-eszközök az utóbbi években - de ennyit azért nem.

Ugyanakkor a teljesítmény hajszolása továbbra is zajlik. Nem tűnik drasztikusan más feladatnak az autó- vagy forgalomfelismerés, mint az arcfelismerés, mégis, a Tesla úgy kihajította a brutális teljesítményű, korábbi NVidia-alapú neuralális hálózati számítógépet az autóiból márciusban, hogy ott pattog a járdaszélen azóta is. Hogy miért? Mert minden új autóban már az új, általuk tervezett neuronprocesszor ketyeg, melynek számítási teljesítménye hússzorosa(!) az NVidia-s megoldásénak. 

Most akkor kell az a brutális teljesítmény, vagy nem? Mit nem értünk ebben a játszmában?

Hisz tudjuk, hogy az  összes digitális fényképezőgép nemcsak arcokat ismer fel, de mosolygást és kacsintást is. Ki érti ezt?

Eláruljuk a titkot: az IoT-eszközök az arfelismerésnek csupán egy szeletét képesek futtatni: az arcok detektálását (van arc? hol az arc?) és egyfajta zártkörű arcfelismerést (10-20-200 arc esélyű felismerése).

Távolról sem igaz, hogy egy kis IoT-eszköz olyasmit tudna, mint a Kínai kormány rendszere. Egymilliárd ember felismeréséhez brutális teljesítmény szükséges. 

Sőt, az IoT-eszközökben sokszor nem is neuronhálózatot használunk ezekre a feladatokra, hanem sokkal egyszerűbb algoritmusokat, például a Haar Cascade-algoritmust.

Tehát nemcsak tejlesítményokokból nincs bennük neuronháló, mert akár még el is futna rajtuk, hanem mert nincs is rá szükség. Az emberi arcok detektálása pimf ügy, érthetetlen, hogy miért kellett 2001-ig várni arra, hogy valaki észrevegye, hogy minden emberi arc egyforma.

Igen, jól olvastátok. A fényképezőgépekben és egyéb mütyürkékben dolgozó algoritmus úgy dolgozik, hogy számára - a hamarosan ismertetett feltételek esetén - minden emberi arc “egyforma”.  

A Haar Cascade

Az algoritmusnak ha nem is feltalálója, de névadó-ihletője egy magyar ember, nevezett Haar Alfréd szegedi matematikus, Móra Ferenc ismerőse (Szögediek lévén mindketten), akinek a nevét a Haar mérték (vigyázat, érthetetlen!), valamint egy kisbolygó (24907) őrzi. Ez utóbbiról nincs fotónk sajnos.

Van azonban egy remek emléktáblánk Borsos Miklóstól, aki bronzba öntött egy csodálatos Haar Featurét, most csak jegyezd meg az alakját, és tovább olvasva majd mondhatod azt, hogy “aha!” Mert lesz egy “aha”-élményed hamarosan. Addig is a Haar Alfréd-emléktábla:



Haar Alfréd valami olyasmivel játszadozott a matematika terén, amit akár digitálisnak is nevezhetnénk, ha az úr nem hunyt volna el 1933-ban, a digitális számítógépes rendszerek megjelenése előtt vagy 20-30 évvel. Mindenesetre az őt foglalkoztató “lépcsős” függvények ihlették meg a Haar Cascade-algoritmus két megalkotóját, Paul Viola és Michael Jones urakat, akik 2001-ben tárták a világ elé döbbenetesen ügyes, ám rém primitív megoldásukat emberi arcok detektálására.

Ma ezt az algoritmust bárki szabadon felhasználhatja, mert bekerült az OpenCV, azaz Open Source Computer Vision Library gyűjteménybe, így akár forráskód, akár DLL-szinten rendelkezésre áll. Mindössze 5-10 sor Python-kód szükséges például egy élő kameraképpel dolgozó arcfelismerő összerittyentéséhez. Érdemes a tanulást ezzel kezdeni, mert nagyon szórakoztató, sikerélményt is nyújt, és a végén happy end van. Idevágó tanfolyamunk itt található

Lássuk, hogyan is működik a Haar Cascade-algoritmus?

Jevgenyíj, a szovjetúnió hőse és feltaláló, bemutatja vadonatúj borotválógépét a Központi Bizottságnak. Nézik az elvtársak a borotválógépet, és az egyik fejes kiszúrja, hogy ez a gép bizony mindig ugyanúgy borotvál. Szóvá is teszi: Jevgenyíj elvtárs! Baj lesz ebből, hisz minden ember feje más alakú. Mire Jevgenyíj:

-Eleinte igen!

Nos, a Haar Cascade algoritmus is borotválógéppel kezdi. Fogjuk meg ezt a hölgyet, és ültessük be Jevgenyíj borotválógépébe:

A kezdetben minden személynél különböző portrét a Haar Cascade-algoritmus 24 x 24 pixeles felbontásúra butítja le, majd szürkeárnyalatossá konvertálja:

Ezzel készen is állunk az arcfelismerés lefuttatására!

Hát nem őrültség? A 24 x 24 pixel az rémesen kicsi. Először arra gondoltam, hát persze, 2001-ben még csak 1 megapixeles fényképezőgépek voltak, és azokon a képeken biztos ekkora egy arc, de az az igazság, hogy 1024 x 768-as képen is irdatlanul pici a 24 x 24 pixel, lásd az Omaba család alábbi, 1 megapixeles fotóján a zöld keretet a főhős szeme körül:


Ki az a …, aki kitalál egy ilyet, hogy arcfelismerés előtt brutálisan lerontja a képminőséget, és úgy kezd neki? De ugye látod már, hogy így, a szovjetúnió hőse által megborotválva tényleg minden arc “egyforma”. Nincs bőrszín, nincs ferde szem, nincs már szinte semmi, amivel dolgozni lehetne. 

Akkor kezdjünk is neki. A vacak képen vacak jellemzőket keresünk.

A Haar Cascade-algoritmus úgynevezett gyenge osztályozók (weak classifier) bevetésével próbálja meg beazonosítani a tárgyakat/arcokat - pontosabban kihajítani a nem tárgyakat/arcokat. Igen, a Haar Cascade-algoritmus egy negatív felismerő, úgy dolgozik, hogy mindent elhajít, ami nem lehet arc, és a folyamat végén csak az arcok maradnak a halmazban.

Milyen egy weak classifier? Annyira gyenge, hogy meglepő, hogy ennek ellenére az algoritmus egyáltalán eredményes lesz. Arcfelismerés esetén egy gyenge osztályozó például, hogy a homlok mindig világosabb, mint a szemöldökök. Lássunk egy ilyet az előző, epilált hölgy esetén:

És hogy néz ki az orr? Középen világosabb, mint a két szélén. Mindig? Mindig. Mindenkinél? Mindenkinél:

Ha a Földön minden egyes embert beültetünk a szovjet borotválógépbe, az alábbi detektor tökéletesen meg is fog felelni mind a 7 milliárd ember felismerésére:

Sőt, még túl is fogja teljesíteni a feladatot, mert a fénysorompókat, és bizonyos 220V-os konnektorokat is emberi arcként fog azonosítani. 

És ez szándékos. Hiszen a Haar Cascade-algoritmus nem az arc felismerésével próbálkozik (az ugye lehetetlen feladat 🤔), hanem minden olyan dolog kihajításával, ami NEM arc. A vízesés legfelső szintjén ezek a gyenge azonosítók sikeresen kihajítanak a felismerésből mindent, ami garantáltan nem arc, és bent tartanak mindent, ami arc, legyen az emberi, vagy postaláda. 

Ugye, hogy egy arc? Az algoritmus a gyenge felismerőivel már első körben is 100%-os emberi arcfelismerést végez, 40% úgynevezett fals pozitívval, amik postaládák, mosolygó szemeteskukák és mérges autók.

Ennek az az értelme, hogy villámgyorsan elhajítsuk a vizsgálandó kép területének 90-95%-át. Normál felhasználás esetén az IoT-eszköz a teljes kameraképen, pixelről pixelre lépegetve keresi 24 x 24-es területeken az emberi arcot, ám a kamerakép területének elsöprő többségén nincs arc. Így az első lépés néhány primitív “felismerővel” villámgyorsan, néhány pixel megmozgatása árán kihajítja a felesleges területeket, és a keresést már csak a fennmaradó 5%-nyi területen kell folytatni.

A vízesést, vagyis a potenciális arcok további szűrögetését már csak az első lépésben “reménykeltőnek” jelzett területeken kell lefuttatni. Egyébként úgyanígy, mint az előbb, csak egyre finomabb szűrőkkel. Minden szinten további nem-arcokat hajítunk ki, míg végül, a 25. szint után már tényleg csak az marad, ami emberi arc.

Ami meglepő viszont, hogy nincs külön cascade nőkre és férfiakra, szakállasokra és kopaszokra, gyerekekre és felnőttekre, feketékre és sárgákra: ezzel a kihajigálós megoldással tényleg minden emberi arc “egyforma”.

Próbáld ki te is! Az OpenCV-ben található opencv_visualizaton parancssori program segítségével te is láthatóvá teheted magadnak az arcfelismerés (=arcdetektálás=nemarc-kihajigálás) lépéseinek sorát, hogy beégjen a retinádba, és soha többé ne felejtsd el, hogyan működik. Készítettünk erről egy ingyenes minitanfolyamot neked.

Az alábbi képen egy sokadik szint látható (ránézésre kb. hatodik), a feladata ugyanaz: az összes emberi arc megtartása mellett a fals pozitívakból további százalékokat kidobni. Ha elvégezted az előbb említett minitanfolyamot, tudod, hogy az alábbi kép készítője csaló, mert nem butította le a hölgy arcát 24 x 24 pixelesre.

(Az alsó sor középső kockáján a Haar Feature nem más, mint a Borsos Miklós által készített emléktábla. AHA-élmény!)

Az algoritmus elképesztően gyorsan fut. Ezt még egy modernebb turmixgép is kényelmesen le tudja futtatni másodpercenként 25-ször, full frame-ben, nemhogy egy digitális fényképezőgép. Nem csoda, hogy a megoldás futótűzként terjedt, ezért van benne már lassan a porszívókban is.

A gyári OpenCV-ben egyébként nemcsak arcfelismerő Cascade van konyhakészen, hanem szemüvegfelismerő, macskafelismerő, orosz rendszámtábla “felismerő” (lásd később, hogy miért nem), teljes, álló emberi test felismerő stb. Ha ez neked mind nem elég, akkor jön a…

Saját felismerés készítése

Ha megvagyunk az arcfelismeréssel, jöhet a saját projekt. Ismertessünk fel valami egyedi objektumot a géppel!

Definíció: olyan tárgyakat lehet felismertetni a Haar Cascade-algoritmussal, amelyek 24 x 24 (vagy hosszúkás esetben, pl. könyv 24 x 36) pixelen, 255 fokozatú szürkeárnyalatos képen emberi megfigyelő által továbbra is felismerhetők.

Tehát például rendszámot fel lehet-e vele ismertetni? Felbontás: 24 x 100 pixel.

Talán meglepő, de ebben a vacak felbontásban is látszólag igen. Mondjuk jelentős csalás van benne, a szélességünk nem 24 pixel, hanem 100, tehát lehet, hogy a kis kamera nem fogja szuflával bírni. 

50 x 10 pixel felel meg pixelmennyiségben a 24 x 24-nek, ez így néz ki: 

Ez már majdhogynem olvashatatlan. De ez nem is számít, mert a Haar Cascade számára nemcsak minden ember, hanem minden rendszám is egyforma. Nem fogja elolvasni a rendszámot, hiszen válaszként csupán egy marék koordinátát ad vissza a megtalált objektumokról, nem pedig betűket. A feljebb említett, hogy az OpenCV-ben meglévő orosz rendszám cascade nem rendszámfelismerő, hanem rendszámdetektáló. 

De arra alkalmas lehet, hogy csak egy bizonyos, vagy néhány bizonyos rendszámnak nyissa ki a kaput. Vagy a világon az összesnek. Ha valaki egy rendszámtáblával bohóckodik a sorompó előtt, az felnyílik.

Ha a rendszámot ténylegesen le is kell olvasni, akkor a Haar Cascade egy gyors első lépés lehet a rendszám területének megtalálására, így egy okosabb, de lassabb rendszernek már hajszálpontosan oda lehet adni, hogy nesze, itt a rendszám, olvasgass.

És könyvborítót?

Méret- és színhelyesen:

Ez nem lenne teljesen reménytelen vállalkozás. Bár… az első kötetet a másodiktól nem lehetne megkülönböztetni, az biztos. 

A felismerendő objektumon egyébként nem nekünk kell majd weak classifiereket keresni, van a betanításra pár parancssori program az OpenCV-ben, azokkal majdnem teljesen automatizálható a tanítás folyamata (az értékes részeket nekünk kell megjelölgetni a képeken tanítás előtt, mert nem fogja kitalálni, hogy mit keresel.)

Természetesen ehhez is készült egy tanfolyam, ami végigvezet egy adott tárgy, jelesül egy könyvfelismerő Haar Cascade készítésének lépésein. És ha a könyv megy, már minden menni fog, szuperember leszel. Olyanokat fogsz tudni készíteni, mint például ez a srác, aki kinyitja a garázsajtót a robotfűnyírójának, ha a gép a munkában elfáradván haza akar menni.

Ez lenne az AI? 

Ó dehogy. Ez még csak Machine Learning. Hamarosan jönnek a neuronhálók és a deep learning is. 

Viszont jó hírünk is van: a többi AI-cucc is emberi agy szüleménye, ezért könnyen megérthető. Persze csak akkor, ha valaki kiemeli számdora a lényeget, és elrejti az összes felesleges egyenletet. Mi a NetAcademiánál azt szeretnénk, hogy valóban megértsd. Ezért nem kaptál a szemed közé egyetlen matematikai egyenletet sem. Ilyeneket nem: