Enlazado de un modelo

Un modelo de aprendizaje automático tiene características de entrada y salida, que pasan información dentro y fuera del modelo.

Después de cargar el modelo como LearningModel, puedes usar LearningModel.InputFeatures y LearningModel.OutputFeatures para obtener objetos ILearningModelFeatureDescriptor. Enumeran los tipos de características de entrada y salida que espera el modelo.

Debes usar LearningModelBinding para enlazar valores a una característica, haciendo referencia a ILearningModelFeatureDescriptor por su propiedad Name.

El siguiente vídeo ofrece una breve introducción a las características de enlace de modelos de aprendizaje automático.


Tipos de características

Windows ML es compatible con todos los tipos de características de ONNX, que se enumeran en LearningModelFeatureKind. Se asignan a distintas clases de descriptores de características:

Tensores

Los tensores son matrices multidimensionales. El tensor más común es de puntos flotantes de 32 bits. Las dimensiones de los tensores son principales de fila, con datos contiguos estrechamente empaquetados que representan cada dimensión. El tamaño total del tensor es el producto de los tamaños de cada dimensión.

Secuencias

Las secuencias son vectores de valores. Un uso común de los tipos de secuencia es un vector de probabilidades flotantes, que algunos modelos de clasificación devuelven para indicar la clasificación de precisión de cada predicción.

Maps

Las asignaciones son pares clave-valor de información. Los modelos de clasificación suelen devolver una asignación de cadena/punto flotante que describe la probabilidad flotante de cada nombre de clasificación etiquetado. Por ejemplo, la salida de un modelo que intenta predecir la raza de perro de una imagen podría ser ["Boston terrier", 90.0], ["Golden retriever", 7.4], ["Poodle", 2.6].

Escalares

La mayoría de las asignaciones y secuencias tendrán valores escalares. Aparecen donde TensorFeatureDescriptor.Shape.Size es cero (0). En este caso, la asignación o la secuencia serán de tipo escalar. El tipo más común es float. Por ejemplo, una asignación de cadena a punto flotante sería:

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

El valor real de la característica de asignación real será IMap<string, float>.

Secuencia de asignaciones

Una secuencia de asignaciones es simplemente un vector de pares clave-valor. Por ejemplo, una secuencia de asignaciones de cadena a punto flotante sería de tipo IVector<IMap<string, float>>. La salida anterior de las predicciones de perros razas ["Boston terrier", 90.0], ["Golden retriever", 7.4], ["Poodle", 2.6] es un ejemplo de una secuencia de asignaciones.

Imágenes

Al trabajar con imágenes, deberás tener en cuenta los formatos de imagen y la tensorización.

Formatos de imagen

Los modelos están entrenados con datos de entrenamiento de imágenes, y los pesos se guardan y adaptan a ese conjunto de entrenamiento. Al pasar una entrada de imagen al modelo, su formato debe coincidir con el formato de las imágenes de entrenamiento.

En muchos casos, el modelo describe el formato de imagen esperado; los modelos ONNX pueden usar metadatos para describir los formatos de imagen esperados.

La mayoría de los modelos usan los siguientes formatos, pero esto no es universal para todos los modelos:

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

Tensorización

Las imágenes se representan en Windows ML con un formato de tensor. La tensorización es el proceso de convertir una imagen en un tensor y se produce durante el enlace.

Windows ML convierte las imágenes en tensores de 4 dimensiones de puntos flotantes de 32 bits con el "formato de tensor NCHW":

  • N: Tamaño del lote (o número de imágenes). Windows ML admite actualmente un tamaño de lote N de 1.
  • C: Recuento de canales (1 para Gray8, 3 para Bgr8).
  • H: Alto.
  • W: Ancho.

Cada píxel de la imagen es un número de color de 8 bits que se almacena en el intervalo de 0-255 y se empaqueta en un punto flotante de 32 bits.

Cómo pasar imágenes al modelo

Hay dos maneras de pasar imágenes a los modelos:

  • ImageFeatureValue

    Se recomienda usar el tipo ImageFeatureValue para enlazar imágenes como entradas y salidas, ya que se encarga de la conversión y la tensorización, de modo que las imágenes coinciden con el formato de imagen necesario del modelo. Los tipos de formato de modelo admitidos actualmente son Gray8, Rgb8 y Bgr8, y el intervalo de píxeles admitido actualmente es 0-255.

    Puedes crear un tipo ImageFeatureValue mediante el método estático ImageFeatureValue.CreateFromVideoFrame.

    Para averiguar qué formato necesita el modelo, WinML usa la lógica y orden de prioridad siguientes:

    1. BIND(String, Object, IPropertySet) invalidará la configuración de imagen.
    2. A continuación, se comprobarán los metadatos del modelo y se usarán si están disponibles.
    3. Si no se proporcionan metadatos del modelo y ningún autor de llamada ha proporcionado propiedades, el entorno de ejecución intentará realizar la mejor coincidencia.
    • Si el tensor es similar a NCHW (float32 de 4 dimensiones, N==1), el entorno de ejecución supondrá Gray8 (C==1) o Bgr8 (C==3) en función del número de canales.
    • Se supondrá NominalRange_0_255
    • Se supondrá SRGB

    Existen varias propiedades opcionales que puedes pasar a BIND(String, Object, IPropertySet):

    • BitmapBounds: Si se especifica, son los límites de recorte que se aplicarán antes de enviar la imagen al modelo.
    • BitmapPixelFormat: Si se especifica, este es el formato de píxel que se usará como formato de píxel del modelo durante la conversión de la imagen.

    En el caso de las formas de imagen, el modelo puede especificar una forma específica que toma (por ejemplo, SqueezeNet toma 224,224), o bien puede especificar dimensiones libres para cualquier imagen de forma (muchos modelos de tipo StyleTransfer pueden tomar imágenes de tamaño variable). El autor de la llamada puede usar BitmapBounds para elegir la sección de la imagen que desea usar. Si no se especifica, el entorno de ejecución escalará la imagen al tamaño del modelo (respetando la relación de aspecto) y, a continuación, recortará el centro.

  • TensorFloat

    Si Windows ML no admite el formato de color o el intervalo de píxeles del modelo, puedes implementar las conversiones y la tensorización. Deberás crear un tensor de cuatro dimensiones NCHW para los puntos flotantes de 32 bits del valor de entrada. Consulta el artículo Ejemplo de tensorización personalizada para ver cómo hacerlo.

    Cuando se usa este método, se omiten todos los metadatos de imagen del modelo.

Ejemplo

En el siguiente ejemplo se muestra el procedimiento de enlace a una entrada del modelo. En este caso, se crea un enlace desde session, un objeto ImageFeatureValue desde inputFrame y se enlaza la imagen a la entrada del modelo, 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);
}

Consulte también

Nota:

Use los siguientes recursos para obtener ayuda con Windows ML:

  • Para formular o responder a preguntas técnicas sobre Windows Machine Learning, utilice la etiqueta windows-machine-learning en Stack Overflow.
  • Para notificar un error, registre un problema en GitHub.