Ein Angebot von

Bildverarbeitung mit dem Smartphone

| Autor / Redakteur: Prof. Dr. Marianne von Schwerin und Daniel Klitzke* / Sebastian Gerstl

Die Softwarebibliothek OpenCV für Maschinelles Sehen kann auch auf Smartphones eingesetzt werden. Dies macht die Geräte sogar für bestimmte Anwendungen in der industriellen Beildverarbeitung tauglich - zumindest bis zu einem gewissen Grad.
Die Softwarebibliothek OpenCV für Maschinelles Sehen kann auch auf Smartphones eingesetzt werden. Dies macht die Geräte sogar für bestimmte Anwendungen in der industriellen Beildverarbeitung tauglich - zumindest bis zu einem gewissen Grad. (Bild: gemeinfrei / CC0)

In der industriellen Bildverarbeitung wird meist speziell zugeschnittene Hardware und eigens dafür entwickelte Software eingesetzt. Mit ihrer steigenden Leistungsfähigkeit on können aber auch Smartphones für Bildverarbeitungsaufgaben genutzt werden.

Das Beispiel der Verkehrszeichenerkennung in einem autonom fahrenden Modellauto zeigt, dass Bildverarbeitung sehr gut mit einem gängigen Smartphone gelöst werden kann. Allerdings ist das auf einem Smartphone basierende System nicht echtzeitfähig und die Hardware nicht auf Dauerbetrieb ausgelegt, so dass hier Zugeständnisse gemacht werden müssen. Moderne Smartphones sind mit leistungsstarken Multi-Core-Prozessoren sowie Arbeitsspeicher von einigen Gigabytes ausgestattet.

Sie können mit überschaubarem Aufwand für Bildverarbeitungsaufgaben nutzbar gemacht werden und bieten dadurch vielseitige Einsatzmöglichkeiten im industriellen Betrieb. Zudem bieten sie auch zahlreiche Kommunikationsschnittstellen und können so in verteilten Systemen eingesetzt werden. Durch Akkubetrieb ist der Einsatz insbesondere in mobilen Systemen attraktiv und die integrierten und zunehmend hochwertigen Kameras machen Smartphones auch für Bildverarbeitungsaufgaben interessant.

Anwendungsbeispiel

An der Hochschule Ulm wurde ein RC Car als ferngesteuertes, elektrisch angetriebenes Fahrzeug entwickelt (vgl. Bild 1), das autonom Fahrmanöver durchführen kann. Es kann einer auf dem Boden aufgebrachten Spur folgen, zum anderen reagiert es durch Auswertung von Kamerabildern geeignet auf Verkehrsschilder und Ampeln. Die Hauptsteuereinheit bildet ein ARM Cortex-M3 Mikrocontroller, der über WLAN Steuerkommandos empfängt und die elektrischen Antriebsmotoren entsprechend ansteuert.

An der Front des Fahrzeugs ist ein Smartphone vom Typ Google Nexus 5 angebracht, welches zum einen durch Auswertung von Bildern der internen Kamera einer Spur folgen kann, zum anderen die Bilder einer weiteren nach vorne gerichteten Kamera zur Erkennung von Verkehrszeichen bzw. Ampeln einsetzt. Die Ergebnisse dieser Auswertungen werden von der Software auf dem Bildverarbeitungssmartphone kombiniert und entsprechende Steuerkommandos an den Mikrocontroller gesendet.

Realisierung der Verkehrszeichenerkennung

Das im Beispiel eingesetzte Smartphone für die Bildverarbeitung ist ein Gerät mit Android Betriebssystem der Version 4.4.2. Es ist mit vier Kernen mit je 2,3 GHz Taktrate und 2 GB Arbeitsspeicher ausgestattet. Die bildverarbeitende Anwendung ist als Android-App in Java implementiert. Da in einem System zur Objekterkennung, wie dem hier realisierten, eine Vielzahl an gängigen Bildverarbeitungsalgorithmen zum Einsatz kommt, wird auf eine leistungsfähige Softwarebibliothek zurückgegriffen.

