Zum Inhalt springen

Personenzählung mit OpenCV – Erste Ergebnisse

Das lange Osterwochenende hat mir endlich etwas Zeit verschafft mich mit Computer Vision zu beschäftigen – Ein super interessantes Thema – leider mit einer recht flachen Lernkurve wie ich finde. Außerdem war das mein erster Kontakt mit Python.

Recht schnell bin ich auf die Seite https://www.pyimagesearch.com gestoßen. Adrian Rosebrock schreibt unglaublich gute Tutorials zu diesem Themenbereich.

Nachdem ich einige der Tutorials durchgearbeitet habe bin ich auf sein Tutorial gestoßen wo er eine Personenzählung mit Hilfe von OpenCV gebaut hat. Ein Thema, das uns in Zukunft sicher öfter begegnen wird wenn wir z.B. aus Infektionsschutzgünden nur noch begrenzt viele Personen in Gebäude oder Bereiche lassen dürfen.

Man dürfte meinen, dass Personenzählung inzwischen ein gängiges gelöstes Problem ist aber je länger ich mich damit beschäftige desto größer und schwieriger sieht das für mich aus. Zählt man im Einzelhandel die Anzahl der Türöffnungen so bekommt man nicht mit wie viele Personen dabei durchgehen. Zählt man mit Hilfe eines Höhenprofilscanners kann man Kinder nicht von vollen Einkaufswägen unterscheiden. Eine einfache Lichtschranke kann den Einkaufswagen nicht von Personen unterscheiden und Personen die nebeneinander durchgehen werden ebenfalls nur einmal gezählt. Passive Infrarotsensoren können nur Bewegungen zählen, nicht die Anzahl der Leute. Laserscanner sind vergleichsweise teuer.

Computervision scheint ein guter Lösungsansatz zu sein weil hier mit Trainingsdaten speziell nach Personen gesucht werden kann. Aber leider gibt es auch hier wieder viele Fallstricke.

Computervision ist datenschutztechnisch eine interessante Sache. Die Objekterkennung geschieht lokal. Kein Bild oder kein Video muss den PC verlassen und nachdem ein einzelnes Frame durch das neuroyale Netz geschickt wurde wird es verworfen. Es verbleibt kein Bild oder keine auf eine Person rückschließbare Information auf dem Computer zurück. Es wird (in diesem Fall) keine Gesichtserkennung gemacht sondern nur eine Personenerkennung: Sieht das Objekt einem Menschen zu über 50% ähnlich? Ja/Nein.

Über die Akzeptanz einer Kamera kann man natürlich noch streiten.

Die Computervision mit OpenCV, die Adrian auf seiner Website anbietet funktioniert out of the box ziemlich gut. Ich würde mal behaupten, dass ich direkt nach der Ersteinrichtung schon eine 70%ige positive Erkennungsrate mit einer einfachen Webcam hatte. Wenn man aber bedenkt, dass 30% der Leute entweder nicht erkannt wurden oder zum Teil mehrfach gezählt wurden ist das kein sonderlich gutes Ergebnis wenn man über den Tag hinweg z.B. den Eingangsbereich eines Gastronomieraum überwachen will in den nur 100 Personen hinein dürfen. +-30 Personen und das im schlimmsten Fall auch noch driftend in eine Richtung ist schlechter als dass eine Person einfach am Eingangsbereich ab und zu eine Ampel auf Rot oder Grün schaltet.

Zum Teil schreite ich selber auf und ab durch das Bild oder ich zeige meiner Webcam einfach einen Videostream auf YouTube in dem Personen umherlaufen.

Was fehlt zu einer 95%igen Erkennungsrate, die für mich akzeptabel wäre?

Dazu muss ich etwas ausholen. Die Personenzählung passiert in zwei Schritten. Alle X Frames wird im Videostream eine Objekterkennung auf Personen gestartet. Dabei werden alle Objekte, die zu einem gewissen (einstellbaren) Prozentsatz nach einer Person aussehen erkannt und markiert. In allen anderen Frames wird ein Tracking der erkannten Personen gemacht. Die Personen werden ab der Erkennung bis zum Verlassen des Bildes mit einem Tracker verfolgt.

Wo aber liegen jetzt die Schwierigkeiten?

Personenerkennung

Die Personenerkennung funktioniert erstaunlich gut! VIEL zu gut wenn ich ehrlich bin.

Warum bin ich damit nicht zufrieden fragt ihr euch sicher?

Bereits der Unterkörper wird erkannt – ein Problem

Je nach Winkel in dem die Personen aufgenommen werden erscheinen erst die Beine oder erst der Kopf im Bild. Beides wird unglaublich gut erkannt. Warum das ein Problem ist erfahrt ihr gleich.

Die Kameraperspektive und Brennweite ist enorm wichtig. Ist die Person zu groß auf dem Erkennungsbereich wird sie zum Teil öfter erkannt während sie durch das Bild läuft. Ist sie zu klein oder ist der Winkel zu steil wird sie aufgrund der unbekannten Kontur nicht erkannt.

Interessant wäre eine reine Kopferkennung, wie sie einige kommerzielle Anbieter einsetzen. Hierfür fehlt mir aber leider ein entsprechendes trainiertes neuronales Netz mit dem ich arbeiten könnte.

Tracking

