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 imagenOptional, 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 imagenOptional, String or Positive Integer |
"400px" or 400 |
height |
Altura de la imagenOptional, String or Positive Integer |
"200px" or 200 |
label |
Clase o etiqueta de la imagenRequired, 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"}
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 imagenOptional, 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 imagenOptional, String or Positive Integer |
"400px" or 400 |
height |
Altura de la imagenOptional, String or Positive Integer |
"200px" or 200 |
label |
Lista de clases o etiquetas de la imagenRequired, 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"]}
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 delimitadorymin
= coordenada Y de la esquina superior izquierda del rectángulo delimitadorxmax
= coordenada X de la esquina inferior derecha del rectángulo delimitadorymax
= 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 imagenOptional, 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 imagenOptional, String or Positive Integer |
"499px" or 499 |
height |
Altura de la imagenOptional, 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 derechaRequired, 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 delimitadorRequired, String |
"cat" |
topX |
Proporción de la coordenada X de la esquina superior izquierda del rectángulo delimitador y el ancho de la imagenRequired, 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 imagenRequired, 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 imagenRequired, 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 imagenRequired, 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}]}
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 imagenOptional, Dictionary |
"image_details":{"format": "jpg", "width": "400px", "height": "258px"} |
format |
Tipo de imagenOptional, 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 imagenOptional, String or Positive Integer |
"499px" or 499 |
height |
Altura de la imagenOptional, 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áscaraRequired, 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 objetoRequired, 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 ]]}]}
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:
- XRAI (xrai)
- Gradientes integrados (integrated_gradients)
- GradCAM guiado (guided_gradcam)
- Retropropagación guiada (guided_backprop)
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 base64Required, String |
- |
model_explainability |
Si se van a generar explicaciones o solo la puntuaciónOptional, 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.