Verwenden Sie die OpenMV-Kamera, um schnell mit der Anwendung des maschinellen Lernens auf die Objekterkennung zu beginnen
Zur Verfügung gestellt von Nordamerikanische Fachredakteure von DigiKey
2020-02-25
Die Anwendung von maschinellem Lernen (ML) zur Objekterkennung und -klassifizierung wird zu einem dringenden Bedarf innerhalb der Industrie für eingebettete Systeme - insbesondere für das Internet der Dinge (IoT), Sicherheit, fortschrittliche Fahrassistenzsysteme (ADAS) und auf industrieller Automatisierung basierende Systeme. Die Objekterkennung ist jedoch ein komplexes Thema und ML ist relativ neu, so dass die Entwicklung von ML-Anwendungen zur Erkennung von Objekten schwierig und umständlich sein kann.
Beispielsweise war es bei der Objekterkennung traditionell erforderlich, dass Entwickler ein Framework wie OpenCV erlernen und Tausende von Dollar an Computerausrüstung kaufen mussten, um erfolgreich zu sein. Daher sind traditionelle Ansätze zur Objekterkennung und industriellen Bildverarbeitung nicht nur zeitaufwändig, sondern auch teuer.
Für Ingenieure, die ML für Objekterkennung und Bildverarbeitungsanwendungen einsetzen möchten, ohne die Notwendigkeit, ein Experte für ML zu werden oder ein kleines Vermögen für Geräte auszugeben, ist das programmierbare OpenMV H7-Kameramodul Python von SparkFun Electronics eine innovative Lösung. Das Modul ist als kostengünstiges "Arduino"-ähnliches Modul für die Bildverarbeitung und -erkennung konzipiert. Das Modul und das Software-Ökosystem stellen somit eine einzigartige und interessante Lösung dar, um eine einfache Objekterkennung und -klassifizierung mit ML in Form eines kostengünstigen Moduls zu ermöglichen.
Dieser Artikel stellt das OpenMV H7-Kameramodul vor und zeigt, wie Entwickler mit der Anwendung von ML zur Objekterkennung unter Verwendung des CIFAR-10-Computer-Vision-Bilddatensatzes beginnen können.
Das OpenMV H7-Kameramodul
Mit seinen funktionsreichen Software-Bibliotheken bietet das OpenMV H7-Kameramodul eine Menge, um einem Entwickler die schnelle Erstellung einer ML-Anwendung zu erleichtern. So können Entwickler beispielsweise die OpenMV-Kamera zur Gesichts- und Augenerkennung und sogar zur präzisen Verfolgung der Pupillen verwenden. Es kann verwendet werden, um Blobs oder Marker zu erstellen, die dann eine Farbe verfolgen. Es gibt sogar Beispiele dafür, wie ML zur Erkennung und Verfolgung von benutzerdefinierten Objekten verwendet werden kann.
Das OpenMV H7-Kameramodul ist ein einziges integriertes Entwicklungsboard, das alle für die ML-basierte Objekterkennung und -klassifizierung erforderlichen Hardwarekomponenten zu Kosten enthält, die um Größenordnungen unter denen herkömmlicher Bildverarbeitungssysteme liegen. Das Modul ist relativ klein, misst nur 1,4 x 1,75 Zoll (in.) und umfasst:
- Ein High-End-Mikrocontroller
- Ein integriertes und austauschbares Kameramodul
- Batterieverbinder
- USB-Mikro-Anschluss
- Dreifarbige LED
- Ein microSD-Sockel (unterstützt Karten mit bis zu 64 Gigabyte)
- Erweiterungseingang und -ausgang (E/A)
Abbildung 1: Das OpenMV H7-Kameramodul ist vollständig mit allen Komponenten integriert, die für die schnelle Entwicklung und Bereitstellung einer Bildverarbeitungsanwendung mit ML erforderlich sind. (Bildquelle: SparkFun Electronics)
Die Erweiterungs-E/A bietet Entwicklern eine Reihe von Peripheriefunktionen des Mikrocontrollers (Abbildung 2). Zu diesen Funktionen gehören Kommunikationsschnittstellen wie z.B:
- UART
- SPI
- I2C
- CAN
Die Erweiterungs-E/A umfasst auch Steuer- und Datenkanäle zum Ansteuern von Servos, zum Erzeugen von Signalen über einen Digital-Analog-Wandler (DAC) oder zum Lesen von Sensorwerten über einen Analog-Digital-Wandler (ADC). Diese Erweiterungs-E/As machen das OpenMV-Modul äußerst interessant für Bildverarbeitungsanwendungen in den Bereichen Hausautomatisierung, Roboterführung, Industrieautomatisierung und Objekterkennung und -verfolgung.
Abbildung 2: Das OpenMV H7-Kameramodul ist mit einer Vielzahl von erweiterbaren E/A-Pins ausgestattet. Diese Pins können zur Steuerung von Servomotoren, Probensensoren oder zur Kommunikation mit einem Wi-Fi-Modul verwendet werden, um ein IoT-Gerät zu erstellen. (Bildquelle: SparkFun)
Der integrierte Mikrocontroller ist der STM32F765VIT6 von STMicroelectronics, der einen Arm Cortex-M7-Prozessor in einem 100-Pin-LQFP enthält. Der Prozessor läuft mit 216 Megahertz (MHz) und verfügt über 2 Megabyte (Mbytes) Flash und 512 Kilobyte (Kbytes) RAM. Der Prozessor ist aufgrund seiner doppelt präzisen Fließkommaeinheit (FPU) und der vollständigen DSP-Instruktionen extrem leistungsfähig und gut gepaart für Bildverarbeitungsanwendungen. Der Mikrocontroller enthält auch einen hardwarebasierten JPEG-Kodierer, der Bildgebungsanwendungen beschleunigen kann. Das allgemeine Blockdiagramm für das STM32F765VIT6 ist in Abbildung 3 dargestellt.
Abbildung 3: Der STM32F765VIT enthält 2 Mbytes Flash, 512 KByte RAM und Peripheriegeräte wie hardwarebasierte JPEG-Kodierung und DSP-Anweisungen, die ihn perfekt für Bildverarbeitungsanwendungen geeignet machen. (Bildquelle: STMicroelectronics)
Das OpenMV H7-Kameramodul ist insofern einzigartig, als es mehrere verschiedene Kameramodule unterstützt. Wenn ein Entwickler zum Beispiel die Onboard-Kamera mit einer Auflösung von 640 x 480 nicht verwenden wollte, könnte er auf ein Modul umsteigen, das den Bildsensor MT9V034 von ON Semiconductor unterstützt. Der MT9V034 ist ein 1/3 Zoll breiter CMOS-Bildsensor im VGA-Format mit aktiven Pixeln, der einen globalen Verschluss und einen HDR-Modus (High Dynamic Range) aufweist. Der Sensor hat eine Bildauflösung von 752 x 480 und ist für den Betrieb über einen weiten Temperaturbereich von -30˚C bis +70˚C ausgelegt. ON Semiconductor bietet eine Entwicklungsplatine für diesen Bildsensor an, den MT9V034C12STCH-GEVB (Abbildung 4).
Abbildung 4: Der MT9V034C12STCH-GEVB ist eine Entwicklungsplatine für den Bildsensor MT9V034, die ein eingebautes Objektiv zur Beschleunigung der Entwicklung und des Tests enthält. (Bildquelle: ON Semiconductor)
Entwicklung einer ersten Anwendung zur Objekterkennung
Die Anwendungsentwicklung für das OpenMV H7-Kameramodul erfolgt über die OpenMV-IDE, die eine Python-Schnittstelle für die Anwendungsentwicklung bietet (Abbildung 5). Bei Python ist es nicht notwendig, eine Low-Level-Programmiersprache zu kennen. Tatsächlich ist das Skript nicht nur in Python geschrieben, sondern das OpenMV H7-Kameramodul führt MicroPython nativ aus. Dies bietet Entwicklern eine extrem einfache Möglichkeit, mit minimalem Aufwand mit dem Schreiben von Bildverarbeitungsanwendungen und der Ausführung von ML-Schlussfolgerungen zu beginnen.
Abbildung 5: Die OpenMV-IDE bietet eine Python-basierte Schnittstelle zur Entwicklung von Anwendungscode für das OpenMV H7-Kameramodul. Die Anwendung wird dann als Skript an das Kameramodul gesendet, auf dem MicroPython läuft. (Bildquelle: Beningo Embedded Group)
Eines der ersten Dinge, die ein Entwickler nach der Einrichtung tut, ist die Ausführung der Basisversion von hello_world.py, die den in Listing 1 gezeigten Code enthält. Das Python-Skript zeigt einem Entwickler, wie er die OpenMV-Kamera aktiviert und kontinuierlich Schnappschüsse macht. Dies ermöglicht dem Entwickler, Live-Video zu erhalten und die Bildfrequenz zu messen. Die Bildfrequenz kann während des Anschlusses an einen PC von nur 25 Bildern pro Sekunde (fps) bis zu etwa 60 fps variieren. Die Anwendung wird ausgeführt, indem Sie einfach die OpenMV-Kamera mit der OpenMV-IDE verbinden, indem Sie die Schaltfläche "Verbinden" in der linken unteren Ecke des Bildschirms verwenden und dann auf die grüne Schaltfläche "Ausführen" klicken.
Kopie
# Hello World Example
#
# Welcome to the OpenMV IDE! Click on the green run arrow button below to run the script!
import sensor, image, time
sensor.reset() # Reset and initialize the sensor.
sensor.set_pixformat(sensor.RGB565) # Set pixel format to RGB565 (or GRAYSCALE)
sensor.set_framesize(sensor.QVGA) # Set frame size to QVGA (320x240)
sensor.skip_frames(time = 2000) # Wait for settings take effect.
clock = time.clock() # Create a clock object to track the FPS.
while(True):
clock.tick() # Update the FPS clock.
img = sensor.snapshot() # Take a picture and return the image.
print(clock.fps()) # Note: OpenMV Cam runs about half as fast when connected
# to the IDE. The FPS should increase once disconnected.
Listing 1: Die OpenMV-IDE hello_world.py-Anwendung ermöglicht dem OpenMV-Kameramodul die Bereitstellung von Live-Video. (Code-Quelle: OpenMV)
Um einen ersten Objekterkennungs- und Klassifikationstest durchzuführen, muss ein ML-Netzwerk mit den gewünschten Objekterkennungsklassen trainiert werden. Ein häufig verwendeter Bilddatensatz, der zum Trainieren von Objekterkennungsmodellen und zum Testen der Funktionstüchtigkeit des Modells verwendet wird, ist der CIFAR-10-Datensatz. Der CIFAR-10-Datensatz besteht aus 60.000 Bildern mit 32 x 32 Farbbildern für die folgenden 10 verschiedenen Bildklassen:
- Flugzeug
- Automobil
- Vogel
- Katze
- Hirsch
- Hund
- Frosch
- Pferd
- Schiff
- LKW
Eine Beschreibung des Prozesses, der zum Trainieren des Modells und zur Umwandlung in eine Schlussfolgerung, die auf der OpenMV-Kamera laufen kann, würde den Rahmen dieses Artikels sprengen. Aber es ist möglich, ein CIFAR-10 geschultes Netzwerk zu betreiben, ohne die Modellentwicklung durchlaufen zu müssen: Die OpenMV-IDE enthält bereits ein trainiertes Modell für CIFAR-10, das nur noch auf die Kamera geladen werden muss.
Um dieses Modell zu verwenden, schließen Sie die OpenMV-Kamera an den PC und die OpenMV-IDE an. Klicken Sie in der OpenMV-IDE auf tools -> machine learning -> CNN Network Library. Es öffnet sich ein Fenster mit dem Ordner OpenMV qtcreator models. Es gibt zwei Möglichkeiten:
- cmsisnn
- tensorflow
Navigieren Sie unter cmsisnn zum Ordner cifar10, klicken Sie auf cifar10.network und öffnen Sie dann. Dann öffnet sich ein weiteres Fenster. Dieses Fenster dient zum Speichern der trainierten Netzwerkdatei auf der OpenMV-Kamera. Der Benutzer kann dann das mit der Kamera angezeigte Massenspeicherlaufwerk auswählen, um das Netzwerk zu speichern.
Nachdem das Netzwerk gespeichert wurde, laden Sie das CIFAR-10-Maschinenlernbeispiel, indem Sie zu File -> Examples -> 25-Machine-Learning -> nn_cifar10_search_whole_window.py gehen. Dadurch wird ein Beispielskript geladen, das unten (Listing 2) zu sehen ist.
Kopie
# CIFAR-10 Search Whole Window Example
#
# CIFAR is a convolutional neural network designed to classify its field of view into several
# different object types and works on RGB video data.
#
# In this example we slide the LeNet detector window over the image and get a list of activations
# where there might be an object. Note that use a CNN with a sliding window is extremely compute
# expensive so for an exhaustive search do not expect the CNN to be real-time.
import sensor, image, time, os, nn
sensor.reset() # Reset and initialize the sensor.
sensor.set_pixformat(sensor.RGB565) # Set pixel format to RGB565 (or GRAYSCALE)
sensor.set_framesize(sensor.QVGA) # Set frame size to QVGA (320x240)
sensor.set_windowing((128, 128)) # Set 128x128 window.
sensor.skip_frames(time=750) # Don't let autogain run very long.
sensor.set_auto_gain(False) # Turn off autogain.
sensor.set_auto_exposure(False) # Turn off whitebalance.
# Load cifar10 network (You can get the network from OpenMV IDE).
net = nn.load('/cifar10.network')
# Faster, smaller and less accurate.
# net = nn.load('/cifar10_fast.network')
labels = ['airplane', 'automobile', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck']
clock = time.clock()
while(True):
clock.tick()
img = sensor.snapshot()
# net.search() will search an roi in the image for the network (or the whole image if the roi is not
# specified). At each location to look in the image if one of the classifier outputs is larger than
# threshold the location and label will be stored in an object list and returned. At each scale the
# detection window is moved around in the ROI using x_overlap (0-1) and y_overlap (0-1) as a guide.
# If you set the overlap to 0.5 then each detection window will overlap the previous one by 50%. Note
# the computational work load goes WAY up the more overlap. Finally, for mult-scale matching after
# sliding the network around in the x/y dimensions the detection window will shrink by scale_mul (0-1)
# down to min_scale (0-1). For example, if scale_mul is 0.5 the detection window will shrink by 50%.
# Note that at a lower scale there's even more area to search if x_overlap and y_overlap are small...
# contrast_threshold skips running the CNN in areas that are flat.
for obj in net.search(img, threshold=0.6, min_scale=0.5, scale_mul=0.5, \
x_overlap=0.5, y_overlap=0.5, contrast_threshold=0.5):
print("Detected %s - Confidence %f%%" % (labels[obj.index()], obj.value()))
img.draw_rectangle(obj.rect(), color=(255, 0, 0))
print(clock.fps())
Listing 2: Die OpenMV IDE nn_cifar10_search_whole_window.py Beispielanwendung wird verwendet, um Bilder zu klassifizieren und ein Konfidenzniveau für die Klassifikation zu messen. (Code-Quelle: OpenMV)
Die Testanwendung kann gemäß dem Skript hello_world.py ausgeführt werden: Verbinden Sie die OpenMV-IDE mit dem Modul, indem Sie unten links auf connect klicken und dann auf run klicken. Zu diesem Zeitpunkt wird die Kamera das Skript ausführen und versuchen, die Bilder, die sie sieht, zu klassifizieren. Das Terminalfenster gibt aus, ob ein Bild klassifiziert ist oder nicht und wie hoch das Konfidenzniveau ist.
An diesem Punkt muss ein Entwickler lediglich verschiedene Objekte, die sich im CIFAR-10-Datensatz befinden, präsentieren und von der Kamera klassifizieren lassen. Für die Zwecke dieses Artikels wurde die Kamera mit einem Bild einer Katze (Abbildung 6) und einem Bild eines Flugzeugs (Abbildung 7) versehen. Das Bild ist schwer zu erkennen, aber das Vertrauensniveau lag bei etwa 70%. Das Konfidenzniveau kann aufgrund von Unterschieden in den trainierten Bildern gegenüber den Testbildern, den Lichtverhältnissen und anderen Faktoren niedrig sein. Höhere Niveaus sind sicherlich mit zusätzlicher Schulung und einer strengeren Kontrolle über die Kameraumgebung erreichbar.
Abbildung 6: Die OpenMV-IDE-Kamera, die ein CNN-Netzwerk für den CIFAR-10-Datensatz betreibt, wird mit einer Katze zur Erkennung präsentiert. (Bildquelle: Beningo Embedded Group)
Abbildung 7: Die OpenMV-IDE-Kamera, die ein CNN-Netzwerk für den CIFAR-10-Datensatz betreibt, wird mit einem Flugzeug zur Erkennung präsentiert. (Bildquelle: Beningo Embedded Group)
Erweiterung der Fähigkeiten des OpenMV H7
Es gibt viele Möglichkeiten, das OpenMV-Modul für die Verwendung mit verschiedenen Kameramodulen und einer fast unbegrenzten Anzahl externer Sensoren zu erweitern.
Obwohl das OpenMV-Modul über E/A-Erweiterungsmöglichkeiten verfügt, kann es nützlich sein, eine externe Erweiterungskarte zu verwenden, um zusätzlichen Zugriff auf Stromversorgung, Masse und Kommunikationssignale zu ermöglichen. Eine nützliche Erweiterungskarte ist der DFR0578 Gravitationserweiterungsschutz für das OpenMV M7-Modul von DFRobot (Abbildung 8). In der Abbildung ist zu sehen, dass das Gravitationsmodul Zugang zu einer Reihe weiterer Strom- und Masseanschlüsse bietet. Es erweitert sogar zusätzliche I2C-Leitungen und bietet zusätzliche Optionen zur Stromversorgung des Moduls. Dadurch wird es viel einfacher, externe Sensoren und Module anzuschließen, ohne eine Steckplatine zu verwenden oder Drähte zu spleißen.
Abbildung 8: Das DFRobot Gravity-Erweiterungsboard für die OpenMV-Nockenwelle M7 bietet mehrere zusätzliche, leicht zugängliche Header, um das Rapid Prototyping zu vereinfachen. (Bildquelle: DFRobot)
Neben dem Gravity-Board ist ein weiteres interessantes Erweiterungsboard, das für Entwickler hilfreich sein könnte, das DFRobot DFR0498 FireBeetle Covers - Camera & Audio Media Board (Abbildung 9). Das FireBeetle Entwicklungsmodul umfasst:
- Eine Schnittstelle zum Anschluss von IIS-Codecs
- Ein Kameramodul
- Kopfhörer
- Mikrofon
Es gibt viele andere Erweiterungskarten, die je nach Endanwendung an das OpenMV H7-Kameramodul angeschlossen werden können.
Abbildung 9: Der DFRobot FireBeetle DFR0498 enthält eine Erweiterung für Mediengeräte wie z.B. ein Mikrofon. (Bildquelle: DFRobot)
Tipps und Tricks für die Arbeit mit OpenMV
Der Einstieg in das OpenMV H7-Kameramodul ist nicht schwierig, aber es gibt viele Nuancen und Entscheidungen, die Entwickler, die zum ersten Mal damit arbeiten, kennen sollten. Hier sind einige "Tipps und Tricks" für den Einstieg in das Modul:
- Wenn Sie das Modul zum ersten Mal verwenden, stellen Sie sicher, dass Sie den Fokus auf das Modul gemäß der in der OpenMV-Dokumentation beschriebenen Vorgehensweise einstellen.
- Über das Menü Dateien -> Beispiele können Sie auf Dutzende von Beispielen zugreifen, die von der Erkennung einer Farbe bis hin zur Gesichtserkennung reichen.
- Um eine Internetverbindung hinzuzufügen, sollten Sie die Verwendung eines Wi-Fi-Schutzschildes in Betracht ziehen. Ein Wi-Fi-Schutzschild kann automatisch beim Start in der OpenMV-IDE über die Option Werkzeuge -> OpenMV-Kamera-Einstellungen aktiviert werden.
- Erwägen Sie die Verwendung von TensorFlow Lite zum Trainieren eines ML-Modells für das/die Objekt(e) von Interesse.
Entwickler, die diese "Tipps und Tricks" befolgen, werden feststellen, dass sie bei der erstmaligen Arbeit mit dem OpenMV H7-Kameramodul eine Menge Zeit und Ärger sparen können.
Fazit
Wie gezeigt, ist das OpenMV H7-Kameramodul in einzigartiger Weise geeignet, Entwicklern den schnellen Einstieg in die Anwendung der ML-Prinzipien auf die Objekterkennung und verwandte Anwendungen zu erleichtern. Es stehen nicht nur Beispielanwendungen zur Verfügung, die Entwickler zur Beschleunigung ihres Designs nutzen können, sondern es gibt auch zahlreiche Erweiterungsmöglichkeiten für Kameras und Sensoren. Um anzufangen, müssen Entwickler nur wissen, wie man ein paar Zeilen Python-Code schreibt, und sie können eine funktionierende Anwendung innerhalb von mehreren Stunden haben, je nach Komplexität.
Haftungsausschluss: Die Meinungen, Überzeugungen und Standpunkte der verschiedenen Autoren und/oder Forumsteilnehmer dieser Website spiegeln nicht notwendigerweise die Meinungen, Überzeugungen und Standpunkte der DigiKey oder offiziellen Politik der DigiKey wider.