OpenCV ist eine Softwarebibliothek für Maschinelles Sehen sowie Maschinelles Lernen [1], die eine große Anzahl an eben solchen Algorithmen enthält. OpenCV ist Open Source und steht unter der BSD Li-zenz [1]. Im Rahmen des vorgestellten Projektes wurde OpenCV in der Version 3.1 verwendet. Die Einbindung der Bibliothek erfolgt über einen von OpenCV zur Verfügung gestellten Java Wrapper. So kann OpenCV sehr einfach aus dem Java-Code der App heraus verwendet werden.

Der Aufruf einer Java-Funktion des Wrappers führt zum Aufruf einer nativen, in C/C++ implementierten Methode, in der die eigentliche Berechnung durchgeführt wird, was gegenüber einer Implementierung in Java einen erheblichen Geschwindigkeitsvorteil bringt. Im Folgenden wird die Erkennung eines Stoppschildes exemplarisch als Bildverarbeitungsaufgabe für ein autonomes Fahrzeug herausgegriffen. Die Erkennung eines Verkehrszeichens teilt sich in einen Detektionsschritt sowie einen Klassifikationsschritt.

Bei der Detektion werden farbbasiert mögliche Schilderkandidaten aus dem Kamerabild herausgefiltert. Bei der Klassifikation werden die erkannten Schilderkandidaten dann anhand ihrer Form validiert und ggf. einer Liste mit erkannten Verkehrszeichen hinzugefügt (vgl. Bild 2). Die einzelnen Schritte der Detektion bzw. Klassifikation werden nun unter Zuhilfenahme von OpenCV umgesetzt.

Für die farbbasierte Detektion wird das Bild (vgl. Bild 3) zunächst in den HSV Farbraum konvertiert, was eine intuitivere farbliche Filterung ermöglicht, da die Farbtoninformation von Sättigung und Helligkeit getrennt im Hue Kanal vorliegt. Die Farbraumkonvertierung erfolgt durch den Aufruf der OpenCV-Funktion Img-proc.cvtColor. Anschließend werden alle Pixel, welche in relevanten Farbbereichen liegen, durch einfaches Thresholding herausgefiltert.

Auch hierbei kommt OpenCV mit der Filter-funktion Imgproc.inRange zum Einsatz. Man erhält ein binäres Bild, bei dem alle relevanten Pixel den Wert 255 (Weiß) haben (vgl. Bild 4). Basierend auf dem Binärbild werden nun einzelne Objekte aus dem Bild segmentiert. Hierzu wird das gesamte Bild durchlaufen und jeweils eine rechteckige Region auf die Anzahl ihrer relevanten Pixel überprüft.

Überschreitet diese Anzahl einen bestimmten Wert, so wird das Rechteck als zu einem Objekt gehörig markiert. Sich überlappende Rechtecke werden zu größeren Regionen zusammengefasst (vgl. Bild 5). Um nicht jedes Mal die Farbwerte aller Pixel in einer Region zusammenzählen zu müssen, wird die Operation auf ein zuvor mittels der OpenCV Funktion Imgproc.integral berechnetes Integralbild ausgeführt.

Die vorhergehend ermittelten Regionen, in denen sich aufgrund ihrer Farbgebung Verkehrsschilder befinden können, sollen nun klassifiziert werden, d.h. es soll geprüft werden, ob sich in einem detektierten Ausschnitt tatsächlich ein Verkehrsschild befindet und wenn ja, welches. Durchgeführt wird die Klassifikation mittels einer Support Vector Machine (SVM) anhand sogenannter Histogram of Oriented Gradients (HOG) Features.

Bei einem Histogram of Oriented Gradients handelt es sich um einen Feature Deskriptor, der im Bereich des maschinellen Sehens häufig zur formbasierten Objekterkennung eingesetzt wird. Er besteht aus Histogrammen, welche die Verteilung von Gradienten in einer bestimmten Bildregion repräsentieren (vgl. Bild 6). Der Gradient ist in diesem Fall ein zweidimensionaler Vektor, der an jeder Pixel-Position in Richtung der stärksten Änderung zeigt (vgl. Bild 7).

