Face recognition werkt ideaal om het aantal kijkers te registreren. Zoals aangegeven onder het onderdeel: WELKE DATA WORDEN ER UITGELEZEN? is dit echter niet geschikt voor voorbijgangers. Face Recognition herkent gezichten alleen frontaal, daarmee worden passanten niet geregistreerd.
Omdat de Face Recognition eigenlijk een systeem is dat gebruik maakt van een filter dat zoekt naar het gezicht, dacht ik dat deze code met het juiste filter ook kan worden ingezet voor voorbijgangers. Met de Face Recognition maak ik gebruik van een van de haarcascade modellen. Onder deze modellen is ook een upperbody model.
Met het Haarcascade upperbody model heb ik mijn eerste test uitgevoerd voor het herkennen van voorbijgangers. Hoewel het idee goed leek, bleek de afstand waarover de meting gedaan kon worden een te grote minimale afstand nodig te hebben. Daarbij komt dat de filter (single-threaded) niet snel genoeg is voor real-time data. Indien de instellingen aangepast worden om toch waarden te zien worden er te veel overige objecten als lichaam gedetecteerd. De problemen met deze manier zijn:
- een te grote minimale afstand
- de nauwkeurigheid is te laag
- het geheel werkt te langzaam.
Misschien dat dit snel genoeg zou zijn in een multithreaded variant, maar gezien de overige probleempunten is dit niet getest.
Gedurende het toepassen en achterhalen van het Haarcascade upperbody model bleek dat ook openCV een eigen model had ingebouwd. Gezien het goed functioneren van de overige openCV code leek het mij een goed plan dit als volgende te testen. De optie van openCV is de HOGDetector/HOGDescriptor en is op dezelfde manier toe te passen als de Face Recognition. Hoewel de toepassing ervan gemakkelijk was gaf het niet het gewenste effect. De HOGDetector is bedoeld voor het herkennen van mensen/voetgangers. Daarbij maakt de HOGDetector gebruik van een model van het gehele lichaam. Een voorbijganger die niet volledig in beeld komt wordt meestal niet gedetecteerd. Ook voor deze oplossing is de minimale afstand te groot. Indien je de instellingen aanpast om deze te verlagen wordt de detectie onnauwkeurig en zijn er net als bij het Haarcascade model te veel resultaten.
In deze video detecteert de recognition mijn arm als het onderlichaam. De arm rechts in beeld wordt gezien als volledig persoon.
Omdat Object Detection gebruikt maakt van een andere techniek dan filteren op het lichaam (of delen van het lichaam) is het geschikt. Om de personen te detecteren moet je deze kunnen scheiden van de achtergrond. Normaal zou je een foto knippen van de achtergrond en deze vergelijken met de huidige situatie. Dit is echter geen optie omdat de locatie verschilt. (Tenzij je iedere gebruiker hun eigen foto laat maken en deze gebruikt. Dit is echter niet gebruikersvriendelijk.) Om deze reden wordt de achtergrond door middel van subtraction verkregen. Van deze subtraction word vervolgens een mask gemaakt waarmee je bewegingen detecteert. Met deze bewegingen bereken je vervolgens de “grootst mogelijke” contouren. Als je niet de grootst mogelijke contouren berekent verkrijg je losse delen zoals een arm of been. De grootst mogelijke contouren worden vervolgens gevolgd met een tracker.
In de video zijn drie stadia te zien:
- het linker scherm geeft de gevonden contouren weer.
- het middelste scherm geeft de face recognition weer die tegelijk wordt uitgevoerd.
- het rechter scherm geeft de gevonden bewegingen weer.
In dit voorbeeld is de tracker nog niet toegepast, hierdoor zie je steeds nieuwe resultaten verschijnen.
Bibliografie
Face Detection using Haar Cascades. (2018). Opgehaald van OpenCV: https://docs.opencv.org/3.3.1/d7/d8b/tutorial_py_face_detection.html
Mallick, S. (2018). Object Tracking using OpenCV (C++/Python). Opgehaald van Learn OpenCV: https://www.learnopencv.com/object-tracking-using-opencv-cpp-python/
Pysource. (2018). Object tracking with Mean-shift – OpenCV 3.4 with python 3 Tutorial 29. Opgehaald van Youtube: https://www.youtube.com/watch?v=EDT0vHsMy34