Compartir vía


Esquemas de datos para entrenar modelos de Computer Vision con aprendizaje automático automatizado

SE APLICA A:Extensión ML de la CLI de Azure v2 (actual)SDK de Python azure-ai-ml v2 (actual)

Obtenga información sobre cómo dar formato a los archivos JSONL para el consumo de datos en experimentos de ML automatizado para tareas de Computer Vision durante el entrenamiento y la inferencia.

Esquema de datos para el entrenamiento

El aprendizaje automático automatizado para imágenes de Azure Machine Learning requiere que los datos de la imagen de entrada se preparen en formato JSONL (JSON Lines). En esta sección, se describen los formatos de datos de entrada o el esquema para la clasificación de imágenes de varias clases, la clasificación de imágenes con varias etiquetas, la detección de objetos y la segmentación de instancias. También se proporcionará un ejemplo del archivo JSON Lines de entrenamiento o validación final.

Clasificación de imágenes (binaria/multiclase)

Esquema o formato de datos de entrada en cada línea JSON:

{
   "image_url":"azureml://subscriptions/<my-subscription-id>/resourcegroups/<my-resource-group>/workspaces/<my-workspace>/datastores/<my-datastore>/paths/<path_to_image>",
   "image_details":{
      "format":"image_format",
      "width":"image_width",
      "height":"image_height"
   },
   "label":"class_name",
}
Clave Descripción Ejemplo
image_url Ubicación de la imagen en el almacén de datos de Azure Machine Learning.
my-subscription-id debe reemplazarse por la suscripción de Azure donde se encuentran las imágenes. Puede encontrar más información sobre las suscripciones de Azure aquí. Del mismo modomy-resource-group, my-workspace, my-datastore debe reemplazarse por el nombre del grupo de recursos, el nombre del área de trabajo y el nombre del almacén de datos, respectivamente.
path_to_image debe ser la ruta de acceso completa a la imagen en el almacén de datos.
Required, String
"azureml://subscriptions/my-subscription-id/resourcegroups/my-resource-group/workspaces/my-workspace/datastores/my-datastore/paths/image_data/Image_01.jpg"
image_details Detalles de la imagen
Optional, Dictionary
"image_details":{"format": "jpg", "width": "400px", "height": "258px"}
format Tipo de imagen (se admiten todos los formatos de imagen disponibles en la biblioteca Pillow)
Optional, String from {"jpg", "jpeg", "png", "jpe", "jfif","bmp", "tif", "tiff"}
"jpg" or "jpeg" or "png" or "jpe" or "jfif" or "bmp" or "tif" or "tiff"
width Ancho de la imagen
Optional, String or Positive Integer
"400px" or 400
height Altura de la imagen
Optional, String or Positive Integer
"200px" or 200
label Clase o etiqueta de la imagen
Required, String
"cat"

Ejemplo de un archivo JSONL para la clasificación de imágenes de varias clases:

{"image_url": "azureml://subscriptions/my-subscription-id/resourcegroups/my-resource-group/workspaces/my-workspace/datastores/my-datastore/paths/image_data/Image_01.jpg", "image_details":{"format": "jpg", "width": "400px", "height": "258px"}, "label": "can"}
{"image_url": "azureml://subscriptions/my-subscription-id/resourcegroups/my-resource-group/workspaces/my-workspace/datastores/my-datastore/paths/image_data/Image_02.jpg", "image_details": {"format": "jpg", "width": "397px", "height": "296px"}, "label": "milk_bottle"}
.
.
.
{"image_url": "azureml://subscriptions/my-subscription-id/resourcegroups/my-resource-group/workspaces/my-workspace/datastores/my-datastore/paths/image_data/Image_n.jpg", "image_details": {"format": "jpg", "width": "1024px", "height": "768px"}, "label": "water_bottle"}

Ejemplo de imagen para la clasificación de imágenes de varias clases.

Clasificación de imágenes con varias etiquetas

A continuación, se muestra un ejemplo de esquema o formato de datos de entrada de cada línea JSON para la clasificación de imágenes.

