Die Corona-Krise ist weiterhin in aller Munde und wird uns mit hoher Wahrscheinlichkeit noch etwas länger begleiten. Wie man aus unterschiedlichen Statistiken erfährt, schwanken die Fallzahlen weiter und sorgen für zusätzliche Restriktionen. Diese werden eingesetzt, um die Verbreitung des Virus weitestgehend zu stoppen. Ein wichtiger Aspekt stellt dabei die Einhaltung eines Mindestabstands zu anderen Personen dar. Die empfohlene Distanz liegt bei ungefähr 1,5 Metern, um so bestmöglich den direkten Kontakt zu anderen Personen zu vermeiden. Besonders in Zeiten, in denen die Zahlen an Corona-Infizierten erneut ansteigen, ist es umso wichtiger, dass ein solcher Abstand eingehalten wird. Immer öfter wird dieser Mindestabstand jedoch vergessen.
Aus diesem Grund wurde mittels eines Machine-Learning -Ansatzes die Anwendung „Smart DistancR“ entwickelt. Der Smart DistancR ermöglicht eine perspektivisch korrekte Distanzmessung zwischen allen sichtbaren Personen auf einem Kamerabild und kann eine Mitteilung herausgeben, falls der Mindestabstand zwischen einer bestimmten Paarung nicht eingehalten werden sollte. Die Verarbeitung verläuft dabei vollständig lokal und somit ohne jegliche Cloud-Anbindung und ohne Speicherung von Bildmaterialien.
Das folgende Video zeigt das Ergebnis des Distanzmessers, das mithilfe von OpenCV generiert wurde. Die erkannten Personen wurden aus Datenschutzgründen durch Avatare ersetzt.
Um zunächst einen Überblick über das allgemeine Vorgehen zu schaffen, sind hier die einzelnen Schritte, die innerhalb des Prozesses durchgeführt werden, kurz und bündig dargestellt:
- Das Video oder der Videostream wird über eine Schnittstelle (z. B. als Real-Time Streaming Protocol) bereitgestellt.
- Mittels eines trainierten Machine-Learning-Modells werden alle Personen erkannt und die dazugehörigen Bild-Koordinaten berechnet.
- Durch den Kamerawinkel sind die Koordinaten nicht ohne Weiteres für die Distanzmessung nutzbar. Der Fehler, der durch den Betrachtungswinkel entsteht, wird mithilfe perspektivischer Transformation herausgerechnet.
- Alle korrigierten Koordinaten werden in ein zweidimensionales Feld überführt.
- Die Distanzen werden mithilfe von Abständen zwischen bestehenden Referenzpunkten perspektivisch korrekt berechnet und über eine Schnittstelle bereitgestellt.
Das Hauptziel des Smart DistancRs besteht darin, Distanzen zwischen Personen in einem Video perspektivisch korrekt zu berechnen. Für die Umsetzung war es jedoch auch wichtig, dass die Hardware leichtgewichtig ist und so die Einsetzbarkeit möglichst einfach gestaltet werden kann. Deswegen wurde das Projekt für die Nutzung auf einem Raspberry Pi 4 und dem Coral Device von Google, das als Edge TPU für die Inferenz genutzt wird, optimiert. Für die Inferenz mit dem Coral Device wurde das trainierte Machine-Learning-Modell von einem TensorFlow-Modell in ein TensorFlow-Lite-Modell überführt.
Umsetzung des Smart DistancRs im Detail
Für ein tieferes Verständnis wird im Folgenden jeder einzelne Prozessschritt im Detail erläutert. Da es bereits umfangreiche Artikel zu Object-Detection-Modellen gibt, wird hierbei lediglich der eigentliche Prozess erklärt.
Personenerkennung
Für die Erkennung von Personen bietet ein Object-Detection-Ansatz die optimale Lösung. In einer perfekten Welt mit unbegrenzter Rechenpower könnte man dafür sehr genaue Ansätze, wie Faster R-CNN, verwenden. Im Fall des vorliegenden Projekts bestehen aber gewisse Hardware-Einschränkungen. Zum einen soll die Lauffähigkeit der Anwendung auf einem Raspberry Pi 4 gewährleistet sein, zum anderen soll die Inferenz zur Erkennung von Objekten auf einem Google Coral Device durchgeführt werden. Da bereits viele vortrainierte Object-Detection-Modelle für das Coral Device optimiert sind [1] , wurde ein auf MS COCO (Microsoft Common Objects in Context) trainiertes SSD-MobileNet-V2-Modell verwendet. Da der MS-COCO-Datensatz die Klasse „Person“ enthält und die Inferenzzeit bei 7,6 ms liegt, war dies die beste Option für ein Proof of Concept.
Perspektivische Korrektur
Den Kern der Anwendung stellt die perspektivische Korrektur dar. Mittlerweile wurden verschiedene Lösungen eines Distanzmessers umgesetzt. Darunter sind zum einen Anwendungen, die auf unterschiedlichen Sensoren basieren, zum anderen sind es Anwendungen, die ebenfalls Kamerabilder zur Distanzmessung verwenden. Viele dieser Alternativen gehen dabei ähnlich wie der Smart DistancR vor und beginnen mit der Erkennung von Personen. Danach wird häufig einfach die Distanz (euklidische Distanz) zwischen den erkannten Köpfen oder Füßen berechnet und der Wert als Ergebnis für die Distanz bereitgestellt. Bei diesem Verfahren wird jedoch nicht der perspektivische Fehler, der bei der Aufnahme entsteht, berücksichtigt.
Die meisten Kameras führen die Aufnahme nicht aus der Vogelperspektive, sondern von vorne oder von der Seite durch. Distanzen, die mit den Koordinaten aus diesem Kamerabild berechnet werden, sind perspektivisch inkorrekt. Durch den Kamerawinkel sind Personen, die nebeneinander stehen, im berechneten Wert weiter voneinander entfernt als Personen mit der gleichen Distanz hintereinander. Es geht sogar so weit, dass das Ergebnis mit einem flacheren Kamerawinkel immer schlechter wird. Der dabei entstehende Fehler ist in der dargestellten Animation zu erkennen.
Um eine korrekte Distanz berechnen zu können, muss die Kamera entweder aus der Vogelperspektive die Aufnahmen erzeugen oder der Kamerawinkel muss herausgerechnet und somit die Perspektive korrigiert werden.
Die Korrektur wird mithilfe einer projektiven Transformation realisiert. Diese ermöglicht es, mittels der Koordinaten aus der einen Perspektive und einer sogenannten Transformationsmatrix (Homographie) Koordinaten aus einer anderen Perspektive zu berechnen. Für den vorliegenden Anwendungsfall können so Positionen aus dem Kamerabild in die Vogelperspektive überführt werden.
Die Korrektur der Koordinaten berechnet sich mithilfe folgender Gleichung:
\(\begin{bmatrix} x‘ \\ y‘ \\ z‘ \end{bmatrix} = \begin{bmatrix} h_{11} & h_{12} & h_{13} \\ h_{21} & h_{22} & h_{23} \\ h_{31} & h_{32} & h_{33} \end{bmatrix}. \begin{bmatrix} x \\ y \\ z \end{bmatrix}\)
Hierbei stehen x, y und z für eine Koordinate in der ursprünglichen Perspektive und x’, y’ und z’ für eine Koordinate der Ziel-Perspektive. Die Matrix H repräsentiert die Homographie. Mit ihr ist es mit der dargestellten Multiplikation möglich, jeden Punkt aus der einen Ebene in die andere Ebene zu überführen. Um die Homographie zu berechnen, werden vier übereinstimmende Koordinaten aus beiden Perspektiven benötigt. Mithilfe dieser Koordinaten kann die Homographie H mit folgender Gleichung berechnet werden:
\(PH =\\ \begin{bmatrix} -x_1 & -y_1 & -1 & 0 & 0 & 0 & x_1x_1′ & y_1x_1′ & x_1′ \\ 0 & 0 & 0 & -x_1 & -y_1 & -1 & x_1y_1′ & y_1y_1′ & y_1′ \\ -x_2 & -y_2 & -1 & 0 & 0 & 0 & x_2x_2′ & y_2x_2′ & x_2′ \\ 0 & 0 & 0 & -x_2 & -y_2 & -1 & x_2y_2′ & y_2y_2′ & y_2′ \\ -x_3 & -y_3 & -1 & 0 & 0 & 0 & x_3x_3′ & y_3x_3′ & x_3′ \\ 0 & 0 & 0 & -x_3 & -y_3 & -1 & x_3y_3′ & y_3y_3′ & y_3′ \\ -x_4 & -y_4 & -1 & 0 & 0 & 0 & x_4x_4′ & y_4x_4′ & x_4′ \\ 0 & 0 & 0 & -x_4 & -y_4 & -1 & x_4y_4′ & y_4y_4′ & y_4′ \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1\\ \end{bmatrix} \begin{bmatrix}h1 \\ h2 \\ h3 \\ h4 \\ h5 \\ h6 \\ h7 \\ h8 \\h9 \end{bmatrix} = \begin{bmatrix}0 \\ 0 \\ 0 \\ 0 \\ 0 \\ 0 \\ 0 \\ 0 \\1 \end{bmatrix}\)
Alternativ kann man die Funktion findHomography , die OpenCV bereitstellt, ganz einfach nutzen.
Die vier übereinstimmenden Koordinaten sollten möglichst exakt sein und im besten Fall nicht zu nah beieinander liegen. Hat man diese Koordinaten gewählt und die Homographie berechnet, kann jeder Punkt aus der einen Perspektive in die andere übertragen werden. Wie in der nachfolgenden Abbildung zu sehen, kann demnach auch die Position einer erkannten Person übertragen werden.
Zusammenführung zur Anwendung
Nachdem alle Bausteine für die Distanzmessung entwickelt sind, gilt es, alles korrekt zusammenzuführen. Wie bereits zu Anfang erwähnt, werden zunächst Personen erkannt, wobei die Füße als Anker für die Distanz verwendet werden. Die daraus entstehenden Koordinaten werden mithilfe der Homographie in eine 2D-Ebene umgerechnet. Die euklidische Distanz (d) der beiden Koordinaten (P,Q) in der 2D-Ebene stellt die berechnete Distanz in Pixeln dar. Diese berechnet sich wie folgt:
\(d(P,Q) = \sqrt{(q_1 – p_1)^2 + (q_2 – p_2)^2}\)
Um diesen Wert in Zentimeter umzurechnen, wird das Maß für Zentimeter pro Pixel benötigt (cm/p). Für die Berechnung dieses Wertes kann eine bekannte Distanz, wie etwa der Abstand zwischen zwei Referenzpunkten, verwendet werden. Da die Distanz in Pixeln in der 2D-Ebene bekannt ist, kann somit der Wert für cm/Pixel berechnet werden.
Um Warnhinweise für eine Unterschreitung der einzuhaltenden Distanz zwischen zwei Personen herausgeben zu können, wurde ein Threshold von 150 cm eingebaut. Wird dieser Abstand nicht eingehalten, kann ein gewünschtes Event getriggert werden. In diesem Fall wird die Linie zwischen den Personen rot dargestellt (siehe Video).
Weiteres Vorgehen beim Smart DistancR
Die eigentlich Distanzberechnung ist somit abgeschlossen. Weiterführend kann die Anwendung aber um zusätzliche Aspekte und Funktionalitäten erweitert werden. In unserem Fall wurde eine Schnittstelle entwickelt, die die Daten direkt an einen MQTT Broker und somit an eine IoT Cloud weitergeben kann.
Referenzen
Weitere Beiträge
von Michel Ehmen
Dein Job bei codecentric?
Jobs
Agile Developer und Consultant (w/d/m)
Alle Standorte
Weitere Artikel in diesem Themenbereich
Entdecke spannende weiterführende Themen und lass dich von der codecentric Welt inspirieren.
Gemeinsam bessere Projekte umsetzen.
Wir helfen deinem Unternehmen.
Du stehst vor einer großen IT-Herausforderung? Wir sorgen für eine maßgeschneiderte Unterstützung. Informiere dich jetzt.
Hilf uns, noch besser zu werden.
Wir sind immer auf der Suche nach neuen Talenten. Auch für dich ist die passende Stelle dabei.
Blog-Autor*in
Michel Ehmen
IT Consultant
Du hast noch Fragen zu diesem Thema? Dann sprich mich einfach an.
Du hast noch Fragen zu diesem Thema? Dann sprich mich einfach an.