Erste Schritte beim maschinellen Sehen mit tinyML und OpenMV – Teil 1
Es gibt viele Anwendungsprobleme, die Ingenieure für eingebettete Systeme mithilfe von maschinellem Lernen und tinyML lösen können. Ein einzigartiges Problem, das sehr schwer von Grund auf zu programmieren ist, ist die Objekterkennung in einem Bild. Wie es der Zufall will, ist das Finden und Erkennen von Objekten jedoch eine perfekte Anwendung für tinyML. Der Einstieg in tinyML und maschinelles Sehen kann jedoch kompliziert sein. In den nächsten Beiträgen beleuchten wir den Einstieg in das maschinelle Sehen mit der OpenMV-Kamera.
Einführung zum OpenMV Cam H7
Angenommen, Sie interessieren sich für das maschinelle Sehen in Niederleistungsanwendungen mit einem Mikrocontroller. In diesem Fall müssen Sie entweder Ihr eigenes Kameramodul entwerfen oder ein bereits im Handel erhältliches finden. Ein Modul von Grund auf neu zu erstellen, wäre anspruchsvoll, kostspielig und zeitaufwändig. Eine interessante, im Handel erhältliche Lösung ist das OpenMV Cam.
Dabei handelt es sich um ein kleines, Arduino-ähnliches Entwicklungsboard, das alles enthält, was ein Entwickler für den Einstieg in das maschinelle Sehen braucht. Zunächst ist es wichtig zu wissen, dass es verschiedene Hardware-Versionen gibt. Die neueste Version ist das Modul OpenMV Cam H7 (Abbildung 1). Das Cam H7 basiert auf einem Mikrocontroller STM32H743VI von STMicroelectronics, der eine Arm-Cortex-M7-Architektur mit einer Taktrate von 480 Megahertz (MHz) nutzt. Außerdem verfügt das Bauteil über 1 Megabyte (MByte) SRAM und 2 MByte Flash. Wenn Sie mit maschinellem Sehen oder Lernen arbeiten, ist es immer gut, wenn Sie über ausreichend Speicherplatz verfügen. Das Cam H7 besitzt ein Kameramodul MT9M114, das Bilder mit 640 x 320 in 8-Bit-Graustufen bei 40 Bildern pro Sekunde (fps) oder 320 x 240 QVGA bei 40 - 80 fps aufnehmen kann. Das Kameramodul ist je nach den Anforderungen der Anwendung wechselbar.
Abbildung 1: Das Modul OpenMV Cam H7 enthält alles, was für den Einstieg in das Design von Anwendungen im Bereich maschinelles Sehen erforderlich ist. (Bildquelle: OpenMV)
Die OpenMV-Entwicklungsumgebung
Die integrierte Entwicklungsumgebung (integrated development environment, IDE) von OpenMV, die in Abbildung 2 dargestellt ist, dient Entwicklern zur Interaktion mit dem Cam H7. Die IDE bietet Entwicklern die Möglichkeit, Python-Skripte zu bearbeiten, die auf dem Modul ausgeführt werden sollen. Das Cam H7 verwendet MicroPython, eine Portierung von C-Python, die speziell für die Ausführung auf Mikrocontroller-basierten Systemen entwickelt wurde. Die Entwickler können dann eine Verbindung zu ihrem Cam H7 herstellen, ihr Skript auf das Gerät laden und ihre Anwendung ausführen. Außerdem erlaubt die IDE eine Live-Übertragung der Bilder aus dem Bildpuffer des Cam H7.
Abbildung 2: Die OpenMV-Entwicklungsumgebung enthält alles, was Entwickler zur Programmierung und Interaktion mit dem Cam H7 benötigen, wie z. B. einen Texteditor, ein Terminal und eine Bildaufnahmeanzeige. (Bildquelle: OpenMV)
Entwickler, die das Modul für maschinelles Sehen oder schließlich auch maschinelles Lernen einsetzen möchten, brauchen nicht lange zu suchen. Die OpenMV-IDE enthält Beispielskripte, die vom Versetzen des Systems in den Energiesparmodus bis zur Objekt- und Gesichtserkennung reichen. Außerdem gibt es Beispiele für die Verbindung des Moduls mit externen Entwicklungsboards wie Wi-Fi-Modulen, Trägheitsmesseinheiten und anderen Optionen.
Erkennen eines Kreises in einem Bild
Die OpenMV-IDE enthält ein HelloWorld-Skript, mit dem ein Entwickler eine Verbindung zur Kamera herstellen und Bilder aufnehmen kann, die in den Bildpuffer eingespeist werden. Für diesen Beitrag dachte ich, es wäre interessant, ein Beispiel zu betrachten, das etwas in einem Bild erkennen kann, z. B. einen Kreis.
Wenn Sie die OpenMV-IDE öffnen und auf „File->Examples->Feature-Detection->find_circles.py“ (siehe Abbildung 3) klicken, wird ein Skript angezeigt, das genau das tut. Es ist ganz einfach, dieses Skript zu testen: Zuerst müssen Sie ein Stück Papier oder einen Zettel nehmen und einen Kreis zeichnen (bitte beurteilen Sie nicht meine Zeichenkünste, die sind ziemlich grauenhaft). Auf der unteren linken Seite der IDE finden Sie dann eine Schaltfläche für die Verbindung. Klicken Sie darauf, um eine Verbindung mit dem Cam H7 herzustellen. Klicken Sie anschließend auf die grüne Wiedergabeschaltfläche direkt unter der Verbindungsschaltfläche. Richten Sie schließlich das Cam H7 auf den von Ihnen gezeichneten Kreis und überwachen Sie den Bildpuffer in der OpenMV-IDE.
Abbildung 3: Navigation zum Beispielskript „find_circles.py“ in der OpenMV-IDE. (Bildquelle: Beningo Embedded Group)
Sie werden feststellen, dass in regelmäßigen Abständen ein roter Kreis in den Bildpuffer gezeichnet wird, der den von Ihnen gezeichneten Kreis überlappt, wie in Abbildung 4 dargestellt. Beachten Sie, dass das Cam H7 trotz meiner mangelnden künstlerischen Fähigkeiten immer noch in der Lage war, einen kreisähnlichen Gegenstand in dem aufgenommenen Bild zu erkennen. Ein Kreis ist unser erstes Erkennungsbeispiel in dieser Blogserie, aber nicht unser letztes! Werfen wir einen Blick auf das Beispielskript, um zu verstehen, was es tut.
Abbildung 4: Das Beispielskript „find_circles.py“ fügt dem Bildpuffer einen roten Kreis hinzu, der hervorhebt, wenn ein Kreis erkannt wird. (Bildquelle: Beningo Embedded Group)
Analyse des Beispiels „find_circles.py“
Das Skript, das die OpenMV-IDE zur Verfügung stellt, um Kreise zu erkennen, ist sehr einfach. Zunächst importiert das Skript die benötigten Python-Bibliotheken und initialisiert den Kamerasensor und die Uhr, wie in Listing 1 gezeigt.
Kopierenimport sensor, image, time
sensor.reset()
sensor.set_pixformat(sensor.RGB565) # grayscale is faster
sensor.set_framesize(sensor.QQVGA)
sensor.skip_frames(time = 2000)
clock = time.clock()
Listing 1: Beispielcode zur Initialisierung des Kamerasensors. (Code-Quelle: OpenMV)
Als Nächstes wird die Anwendung in einer Endlosschleife ausgeführt, genau wie in jeder anderen eingebetteten Standardanwendung. Und schließlich gibt es noch die Magie, die die Erkennung ermöglicht. Nehmen Sie sich einen Moment Zeit, um Listing 2 zu prüfen.
Kopierenwhile(True):
clock.tick()
img = sensor.snapshot().lens_corr(1.8)
for c in img.find_circles(threshold = 2000, x_margin = 10, y_margin = 10, r_margin = 10,
r_min = 2, r_max = 100, r_step = 2):
img.draw_circle(c.x(), c.y(), c.r(), color = (255, 0, 0))
print(c)
print("FPS %f" % clock.fps())
Listing 2: Beispielcode zum Auslesen des Kamerasensors und Auffinden von Kreisen im Bild. (Code-Quelle: OpenMV)
Der Code in Listing 2 beginnt mit der Aufnahme eines Schnappschusses. Eine Methode namens „find_circles“, die in den OpenMV-Bibliotheken enthalten ist, kommt dann zum Einsatz, um das Bild nach Kreisen zu durchsuchen. Sie können die Kommentare im eigentlichen Quellcode-Beispiel lesen, um Einzelheiten zu den Parametern zu erfahren, aber wir sind vor allem an den Parametern r_min, r_max und r_step interessiert. Die Parameter r_min geben den minimalen Kreisradius an, der erkannt werden kann. Der Parameter r_max legt das Maximum fest. Das Programm sieht in dem Beispiel Kreise zwischen 2 und 100 Pixeln.
Wenn ein Kreis erkannt wird, wird die Methode „draw_circle“ in Kombination mit den Kreiswerten x, y und Radius verwendet, um einen Kreis über den erkannten Kreis zu zeichnen. Sie werden feststellen, dass die Farbe in der R-, G- und B-Notation angegeben wird, in diesem Fall Rot.
Fazit
Maschinelles Sehen und TinyML können von Entwicklern genutzt und auf eine nahezu unendliche Anzahl von Anwendungsfällen angewendet werden. In diesem Beitrag haben wir das OpenMV Cam H7 und die OpenMV-IDE vorgestellt und erste Schritte am Beispiel der gezeigt. Das erforderte jedoch kein tinyML, sondern nur ein paar Bibliotheksfunktionen. Im nächsten Beitrag werden wir uns mit den integrierten Beispielen für maschinelles Lernen befassen, bevor wir zu einem komplexeren Beispiel übergehen, in dem wir unser Erkennungsprojekt trainieren und einsetzen werden.

Have questions or comments? Continue the conversation on TechForum, Digi-Key's online community and technical resource.
Visit TechForum