In mijn vorige bericht gaf ik aan dat ik me voorlopig niet zou bezighouden met gezichtsherkenning. Maar mijn IT-bloed kruipt toch waar het niet gaan kan en dus heb ik me er wat meer in verdiept.

Natuurlijk ben ik op zoek gegaan naar iets dat al kant-en-klaar in te zetten is. Hoewel het leuk is om zo’n systeem helemaal vanaf de grond op te bouwen, heb ik er simpelweg geen tijd voor. Na een korte zoektocht kwam ik terecht bij een applicatie genaamd ‘face_recognition‘, welke is geschreven in de taal Python en die ik op mijn eigen laptop kan uitproberen. Er staat netjes beschreven welke stappen je moet uitvoeren om de boel werkend te krijgen. Ik kan me voorstellen dat wanneer je geen affiniteit met IT hebt, de drempel toch net wat te hoog is.

De applicatie leert van ‘bekende’ foto’s en probeert dit dan toe te passen op ‘onbekende’ foto’s. Zo zijn er een paar dingen waar je rekening mee moet houden. Zo moeten de foto’s met de bekende personen in een aparte folder worden geplaatst. Eveneens zullen de foto’s de naam van de persoon krijgen die op de foto terug te vinden is. Dit omdat bij het matchen de naam van de foto wordt gebruikt om aan te geven wie er op een foto gevonden is.

Nu is dat ‘vinden’ van personen niet waterdicht. Het model dat door de applicatie wordt gebruikt, is getraind op het herkennen van volwassenen en zal dus moeite hebben om kinderen te herkennen. Ook zal de nauwkeurigheid verschillen per etnische groepering. Naast deze bekende tekortkomingen, geeft het geen 100% zekerheid dat een persoon ook daadwerkelijk gevonden wordt. Wanneer er een ‘match’ gevonden wordt, is dit met een bepaalde zekerheid… en hoe lager het getal voor de afstand tot de bekende persoon, des te zekerder de match is. Ook heb ik al gemerkt dat er soms gezichten worden gezien die er niet zijn, of juist niet gezien terwijl ze er wel zijn.

Ondertussen heb ik een paar testjes uitgevoerd met foto’s die ik ondertussen heb ingescand en waarvan ik weet wie er op staan. En ik moet zeggen dat ik niet ontevreden ben!

Allereerst heb ik een aantal foto’s van de gezichten van enkele personen van wie ik de naam weet opgeslagen en toegevoegd aan de folder met ‘bekende’ personen. Deze dient dan als ‘invoer’ voor de applicatie en worden gebruikt bij het matchen.

In eerste instantie heb ik geprobeerd om matches te krijgen op foto’s waarop enkel dezelfde persoon stond die ik al kende. Maar wel met meerdere foto’s als ‘bekenden’. Zo had ik een foto van onder andere Frederik, Willebertus en Hendrikus van den Brink gebruikt. Allen broers van elkaar, dus er is een kans dat ze op bepaalde vlakken op elkaar lijken.

Een eerste poging…

Als eerste heb ik een foto gebruikt waarop Frederik staat. Het is dezelfde foto als degene die ik gebruik als ‘bekende’, maar dan anders uitgesneden. Het uitgevoerde commando is:

face_recognition ./known_people/ ./unknown_pictures/frederik.jpg

Volgens de applicatie staan de volgende personen op de foto:

./unknown_pictures/frederik.jpg,Frederik van den Brink (1914-1991)
./unknown_pictures/frederik.jpg,Willebertus van den Brink (1921-2002)
./unknown_pictures/frederik.jpg,Hendrikus van den Brink (1923-1944)

Niet geheel wat ik had verwacht, maar ik kon niet zien wat hier nu precies aan de hand is… totdat ik zag dat er nog andere opties mee te geven zijn aan het programma! Zo is er een optie aanwezig om te zien hoe goed de match is (waarbij een lagere waarde dus een zekerdere match is). Het volgende commando gaf dan ook meer inzicht:

face_recognition --show-distance true ./known_people/ ./unknown_pictures/frederik.jpg

Deze keer werd het al een stuk helderder, zoals hieronder te zien is:

./unknown_pictures/frederik.jpg,Frederik van den Brink (1914-1991),0.03460119419939914
./unknown_pictures/frederik.jpg,Willebertus van den Brink (1921-2002),0.5894542838620631
./unknown_pictures/frederik.jpg,Hendrikus van den Brink (1923-1944),0.5666268212029603

Blijkbaar is de match met Frederik bijzonder goed en is vrijwel zeker te zeggen dat het Frederik is die op de foto terug te vinden is. Nu is er nog een andere optie te gebruiken te gebruiken om een soort drempelwaarde in te stellen. Alleen matches die onder de drempel liggen worden dan weergegeven. Zo zal alleen Frederik als resultaat worden weergegeven wanneer het volgende commando wordt uitgevoerd:

face_recognition --show-distance true --tolerance 0.55 ./known_people/ ./unknown_pictures/frederik.jpg
Meerdere personen op een foto…

De volgende stap was om te zien hoe de applicatie om gaat met foto’s waar meerdere personen op staan. Als input gebruikte ik de volgende foto:

Onbekende persoon, Hendrikus en Frederik

Van twee van de drie personen is bekend hoe ze heten… maar kan de applicatie ze ook herkennen? Om dit te testen gebruik ik hetzelfde commando als eerder genoemd, maar dan met een tolerantie van 0.54 (dit bleek de beste resultaten te geven). Het resultaat was:

./unknown_pictures/3_personen.jpg,Hendrikus van den Brink (1923-1944),0.4404258758231961
./unknown_pictures/3_personen.jpg,Frederik van den Brink (1914-1991),0.25858196946763573
./unknown_pictures/3_personen.jpg,unknown_person,None

Er blijkt dus dat zowel Hendrikus alsook Frederik worden herkend… plus een onbekende. Dus precies wat de bedoeling was. Maar grote vraag is nu, of er ook zichtbaar is te maken welke naam bij welke persoon hoort. Zeker bij groepsfoto’s zou dit een ware toevoeging zijn. Met behulp van wat code voorbeelden heb ik het voor elkaar gekregen om de gedetecteerde gezichten te omlijnen en de meest waarschijnlijke naam toe te voegen. Het resultaat was:

Resultaat van gezichtsherkenning met meest waarschijnlijke namen

Het is lastig te lezen, maar zoals te zien is, zijn er 3 gezichten ontdekt. Van links naar rechts staat er ‘Unknown’, ‘Hendrikus van den Brink (1923-1944)’ en ‘Frederik van den Brink (1914-1991)’. Dit is precies wat het zou moeten zijn.

Wat nu?

Ik ben zeer positief over wat er mogelijk is. Wat ik echter nog niet weet, is of gezichten ook herkend worden wanneer iemand een stuk ouder/jonger is dan op de foto die als ‘bekend’ is aangemerkt. En natuurlijk of het formaat van de foto van invloed is op het detecteren van gezichten en matches.