{
   "image_url":"azureml://subscriptions/<my-subscription-id>/resourcegroups/<my-resource-group>/workspaces/<my-workspace>/datastores/<my-datastore>/paths/<path_to_image>",
   "image_details":{
      "format":"image_format",
      "width":"image_width",
      "height":"image_height"
   },
   "label":[
      "class_name_1",
      "class_name_2",
      "class_name_3",
      "...",
      "class_name_n"
        
   ]
}
Clave Descripción Ejemplo
image_url Ubicación de la imagen en el almacén de datos de Azure Machine Learning.
my-subscription-id debe reemplazarse por la suscripción de Azure donde se encuentran las imágenes. Puede encontrar más información sobre las suscripciones de Azure aquí. Del mismo modomy-resource-group, my-workspace, my-datastore debe reemplazarse por el nombre del grupo de recursos, el nombre del área de trabajo y el nombre del almacén de datos, respectivamente.
path_to_image debe ser la ruta de acceso completa a la imagen en el almacén de datos.
Required, String
"azureml://subscriptions/my-subscription-id/resourcegroups/my-resource-group/workspaces/my-workspace/datastores/my-datastore/paths/image_data/Image_01.jpg"
image_details Detalles de la imagen
Optional, Dictionary
"image_details":{"format": "jpg", "width": "400px", "height": "258px"}
format Tipo de imagen (se admiten todos los formatos de imagen disponibles en la biblioteca Pillow)
Optional, String from {"jpg", "jpeg", "png", "jpe", "jfif", "bmp", "tif", "tiff"}
"jpg" or "jpeg" or "png" or "jpe" or "jfif" or "bmp" or "tif" or "tiff"
width Ancho de la imagen
Optional, String or Positive Integer
"400px" or 400
height Altura de la imagen
Optional, String or Positive Integer
"200px" or 200
label Lista de clases o etiquetas de la imagen
Required, List of Strings
["cat","dog"]

Ejemplo de un archivo JSONL para la clasificación de imágenes con varias etiquetas:

{"image_url": "azureml://subscriptions/my-subscription-id/resourcegroups/my-resource-group/workspaces/my-workspace/datastores/my-datastore/paths/image_data/Image_01.jpg", "image_details":{"format": "jpg", "width": "400px", "height": "258px"}, "label": ["can"]}
{"image_url": "azureml://subscriptions/my-subscription-id/resourcegroups/my-resource-group/workspaces/my-workspace/datastores/my-datastore/paths/image_data/Image_02.jpg", "image_details": {"format": "jpg", "width": "397px", "height": "296px"}, "label": ["can","milk_bottle"]}
.
.
.
{"image_url": "azureml://subscriptions/my-subscription-id/resourcegroups/my-resource-group/workspaces/my-workspace/datastores/my-datastore/paths/image_data/Image_n.jpg", "image_details": {"format": "jpg", "width": "1024px", "height": "768px"}, "label": ["carton","milk_bottle","water_bottle"]}

Ejemplo de imagen para la clasificación de imágenes con varias etiquetas.

Detección de objetos

A continuación, se muestra un archivo JSONL de ejemplo para la detección de objetos.

{
   "image_url":"azureml://subscriptions/<my-subscription-id>/resourcegroups/<my-resource-group>/workspaces/<my-workspace>/datastores/<my-datastore>/paths/<path_to_image>",
   "image_details":{
      "format":"image_format",
      "width":"image_width",
      "height":"image_height"
   },
   "label":[
      {
         "label":"class_name_1",
         "topX":"xmin/width",
         "topY":"ymin/height",
         "bottomX":"xmax/width",
         "bottomY":"ymax/height",
         "isCrowd":"isCrowd"
      },
      {
         "label":"class_name_2",
         "topX":"xmin/width",
         "topY":"ymin/height",
         "bottomX":"xmax/width",
         "bottomY":"ymax/height",
         "isCrowd":"isCrowd"
      },
      "..."
   ]
}

Aquí,

  • xmin = coordenada X de la esquina superior izquierda del rectángulo delimitador
  • ymin = coordenada Y de la esquina superior izquierda del rectángulo delimitador
  • xmax = coordenada X de la esquina inferior derecha del rectángulo delimitador
  • ymax = coordenada Y de la esquina inferior derecha del rectángulo delimitador