Die Berechnung des Deskriptors ist einfach durch die Nutzung von OpenCV möglich, so wird lediglich ein Objekt vom Typ HogDescriptor instanziiert und der Feature Vektor durch Aufruf der Methode HogDescriptor.compute berechnet. Für die so berechneten Form-Features jedes Schilderkandidaten muss nun geprüft werden, welcher Schilderklasse diese zugeordnet werden können. Eine Support Vector Machine ist ein Algorithmus für überwachtes Lernen (engl. supervised learning), d.h. der Algorithmus erlernt aus einer Menge von Beispieldaten eine Funktion, die einer Eingabe eine bestimmte Ausgabe zuordnet [2].

Das bedeutet, dass die SVM anhand von Feature-Vektoren für eine große Anzahl an bekannten Schildern und Negativbeispielen auf die jeweils passende Ausgabe trainiert wurde. Hier wurde nicht die SVM Implementierung von OpenCV sondern die Bibliothek libSVM verwendet, da der Java-Wrapper von OpenCV zum Zeitpunkt der Implementierung einen Fehler aufwies, welcher das Speichern und Laden eines trainierten SVM-Models verhinderte.

Ergebnis

Das entwickelte System zeigt gute funktionale Eigenschaften, weist aber auch Einschränkungen auf. Positiv hervorzuheben ist die Vielzahl der in OpenCV verfügbaren Algorithmen und deren hoher Optimierungsgrad, so dass eine gute Performance gewährleistet ist. Auch die im vorgestellten Projekt erfolgte Einbindung über einen Java-Wrapper gestaltete sich weitestgehend problemlos.

Leider ist dieser Java-Wrapper kaum dokumentiert, d.h. es finden sich in der offiziellen Dokumentation nur wenige grundlegende Beispiele zu dessen Verwendung. Je mehr und algorithmisch anspruchsvollere Bildverarbeitung betrieben wird, desto stärker wird die Performance des Gesamtsystems beeinflusst. Wird statt Java ausschließlich nativer Code in C oder C++ im bildverarbeitenden Teil der Anwendung genutzt, so kann die Performance deutlich verbessert werden, wie auch Tests im vorgestellten System zeigen.

Dieses ist ohne weiteres möglich, indem man OpenCV nicht über den Java-Wrapper sondern als native Bibliothek einbindet (siehe [3]). Sollten performancekritische Funktionalitäten teilweise dennoch in Java implementiert sein, so lohnt sich ein Blick auf die Performance-Tipps der Android Developers Dokumentation unter [4] bzw. auf die Best Practices for Performance [5]. Ein generelles Problem ist der Einsatz von Android-Smartphones in Echtzeitsystemen.

Für harte Echtzeitanforderungen eignet sich eine derartige Lösung nicht, da die Bestimmung einer maximalen Laufzeit für bestimmte Aufgaben meist nicht möglich ist. Ein Beispiel hierfür ist der nicht deterministische Garbage Collector. Abhilfe könnte hier eine echtzeitfähige Android Version, wie das an der RWTH Aachen entwickelte RTAndroid, schaffen [6].

Doch auch hiermit bleiben weitere Echtzeitprobleme im Gesamtsystem bestehen, wie z.B. die nicht vorhersagbare Übertragungszeit von Daten über WLAN. Beim Einsatz eines Smartphones für die Bildverarbeitung auf die Auslastung des Arbeitsspeicher zu achten, denn eine Überschreitung der maximalen Heap-Größe der Laufzeitumgebung führt zum Absturz der App. Diese maximale Heap-Größe variiert je nach Smartphone und wird vom Hersteller festgelegt.

Standardmäßig definiert der sogenannte heapgrowthlimit-Wert die maximale Heap-Größe. Das Limit kann durch das Setzen des Flags android:largeHeap im Manifest der Android-App erhöht werden. In diesem Fall definiert der heapsize-Wert die Grenze für die Heap-Größe. Die Werte werden vom Hersteller in der build.prop Datei definiert und können verändert werden, sofern man Root-Rechte besitzt.

Die Performance des Systems unterliegt auch Faktoren, auf die der Programmierer keinen Einfluss hat. So zeigte sich in Tests, dass das eingesetzte Smartphone die maximale Taktfrequenz der Prozessorkerne bei Überschreitung einer kritischen Temperatur deutlich herabsetzt und die Verarbeitungsrate so von 10,5 auf 5,8 Frames pro Sekunde absinkt.