Das Tracking ist eines meiner größten Sorgenkinder. Es passiert leider öfters, dass eine Person, die zu „nah“ an der Webcam vorbeiläuft mehrfach gezählt wird. Erst die Beine, dann verschwinden die Beine und danach wird im letzten Moment noch der Oberkörper als neue Person erkannt und eine Person wird Doppelt gezählt. Der Tracker haftet auf der Mitte des zuerst erkannten Objekts. Er kann leider nicht driften und sich aus neuen Informationen des neuroyalen Netzes bedienen.

Der Tracker lässt sich wenigstens gut mit zwei Parametern einstellen. Die Distanz in der zwischen zwei Bildern nach dem gleichen Objekt gesucht wird und die Dauer über die der Tracker ein Objekt verlieren darf bis er das Objekt „vergisst“. Diese zwei Parameter müssen für jede Situation neu ausgelotet werden. Hier spielen Faktoren eine Rolle wie schnell die Personen durch das Bild laufen, wie schnell die Framerate der Bildverarbeitung im Trackingzyklus stattfindet und ob Personen gerne durch das Bild „kreuzen“ oder sich überlagern. Es kann auch vorkommen, dass ein Tracker von einer Person auf eine andere übergeben wird. Verlässt z.B. eine Person oben links das Bild und kommt kurz darauf aus der gleichen Position jemand zurückgelaufen kann diese neue Person den alten Tracker übernehmen. Ein Problem weil jeder Tracker eine eindeutige ID hat und jede ID nur einmal gezählt wird. Das Trackingobjekt der neu hineingelaufenen Person ist also unfähig nochmal gezählt zu werden.

Hoch/Runter Erkennung

Adrian teilt das Bild in zwei Bereiche und schaut sich die Y-Koordinate zwischen zwei Tracker Positionen an. Bewegt sich ein Tracker im oberen Bildbereich nach oben wird ein „hoch“ gezählt. Der Tracker ist „verbrannt“ und kann keinen weiteren Zählvorgang auslösen. Simpel aber leider zu simpel.

Die Tracker haben nämlich ein kleines Problem. Sie zittern/springen etwas um das getrackte Objekt umher. Schreitet eine Person also nur sehr langsam durch das Bild kann es ab und zu passieren, dass der Tracker ganz am Anfang schon in die entgegensetzte Laufrichtung springt und damit in die entgegengesetzte Richtung zählt noch bevor die Person den „richtigen“ Zählbereich erreicht.

Adrian schaut sich zwar einen „average“ der Laufrichtung an was bei einer längeren Trackingdauer immer genauer wird. Aber wenn der entgegengesetzte Sprung zur Laufrichtung gleich am Anfang passiert ist die Zählung für dieses Objekt kaputt bevor ein ordentliches Average gebildet werden kann.

Dieses Problem löse ich indem ich ein Objekt erst einige Frames beobachte bevor ich eine Verarbeitung der Y-Koordinaten unternehme. Damit erreiche ich ein etwas sichereres „average“ der Y-Richtung.

Außerdem baue so drei Zustände auf, die ein Trackingobjekt haben kann:

  • Rot = Objekt wurde erkannt, ist aber erst 0 bis ca. 10 Frames „alt“ Jede Position wird aufgezeichnet.
  • Blau = Objekt ist älter als 10 Frames und es ist in der Lage im oberen oder unteren Bildbereich einen Zählvorgang auszulösen. Es wird weiter jede Position aufgezeichnet
  • Grün = Objekt wurde gezählt und ist ab dem Moment nicht mehr zählbar.

Die Kamera

Aktuell nutze ich eine einfach Webcam für die Bilderkennung. Auflösung spielt keine große Rolle. Ich croppe mir aus dem gesamten Bild ein etwas kleineres Bild heraus um weniger Rechenpower in die Bilderkennung stecken zu müssen. So sind ein besseres Tracking und eine schnellere Bilderkennung möglich. Generell bin ich erstaunt wie wenig Bildinformationen das Neuronale Netz braucht um eine Person zu erkennen.

Ein Problem ist allerdings, dass ich keinen Einfluss auf die Belichtung der Kamera habe. Die Kamera stellt sich selber entsprechend hell oder dunkel je nach Lichtsituation. Wenn ich aus einem größeren Bildausschnitt nur einen kleineren verarbeite muss ich sicherstellen, dass die Belichtung für den jeweiligen Ausschnitt auch ok ist. Bei meiner Logitech gibt es da keine Chance auf Korrektur von außen. OpenCV bietet diese Option an aber die Kamera ignoriert die Befehle – ein bekanntes Problem mit den meisten Webcams. Schön wäre auch eine Kamera mit variabler Brennweite und Fokusfixierung. Ich dachte dabei an so etwas: Einstellbarer Zoom und Fokus 5-50mm oder Einstellbarer Zoom und Fokus 2,8-12mm Die Teile würden mir Flexibilität in der Anwendung geben und das Fokus-Pumpen eliminieren, die meine aktuelle Webcam ab und zu macht.

Wie geht es weiter?

Das Projekt mach viel Spaß und langsam geht die Lernkurve auch hoch. Ich werde mir ein Szenario suchen wo ich das Projekt einmal in freier Wildbahn testen kann. Ich werde versuchen für diesen Standort alle Parameter so lange einzustellen bis ich ein Erkennungsrate von hoffentlich 90-95% bekomme. Parallel beschäftige ich mich noch damit einen besseren Trackingalgorithmus zu finden. Ich hoffe ich kann euch bald positive Ergebnisse berichten.

Gefällt dir der Beitrag?

Schreibe dich in den Newsletter ein und bekomme in unregelmäßigen Abständen zusammenfassende Newsletter mit den neuesten Beiträgen. Ich halte es minimalistisch. Versprochen.
Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

*