Projekt 45: Simulink Bildverarbeitung: Unterschied zwischen den Versionen

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen
Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
 
(10 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 5: Zeile 5:


== Aufgabe ==
== Aufgabe ==
Simulink Bildverarbeitung mit einem Raspberry Pi 2 [[Datei:BildverarbeitungSimulink.jpg|220px|thumb|right|Abb.1: Vorlage  für diese Aufgabe - PKW zählen mit Simulink]]
Simulink Bildverarbeitung mit einem Raspberry Pi 2 [[Datei:BildverarbeitungSimulink.jpg|220px|thumb|right|Abb. 1: Vorlage  für diese Aufgabe - PKW zählen mit Simulink (Quelle: http://makerzone.mathworks.com/blog/counting-cars-and-analyzing-traffic-raspberry-pi-thingspeak/)]]




Zeile 33: Zeile 33:
===Aufgabenstellung===
===Aufgabenstellung===


Die Aufgabe bestand im Wesentlichen darin mit Hilfe von Simulink einen Algorithmus zur Bildverarbeitung zu entwickeln mit dem es möglich ist Personen im Bild zu finden und zu zählen. Dieses Programm sollte dabei auf einer Zielhardware,in diesem Fall ein Raspberry Pi 2, ausgeführt werden können. Die zu verarbeitenden Videodaten stammen von einer Kamera, die per USB-Verbindung an den Pi angeschlossen wird. Auf diese Weise können Live-Bilder in Echtzeit verarbeitet werden. Der mit dem Pi verbundene PC dient lediglich zur Darstellung der Ergebnisse.
Die Aufgabe bestand im Wesentlichen darin mit Hilfe von Simulink einen Algorithmus zur Bildverarbeitung zu entwickeln mit dem es möglich ist, Personen im Bild zu finden und zu zählen. Dieses Programm sollte dabei auf einer Zielhardware,in diesem Fall ein Raspberry Pi 2, ausgeführt werden können. Die zu verarbeitenden Videodaten stammen von einer Kamera, die per USB-Verbindung an den Pi angeschlossen wird. Auf diese Weise können Live-Bilder in Echtzeit verarbeitet werden. Der mit dem Pi verbundene PC dient lediglich zur Darstellung der Ergebnisse.


Als Vorlage<ref>[http://makerzone.mathworks.com/blog/counting-cars-and-analyzing-traffic-raspberry-pi-thingspeak/]''Vorlage MathWorks''. Website von MathWorks. Abgerufen am 02. Januar 2016.</ref> für diese Aufgabe wurde ein Projekt von MathWorks verwendet. Wie in Abbildung 2 zu erkennen ist, war dabei das Ziel Fahrzeuge auf einer Straße zu erkennen und so Aussagen über das Verkehrsaufkommen machen zu können.
Als Vorlage<ref>[http://makerzone.mathworks.com/blog/counting-cars-and-analyzing-traffic-raspberry-pi-thingspeak/]''Vorlage MathWorks''. Website von MathWorks. Abgerufen am 02. Januar 2016.</ref> für diese Aufgabe wurde ein Projekt von MathWorks verwendet. Wie in Abbildung 2 zu erkennen ist, war dabei das Ziel Fahrzeuge auf einer Straße zu erkennen und so Aussagen über das Verkehrsaufkommen machen zu können.


[[Datei:Simulink_BV_Ergebnis_Vorlage.png|506px|thumb|center|Abb.2: Ergebnis des Vorlageprojektes - Gefundene PKW werden im Bild markiert]]
[[Datei:Simulink_BV_Ergebnis_Vorlage.png|506px|thumb|center|Abb. 2: Ergebnis des Vorlageprojektes - Gefundene PKW werden im Bild markiert (Quelle: http://makerzone.mathworks.com/blog/counting-cars-and-analyzing-traffic-raspberry-pi-thingspeak/)]]


Bei der Entwicklung der Software für dieses Projekt wurde sich zu Nutze gemacht, dass die Fahrzeuge auf der beobachteten Straße sich mit der vorgeschriebenen Geschwindigkeit bewegen. Unter dieser Vorraussetzung konnte ein Zeitintervall bestimmt werden, das ein Fahrzeug benötigt, um vollständig durch das Bild zu fahren. Bei langsamen PKW bestand die Möglichkeit diese doppelt zu zählen, weil die Fahrzeuge nicht getrackt wurden und in einem fixen Intervall von 15 Sekunden Daten ausgewertet wurden. Außerdem konnten Autos, die z.B. durch Stau zum Stillstand gekommen sind, Teil des Hintergrundes werden, wodurch beim Wiederlosfahren diese Fahrzeuge als neue Objekte behandelt wurden.  
Bei der Entwicklung der Software für dieses Projekt wurde sich zu Nutze gemacht, dass die Fahrzeuge auf der beobachteten Straße sich mit der vorgeschriebenen Geschwindigkeit bewegen. Unter dieser Vorraussetzung konnte ein Zeitintervall bestimmt werden, das ein Fahrzeug benötigt, um vollständig durch das Bild zu fahren. Bei langsamen PKW bestand die Möglichkeit diese doppelt zu zählen, weil die Fahrzeuge nicht getrackt wurden und in einem fixen Intervall von 15 Sekunden Daten ausgewertet wurden. Außerdem konnten Autos, die z.B. durch Stau zum Stillstand gekommen sind, Teil des Hintergrundes werden, wodurch beim Wiederlosfahren diese Fahrzeuge als neue Objekte behandelt wurden.  
Zeile 45: Zeile 45:


===Benötigtes Material===
===Benötigtes Material===
Neben ein Entwicklungsrechner mit MATLAB/Simulink wird folgendes benötigt:
Neben einem Entwicklungsrechner, auf dem MATLAB/Simulink installiert ist, wird folgendes benötigt:


*Raspberry Pi 2
*Raspberry Pi 2
*MicroUSB-Netzteil 5V und mindestens 1A
*MicroUSB-Netzteil 5V und mindestens 1A
*MicroSD-Speicherkarte mit mindestens 4GB Speicherplatz
*MicroSD-Speicherkarte mit mindestens 4GB Speicherplatz
*CAT-5 Netzwerkleitung zur direkten Kommunikation mit dem Raspberry Pi. Alternativ kann das Raspberry Pi an einem Netzwerk angebunden werden, an dem der Entwicklungsrechner auch hängt.
*CAT-5 Netzwerkleitung zur direkten Kommunikation mit dem Raspberry Pi. Alternativ kann der Raspberry Pi in ein Netzwerk eingebunden werden, in dem der Entwicklungsrechner sich auch befindet.
*Webcam mit V4L2-Unterstützung, z.B. Logitec C310
*Webcam mit V4L2-Unterstützung, z.B. Logitec C310
*Optional ist ein HDMI-Kabel, falls man das Programm auf dem Raspberry Pi als Stand-Alone ohne Rückkopplung an dem Entwicklungsrechner betreibt bzw. die Video-Ausgabe direkt aus dem Raspberry Pi abzweigt.
*Optional ist ein HDMI-Kabel, falls man das Programm auf dem Raspberry Pi als Stand-Alone ohne Rückkopplung an dem Entwicklungsrechner betreibt bzw. die Video-Ausgabe direkt aus dem Raspberry Pi abzweigt.
Zeile 56: Zeile 56:


===Systemaufbau===
===Systemaufbau===
Das System besteht aus 3 Hauptkomponenten. In dem Entwicklungsrechner wird mithilfe von MATLAB/Simulink die Bildverarbeitung entwickelt und zu einem lauffähigen Programm (Binäre Daten) kompiliert. Die Programme können zum Raspberry Pi übertragen werden, wo sie als eigenständige Programme laufen. Für die Bildverarbeitung werden die benötigten RGB-Bilder aus einem USB-Kamera gelesen. Diese ist an dem Raspberry Pi angeschlossen und kann durch das entsprechende Simulink-Block adressiert werden.
Das System besteht aus drei Hauptkomponenten. An dem Entwicklungsrechner wird mithilfe von MATLAB/Simulink die Bildverarbeitung entwickelt und zu einem lauffähigen Programm (binäre Daten) kompiliert. Das Programm kann auf den Raspberry Pi übertragen werden, wo es als eigenständige Software ausgeführt wird. Für die Bildverarbeitung werden die benötigten RGB-Bilder aus einer USB-Kamera gelesen. Diese ist an den Raspberry Pi angeschlossen und kann durch den entsprechenden Simulink-Block adressiert werden.


[[Datei:Blockdiagramm Projekt45.PNG|506px|thumb|center|Schematischer Aufbau des Systems]]
[[Datei:Blockdiagramm Projekt45.PNG|506px|thumb|center|Abb. 3: Schematischer Aufbau des Systems]]


==Raspberry Pi 2 einrichten und Verbindung aufbauen==
==Raspberry Pi 2 einrichten und Verbindung aufbauen==
Zeile 64: Zeile 64:
===Support Package für Raspberry 2 installieren und konfigurieren===
===Support Package für Raspberry 2 installieren und konfigurieren===


Damit Simulinkmodelle für den Raspberry Pi kompiliert und auf der Hardware aufspielt werden können wird eine zusätzliche Toolkette - ein ''Hardware Support Package'' - benötigt.  Um den Support Package für den Raspberry Pi zu installieren wählt man in MATLAB auf der Home-Oberfläche die Option '''Get Hardware Support Package'''. Im folgenden Fenster wählt man die Installationsquelle Internet. Aus der Übersicht aller verfügbaren Paketen wird das Paket:
Damit Simulinkmodelle für den Raspberry Pi kompiliert und auf die Zielhardware aufspielt werden können, wird ein zusätzliches Tool - ein ''Hardware Support Package'' - benötigt.  Um das Support Package für den Raspberry Pi zu installieren wählt man in MATLAB auf der Home-Oberfläche die Option '''Get Hardware Support Package'''. Im folgenden Fenster wählt man die Installationsquelle Internet. Aus der Übersicht aller verfügbaren Paketen wird das Paket:


'''Raspberry Pi'''
'''Raspberry Pi'''
Zeile 71: Zeile 71:


<gallery>
<gallery>
Datei:MATLAB Hardwaresupportpackages.PNG|Einfügen von Hardware Support Packages unter MATLAB
Datei:MATLAB Hardwaresupportpackages.PNG|Abb. 4: Einfügen von Hardware Support Packages unter MATLAB
Datei:Raspberrypi supportpackage.PNG|Auswahl des Hardware Support Package für Raspberry Pi
Datei:Raspberrypi supportpackage.PNG|Abb. 5: Auswahl des Hardware Support Package für Raspberry Pi
</gallery>
</gallery>


Zeile 78: Zeile 78:
===Einrichtung des Raspberry Pi===
===Einrichtung des Raspberry Pi===


Nach der Installation des Support Package für Raspberry Pi lädt Simulink ein fertig eingerichtetes Linux-System auf der SD-Karte des Raspberry Pi. Dazu stellt Simulink eine Reihe von Konfigurationsdialogen bereit.
Nach der Installation des Support Packages für Raspberry Pi lässt sich mit Hilfe von Simulink ein bereits eingerichtetes Linux-System auf die SD-Karte des Raspberry Pi herunterladen. Dazu stellt Simulink eine Reihe von Konfigurationsdialogen bereit.


Zunächst wählt man das entsprechende Raspberry Pi Modell. In diesem Fall ist es das Raspberry Pi 2 Model B. Im nächsten Schritt wählt man die Verbindungsart zwischen dem Entwicklungsrechner und dem Raspberry Pi. Es stehen 3 Verbindungsarten zu Auswahl:
Zunächst wählt man das entsprechende Raspberry Pi Modell. In diesem Fall ist es der Raspberry Pi 2 Model B. Im nächsten Schritt wählt man die Verbindungsart zwischen dem Entwicklungsrechner und dem Raspberry Pi. Es stehen 3 Verbindungsarten zu Auswahl:
*Local Area or Home Network: Hier sucht der Entwicklungsrechner den Raspberry Pi in einem lokalen Netzwerk. Diese Verbindungsart empfiehlt sich nicht an der Hochschule. Da der Raspberry Pi zuvor durch den Sachgebiet IT-Infrastruktur an dem Netzwerk eingebunden werden muss. Ohne diesen Schritt besteht die Gefahr, dass Netzwerkports im Labor durch die Sicherheitsrichtlinien stillgelegt werden.
*Local Area or Home Network: Hier sucht der Entwicklungsrechner den Raspberry Pi in einem lokalen Netzwerk. Diese Verbindungsart empfiehlt sich nicht an der Hochschule. Der Raspberry Pi müsste zuvor in die IT-Infrastruktur eingebunden werden. Ohne diesen Schritt besteht die Gefahr, dass Netzwerkports im Labor durch die Sicherheitsrichtlinien stillgelegt werden.
*Direct Connection to Host Computer: In dieser Art wird der Entwicklungsrechner direkt mit dem Raspberry Pi über ein CAT-Kabel verbunden. Für das Projekt wurde diese Verbindungsart ausgewählt.
*Direct Connection to Host Computer: Bei dieser Verbindungsart wird der Entwicklungsrechner direkt mit dem Raspberry Pi über ein CAT-Kabel verbunden. Für das Projekt wurde diese Verbindungsart ausgewählt.
*Manually enter Network Settings: Hier kann der Nutzer die Netzwerkeinstellungen selbst vornehmen. Empfohlen für Nutzer mit Netzwerkkenntnissen.
*Manually enter Network Settings: Hier kann der Nutzer die Netzwerkeinstellungen selbst vornehmen. Empfohlen für Nutzer mit Netzwerkkenntnissen.


Nachdem man die Einstellungen vorgenommen hat, kann das Betriebssystem eingerichtet werden. Dazu muss die Mikro-SD-Karte des Pis an dem Rechner angeschlossen werden, z.B. mit einem Adapter oder Lesegerät. Simulink formatiert die Karte in das Linux-Dateisystem und schreibt das Betriebssystem auf der Karte.
Nachdem man die Einstellungen vorgenommen hat, kann das Betriebssystem eingerichtet werden. Dazu muss die Mikro-SD-Karte des Raspberry Pi an den Rechner angeschlossen werden, z.B. mit einem Adapter oder Lesegerät. Simulink formatiert die Karte in das Linux-Dateisystem und schreibt das Betriebssystem auf die Karte.


Am Ende der Schreiboperation muss der Raspberry Pi an dem Rechner angeschlossen und eingeschaltet werden. Zum Schluss wird die Konfiguration angezeigt und die Verbindung zum Raspberry Pi kann getestet werden.
Am Ende der Schreiboperation muss der Raspberry Pi an den Rechner angeschlossen und eingeschaltet werden. Zum Schluss wird die Konfiguration angezeigt und die Verbindung zum Raspberry Pi kann getestet werden.


<gallery>
<gallery>
Datei:Supportpackage setup raspberrypi model auswahl.PNG|Auswahl des richtigen Raspberry Pi Modells
Datei:Supportpackage setup raspberrypi model auswahl.PNG|Abb. 6: Auswahl des richtigen Raspberry Pi Modells
Datei:Supportpackage setup raspberrypi verbindung.PNG|Einstellung der Verbindungsart zwischen Entwicklungsrechner und Raspberry Pi
Datei:Supportpackage setup raspberrypi verbindung.PNG|Abb. 7: Einstellung der Verbindungsart zwischen Entwicklungsrechner und Raspberry Pi
Datei:Supportpackage setup raspberrypi sdcard.PNG|Aufspielen des Betriebssystems auf der SD-Karte
Datei:Supportpackage setup raspberrypi sdcard.PNG|Abb. 8: Aufspielen des Betriebssystems auf die SD-Karte
Datei:Supportpackage setup einschalten.PNG|Anschliessen und Einschalten des Raspberry Pi
Datei:Supportpackage setup einschalten.PNG|Abb. 9: Anschließen und Einschalten des Raspberry Pi
Datei:Supportpackage setup konfiguration.PNG|Abschluss der Installation und Verbindungsdaten
Datei:Supportpackage setup konfiguration.PNG|Abb. 10: Abschluss der Installation und Verbindungsdaten
</gallery>
</gallery>




===Übertragung von Programmen von Simulink zu Raspberry Pi===
===Übertragung des Programms von Simulink auf Raspberry Pi===
[[Datei:Simulink target build model.png|180px|thumb|right|Eigenständigen Ausführen des Modells auf dem Raspberry Pi]]
[[Datei:Simulink target build model.png|180px|thumb|right|Abb. 11: Eigenständiges Ausführen des Modells auf dem Raspberry Pi]]
[[Datei:Simulink target run external.png|180px|thumb|right|Ausführen des Modells auf dem Raspberry Pi mit Rückkopplung zu Simulink]]
[[Datei:Simulink target run external.png|180px|thumb|right|Abb. 12: Ausführen des Modells auf dem Raspberry Pi mit Rückkopplung zu Simulink]]


Es stehen zwei Möglichkeiten der Programmausführung auf dem Raspberry Pi zur Verfügung.
Es stehen zwei Möglichkeiten der Programmausführung auf dem Raspberry Pi zur Verfügung.
Zeile 106: Zeile 106:
*Ausführung auf dem Raspberry Pi als eigenständiges Programm ohne Rückkopplung zu Simulink. Dazu klickt man in Simulink auf dem Knopf '''Build Model'''. Das Programm wird kompiliert und auf dem Raspberry Pi ausgeführt. Eine Möglichkeit zur Betrachtung der Programmausführung von Simulink aus besteht in diesem Fall nicht.
*Ausführung auf dem Raspberry Pi als eigenständiges Programm ohne Rückkopplung zu Simulink. Dazu klickt man in Simulink auf dem Knopf '''Build Model'''. Das Programm wird kompiliert und auf dem Raspberry Pi ausgeführt. Eine Möglichkeit zur Betrachtung der Programmausführung von Simulink aus besteht in diesem Fall nicht.


*Ausführung auf dem Raspberry Pi mit Rückkopplung zu Simulink. Dazu wählt man das Simulationsmodus '''External''' und dann auf '''Run'''. Das Programm wird auf dem Raspberry Pi übertragen und ausgeführt. In diesem Modus können Daten zu Simulink zurück überführt werden. So ist es z.B. möglich, '''Display'''-Blöcke zu nutzen und die Werte auf dem Entwicklungsrechner zu beobachten oder auch die Video-Ausgaben vom Modell auf dem Entwicklungsrechner zu sehen.
*Ausführung auf dem Raspberry Pi mit Rückkopplung zu Simulink. Dazu wählt man den Simulationsmodus '''External''' und anschließend '''Run'''. Das Programm wird auf den Raspberry Pi übertragen und ausgeführt. In diesem Modus können Daten zu Simulink zurückgeführt werden. So ist es z.B. möglich, '''Display'''-Blöcke zu nutzen und die Werte auf dem Entwicklungsrechner zu beobachten oder auch die Video-Ausgabe des Modells auf dem Entwicklungsrechner zu sehen.


==Bildverarbeitung==
==Bildverarbeitung==


Die Bildverarbeitung erfolgt mit Simulink in mehreren Phasen. Bevor das Modell gestartet wird, muss der Modus festgelegt werden, der ausgeführt werden soll. Das geschieht mit Hilfe der Funktion "StarteBildverarbeitung.m". Es lässt sich dabei zwischen der Online-Version, die die Live-Kamerabilder verwendet, und der Offline Variante, die ein aufgenommenes Video nutzt, wählen. Außerdem wird in dieser Funktion das Hintergrundbild bestimmt, das später dazu dient Personen zu entdecken, die sich von diesem abheben. Alle weiteren Schritte sind im Programmablaufplan aufgelistet, der in Abbildung 3 zu sehen ist. Im Folgenden wird jede der aufgeführten Phasen kurz erläutert.
Die Bildverarbeitung erfolgt mit Simulink in mehreren Phasen. Bevor das Modell gestartet wird, muss der Modus festgelegt werden, der ausgeführt werden soll. Das geschieht mit Hilfe der Funktion "StarteBildverarbeitung.m". Es lässt sich dabei zwischen der Online-Version, die die Live-Kamerabilder verwendet, und der Offline Variante, die ein aufgenommenes Video nutzt, wählen. Außerdem wird in dieser Funktion das Hintergrundbild bestimmt, das später dazu dient Personen zu entdecken, die sich von diesem abheben. Alle weiteren Schritte sind im Programmablaufplan aufgelistet, der in Abbildung 13 zu sehen ist. Im Folgenden wird jede der aufgeführten Phasen kurz erläutert.
[[Datei:Simulink_Bildverarbeitung_kurzPAP.png|750px|thumb|center|Abb.3: Zusammengefasster PAP mit den wesentlichen Abschnitten der Bildverarbeitung]]
[[Datei:Simulink_Bildverarbeitung_kurzPAP.png|750px|thumb|center|Abb. 13: Zusammengefasster PAP mit den wesentlichen Abschnitten der Bildverarbeitung]]


===Vorverarbeitung===
===Vorverarbeitung===


Die Vorverarbeitung befasst sich im Wesentlichen damit, die Bilddaten in das richtige Format zu konvertieren. Von der Kamera werden Bilder im RGB-Format mit einer Auflösung von 320x240 Pixeln empfangen. Eine geringe Auflösung steigert hierbei die Anzahl der Frames, die pro Zeiteinheit verarbeitet werden können und wirkt sich somit positiv auf die Echtzeitfähigkeit aus. Um noch mehr Rechenzeit zu sparen, werden im ersten Schritt die drei Farbkanäle zu einem im Graubild-Format zusammengefasst. Dieser dient jedoch nur als Zwischenschritt, um daraus ein Schwarz-Weiß-Bild zu erzeugen. Das Hintergrundbild, das mit Hilfe der oben genannten Funktion erzeugt wurde, liegt ebenfalls in diesem Format vor. Daher kann im nächsten Schritt ein Vergleich des aktuellen Bildes mit dem Hintergrund stattfinden. Dies geschieht über eine einfache XOR-Verknüpfung jedes Pixels mit dem entsprechenden Bildelement aus dem Hintergrundbild. Bereiche, ohne Personen sind in beiden Bildern gleich, sodass diese Regionen schwarz im Ergebnis werden. Nur dort wo Personen den Hintergrund überdecken, sind diese als weiße Umrisse sichtbar. Abbildung 4 zeigt ein Zwischenergebnis, nachdem die Vorverarbeitung abgeschlossen wurde.
Die Vorverarbeitung befasst sich im Wesentlichen damit, die Bilddaten in das richtige Format zu konvertieren. Von der Kamera werden Bilder im RGB-Format mit einer Auflösung von 320x240 Pixeln empfangen. Eine geringe Auflösung steigert hierbei die Anzahl der Frames, die pro Zeiteinheit verarbeitet werden können und wirkt sich somit positiv auf die Echtzeitfähigkeit aus. Um noch mehr Rechenzeit zu sparen, werden im ersten Schritt die drei Farbkanäle zu einem im Graubild-Format zusammengefasst. Dieser dient jedoch nur als Zwischenschritt, um daraus ein Schwarz-Weiß-Bild zu erzeugen. Das Hintergrundbild, das mit Hilfe der oben genannten Funktion erzeugt wurde, liegt ebenfalls in diesem Format vor. Daher kann im nächsten Schritt ein Vergleich des aktuellen Bildes mit dem Hintergrund stattfinden. Dies geschieht über eine einfache XOR-Verknüpfung jedes Pixels mit dem entsprechenden Bildelement aus dem Hintergrundbild. Bereiche, ohne Personen sind in beiden Bildern gleich, sodass diese Regionen schwarz im Ergebnis dargestellt werden. Nur dort wo Personen den Hintergrund überdecken, sind diese als weiße Umrisse sichtbar. Abbildung 14 zeigt ein Zwischenergebnis, nachdem die Vorverarbeitung abgeschlossen wurde.
[[Datei:Simulink_BV_Vorverarbeitung.png|450px|thumb|center|Abb.4: Zwischenergebnis nach der Vorverarbeitung]]
[[Datei:Simulink_BV_Vorverarbeitung.png|450px|thumb|center|Abb. 14: Zwischenergebnis nach der Vorverarbeitung]]


===Rauschunterdrückung===
===Rauschunterdrückung===


Wie sich in der obigen Abbildung schon direkt erkennen lässt, ist nicht nur die Person als weiße Fläche zu sehen, sondern auch einige Elemente des Hintergrunds. Damit diese nicht während der nachfolgenden Schritte als Personen erkannt und fälschlicherweise gezählt werden, ist eine Rauschunterdrückung notwendig. Natürlich ließe sich dieser Effekt auch vermindern, indem die Kamera noch besser fixiert wird, jedoch stellen einige Maßnahmen in Software eine wesentlich robustere Lösung da.  
Wie sich in der obigen Abbildung schon direkt erkennen lässt, ist nicht nur die Person als weiße Fläche zu sehen, sondern auch einige Elemente des Hintergrunds. Damit diese nicht während der nachfolgenden Schritte als Personen erkannt und fälschlicherweise gezählt werden, ist eine Rauschunterdrückung notwendig. Natürlich ließe sich dieser Effekt auch vermindern, indem die Kamera noch besser fixiert wird, jedoch stellen einige Maßnahmen in Software eine wesentlich robustere Lösung dar.  
Im ersten Schritt der Rauschunterdrückung findet ein Erodieren statt. Dabei verringert sich die Größe aller Elemnte im Bild. Strukturen, die dabei eine Mindestgröße unterschreiten, werden durch Verwenden eines Median-Filters entfernt. Anschließend wird durch eine Dilatation die ursprüngliche Größe der einzelnen Elemente wiederhergestellt. Dies gilt jedoch nur, falls das betroffene Bildelement durch die vorrangegangenen Schritte nicht gänzlich verschwunden ist. Kleinere Strukturen, wie die schmalen Linien, die in Abbildung 4 zu sehen sind, können auf diese Weise aus dem Bild entfernt werden. Wie in Abbildung 5 zu sehen ist, sind Personen hingegen groß genug, um nicht durch die Rauschunterdrückung entfernt zu werden.  
Im ersten Schritt der Rauschunterdrückung findet ein Erodieren statt. Dabei verringert sich die Größe aller Elemente im Bild. Strukturen, die dabei eine Mindestgröße unterschreiten, werden darauffolgend durch Verwenden eines Median-Filters entfernt. Anschließend wird durch eine Dilatation die ursprüngliche Größe der einzelnen Elemente wiederhergestellt. Dies gilt jedoch nur, falls das betroffene Bildelement durch die vorrangegangenen Schritte nicht gänzlich verschwunden ist. Kleinere Strukturen, wie die schmalen Linien, die in Abbildung 14 zu sehen sind, können auf diese Weise aus dem Bild entfernt werden. Wie in Abbildung 15 zu sehen ist, sind Personen hingegen groß genug, um nicht durch die Rauschunterdrückung entfernt zu werden.  
[[Datei:Simulink_BV_Rauschunterdrückung.jpg|450px|thumb|center|Abb.5: Zwischenergebnis nach der Rauschunterdrückung]]
[[Datei:Simulink_BV_Rauschunterdrückung.jpg|450px|thumb|center|Abb. 15: Zwischenergebnis nach der Rauschunterdrückung]]


===Blob-Analyse und Auswertung===
===Blob-Analyse und Auswertung===


[[Datei:Simulink_BV_Endergebnis.jpg|450px|thumb|center|Abb.6: Zwischenergebnis nach der Rauschunterdrückung]]
Nachdem die Rauschunterdrückung alle ungewollten Strukturen beseitigt hat, enthält das Bild nur noch dort geschlossene weiße Elemente, wo sich Personen befinden. Um diese zählen und auch zuordnen zu können, ist es notwendig zu jedem dieser Elemente die Abmaße und den Mittelpunkt zu kennen. Diese Information können in Simulink leicht mit Hilfe einer Blob Analyse gewonnen werden.
Unter der Voraussetzung, dass sich die Personen aufrecht durch das Bild bewegen, kann eine Zuordnung der gefunden Blobs zu den Personen stattfinden. Die Zentren jener Blobs, die zu einer Person gehören, haben die Eigenschaft, dass ihre x-Koordinate mit einer gewissen Toleranz gleich ist. Sollte ein Blob außerhalb dieser Toleranz liegen, so wird er zu einer neuen Person gezählt. Auf diese Weise kann die Anzahl der Personen im aktuellen Bild bestimmt werden. Liegt die so ermittelte Anzahl einige Frames lang über der zuvor bestimmten Anzahl, ist mit großer Sicherheit eine neue Person ins Bild getreten und der Zähler wird inkrementiert.
Die Abmaße der einzelnen Blobs, die durch die Blob Analyse ermittelt wurden, werden dazu eingesetzt, die Blobs in das Originalbild einzuzeichnen. In Abbildung 6 ist das Endergebnis der Bildverarbeitung dargestellt. Hierbei ist ebenfalls zu erkennen, dass eine Person durchaus durch mehrere Blobs repräsentiert werden kann.
[[Datei:Simulink_BV_Endergebnis.jpg|450px|thumb|center|Abb. 16: Zwischenergebnis nach der Rauschunterdrückung]]


==Fazit==
==Fazit==
Betrachtet man das Endergebnis dieses Projektes und vergleicht es mit der Vorlage von MathWorks, lässt sich von einem erfolgreichen Projekt sprechen. Zwar lässt sich  der Zähl-Algorithmus noch weiter verbessern, um in bestimmten Fällen Fehler zu vermeiden, aber die Funktionalität ist grundsätzlich gegeben. Gegenüber der Vorlage besteht bei dieser Arbeit sogar der Vorteil, dass nicht nur in einem bestimmten Intervall von mehreren Sekunden Länge gezählt wird, sondern jeder Frame genutzt wird.
==Ausblick==
Um den Zähl-Algorithmus weiter zu verbessern, wären folgende Maßnahmen möglich:
*Implementieren eines Kalman-Filters für jede Person im Bild
*Entwicklung einer Logik, die es ermöglicht zeitweise verdeckte Personen nicht mehrfach zu zählen
*Entwicklung einer Logik, die ein Verlassen des Bildes nur an den Randbereichen zulässt
*Aufteilung der Zählung in Personen, die von links nach rechts und ungekehrt durch das Bild gelaufen sind
Gerade mit der Umsetzung des letzten Punktes ergäben sich vielfältige Einsatzmöglichkeiten für dieses Projekt. Es wäre beispielsweise möglich, zu zählen wie viele Studenten die Mensa zu einer bestimmten Zeit betreten und verlassen haben. Solche Daten könnten anschließend für die Planung eingesetzt werden, um lange Warteschlangen zu verhindern.


==Youtube-Video==
==Youtube-Video==
Zu diesem Projekt wurde ein Ergebnisvideo angefertigt. Dieses lässt sich unter dem folgenden Link abrufen [https://www.youtube.com/watch?v=A7QgMBuuMx8&feature=youtu.be].


==Quellen==
==Quellen==

Aktuelle Version vom 3. Februar 2016, 17:39 Uhr

Autoren: Asaad Al-Suleihi, Tim Salinski
Betreuer: Prof. Schneider
→ zurück zum Hauptartikel: Angewandte Elektrotechnik (WS 15/16)

Aufgabe

Simulink Bildverarbeitung mit einem Raspberry Pi 2

Abb. 1: Vorlage für diese Aufgabe - PKW zählen mit Simulink (Quelle: http://makerzone.mathworks.com/blog/counting-cars-and-analyzing-traffic-raspberry-pi-thingspeak/)


Erwartungen an die Projektlösung

  • Lesen Sie den Mathworks Artikel
  • Planen Sie den Aufbau
  • Beschaffen Sie die Bauteile
  • Realisierung des Aufbaus
  • Zählen Sie in Echtzeit, die Personen, die an der Kamera verübergehen
  • Machen ein spektakuläres Video, welches die Funktion visualisiert
  • Test und wiss. Dokumentation
  • Live Vorführung während der Abschlusspräsentation


Schwierigkeitsgrad

Anspruchsvoll (***)


Einleitung

Diese Aufgabe wurde im Rahmen der Lehrveranstaltung "Angewandte Elektrotechnik" im Masterstudiengang "Business & Systems Engineering" vergeben und bearbeitet. Dieser Wiki-Artikel stellt das Vorgehen dar und zeigt den Lösungsweg auf. Dabei wird darauf eingegangen welche Hard- und Software benötigt wird, wie der Algorithmus zur Bildverarbeitung funktioniert und welche Möglichkeiten zur Verbesserung oder Weiterentwicklung bestehen.


Aufgabenstellung

Die Aufgabe bestand im Wesentlichen darin mit Hilfe von Simulink einen Algorithmus zur Bildverarbeitung zu entwickeln mit dem es möglich ist, Personen im Bild zu finden und zu zählen. Dieses Programm sollte dabei auf einer Zielhardware,in diesem Fall ein Raspberry Pi 2, ausgeführt werden können. Die zu verarbeitenden Videodaten stammen von einer Kamera, die per USB-Verbindung an den Pi angeschlossen wird. Auf diese Weise können Live-Bilder in Echtzeit verarbeitet werden. Der mit dem Pi verbundene PC dient lediglich zur Darstellung der Ergebnisse.

Als Vorlage[1] für diese Aufgabe wurde ein Projekt von MathWorks verwendet. Wie in Abbildung 2 zu erkennen ist, war dabei das Ziel Fahrzeuge auf einer Straße zu erkennen und so Aussagen über das Verkehrsaufkommen machen zu können.

Abb. 2: Ergebnis des Vorlageprojektes - Gefundene PKW werden im Bild markiert (Quelle: http://makerzone.mathworks.com/blog/counting-cars-and-analyzing-traffic-raspberry-pi-thingspeak/)

Bei der Entwicklung der Software für dieses Projekt wurde sich zu Nutze gemacht, dass die Fahrzeuge auf der beobachteten Straße sich mit der vorgeschriebenen Geschwindigkeit bewegen. Unter dieser Vorraussetzung konnte ein Zeitintervall bestimmt werden, das ein Fahrzeug benötigt, um vollständig durch das Bild zu fahren. Bei langsamen PKW bestand die Möglichkeit diese doppelt zu zählen, weil die Fahrzeuge nicht getrackt wurden und in einem fixen Intervall von 15 Sekunden Daten ausgewertet wurden. Außerdem konnten Autos, die z.B. durch Stau zum Stillstand gekommen sind, Teil des Hintergrundes werden, wodurch beim Wiederlosfahren diese Fahrzeuge als neue Objekte behandelt wurden.

Ziel des Personen-Zählers ist es, dass Personen, die in mehr als nur einem Bild zu sehen sind, nicht mehrfach gezählt werden. Der Algorithmus funktioniert also unabgängig von Geschwindigkeit mit der sich jemand durch das Bild bewegt. Darüber hinaus soll es möglich sein im Bild stehenzubleiben ohne, dass es dadurch zu Fehlern am Zählerstand kommt.


Benötigtes Material

Neben einem Entwicklungsrechner, auf dem MATLAB/Simulink installiert ist, wird folgendes benötigt:

  • Raspberry Pi 2
  • MicroUSB-Netzteil 5V und mindestens 1A
  • MicroSD-Speicherkarte mit mindestens 4GB Speicherplatz
  • CAT-5 Netzwerkleitung zur direkten Kommunikation mit dem Raspberry Pi. Alternativ kann der Raspberry Pi in ein Netzwerk eingebunden werden, in dem der Entwicklungsrechner sich auch befindet.
  • Webcam mit V4L2-Unterstützung, z.B. Logitec C310
  • Optional ist ein HDMI-Kabel, falls man das Programm auf dem Raspberry Pi als Stand-Alone ohne Rückkopplung an dem Entwicklungsrechner betreibt bzw. die Video-Ausgabe direkt aus dem Raspberry Pi abzweigt.


Systemaufbau

Das System besteht aus drei Hauptkomponenten. An dem Entwicklungsrechner wird mithilfe von MATLAB/Simulink die Bildverarbeitung entwickelt und zu einem lauffähigen Programm (binäre Daten) kompiliert. Das Programm kann auf den Raspberry Pi übertragen werden, wo es als eigenständige Software ausgeführt wird. Für die Bildverarbeitung werden die benötigten RGB-Bilder aus einer USB-Kamera gelesen. Diese ist an den Raspberry Pi angeschlossen und kann durch den entsprechenden Simulink-Block adressiert werden.

Abb. 3: Schematischer Aufbau des Systems

Raspberry Pi 2 einrichten und Verbindung aufbauen

Support Package für Raspberry 2 installieren und konfigurieren

Damit Simulinkmodelle für den Raspberry Pi kompiliert und auf die Zielhardware aufspielt werden können, wird ein zusätzliches Tool - ein Hardware Support Package - benötigt. Um das Support Package für den Raspberry Pi zu installieren wählt man in MATLAB auf der Home-Oberfläche die Option Get Hardware Support Package. Im folgenden Fenster wählt man die Installationsquelle Internet. Aus der Übersicht aller verfügbaren Paketen wird das Paket:

Raspberry Pi

ausgewählt. Nach der Installation kann die Einrichtung des Raspberry Pi vorgenommen werden.


Einrichtung des Raspberry Pi

Nach der Installation des Support Packages für Raspberry Pi lässt sich mit Hilfe von Simulink ein bereits eingerichtetes Linux-System auf die SD-Karte des Raspberry Pi herunterladen. Dazu stellt Simulink eine Reihe von Konfigurationsdialogen bereit.

Zunächst wählt man das entsprechende Raspberry Pi Modell. In diesem Fall ist es der Raspberry Pi 2 Model B. Im nächsten Schritt wählt man die Verbindungsart zwischen dem Entwicklungsrechner und dem Raspberry Pi. Es stehen 3 Verbindungsarten zu Auswahl:

  • Local Area or Home Network: Hier sucht der Entwicklungsrechner den Raspberry Pi in einem lokalen Netzwerk. Diese Verbindungsart empfiehlt sich nicht an der Hochschule. Der Raspberry Pi müsste zuvor in die IT-Infrastruktur eingebunden werden. Ohne diesen Schritt besteht die Gefahr, dass Netzwerkports im Labor durch die Sicherheitsrichtlinien stillgelegt werden.
  • Direct Connection to Host Computer: Bei dieser Verbindungsart wird der Entwicklungsrechner direkt mit dem Raspberry Pi über ein CAT-Kabel verbunden. Für das Projekt wurde diese Verbindungsart ausgewählt.
  • Manually enter Network Settings: Hier kann der Nutzer die Netzwerkeinstellungen selbst vornehmen. Empfohlen für Nutzer mit Netzwerkkenntnissen.

Nachdem man die Einstellungen vorgenommen hat, kann das Betriebssystem eingerichtet werden. Dazu muss die Mikro-SD-Karte des Raspberry Pi an den Rechner angeschlossen werden, z.B. mit einem Adapter oder Lesegerät. Simulink formatiert die Karte in das Linux-Dateisystem und schreibt das Betriebssystem auf die Karte.

Am Ende der Schreiboperation muss der Raspberry Pi an den Rechner angeschlossen und eingeschaltet werden. Zum Schluss wird die Konfiguration angezeigt und die Verbindung zum Raspberry Pi kann getestet werden.


Übertragung des Programms von Simulink auf Raspberry Pi

Abb. 11: Eigenständiges Ausführen des Modells auf dem Raspberry Pi
Abb. 12: Ausführen des Modells auf dem Raspberry Pi mit Rückkopplung zu Simulink

Es stehen zwei Möglichkeiten der Programmausführung auf dem Raspberry Pi zur Verfügung.

  • Ausführung auf dem Raspberry Pi als eigenständiges Programm ohne Rückkopplung zu Simulink. Dazu klickt man in Simulink auf dem Knopf Build Model. Das Programm wird kompiliert und auf dem Raspberry Pi ausgeführt. Eine Möglichkeit zur Betrachtung der Programmausführung von Simulink aus besteht in diesem Fall nicht.
  • Ausführung auf dem Raspberry Pi mit Rückkopplung zu Simulink. Dazu wählt man den Simulationsmodus External und anschließend Run. Das Programm wird auf den Raspberry Pi übertragen und ausgeführt. In diesem Modus können Daten zu Simulink zurückgeführt werden. So ist es z.B. möglich, Display-Blöcke zu nutzen und die Werte auf dem Entwicklungsrechner zu beobachten oder auch die Video-Ausgabe des Modells auf dem Entwicklungsrechner zu sehen.

Bildverarbeitung

Die Bildverarbeitung erfolgt mit Simulink in mehreren Phasen. Bevor das Modell gestartet wird, muss der Modus festgelegt werden, der ausgeführt werden soll. Das geschieht mit Hilfe der Funktion "StarteBildverarbeitung.m". Es lässt sich dabei zwischen der Online-Version, die die Live-Kamerabilder verwendet, und der Offline Variante, die ein aufgenommenes Video nutzt, wählen. Außerdem wird in dieser Funktion das Hintergrundbild bestimmt, das später dazu dient Personen zu entdecken, die sich von diesem abheben. Alle weiteren Schritte sind im Programmablaufplan aufgelistet, der in Abbildung 13 zu sehen ist. Im Folgenden wird jede der aufgeführten Phasen kurz erläutert.

Abb. 13: Zusammengefasster PAP mit den wesentlichen Abschnitten der Bildverarbeitung

Vorverarbeitung

Die Vorverarbeitung befasst sich im Wesentlichen damit, die Bilddaten in das richtige Format zu konvertieren. Von der Kamera werden Bilder im RGB-Format mit einer Auflösung von 320x240 Pixeln empfangen. Eine geringe Auflösung steigert hierbei die Anzahl der Frames, die pro Zeiteinheit verarbeitet werden können und wirkt sich somit positiv auf die Echtzeitfähigkeit aus. Um noch mehr Rechenzeit zu sparen, werden im ersten Schritt die drei Farbkanäle zu einem im Graubild-Format zusammengefasst. Dieser dient jedoch nur als Zwischenschritt, um daraus ein Schwarz-Weiß-Bild zu erzeugen. Das Hintergrundbild, das mit Hilfe der oben genannten Funktion erzeugt wurde, liegt ebenfalls in diesem Format vor. Daher kann im nächsten Schritt ein Vergleich des aktuellen Bildes mit dem Hintergrund stattfinden. Dies geschieht über eine einfache XOR-Verknüpfung jedes Pixels mit dem entsprechenden Bildelement aus dem Hintergrundbild. Bereiche, ohne Personen sind in beiden Bildern gleich, sodass diese Regionen schwarz im Ergebnis dargestellt werden. Nur dort wo Personen den Hintergrund überdecken, sind diese als weiße Umrisse sichtbar. Abbildung 14 zeigt ein Zwischenergebnis, nachdem die Vorverarbeitung abgeschlossen wurde.

Abb. 14: Zwischenergebnis nach der Vorverarbeitung

Rauschunterdrückung

Wie sich in der obigen Abbildung schon direkt erkennen lässt, ist nicht nur die Person als weiße Fläche zu sehen, sondern auch einige Elemente des Hintergrunds. Damit diese nicht während der nachfolgenden Schritte als Personen erkannt und fälschlicherweise gezählt werden, ist eine Rauschunterdrückung notwendig. Natürlich ließe sich dieser Effekt auch vermindern, indem die Kamera noch besser fixiert wird, jedoch stellen einige Maßnahmen in Software eine wesentlich robustere Lösung dar. Im ersten Schritt der Rauschunterdrückung findet ein Erodieren statt. Dabei verringert sich die Größe aller Elemente im Bild. Strukturen, die dabei eine Mindestgröße unterschreiten, werden darauffolgend durch Verwenden eines Median-Filters entfernt. Anschließend wird durch eine Dilatation die ursprüngliche Größe der einzelnen Elemente wiederhergestellt. Dies gilt jedoch nur, falls das betroffene Bildelement durch die vorrangegangenen Schritte nicht gänzlich verschwunden ist. Kleinere Strukturen, wie die schmalen Linien, die in Abbildung 14 zu sehen sind, können auf diese Weise aus dem Bild entfernt werden. Wie in Abbildung 15 zu sehen ist, sind Personen hingegen groß genug, um nicht durch die Rauschunterdrückung entfernt zu werden.

Abb. 15: Zwischenergebnis nach der Rauschunterdrückung

Blob-Analyse und Auswertung

Nachdem die Rauschunterdrückung alle ungewollten Strukturen beseitigt hat, enthält das Bild nur noch dort geschlossene weiße Elemente, wo sich Personen befinden. Um diese zählen und auch zuordnen zu können, ist es notwendig zu jedem dieser Elemente die Abmaße und den Mittelpunkt zu kennen. Diese Information können in Simulink leicht mit Hilfe einer Blob Analyse gewonnen werden. Unter der Voraussetzung, dass sich die Personen aufrecht durch das Bild bewegen, kann eine Zuordnung der gefunden Blobs zu den Personen stattfinden. Die Zentren jener Blobs, die zu einer Person gehören, haben die Eigenschaft, dass ihre x-Koordinate mit einer gewissen Toleranz gleich ist. Sollte ein Blob außerhalb dieser Toleranz liegen, so wird er zu einer neuen Person gezählt. Auf diese Weise kann die Anzahl der Personen im aktuellen Bild bestimmt werden. Liegt die so ermittelte Anzahl einige Frames lang über der zuvor bestimmten Anzahl, ist mit großer Sicherheit eine neue Person ins Bild getreten und der Zähler wird inkrementiert. Die Abmaße der einzelnen Blobs, die durch die Blob Analyse ermittelt wurden, werden dazu eingesetzt, die Blobs in das Originalbild einzuzeichnen. In Abbildung 6 ist das Endergebnis der Bildverarbeitung dargestellt. Hierbei ist ebenfalls zu erkennen, dass eine Person durchaus durch mehrere Blobs repräsentiert werden kann.

Abb. 16: Zwischenergebnis nach der Rauschunterdrückung

Fazit

Betrachtet man das Endergebnis dieses Projektes und vergleicht es mit der Vorlage von MathWorks, lässt sich von einem erfolgreichen Projekt sprechen. Zwar lässt sich der Zähl-Algorithmus noch weiter verbessern, um in bestimmten Fällen Fehler zu vermeiden, aber die Funktionalität ist grundsätzlich gegeben. Gegenüber der Vorlage besteht bei dieser Arbeit sogar der Vorteil, dass nicht nur in einem bestimmten Intervall von mehreren Sekunden Länge gezählt wird, sondern jeder Frame genutzt wird.

Ausblick

Um den Zähl-Algorithmus weiter zu verbessern, wären folgende Maßnahmen möglich:

  • Implementieren eines Kalman-Filters für jede Person im Bild
  • Entwicklung einer Logik, die es ermöglicht zeitweise verdeckte Personen nicht mehrfach zu zählen
  • Entwicklung einer Logik, die ein Verlassen des Bildes nur an den Randbereichen zulässt
  • Aufteilung der Zählung in Personen, die von links nach rechts und ungekehrt durch das Bild gelaufen sind

Gerade mit der Umsetzung des letzten Punktes ergäben sich vielfältige Einsatzmöglichkeiten für dieses Projekt. Es wäre beispielsweise möglich, zu zählen wie viele Studenten die Mensa zu einer bestimmten Zeit betreten und verlassen haben. Solche Daten könnten anschließend für die Planung eingesetzt werden, um lange Warteschlangen zu verhindern.

Youtube-Video

Zu diesem Projekt wurde ein Ergebnisvideo angefertigt. Dieses lässt sich unter dem folgenden Link abrufen [2].

Quellen

  1. [1]Vorlage MathWorks. Website von MathWorks. Abgerufen am 02. Januar 2016.



→ zurück zum Hauptartikel: Angewandte Elektrotechnik (WS 15/16)