5.34. Zusammenfassung

Das image-Modul ist die größte API, die die Kamera bereitstellt, und dieses Kapitel hat gerade einen Überblick darüber gegeben: wie ein Bild im Speicher dargestellt wird, wie die Kamera einzelne Pixel liest und schreibt, wie sie in erfasste Einzelbilder zeichnet, wie sie diese arithmetisch und geometrisch transformiert, wie sie sie schwellenwert-klassifiziert und filtert, wie sie Messwerte und Erkennungen aus ihnen extrahiert, wie sie gedruckte Symbole aus ihnen dekodiert, wie sie ein Bild mit einem anderen vergleicht und wie sie die Ergebnisse auf die Kamera und von ihr herunterbekommt.

Der Werkzeugkasten ist absichtlich breit angelegt. Eine klassische Computer-Vision-Pipeline, die auf einer kleinen eingebetteten Kamera läuft, erledigt den Großteil ihrer Arbeit, bevor irgendetwas ein Machine-Learning-Modell erreicht, sofern es eines gibt – die Schwellenwertbildung bereinigt die Eingabe, Filter entrauschen, Regionen engen die Suche ein, Blob- und Liniendetektoren lokalisieren Kandidaten, die Ähnlichkeitsbewertung entscheidet, ob der Kandidat interessant ist, und die I/O-Schicht übergibt das Ergebnis an das, was die nächste Stufe ausführt. Jede Seite in diesem Kapitel hat eine dieser Operationen behandelt; die richtige Pipeline für eine gegebene Anwendung ist eine Abfolge von ihnen, zusammengesetzt in der Reihenfolge, die das Problem verlangt.

5.34.1. Das Pipeline-Muster

Die meisten nicht-trivialen Kamera-Anwendungen folgen demselben Schema. Erfasse ein Einzelbild vom Sensor. Verarbeite es vor: konvertiere Formate, gleiche das Histogramm an, glätte Rauschen heraus. Lokalisiere die interessierenden Regionen oder Merkmale: Blob-Erkennung, Linienerkennung, Template-Matching, Code-Dekodierung. Analysiere, was gefunden wurde: geometrische Messungen, Ähnlichkeitsbewertung, Statistik. Entscheide anhand der Analyse, was zu tun ist: einen GPIO auslösen, eine Nutzlast melden, erfassen-und-protokollieren, das Einzelbild an ein ML-Modell übergeben. Gib die Entscheidung oder das erfasste Artefakt aus: speichern, kodieren, senden, zurück in das Einzelbild für die IDE-Vorschau zeichnen.

Keine einzelne Kapitelseite hat jeden Schritt behandelt; das Kapitel hat die Bausteine behandelt, aus denen die Pipeline zusammengesetzt wird. Die Wahl, welche Bausteine in welcher Reihenfolge zu verwenden sind, ist die Aufgabe des Anwendungsskripts.

5.34.2. Wohin das Kapitel führt

Das image-Modul befasst sich mit Bildern als Bildern – Pixel, Regionen, Zeichnen, Erkennungen. Viel Arbeit an erfassten Daten passt nicht in dieses Schema. Statistik über ein beliebiges numerisches Array zu berechnen, vektorisierte Arithmetik auf rohen Sensordaten auszuführen, eine eigene Matrixtransformation anzuwenden, hinter der keine Methode des image-Moduls steht, Daten für ein Machine-Learning-Modell vorzubereiten, das ein bestimmtes Tensorlayout erwartet – all das sind Aufgaben für eine numerische Array-Bibliothek, nicht für eine Bildverarbeitungsbibliothek.

Das nächste Kapitel behandelt genau das. Das mit MicroPython auf der Kamera mitgelieferte Modul ulab.numpy ist eine Teilmenge von NumPy, und zwei Brücken verbinden es mit dem image-Modul: to_ndarray() kopiert die Pixel eines Einzelbilds in ein ndarray für numerische Arbeit, und der Konstruktor Image akzeptiert ein ndarray, um aus dem Ergebnis ein neues Bild zu erstellen, bereit zur Anzeige, zum Speichern oder zur Rückführung in die Bildbibliothek. Die beiden Module ergänzen sich – jedes tut, was das andere nicht tut, und zusammen decken sie die numerische und bildgebende Arbeit ab, die eine Embedded-Vision-Anwendung benötigt.