Condividi tramite


Associare un modello

Un modello di Machine Learning include funzionalità di input e output, che passano informazioni all'interno e all'esterno del modello.

Dopo aver caricato il modello come LearningModel, è possibile usare LearningModel.InputFeatures e LearningModel.OutputFeatures per ottenere oggetti ILearningModelFeatureDescriptor . Vengono elencati 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 in base alla 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. Di seguito viene eseguito il mapping a classi di descrittori 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 di tipo row-major, 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 valutazione dell'accuratezza per ogni previsione.

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. Questi vengono visualizzati dove TensorFeatureDescriptor.Shape.Size è zero (0). In questo caso, la mappa o la sequenza sarà 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 funzione della mappa sarà IMap<string, float>.

Sequenza di mappe

Una sequenza di mappe è solo un vettore di coppie chiave/valore. Ad esempio, una sequenza di mappe da stringa a float sarà di tipo IVector<IMap<string, float>>. L'output precedente delle predizioni delle razze canine ["Boston terrier", 90.0], ["Golden retriever", 7.4], ["Poodle", 2.6] è un esempio di sequenza di mappe.

Immagini

Quando si lavora con le 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 il set di training. Quando si passa un input di immagine nel modello, il formato deve corrispondere al formato delle immagini di addestramento.

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 un formato tensore. La tensorizzazione è il processo di conversione di un'immagine in un tensore e si verifica durante l'associazione.

Windows ML converte le immagini in tensori tridimensionali di float a 32 bit nel formato "tensore NCHW":

  • N: dimensioni batch (o numero di immagini). Windows ML supporta attualmente una dimensione batch N di 1.
  • C: Conteggio canali (1 per Gray8, 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 le immagini nel modello

Esistono due modi per passare le immagini nei modelli:

  • Valore 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 di modello attualmente supportati sono Gray8, Rgb8 e Bgr8 e l'intervallo di pixel attualmente supportato è 0-255.

    È possibile creare un oggetto 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 nessun chiamante ha fornito proprietà, il runtime tenterà di ottenere una corrispondenza ottimale.
    • Se il tensore è simile a NCHW (4-dimensional float32, N==1), il runtime assumerà Gray8 (C==1) o Bgr8 (C==3) a seconda del numero di canali.
    • Verrà considerato il NominalRange_0_255
    • Si presuppone che SRGB sia utilizzato

    Esistono diverse proprietà facoltative che è possibile passare in 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 libere 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 ridimensionerà l'immagine alle dimensioni del modello (rispettando le proporzioni) e poi effettuerà un ritaglio centrale.

  • TensorFloat

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

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

Esempio

Nell'esempio seguente viene illustrato come eseguire l'associazione all'input di un modello. In questo caso, viene creata un'associazione dalla sessione, viene creato un ImageFeatureValue da inputFrame e l'immagine viene associata 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);
}

Vedere anche

Annotazioni

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.