Condividi tramite


Associare un modello

Un modello di Machine Learning include funzionalità di input e output, che passano le informazioni in e fuori dal modello.

Dopo aver caricato il modello come LearningModel, è possibile usare LearningModel.InputFeatures e LearningModel.OutputFeatures per ottenere oggetti ILearningModelFeatureDescriptor. Questi elencano i tipi di funzionalità di input e output previsti del modello.

Si usa LearningModelBinding per associare i valori a una funzionalità, facendo riferimento a ILearningModelFeatureDescriptor dalla relativa proprietà Name .

Il video seguente offre una breve panoramica delle funzionalità di associazione dei modelli di Machine Learning.


Tipi di funzionalità

Windows ML supporta tutti i tipi di funzionalità ONNX, enumerati in LearningModelFeatureKind. Questi sono mappati a classi di descrittore di funzionalità diverse:

Tensori

I tensori sono matrici multidimensionali e il tensore più comune è un tensore di float a 32 bit. Le dimensioni dei tensori sono principali della riga, con dati contigui strettamente compressi che rappresentano ogni dimensione. La dimensione totale del tensore è il prodotto delle dimensioni di ogni dimensione.

Sequenze

Le sequenze sono vettori di valori. Un uso comune dei tipi di sequenza è un vettore di probabilità float, che alcuni modelli di classificazione restituiscono per indicare la classificazione dell'accuratezza per ogni stima.

Mappe

Le mappe sono coppie chiave/valore di informazioni. I modelli di classificazione restituiscono in genere una mappa stringa/float che descrive la probabilità float per ogni nome di classificazione etichettato. Ad esempio, l'output di un modello che tenta di stimare la razza di cane in un'immagine potrebbe essere ["Boston terrier", 90.0], ["Golden retriever", 7.4], ["Poodle", 2.6].

Scalari

La maggior parte delle mappe e delle sequenze avrà valori scalari. Vengono visualizzati dove TensorFeatureDescriptor.Shape.Size è zero (0). In questo caso, la mappa o la sequenza saranno del tipo scalare. Il più comune è float. Ad esempio, una stringa per la mappa float sarà:

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

Il valore effettivo della funzionalità della mappa sarà un IMap<string, float>oggetto .

Sequenza di mappe

Una sequenza di mappe è solo un vettore di coppie chiave/valore. Ad esempio, una sequenza di mappe string-to-float sarebbe di tipo IVector<IMap<string, float>>. L'output precedente delle stime ["Boston terrier", 90.0], ["Golden retriever", 7.4], ["Poodle", 2.6] della razza cane è un esempio di una sequenza di mappe.

Immagini

Quando si utilizzano immagini, è necessario essere consapevoli dei formati di immagine e della tensorizzazione.

Formati di immagine

I modelli vengono sottoposti a training con i dati di training delle immagini e i pesi vengono salvati e personalizzati per tale set di training. Quando si passa un input immagine nel modello, il formato deve corrispondere al formato delle immagini di training.

In molti casi, il modello descrive il formato di immagine previsto; I modelli ONNX possono usare i metadati per descrivere i formati di immagine previsti.

La maggior parte dei modelli usa i formati seguenti, ma non è universale per tutti i modelli:

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

Tensorizzazione

Le immagini sono rappresentate in Windows ML in formato tensore. Tensorizzazione è il processo di conversione di un'immagine in un tensore e si verifica durante l'associazione.

Windows ML converte le immagini in tensori a 4 dimensioni di float a 32 bit nel formato "tensor NCHW":

  • N: Dimensioni batch (o numero di immagini). Windows ML supporta attualmente una dimensione batch N di 1.
  • C: Conteggio canali (1 per Grigio8, 3 per Bgr8).
  • H: Altezza.
  • W: Larghezza.

Ogni pixel dell'immagine è un numero di colore a 8 bit archiviato nell'intervallo di 0-255 e compresso in un float a 32 bit.

Come passare immagini al modello

Esistono due modi in cui è possibile passare immagini nei modelli:

  • ImageFeatureValue

    È consigliabile usare ImageFeatureValue per associare le immagini come input e output, in quanto si occupa sia della conversione che della tensorizzazione, in modo che le immagini corrispondano al formato di immagine richiesto del modello. I tipi di formato modello attualmente supportati sono Gray8, Rgb8 e Bgr8 e l'intervallo di pixel attualmente supportato è 0-255.

    È possibile creare un imageFeatureValue usando il metodo statico ImageFeatureValue.CreateFromVideoFrame.

    Per scoprire il formato necessario per il modello, WinML usa la logica e l'ordine di precedenza seguenti:

    1. Bind(String, Object, IPropertySet) eseguirà l'override di tutte le impostazioni dell'immagine.
    2. I metadati del modello verranno quindi controllati e usati se disponibili.
    3. Se non vengono forniti metadati del modello e non sono state fornite proprietà del chiamante, il runtime tenterà di fare una corrispondenza ottimale.
    • Se il tensore è simile a NCHW (float32 4dimensionale, N==1), il runtime presuppone grigio8 (C=1) o Bgr8 (C==3) a seconda del conteggio dei canali.
    • NominalRange_0_255 verrà assunto
    • SRGB verrà assunto

    Esistono diverse proprietà facoltative che è possibile passare a Bind(String, Object, IPropertySet):

    • BitmapBounds: se specificato, questi sono i limiti di ritaglio da applicare prima di inviare l'immagine al modello.
    • BitmapPixelFormat: se specificato, questo è il formato pixel che verrà usato come formato pixel del modello durante la conversione dell'immagine.

    Per le forme dell'immagine, il modello può specificare una forma specifica che accetta (ad esempio, SqueezeNet accetta 224.224) o il modello può specificare dimensioni gratuite per qualsiasi immagine di forma (molti modelli di tipo StyleTransfer possono accettare immagini di dimensioni variabili). Il chiamante può usare BitmapBounds per scegliere la sezione dell'immagine da usare. Se non specificato, il runtime ridimensiona l'immagine alle dimensioni del modello (rispetto delle proporzioni) e quindi il ritaglio centrale.

  • TensorFloat

    Se Windows ML non supporta il formato di colore o l'intervallo di pixel del modello, è possibile implementare conversioni e tensorizzazione. Si creerà un tensore NCHW a quattro dimensioni per i float a 32 bit per il valore di input. Vedere l'esempio di tensorizzazione personalizzata per un esempio di come eseguire questa operazione.

    Quando viene usato questo metodo, tutti i metadati dell'immagine nel modello vengono ignorati.

Esempio

Nell'esempio seguente viene illustrato come associare l'input di un modello. In questo caso viene creata un'associazione dalla sessione, si crea un imageFeatureValue da inputFrame e si associa l'immagine all'input del modello, 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);
}

Vedi anche

Nota

Per informazioni su Windows Machine Learning, usa le risorse seguenti:

  • Per porre domande tecniche o rispondere a domande tecniche su Windows Machine Learning, usa il tag windows-machine-learning in Stack Overflow.
  • Per segnalare un bug, registra il problema in GitHub.