Share via


Binden eines Modells

Ein Machine Learning-Modell verfügt über Eingabe-und Ausgabefunktionen, mit denen Informationen an das und aus dem Modell übergeben werden.

Nachdem Sie das Modell als LearningModel geladen haben, können Sie mit LearningModel.InputFeatures und LearningModel.OutputFeaturesILearningModelFeatureDescriptor-Objekte abrufen. Diese listen die erwarteten Eingabe- und Ausgabefunktionstypen des Modells auf.

Sie verwenden eine LearningModelBinding, um Werte an eine Funktion zu binden. Dabei wird auf ILearningModelFeatureDescriptor durch seine Eigenschafts Name verwiesen.

Das folgende Video bietet eine kurze Übersicht über die Bindungsfunktionen von Machine Learning-Modellen.


Typen von Features

Windows ML unterstützt alle ONNX-Funktionstypen, die in LearningModelFeatureKind aufgeführt werden. Diese werden verschiedenen Funktionsdeskriptorklassen zugeordnet:

Tensoren

Tensoren sind mehrdimensionale Arrays, und der häufigste Tensor ist ein Tensor aus 32-Bit-Gleitkommawerten. Die Dimensionen von Tensoren sind zeilenweise angeordnet und bestehen aus eng gepackten, zusammenhängenden Daten, die jede Dimension darstellen. Die Gesamtgröße des Tensors ist das Produkt der Größen jeder Dimension.

Sequenzen

Sequenzen sind Vektoren von Werten. Eine häufige Verwendung von Sequenztypen ist ein Vektor von Gleitkommawahrscheinlichkeiten, den einige Klassifizierungsmodelle zurückgeben, um die Genauigkeitsbewertung für jede Vorhersage anzugeben.

Maps

Zuordnungen sind Schlüssel-Wert-Paare mit Informationen. Klassifizierungsmodelle geben in der Regel eine Zeichenfolge-Gleitkomma-Zuordnung zurück, die die Gleitkommawahrscheinlichkeit für die einzelnen bezeichneten Klassifizierungsnamen beschreibt. Beispielsweise kann die Ausgabe eines Modells, das versucht, die Hunderasse in einem Bild vorherzusagen, ["Boston terrier", 90.0], ["Golden retriever", 7.4], ["Poodle", 2.6] sein.

Skalare

Die meisten Zuordnungen und Sequenzen verfügen über Werte, die Skalare sind. Diese treten auf, wenn TensorFeatureDescriptor.Shape.Size NULL (0) ist. In diesem Fall ist die Zuordnung oder Sequenz vom skalaren Typ. Am häufigsten ist float. Ein Beispiel für eine Zeichenfolge-Gleitkomma-Zuordnung wäre:

MapFeatureDescriptor.KeyKind == TensorKind.String
MapFeatureDescriptor.ValueDescriptor.Kind == LearningModelFeatureKind.Tensor
MapFeatureDescriptor.ValueDescriptor.as<TensorFeatureDescriptor>().Shape.Size == 0

Der tatsächliche Wert der Zuordnungsfunktion ist ein IMap<string, float>-Element.

Sequenz von Zuordnungen

Eine Zuordnungssequenz ist nur ein Vektor aus Schlüssel-Wert-Paaren. Beispielsweise wäre eine Sequenz von Zeichenfolgen-Gleitkomma-Zuordnungen vom Typ IVector<IMap<string, float>>. Die obige Ausgabe von Hunderassenvorhersagen ["Boston terrier", 90.0], ["Golden retriever", 7.4], ["Poodle", 2.6] ist ein Beispiel für eine Sequenz von Zuordnungen.

Bilder

Beim Arbeiten mit Bildern müssen Sie sich mit den Bildformaten und Tensorisierung vertraut machen.

Bildformate

Modelle werden mit Bildtrainingsdaten trainiert, und die Gewichtungen werden gespeichert und auf den jeweiligen Trainingssatz zugeschnitten. Wenn Sie eine Bildeingabe an das Modell übergeben, muss das Format mit dem Format der Trainingsbilder übereinstimmen.

In vielen Fällen beschreibt das Modell das erwartete Bildformat. ONNX-Modelle können Metadaten verwenden, um erwartete Bildformate zu beschreiben.

Die meisten Modelle verwenden die folgenden Formate, aber dies gilt nicht universell für alle Modelle:

  • Image.BitmapPixelFormat: Bgr8
  • Image.ColorSpaceGamma: SRGB
  • Image.NominalPixelRange: NominalRange_0_255

Tensorisierung

Bilder werden in Windows ML in einem Tensorformat dargestellt. Tensorisierung ist der Prozess, bei dem ein Bild in einen Tensor konvertiert wird. Dies erfolgt während der Bindung.