Clave Descripción Ejemplo
image_url Ubicación de la imagen en el almacén de datos de Azure Machine Learning.
my-subscription-id debe reemplazarse por la suscripción de Azure donde se encuentran las imágenes. Puede encontrar más información sobre las suscripciones de Azure aquí. Del mismo modomy-resource-group, my-workspace, my-datastore debe reemplazarse por el nombre del grupo de recursos, el nombre del área de trabajo y el nombre del almacén de datos, respectivamente.
path_to_image debe ser la ruta de acceso completa a la imagen en el almacén de datos.
Required, String
"azureml://subscriptions/my-subscription-id/resourcegroups/my-resource-group/workspaces/my-workspace/datastores/my-datastore/paths/image_data/Image_01.jpg"
image_details Detalles de la imagen
Optional, Dictionary
"image_details":{"format": "jpg", "width": "400px", "height": "258px"}
format Tipo de imagen (se admiten todos los formatos de imagen disponibles en la biblioteca Pillow, pero en el caso de YOLO, solo se admiten los formatos de imagen permitidos por opencv).
Optional, String from {"jpg", "jpeg", "png", "jpe", "jfif", "bmp", "tif", "tiff"}
"jpg" or "jpeg" or "png" or "jpe" or "jfif" or "bmp" or "tif" or "tiff"
width Ancho de la imagen
Optional, String or Positive Integer
"499px" or 499
height Altura de la imagen
Optional, String or Positive Integer
"665px" or 665
label (clave externa) Lista de rectángulos delimitadores, donde cada uno es un diccionario de label, topX, topY, bottomX, bottomY, isCrowd, sus coordenadas superior izquierda e inferior derecha
Required, List of dictionaries
[{"label": "cat", "topX": 0.260, "topY": 0.406, "bottomX": 0.735, "bottomY": 0.701, "isCrowd": 0}]
label (clave interna) Clase o etiqueta del objeto del rectángulo delimitador
Required, String
"cat"
topX Proporción de la coordenada X de la esquina superior izquierda del rectángulo delimitador y el ancho de la imagen
Required, Float in the range [0,1]
0.260
topY Proporción de la coordenada Y de la esquina superior izquierda del rectángulo delimitador y la altura de la imagen
Required, Float in the range [0,1]
0.406
bottomX Proporción de la coordenada X de la esquina inferior derecha del rectángulo delimitador y el ancho de la imagen
Required, Float in the range [0,1]
0.735
bottomY Proporción de la coordenada Y de la esquina inferior derecha del rectángulo delimitador y la altura de la imagen
Required, Float in the range [0,1]
0.701
isCrowd Indica si el rectángulo delimitador está alrededor de la multitud de objetos. Si se establece esta marca especial, se omite este rectángulo delimitador específico al calcular la métrica.
Optional, Bool
0

Ejemplo de un archivo JSONL para la detección de objetos:

{"image_url": "azureml://subscriptions/my-subscription-id/resourcegroups/my-resource-group/workspaces/my-workspace/datastores/my-datastore/paths/image_data/Image_01.jpg", "image_details": {"format": "jpg", "width": "499px", "height": "666px"}, "label": [{"label": "can", "topX": 0.260, "topY": 0.406, "bottomX": 0.735, "bottomY": 0.701, "isCrowd": 0}]}
{"image_url": "azureml://subscriptions/my-subscription-id/resourcegroups/my-resource-group/workspaces/my-workspace/datastores/my-datastore/paths/image_data/Image_02.jpg", "image_details": {"format": "jpg", "width": "499px", "height": "666px"}, "label": [{"label": "carton", "topX": 0.172, "topY": 0.153, "bottomX": 0.432, "bottomY": 0.659, "isCrowd": 0}, {"label": "milk_bottle", "topX": 0.300, "topY": 0.566, "bottomX": 0.891, "bottomY": 0.735, "isCrowd": 0}]}
.
.
.
{"image_url": "azureml://subscriptions/my-subscription-id/resourcegroups/my-resource-group/workspaces/my-workspace/datastores/my-datastore/paths/image_data/Image_n.jpg", "image_details": {"format": "jpg", "width": "499px", "height": "666px"}, "label": [{"label": "carton", "topX": 0.0180, "topY": 0.297, "bottomX": 0.380, "bottomY": 0.836, "isCrowd": 0}, {"label": "milk_bottle", "topX": 0.454, "topY": 0.348, "bottomX": 0.613, "bottomY": 0.683, "isCrowd": 0}, {"label": "water_bottle", "topX": 0.667, "topY": 0.279, "bottomX": 0.841, "bottomY": 0.615, "isCrowd": 0}]}

Ejemplo de imagen para la detección de objetos.

Segmentación de instancias

Para la segmentación de instancias, ML automatizado solo admite polígono como entrada y salida, sin máscaras.

A continuación, se muestra un archivo JSON de ejemplo para la segmentación de instancias.

