7.6. Aufbau von predict¶
Model.predict(inputs, *, callback=None) ist die Stelle, an der das geladene Modellobjekt tatsächlich arbeitet. Zwischen dem Hineingehen der Eingaben und dem Herauskommen des Ergebnisses laufen drei Stufen nacheinander ab: Vorverarbeitung, Engine-Dispatch, Nachverarbeitung. Zwei der drei nehmen Parameter entgegen, die das Skript direkt steuert; die Engine in der Mitte wird von der Kamera bestimmt.
Die drei Stufen von predict(). Vorverarbeitung und Nachverarbeitung nehmen Parameter entgegen, die das Skript steuert; die Engine in der Mitte ist durch die Kamera festgelegt.¶
7.6.1. Vorverarbeitung¶
Die Vorverarbeitungsstufe wandelt jede Eingabe in den dichten Tensor um, den das Netz erwartet. Die häufigste Eingabe ist ein image.Image, das in RGB565 erfasst wurde. Die Stufe schneidet es zu und skaliert es auf die input_shape des Netzes, konvertiert von RGB565 in das Kanalformat, mit dem das Netz trainiert wurde (RGB888 für die meisten Vision-Netze), wendet Skalierung und Offset pro Kanal an und – wenn das Netz ganzzahlige Eingaben erwartet – quantisiert im selben Durchgang auf den input_dtype des Modells. Netze, die für Float-Eingaben trainiert wurden, überspringen den Quantisierungsschritt und erhalten direkt das Ergebnis von Skalierung und Offset.
Die standardmäßige ml.preprocessing.Normalization liest den Eingabe-dtype des Modells und führt automatisch die richtige Transformation durch. Eine handabgestimmte Normalization überschreibt die Werte für Skalierung, Mittelwert und Standardabweichung für Modelle, die gegen benutzerdefinierte Kanalstatistiken trainiert wurden (die von ImageNet abgeleiteten Mittelwerte und Standardabweichungen sind ein häufiger Fall). Ein einfaches aufrufbares Objekt überschreibt die Stufe vollständig – nützlich, wenn die Eingabe gar kein Bild ist oder wenn die Anwendung den dichten Tensor bereits selbst erzeugt hat.
7.6.2. Engine-Dispatch¶
Die Engine-Stufe führt das Netz aus. An welche Engine sie dispatcht, ist durch die Kamera festgelegt: Der H7 und der RT1062 führen TFLM aus (den TensorFlow-Lite-for-Microcontrollers-Interpreter, der ARM-optimierte CMSIS-NN-Kernel dispatcht, wo sie existieren); der AE3 führt denselben TFLM-Interpreter mit seinem Cortex-M55-Fallback aus, wobei die Ethos-U-NPU jeden Operator übernimmt, den der Offline-Vela-Compiler für den Beschleuniger gekennzeichnet hat; der N6 führt STAI aus, STs Laufzeitumgebung für die zweckgebaute NPU des N6.
Das Skript wählt die Engine nicht aus. Die Engine, die mit der Kamera ausgeliefert wird, führt jedes Modell aus, das die Kamera lädt.
7.6.3. Nachverarbeitung¶
Die Nachverarbeitungsstufe wandelt die rohen Ausgabetensoren des Netzes wieder in ein verwendbares Ergebnis um. Das Standardverhalten besteht darin, jeden Ausgabetensor in Gleitkommazahlen zu dequantisieren (oder ihn bei Netzen mit Float-Ausgaben unverändert durchzureichen) und sie als Liste von ndarray-Objekten zurückzugeben. Die meisten Anwendungen registrieren einen Post-Prozessor – ein aufrufbares Objekt, das das Ausgabelayout des Netzes kennt – um die Tensoren in die Ergebnisform zu dekodieren, auf die die Anwendung reagiert: eine Liste von Begrenzungsrahmen, eine Liste von Schlüsselpunkten, eine Liste von Klassen.
Das Skript steuert diese Stufe auf zwei Arten. Das Schlüsselwort postprocess= am Konstruktor registriert einen Post-Prozessor, der bei jedem Aufruf läuft. Das Schlüsselwort callback= an predict() überschreibt den registrierten Post-Prozessor für nur einen Aufruf – nützlich, um zwischen mehreren Dekodern zu wechseln, ohne das Modell neu zu laden. Beide Formen erhalten (model, inputs, outputs) und geben zurück, was auch immer die Anwendung erwartet.
7.6.4. Was das Skript steuert¶
Vorverarbeitung und Nachverarbeitung sind die beiden Stellschrauben des Skripts. Der standardmäßige Vorprozessor bewältigt die meisten Vision-Modelle; der richtige Post-Prozessor für eine bestimmte Netzfamilie wird aus dem Katalog unter ml.postprocessing ausgewählt. Die Engine in der Mitte wird durch den Build bestimmt und läuft auf dieselbe Weise, unabhängig davon, was das Skript anfordert.