Windows ML konvertiert Bilder in vierdimensionale Tensoren mit 32-Bit-Gleitkommawerten im „NCHW-Tensorformat“:

  • N: Batchgröße (oder Anzahl der Bilder). Windows ML unterstützt derzeit eine Batchgröße N von 1.
  • C: Kanalanzahl (1 für Gray8, 3 für Bgr8).
  • H: Höhe.
  • W: Breite.

Jedes Pixel des Bilds ist eine 8-Bit-Farbnummer, die im Bereich von 0 bis 255 gespeichert und in einen 32-Bit-Gleitkommawert gepackt wird.

Vorgehensweise: Übergeben von Bildern an das Modell

Es gibt zwei Möglichkeiten, Bilder an Modelle zu übergeben:

  • ImageFeatureValue

    Es wird empfohlen, ImageFeatureValue zu verwenden, um Bilder als Eingaben und Ausgaben zu binden, da sowohl die Konvertierung als auch die Tensorisierung übernommen wird, sodass die Bilder dem erforderlichen Bildformat des Modells entsprechen. Die derzeit unterstützten Modellformattypen sind Gray8, Rgb8 und Bgr8, und der derzeit unterstützte Pixelbereich ist 0 bis 255.

    Sie können einen ImageFeatureValue mithilfe der statischen-Methode ImageFeatureValue.CreateFromVideoFrame erstellen.

    Um herauszufinden, welches Format das Modell benötigt, verwendet WinML die folgende Logik und Rangfolge:

    1. Mit Bind(String, Object, IPropertySet) werden alle Bildeinstellungen überschrieben.
    2. Die Modellmetadaten werden dann überprüft und verwendet, wenn sie verfügbar sind.
    3. Wenn keine Modellmetadaten bereitgestellt werden und kein Aufrufer Eigenschaften bereitstellt, versucht die Laufzeit, eine bestmögliche Übereinstimmung zu treffen.
    • Wenn der Tensor wie NCHW (vierdimensionaler float32-Wert, N==1) aussieht, geht die Laufzeit je nach Kanalanzahl von Gray8 (C==1) oder Bgr8 (C==3) aus.
    • NominalRange_0_255 wird angenommen.
    • SRGB wird angenommen.

    Es gibt mehrere optionale Eigenschaften, die Sie an Bind(String, Object, IPropertySet) übergeben können:

    • BitmapBounds: Wenn angegeben, sind dies die Zuschneidebegrenzungen, die vor dem Senden des Bilds an das Modell angewendet werden sollen.
    • BitmapPixelFormat: Wenn angegeben, ist dies das Pixelformat, das während der Bildkonvertierung als Pixelformat des Modells verwendet wird.

    Für Bildformen kann das Modell entweder eine bestimmte Form angeben, die es annimmt (z. B. nimmt SqueezeNet 224,224 an), oder das Modell kann freie Abmessungen für jedes Formbild angeben (viele Modelle vom StyleTransfer-Typ können Bilder variabler Größe annehmen). Der Aufrufer kann BitmapBounds verwenden, um auszuwählen, welcher Abschnitt des Bilds verwendet werden soll. Wenn keine Angabe erfolgt, wird das Bild von der Laufzeit auf die Modellgröße skaliert (unter Beibehaltung des Seitenverhältnisses) und dann zentriert zugeschnitten.

  • TensorFloat

    Wenn Windows ML das Farbformat oder den Pixelbereich Ihres Modells nicht unterstützt, können Sie Konvertierungen und Tensorisierungen implementieren. Sie erstellen einen vierdimensionalen NCHW-Tensor für 32-Bit-Gleitkommawerte für den Eingabewert. Ein Beispiel für die Vorgehensweise finden Sie im Beispiel Benutzerdefinierte Tensorisierung.

    Wenn diese Methode verwendet wird, werden alle Bildmetadaten für das Modell ignoriert.

Beispiel

Das folgende Beispiel zeigt, wie die Bindung an die Eingabe eines Modells erfolgt. In diesem Fall erstellen wir eine Bindung aus session, erstellen einen ImageFeatureValue aus inputFrame und binden das Bild an die Eingabe des Modells (inputName).

private void BindModel(
    LearningModelSession session,
    VideoFrame inputFrame,
    string inputName)
{
    // Create a binding object from the session
    LearningModelBinding binding = new LearningModelBinding(session);

    // Create an image tensor from a video frame
    ImageFeatureValue image =
        ImageFeatureValue.CreateFromVideoFrame(inputFrame);

    // Bind the image to the input
    binding.Bind(inputName, image);
}

Weitere Informationen

Hinweis

Verwende die folgenden Ressourcen, wenn du Hilfe mit Windows ML benötigst:

  • Wenn du technische Fragen zu Windows ML stellen oder beantworten möchtest, verwende das Tag windows-machine-learning auf Stack Overflow.
  • Wenn du einen Fehler melden möchtest, erstelle eine Anfrage auf GitHub.