{
   "image_url":"azureml://subscriptions/<my-subscription-id>/resourcegroups/<my-resource-group>/workspaces/<my-workspace>/datastores/<my-datastore>/paths/<path_to_image>",
   "image_details":{
      "format":"image_format",
      "width":"image_width",
      "height":"image_height"
   },
   "label":[
      {
         "label":"class_name",
         "isCrowd":"isCrowd",
         "polygon":[["x1", "y1", "x2", "y2", "x3", "y3", "...", "xn", "yn"]]
      }
   ]
}
Clave Descripción Ejemplo
image_url Ubicación de la imagen en el almacén de datos de Azure Machine Learning.
my-subscription-id debe reemplazarse por la suscripción de Azure donde se encuentran las imágenes. Puede encontrar más información sobre las suscripciones de Azure aquí. Del mismo modomy-resource-group, my-workspace, my-datastore debe reemplazarse por el nombre del grupo de recursos, el nombre del área de trabajo y el nombre del almacén de datos, respectivamente.
path_to_image debe ser la ruta de acceso completa a la imagen en el almacén de datos.
Required, String
"azureml://subscriptions/my-subscription-id/resourcegroups/my-resource-group/workspaces/my-workspace/datastores/my-datastore/paths/image_data/Image_01.jpg"
image_details Detalles de la imagen
Optional, Dictionary
"image_details":{"format": "jpg", "width": "400px", "height": "258px"}
format Tipo de imagen
Optional, String from {"jpg", "jpeg", "png", "jpe", "jfif", "bmp", "tif", "tiff" }
"jpg" or "jpeg" or "png" or "jpe" or "jfif" or "bmp" or "tif" or "tiff"
width Ancho de la imagen
Optional, String or Positive Integer
"499px" or 499
height Altura de la imagen
Optional, String or Positive Integer
"665px" or 665
label (clave externa) Lista de máscaras, donde cada máscara es un diccionario de label, isCrowd, polygon coordinates
Required, List of dictionaries
[{"label": "can", "isCrowd": 0, "polygon": [[0.577, 0.689,
0.562, 0.681,
0.559, 0.686]]}]
label (clave interna) Clase o etiqueta del objeto de la máscara
Required, String
"cat"
isCrowd Indica si la máscara está alrededor de la multitud de objetos.
Optional, Bool
0
polygon Coordenadas del polígono para el objeto
Required, List of list for multiple segments of the same instance. Float values in the range [0,1]
[[0.577, 0.689, 0.567, 0.689, 0.559, 0.686]]

Ejemplo de un archivo JSONL para la segmentación de instancias:

{"image_url": "azureml://subscriptions/my-subscription-id/resourcegroups/my-resource-group/workspaces/my-workspace/datastores/my-datastore/paths/image_data/Image_01.jpg", "image_details": {"format": "jpg", "width": "499px", "height": "666px"}, "label": [{"label": "can", "isCrowd": 0, "polygon": [[0.577, 0.689, 0.567, 0.689, 0.559, 0.686, 0.380, 0.593, 0.304, 0.555, 0.294, 0.545, 0.290, 0.534, 0.274, 0.512, 0.2705, 0.496, 0.270, 0.478, 0.284, 0.453, 0.308, 0.432, 0.326, 0.423, 0.356, 0.415, 0.418, 0.417, 0.635, 0.493, 0.683, 0.507, 0.701, 0.518, 0.709, 0.528, 0.713, 0.545, 0.719, 0.554, 0.719, 0.579, 0.713, 0.597, 0.697, 0.621, 0.695, 0.629, 0.631, 0.678, 0.619, 0.683, 0.595, 0.683, 0.577, 0.689]]}]}
{"image_url": "azureml://subscriptions/my-subscription-id/resourcegroups/my-resource-group/workspaces/my-workspace/datastores/my-datastore/paths/image_data/Image_02.jpg", "image_details": {"format": "jpg", "width": "499px", "height": "666px"}, "label": [{"label": "carton", "isCrowd": 0, "polygon": [[0.240, 0.65, 0.234, 0.654, 0.230, 0.647, 0.210, 0.512, 0.202, 0.403, 0.182, 0.267, 0.184, 0.243, 0.180, 0.166, 0.186, 0.159, 0.198, 0.156, 0.396, 0.162, 0.408, 0.169, 0.406, 0.217, 0.414, 0.249, 0.422, 0.262, 0.422, 0.569, 0.342, 0.569, 0.334, 0.572, 0.320, 0.585, 0.308, 0.624, 0.306, 0.648, 0.240, 0.657]]}, {"label": "milk_bottle",  "isCrowd": 0, "polygon": [[0.675, 0.732, 0.635, 0.731, 0.621, 0.725, 0.573, 0.717, 0.516, 0.717, 0.505, 0.720, 0.462, 0.722, 0.438, 0.719, 0.396, 0.719, 0.358, 0.714, 0.334, 0.714, 0.322, 0.711, 0.312, 0.701, 0.306, 0.687, 0.304, 0.663, 0.308, 0.630, 0.320, 0.596, 0.32, 0.588, 0.326, 0.579]]}]}
.
.
.
{"image_url": "azureml://subscriptions/my-subscription-id/resourcegroups/my-resource-group/workspaces/my-workspace/datastores/my-datastore/paths/image_data/Image_n.jpg", "image_details": {"format": "jpg", "width": "499px", "height": "666px"}, "label": [{"label": "water_bottle", "isCrowd": 0, "polygon": [[0.334, 0.626, 0.304, 0.621, 0.254, 0.603, 0.164, 0.605, 0.158, 0.602, 0.146, 0.602, 0.142, 0.608, 0.094, 0.612, 0.084, 0.599, 0.080, 0.585, 0.080, 0.539, 0.082, 0.536, 0.092, 0.533, 0.126, 0.530, 0.132, 0.533, 0.144, 0.533, 0.162, 0.525, 0.172, 0.525, 0.186, 0.521, 0.196, 0.521 ]]}, {"label": "milk_bottle", "isCrowd": 0, "polygon": [[0.392, 0.773, 0.380, 0.732, 0.379, 0.767, 0.367, 0.755, 0.362, 0.735, 0.362, 0.714, 0.352, 0.644, 0.352, 0.611, 0.362, 0.597, 0.40, 0.593, 0.444,  0.494, 0.588, 0.515, 0.585, 0.621, 0.588, 0.671, 0.582, 0.713, 0.572, 0.753 ]]}]}

