Compartir a través de


Enlazado de un modelo

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

Después de cargar el modelo como LearningModel, puede usar LearningModel.InputFeatures y LearningModel.OutputFeatures para obtener objetos ILearningModelFeatureDescriptor . En esta lista se enumeran los tipos de características de entrada y salida esperados del modelo.

Se usa learningModelBinding para enlazar valores a una característica, haciendo referencia al ILearningModelFeatureDescriptor por su propiedad Name .

En el vídeo siguiente se proporciona una breve introducción a las características de enlace de los modelos de Machine Learning.


Tipos de características

Windows ML admite todos los tipos de características de ONNX, que se enumeran en LearningModelFeatureKind. Estos se asignan a diferentes clases de descriptor de características:

Tensores

Los tensores son matrices multidimensionales y el tensor más común es un tensor de floats de 32 bits. Las dimensiones de los tensores son orden de fila mayor, 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.

Mapas

Los mapas 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 en una imagen podría ser ["Boston terrier", 90.0], ["Golden retriever", 7.4], ["Poodle", 2.6].

Escalares

La mayoría de los mapas y secuencias tendrán valores que son escalares. Se muestran donde TensorFeatureDescriptor.Shape.Size es cero (0). En este caso, el mapa o la secuencia serán del tipo escalar. La más común es float. Por ejemplo, una cadena para el mapa 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 mapas

Una secuencia de mapas es simplemente un vector de pares clave-valor. Por ejemplo, una secuencia de mapeos de cadena a float sería de tipo IVector<IMap<string, float>>. La salida anterior de las predicciones de las razas de perros ["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á 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 formación. 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:

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

Tensorización

Las imágenes se representan en Windows ML en un formato tensor. La tensorización es el proceso de transformar una imagen en un tensor, que ocurre durante el proceso de 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: Altura.
  • W: Ancho.

Cada píxel de la imagen es un número de color de 8 bits almacenado en el intervalo de 0 a 255 y empaquetado en un float de 32 bits.

Cómo pasar imágenes al modelo

Hay dos maneras de pasar imágenes a modelos:

  • ImageFeatureValue

    Se recomienda usar ImageFeatureValue para enlazar imágenes como entradas y salidas, ya que se encarga de la conversión y la tensorización, por lo 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 de 0 a 255.

    Puede crear un imageFeatureValue mediante el método estático ImageFeatureValue.CreateFromVideoFrame.

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

    1. Bind(String, Object, IPropertySet) invalidará toda la configuración de imagen.
    2. Los metadatos del modelo se comprobarán y usarán si están disponibles.
    3. Si no se proporciona ningún metadato del modelo y no se proporcionan propiedades proporcionadas por el autor de la llamada, el tiempo de ejecución intentará realizar una mejor coincidencia.
    • Si el tensor es similar a NCHW (float32 4 dimensionales, N==1), el tiempo de ejecución asume Gray8 (C==1) o Bgr8 (C==3) en función del recuento de canales.
    • Se supondrá NominalRange_0_255
    • Se supondrá SRGB

    Hay varias propiedades opcionales que se pueden pasar a Bind(String, Object, IPropertySet):

    • BitmapBounds: si se especifica, estos 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 imágenes.

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

  • TensorFloat

    Si Windows ML no admite el formato de color o el intervalo de píxeles del modelo, puede implementar conversiones y tensorización. Vas a crear un tensor de cuatro dimensiones NCHW para los puntos flotantes de 32 bits del valor de la entrada. Consulte el ejemplo de tensorización personalizada para obtener un ejemplo de cómo hacerlo.

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

Ejemplo

En el ejemplo siguiente se muestra cómo enlazar a la entrada de un modelo. En este caso, creamos un enlace a partir de la sesión, creamos imageFeatureValue a partir de inputFrame y enlazamos 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 preguntas técnicas sobre Windows ML, use la etiqueta windows-machine-learning en Stack Overflow.
  • Para notificar un error, envíe un problema en nuestra GitHub.