Freigeben über


Binden eines Modells

Ein Machine Learning-Modell verfügt über Eingabe- und Ausgabefeatures, die Informationen an und aus dem Modell übergeben.

Nachdem Sie Ihr Modell als LearningModel geladen haben, können Sie LearningModel.InputFeatures und LearningModel.OutputFeatures verwenden, um ILearningModelFeatureDescriptor-Objekte abzurufen. Diese listen die erwarteten Eingabe- und Ausgabefeaturetypen des Modells auf.

Sie verwenden ein LearningModelBinding , um Werte an ein Feature zu binden, das auf das ILearningModelFeatureDescriptor anhand seiner Name-Eigenschaft verweist.

Das folgende Video bietet einen kurzen Überblick über bindungsfeatures von Machine Learning-Modellen.


Typen von Features

Windows ML unterstützt alle ONNX-Featuretypen, die in LearningModelFeatureKind aufgelistet werden. Diese werden verschiedenen Featuredeskriptorklassen zugeordnet:

Spannmuskeln

Tensoren sind mehrdimensionale Arrays, und der häufigste Tensor ist ein Tensor von 32-Bit-Floats. 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 Float-Wahrscheinlichkeiten, die einige Klassifizierungsmodelle zurückgeben, um die Genauigkeitsbewertung für jede Vorhersage anzugeben.

Landkarten

Karten sind Schlüssel-Wert-Paare von Informationen. Klassifizierungsmodelle geben häufig eine Zeichenfolgen-/Float-Karte zurück, die die Float-Wahrscheinlichkeit für jeden bezeichneten Klassifizierungsnamen beschreibt. Beispielsweise könnte die Ausgabe eines Modells, das versucht, die Rasse eines Hundes in einem Bild vorherzusagen, ["Boston terrier", 90.0], ["Golden retriever", 7.4], ["Poodle", 2.6] sein.

Skalare

Die meisten Karten und Sequenzen weisen Werte auf, die Skalare sind. Diese werden angezeigt, wobei TensorFeatureDescriptor.Shape.Size null (0) ist. In diesem Fall ist die Karte oder Sequenz vom skalaren Typ. Die häufigste 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 des Kartenmerkmals ist ein IMap<string, float>.

Reihenfolge der Karten

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

Bilder

Wenn Sie mit Bildern arbeiten, müssen Sie bildformate und Tensorisierung kennen.

Bildformate

Modelle werden mit Bildschulungsdaten trainiert, und die Gewichte werden gespeichert und auf diesen Trainingssatz zugeschnitten. Wenn Sie eine Bildeingabe an das Modell übergeben, muss das Format mit dem Format der Schulungsbilder ü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 ist nicht für alle Modelle universell:

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

Tensorisierung

Bilder werden in Windows ML in einem Tensorformat dargestellt. Tensorisierung ist der Prozess der Konvertierung eines Bilds in einen Tensor und erfolgt während der Bindung.

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

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

Jedes Pixel des Bilds ist eine 8-Bit-Farbnummer, die im Bereich von 0-255 gespeichert und in einen 32-Bit-Float verpackt ist.

So übergeben Sie Bilder an das Modell

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

  • ImageFeatureValue

    Wir empfehlen die Verwendung von ImageFeatureValue , um Bilder als Eingaben und Ausgaben zu binden, da sie sowohl die Konvertierung als auch die Tensorisierung übernimmt, sodass die Bilder mit dem erforderlichen Bildformat des Modells übereinstimmen. Die derzeit unterstützten Modellformattypen sind Gray8, Rgb8 und Bgr8, und der derzeit unterstützte Pixelbereich beträgt 0 bis 255.

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

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

    1. Bind(String, Object, IPropertySet) überschreibt alle Bildeinstellungen.
    2. Modellmetadaten werden dann überprüft und verwendet, falls verfügbar.
    3. Wenn keine Modellmetadaten bereitgestellt werden und keine Eigenschaften vom Aufrufer angegeben werden, versucht die Laufzeit, die bestmögliche Übereinstimmung zu finden.
    • Wenn der Tensor wie NCHW (4-dimensional float32, N==1) aussieht, wird für die Laufzeit je nach Kanalanzahl entweder Gray8 (C==1) oder Bgr8 (C==3) vorausgesetzt.
    • NominalRange_0_255 wird angenommen.
    • Der sRGB-Farbraum wird angenommen

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

    • BitmapBounds: Wenn angegeben, sind dies die Zuschneidegrenzen, 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 Modellpixelformat verwendet wird.

    Bei Bildformen kann das Modell entweder eine bestimmte Form angeben, die es annimmt (z. B. SqueezeNet nimmt 224,224 an), oder es kann freie Dimensionen für ein beliebiges Bild angeben (viele StyleTransfer-Modelle können Bilder mit 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 Tensorisierung implementieren. Sie erstellen einen vierdimensionalen NCHW-Tensor für 32-Bit-Gleitkommawerte für den Eingabewert. Im Custom Tensorization Sample finden Sie ein Beispiel dafür, wie Sie dies durchführen können.

    Wenn diese Methode verwendet wird, werden alle Bildmetadaten des Modells ignoriert.

Beispiel

Das folgende Beispiel zeigt, wie eine 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);
}

Siehe auch

Hinweis

Verwenden Sie die folgenden Ressourcen, wenn Sie Hilfe mit Windows ML benötigen:

  • Wenn Sie technische Fragen zu Windows ML stellen oder beantworten möchten, verwenden Sie das Tag windows-machine-learning auf Stack Overflow.
  • Um einen Fehler zu melden, erstellen Sie bitte eine Meldung auf unserem GitHub.