Ejemplo de imagen para la segmentación de instancias.

Esquema de datos para la puntuación en línea

En esta sección, se documenta el formato de datos de entrada necesario para realizar predicciones cuando se usa un modelo implementado.

Formato de entrada

En el siguiente archivos JSON se muestra el formato de entrada necesario para generar predicciones en cualquier tarea mediante el punto de conexión del modelo específico de la tarea.

{
   "input_data": {
      "columns": [
         "image"
      ],
      "data": [
         "image_in_base64_string_format"
      ]
   }
}

Este JSON es un diccionario con clave la externa input_data y claves internas columns, data, tal como se describe en la tabla siguiente. El punto de conexión acepta una cadena JSON en el formato anterior y la convierte en una trama de datos de muestras que necesita el script de puntuación. Cada imagen de entrada de la sección request_json["input_data"]["data"] del elemento JSON es una cadena codificada en base64.

Clave Descripción
input_data
(clave externa)
Es una clave externa en la solicitud JSON. input_data es un diccionario que acepta ejemplos de imágenes de entrada.
Required, Dictionary
columns
(clave interna)
Nombres de columna que se van a usar para crear un dataframe. Solo acepta una columna con image como nombre de columna.
Required, List
data
(clave interna)
Lista de imágenes codificadas en base64
Required, List

Después de implementar el modelo mlflow, podemos usar el siguiente fragmento de código para obtener predicciones para todas las tareas.

# Create request json
import base64

sample_image = os.path.join(dataset_dir, "images", "1.jpg")


def read_image(image_path):
    with open(image_path, "rb") as f:
        return f.read()


request_json = {
    "input_data": {
        "columns": ["image"],
        "data": [base64.encodebytes(read_image(sample_image)).decode("utf-8")],
    }
}
import json

request_file_name = "sample_request_data.json"

with open(request_file_name, "w") as request_file:
    json.dump(request_json, request_file)
resp = ml_client.online_endpoints.invoke(
    endpoint_name=online_endpoint_name,
    deployment_name=deployment.name,
    request_file=request_file_name,
)

Formato de salida

Las predicciones realizadas en los puntos de conexión del modelo siguen una estructura diferente en función del tipo de tarea. En esta sección, se exploran los formatos de datos de salida para las tareas de clasificación de imágenes de varias clases y varias etiquetas, la detección de objetos y la segmentación de instancias.

Los esquemas siguientes son aplicables cuando la solicitud de entrada contiene una imagen.

Clasificación de imágenes (binaria/multiclase)

El punto de conexión para la clasificación de imágenes devuelve todas las etiquetas del conjunto de datos y sus puntuaciones de probabilidad para la imagen de entrada en el formato siguiente. visualizations y attributions están relacionados con la explicación y cuando la solicitud es solo para la puntuación, estas claves no se incluirán en la salida. Para más información sobre la explicación del esquema de entrada y salida para la clasificación de imágenes, consulte la sección de explicación de la clasificación de imágenes.