Im Falle des Google Nexus 5 wird die CPU Frequenz ab einer Temperatur von 42 Grad von 2300MHz auf 1570MHz und ab 44 Grad auf 1190MHz gedrosselt. Diese Werte sind in der Datei thermal-engine.conf definiert. Auch weitere Faktoren, wie z.B. die Aktivierung des Energiesparmodus bei niedrigem Akku-Stand oder die Aktivitäten anderer im Hintergrund aktiver Apps beeinflussen die Leistungsfähigkeit des Smartphones.

Schlussfolgerung

Moderne Smartphones sind eine interessante Plattform für die Realisierung eines bildverarbeitenden Systems, da Android-Versionen moderner Bibliotheken wie OpenCV verfügbar sind. Die Realisierung von Systemen, die harten Echtzeitanforderungen genügen müssen, ist jedoch eingeschränkt, da die Laufzeitumgebung nicht echtzeitfähig ist.

Auch zeigt sich, dass die Smartphone-Hardware im Falle einer dauerhaften hohen Prozessorauslastung temperaturbedingt nicht gewachsen ist und die Prozessortaktfrequenz bereits nach kurzer Zeit erheblich gedrosselt wurde. Trotzdem stellen Smartphones aber eine interessante, leistungsfähige und preisgünstige Plattform für die Realisierung bildverarbeitender Systeme dar.

Vom Bildanzeiger bis zur Gesichtserkennung – Grafikverarbeitung mit OpenCV

Vom Bildanzeiger bis zur Gesichtserkennung – Grafikverarbeitung mit OpenCV

18.05.18 - Viele Bibliotheken vereinfachen dem Entwickler die Arbeit ungemein, dies gilt auch für die Open Cource Computer Vision Library. OpenCV bietet über 2.500 Algorithmen rund um die Verarbeitung und Analyse von Bildmaterial. lesen

(Dieser Beitrag wurde mit freundlicher Genehmigung der Autoren dem Tagungsband des Embedded Software Engineering Kongress 2016 entnommen.)

Literaturverzeichnis

[1] Itseez, „About | OpenCV,“ 2016. [Online]. [Zugriff am 11 3 2016].
[2] S. J. Russell und P. Norvig, Artificial intelligence. A modern approach. 3. ed., Upper Saddle River, NJ: Prentice-Hall, 2010.
[3] opencv dev team, „Introduction into Android Development - OpenCV 2.4.13.1 documentation,“ opencv dev team, [Online]. [Zugriff am 29 9 2016].
[4] Google Inc., „Performance Tips | Android Developers,“ Google Inc., [Online]. [Zugriff am 29 9 2016].
[5] Google Inc., „Best Practices for Performance | Android Developers,“ Google Inc., [Online]. [Zugriff am 29.9.2016].
[6] Real-Time Android Project, „RTAndroid | Real-Time Android Project,“ 2015. [Online]. [Zugriff am 28.05. 2019].

* Marianne von Schwerin ist Professorin für Softwareengineering an der Hochschule Ulm. Ihre Arbeitsgebiete umfassen u.a. Softwaredesign, UML für Embedded Sys-tems und Softwaresysteme in der Telekommunikation.

* Daniel Klitzke ist Absolvent der Hochschule Ulm im Fach Technische Informatik und setzt aktuell seine Ausbildung zum Master in Informatik an der Universität Karlsruhe fort.

Kommentar zu diesem Artikel abgeben

Schreiben Sie uns hier Ihre Meinung ...
(nicht registrierter User)

Zur Wahrung unserer Interessen speichern wir zusätzlich zu den o.g. Informationen die IP-Adresse. Dies dient ausschließlich dem Zweck, dass Sie als Urheber des Kommentars identifiziert werden können. Rechtliche Grundlage ist die Wahrung berechtigter Interessen gem. Art 6 Abs 1 lit. f) DSGVO.
Kommentar abschicken
copyright

Dieser Beitrag ist urheberrechtlich geschützt. Sie wollen ihn für Ihre Zwecke verwenden? Infos finden Sie unter www.mycontentfactory.de (ID: 44847624 / Implementierung)