[
   {
      "probs": [
         2.098e-06,
         4.783e-08,
         0.999,
         8.637e-06
      ],
      "labels": [
         "can",
         "carton",
         "milk_bottle",
         "water_bottle"
      ]
   }
]

Clasificación de imágenes con varias etiquetas

Para la clasificación de imágenes con varias etiquetas, el punto de conexión del modelo devuelve las etiquetas y sus probabilidades. visualizations y attributions están relacionados con la explicación y cuando la solicitud es solo para la puntuación, estas claves no se incluirán en la salida. Para más información sobre la explicación del esquema de entrada y salida para la clasificación con varias etiquetas, consulte la sección de explicación de la clasificación de imágenes con varias etiquetas.

[
   {
      "probs": [
         0.997,
         0.960,
         0.982,
         0.025
      ],
      "labels": [
         "can",
         "carton",
         "milk_bottle",
         "water_bottle"
      ]
   }
]

Detección de objetos

El modelo de detección de objetos devuelve varios rectángulos con sus coordenadas superior izquierda e inferior derecha a escala junto con la etiqueta del rectángulo y la puntuación de confianza.

[
   {
      "boxes": [
         {
            "box": {
               "topX": 0.224,
               "topY": 0.285,
               "bottomX": 0.399,
               "bottomY": 0.620
            },
            "label": "milk_bottle",
            "score": 0.937
         },
         {
            "box": {
               "topX": 0.664,
               "topY": 0.484,
               "bottomX": 0.959,
               "bottomY": 0.812
            },
            "label": "can",
            "score": 0.891
         },
         {
            "box": {
               "topX": 0.423,
               "topY": 0.253,
               "bottomX": 0.632,
               "bottomY": 0.725
            },
            "label": "water_bottle",
            "score": 0.876
         }
      ]
   }
]

Segmentación de instancias

En la segmentación de instancias, la salida consta de varios rectángulos con sus coordenadas superior izquierda e inferior derecha a escala, las etiquetas, las puntuaciones de confianza y los polígonos (no máscaras). En este caso, los valores del polígono están en el mismo formato que se ha descrito en la sección de esquema.

[
    {
       "boxes": [
          {
             "box": {
                "topX": 0.679,
                "topY": 0.491,
                "bottomX": 0.926,
                "bottomY": 0.810
             },
             "label": "can",
             "score": 0.992,
             "polygon": [
                [
                   0.82, 0.811, 0.771, 0.810, 0.758, 0.805, 0.741, 0.797, 0.735, 0.791, 0.718, 0.785, 0.715, 0.778, 0.706, 0.775, 0.696, 0.758, 0.695, 0.717, 0.698, 0.567, 0.705, 0.552, 0.706, 0.540, 0.725, 0.520, 0.735, 0.505, 0.745, 0.502, 0.755, 0.493
                ]
             ]
          },
          {
             "box": {
                "topX": 0.220,
                "topY": 0.298,
                "bottomX": 0.397,
                "bottomY": 0.601
             },
             "label": "milk_bottle",
             "score": 0.989,
             "polygon": [
                [
                   0.365, 0.602, 0.273, 0.602, 0.26, 0.595, 0.263, 0.588, 0.251, 0.546, 0.248, 0.501, 0.25, 0.485, 0.246, 0.478, 0.245, 0.463, 0.233, 0.442, 0.231, 0.43, 0.226, 0.423, 0.226, 0.408, 0.234, 0.385, 0.241, 0.371, 0.238, 0.345, 0.234, 0.335, 0.233, 0.325, 0.24, 0.305, 0.586, 0.38, 0.592, 0.375, 0.598, 0.365
                ]
             ]
          },
          {
             "box": {
                "topX": 0.433,
                "topY": 0.280,
                "bottomX": 0.621,
                "bottomY": 0.679
             },
             "label": "water_bottle",
             "score": 0.988,
             "polygon": [
                [
                   0.576, 0.680, 0.501, 0.680, 0.475, 0.675, 0.460, 0.625, 0.445, 0.630, 0.443, 0.572, 0.440, 0.560, 0.435, 0.515, 0.431, 0.501, 0.431, 0.433, 0.433, 0.426, 0.445, 0.417, 0.456, 0.407, 0.465, 0.381, 0.468, 0.327, 0.471, 0.318
                ]
             ]
          }
       ]
    }
]

Formato de datos para puntuación y explicación en línea (XAI)

Importante

Esta configuración se encuentra actualmente en versión preliminar pública. Se proporciona sin un contrato de nivel de servicio. Es posible que algunas características no sean compatibles o que tengan sus funcionalidades limitadas. Para más información, consulte Términos de uso complementarios de las Versiones Preliminares de Microsoft Azure.

Advertencia

La explicación solo se admite para la clasificación de varias clases y la clasificación de varias etiquetas. Al generar explicaciones en el punto de conexión en línea, si encontrase incidencias de agotamiento de tiempo de espera, use el cuaderno de puntuación por lotes (SDK v1) para generar explicaciones.

En esta sección, se documenta el formato de los datos de entrada necesario para realizar predicciones y generar explicaciones para las clases predichas mediante un modelo implementado. No hay ninguna implementación independiente necesaria para la explicación. El mismo punto de conexión de la puntuación en línea se puede utilizar para generar explicaciones. Solo tenemos que pasar algunos parámetros relacionados con la explicación adicional en el esquema de entrada y obtener visualizaciones de las explicaciones o matrices de puntuación de atribuciones (explicaciones en el nivel de píxel).

Métodos de explicación admitidos:

Formato de entrada (XAI)

Se admiten los siguientes formatos de entrada para generar predicciones y explicaciones en cualquier tarea de clasificación mediante el punto de conexión de modelo específico de la tarea. Después de implementar el modelo, podemos usar el siguiente esquema para obtener predicciones y explicaciones.

{
   "input_data": {
      "columns": ["image"],
      "data": [json.dumps({"image_base64": "image_in_base64_string_format", 
                           "model_explainability": True,
                           "xai_parameters": {}
                         })
      ]
   }
}

Junto con la imagen, hay dos parámetros adicionales (model_explainability y xai_parameters) necesarios en el esquema de entrada para generar explicaciones.

Clave Descripción Valor predeterminado
image_base64 imagen de entrada en formato base64
Required, String
-
model_explainability Si se van a generar explicaciones o solo la puntuación
Optional, Bool
False
xai_parameters Si model_explainability es True, xai_parameters entonces es un diccionario que contiene parámetros relacionados con el algoritmo de explicación con xai_algorithm, visualizations y attributions como claves.
Optional, Dictionary
Si no se pasa xai_parameters, el algoritmo de explicación xrai se usa con su valor predeterminado.
{"xai_algorithm": "xrai", "visualizations": True, "attributions": False}
xai_algorithm Nombre del algoritmo de explicación que se va a usar. Los algoritmos XAI admitidos son {xrai, integrated_gradients, guided_gradcam, guided_backprop}
Optional, String
xrai
visualizations Si se van a devolver visualizaciones de explicaciones.
Optional, Bool
True
attributions Si se van a devolver atribuciones de características.
Optional, Bool
False
confidence_score_threshold_multilabel Umbral de puntuación de confianza para seleccionar las clases principales para generar explicaciones en la clasificación de varias etiquetas.
Optional, Float
0.5

En la tabla siguiente se describen los esquemas admitidos para la explicación.

Tipo Schema
Inferencia en una sola imagen en formato base64 El diccionario con image_base64 como clave y valor es una imagen codificada en base64,
model_explainability key con True o False y xai_parameters diccionario con parámetros específicos del algoritmo XAI
Required, Json String
Works for one or more images

Cada imagen de entrada de request_json, definida en el código siguiente, es una cadena codificada en base64 anexada a la lista request_json["input_data"]["data"]:

import base64
import json
# Get the details for online endpoint
endpoint = ml_client.online_endpoints.get(name=online_endpoint_name)

sample_image = "./test_image.jpg"

# Define explainability (XAI) parameters
model_explainability = True
xai_parameters = {"xai_algorithm": "xrai",
                  "visualizations": True,
                  "attributions": False}

def read_image(image_path):
    with open(image_path, "rb") as f:
        return f.read()

# Create request json
request_json = {

    "input_data": {
        "columns": ["image"],
        "data": [json.dumps({"image_base64": base64.encodebytes(read_image(sample_image)).decode("utf-8"),
                             "model_explainability": model_explainability,
                             "xai_parameters": xai_parameters})],
    }
}

request_file_name = "sample_request_data.json"

with open(request_file_name, "w") as request_file:
    json.dump(request_json, request_file)

resp = ml_client.online_endpoints.invoke(
    endpoint_name=online_endpoint_name,
    deployment_name=deployment.name,
    request_file=request_file_name,
)
predictions = json.loads(resp)

Formato de salida (XAI)

Las predicciones realizadas en los puntos de conexión del modelo siguen un esquema diferente en función del tipo de tarea. En esta sección, se indican los formatos de datos de salida para las tareas de clasificación de imágenes de varias clases y varias etiquetas.

Los esquemas siguientes están definidos para el caso de dos imágenes de entrada.

Clasificación de imágenes (binaria/multiclase)

El esquema de salida es el mismo que se describió anteriormente, excepto que los valores de clave visualizations y attributions se incluyen, si estas claves se establecieron en True en la solicitud.

Si model_explainability, visualizations y attributions están establecidos en True en la solicitud de entrada, la salida tendrá visualizations y attributions. En la tabla siguiente se explican más detalles sobre estos parámetros. Las visualizaciones y atribuciones se generan en una clase que tiene la puntuación de probabilidad más alta.

Clave de salida Descripción
visualizations Imagen única en formato de cadena base64 con tipo
Optional, String
attributions matriz multidimensional con puntuaciones de atribución por píxeles de la forma [3, valid_crop_size, valid_crop_size]
Optional, List
[
    {
       "probs": [
          0.006,
          9.345e-05,
          0.992,
          0.003
       ],
       "labels": [
          "can",
          "carton",
          "milk_bottle",
          "water_bottle"
       ],
       "visualizations": "iVBORw0KGgoAAAAN.....",
       "attributions": [[[-4.2969e-04, -1.3090e-03,  7.7791e-04,  ...,  2.6677e-04,
                          -5.5195e-03,  1.7989e-03],
                          .
                          .
                          .
                         [-5.8236e-03, -7.9108e-04, -2.6963e-03,  ...,  2.6517e-03,
                           1.2546e-03,  6.6507e-04]]]
    }
]

Clasificación de imágenes con varias etiquetas

La única diferencia en el esquema de salida de la clasificación de varias etiquetas en comparación con la clasificación de varias clases es que puede haber varias clases en cada imagen para la que se pueden generar explicaciones. Por lo tanto, visualizations es la lista de cadenas de imagen en formato base64 y attributions es la lista de puntuaciones de atribución en cada clase seleccionada en función de confidence_score_threshold_multilabel (el valor predeterminado es 0,5).

Si model_explainability, visualizations y attributions están establecidos en True en la solicitud de entrada, la salida tendrá visualizations y attributions. En la tabla siguiente se explican más detalles sobre estos parámetros. Las visualizaciones y atribuciones se generan en todas las clases que tienen la puntuación de probabilidad mayor o igual que confidence_score_threshold_multilabel.

Clave de salida Descripción
visualizations Lista de imágenes en formato de cadena base64 con tipo
Optional, String
attributions Lista de matrices multidimensionales con puntuaciones de atribución por píxeles en cada clase, donde cada matriz multidimensional tiene la forma [3, valid_crop_size, valid_crop_size]
Optional, List

Advertencia

Al generar explicaciones en el punto de conexión en línea, asegúrese de seleccionar solo algunas clases basadas en la puntuación de confianza para evitar problemas de agotamiento de tiempo de espera en el punto de conexión o use el punto de conexión con el tipo de instancia de GPU. Para generar explicaciones para un gran número de clases en la clasificación de varias etiquetas, consulte el cuaderno de puntuación por lotes (SDK v1).

[
    {
       "probs": [
          0.994,
          0.994,
          0.843,
          0.166
       ],
       "labels": [
          "can",
          "carton",
          "milk_bottle",
          "water_bottle"
       ],
       "visualizations": ["iVBORw0KGgoAAAAN.....", "iVBORw0KGgoAAAAN......", .....],
       "attributions": [
                        [[[-4.2969e-04, -1.3090e-03,  7.7791e-04,  ...,  2.6677e-04,
                           -5.5195e-03,  1.7989e-03],
                           .
                           .
                           .
                          [-5.8236e-03, -7.9108e-04, -2.6963e-03,  ...,  2.6517e-03,
                            1.2546e-03,  6.6507e-04]]],
                        .
                        .
                        .
                       ]
    }
]

Detección de objetos

Advertencia

No se admite XAI. Por lo tanto, solo se devuelven puntuaciones. Para obtener un ejemplo de puntuación, consulte la sección de puntuación en línea.

Segmentación de instancias

Advertencia

No se admite XAI. Por lo tanto, solo se devuelven puntuaciones. Para obtener un ejemplo de puntuación, consulte la sección de puntuación en línea.

Nota

Las imágenes que se usan en este artículo son del conjunto de datos Fridge Objects, copyright © Microsoft Corporation, y están disponibles en computervision-recipes/01_training_introduction.ipynb bajo la licencia MIT.

Pasos siguientes