Partilhar via


Esquemas de dados para treinar modelos de visão computacional com aprendizado de máquina automatizado

APLICA-SE A:Azure CLI ml extension v2 (current)Python SDK azure-ai-ml v2 (current)

Saiba como formatar seus arquivos JSONL para consumo de dados em experimentos automatizados de ML para tarefas de visão computacional durante o treinamento e a inferência.

Esquema de dados para treinamento

O Azure Machine Learning AutoML for Images requer que os dados de imagem de entrada sejam preparados no formato JSONL (JSON Lines). Esta seção descreve formatos de dados de entrada ou esquema para classificação de imagem multiclasse, classificação de imagem multi-label, deteção de objetos e segmentação de instância. Também forneceremos uma amostra do treinamento final ou do arquivo JSON Lines de validação.

Classificação de imagens (binária/multiclasse)

Formato/esquema de dados de entrada em cada linha 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",
}
Chave Description Exemplo
image_url Localização da imagem no armazenamento de dados do Azure Machine Learning.
my-subscription-id precisa ser substituída pela assinatura do Azure onde as imagens estão localizadas. Mais informações sobre assinaturas do Azure podem ser encontradas aqui. my-resource-groupDa mesma forma, , deve my-datastore ser substituído por nome do grupo de recursos, nome do espaço de trabalho e nome do armazenamento de dados, my-workspacerespectivamente.
path_to_image deve ser o caminho completo para a imagem no armazenamento de dados.
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 Detalhes da imagem
Optional, Dictionary
"image_details":{"format": "jpg", "width": "400px", "height": "258px"}
format Tipo de imagem (todos os formatos de imagem disponíveis na biblioteca de travesseiros são suportados)
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 Largura da imagem
Optional, String or Positive Integer
"400px" or 400
height Altura da imagem
Optional, String or Positive Integer
"200px" or 200
label Classe/rótulo da imagem
Required, String
"cat"

Exemplo de um arquivo JSONL para classificação de imagem multiclasse:

{"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"}

Exemplo de imagem para classificação de imagem multiclasse.

Classificação de imagem multi-rótulo

Segue-se um exemplo de formato/esquema de dados de entrada em cada Linha JSON para classificação de imagens.

{
   "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"
        
   ]
}
Chave Description Exemplo
image_url Localização da imagem no armazenamento de dados do Azure Machine Learning.
my-subscription-id precisa ser substituída pela assinatura do Azure onde as imagens estão localizadas. Mais informações sobre assinaturas do Azure podem ser encontradas aqui. my-resource-groupDa mesma forma, , deve my-datastore ser substituído por nome do grupo de recursos, nome do espaço de trabalho e nome do armazenamento de dados, my-workspacerespectivamente.
path_to_image deve ser o caminho completo para a imagem no armazenamento de dados.
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 Detalhes da imagem
Optional, Dictionary
"image_details":{"format": "jpg", "width": "400px", "height": "258px"}
format Tipo de imagem (todos os formatos de imagem disponíveis na biblioteca de travesseiros são suportados)
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 Largura da imagem
Optional, String or Positive Integer
"400px" or 400
height Altura da imagem
Optional, String or Positive Integer
"200px" or 200
label Lista de classes/rótulos na imagem
Required, List of Strings
["cat","dog"]

Exemplo de um arquivo JSONL para classificação de imagem Multi-label:

{"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"]}

Exemplo de imagem para classificação de imagem multi-label.

Deteção de objetos

A seguir está um exemplo de arquivo JSONL para deteção 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"
      },
      "..."
   ]
}

Aqui,

  • xmin = coordenada x do canto superior esquerdo da caixa delimitadora
  • ymin = coordenada y do canto superior esquerdo da caixa delimitadora
  • xmax = coordenada x do canto inferior direito da caixa delimitadora
  • ymax = coordenada y do canto inferior direito da caixa delimitadora
Chave Description Exemplo
image_url Localização da imagem no armazenamento de dados do Azure Machine Learning.
my-subscription-id precisa ser substituída pela assinatura do Azure onde as imagens estão localizadas. Mais informações sobre assinaturas do Azure podem ser encontradas aqui. my-resource-groupDa mesma forma, , deve my-datastore ser substituído por nome do grupo de recursos, nome do espaço de trabalho e nome do armazenamento de dados, my-workspacerespectivamente.
path_to_image deve ser o caminho completo para a imagem no armazenamento de dados.
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 Detalhes da imagem
Optional, Dictionary
"image_details":{"format": "jpg", "width": "400px", "height": "258px"}
format Tipo de imagem (todos os formatos de imagem disponíveis na biblioteca de travesseiros são suportados. Mas para YOLO apenas formatos de imagem permitidos pelo opencv são suportados)
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 Largura da imagem
Optional, String or Positive Integer
"499px" or 499
height Altura da imagem
Optional, String or Positive Integer
"665px" or 665
label (chave exterior) Lista de caixas delimitadoras, onde cada caixa é um dicionário de label, topX, topY, bottomX, bottomY, isCrowd suas coordenadas superior esquerda e inferior direita
Required, List of dictionaries
[{"label": "cat", "topX": 0.260, "topY": 0.406, "bottomX": 0.735, "bottomY": 0.701, "isCrowd": 0}]
label (chave interna) Classe/rótulo do objeto na caixa delimitadora
Required, String
"cat"
topX Proporção de x coordenada do canto superior esquerdo da caixa delimitadora e largura da imagem
Required, Float in the range [0,1]
0.260
topY Proporção da coordenada y do canto superior esquerdo da caixa delimitadora e da altura da imagem
Required, Float in the range [0,1]
0.406
bottomX Proporção de x coordenada do canto inferior direito da caixa delimitadora e largura da imagem
Required, Float in the range [0,1]
0.735
bottomY Proporção da coordenada y do canto inferior direito da caixa delimitadora e altura da imagem
Required, Float in the range [0,1]
0.701
isCrowd Indica se a caixa delimitadora está ao redor da multidão de objetos. Se esse sinalizador especial for definido, ignoraremos essa caixa delimitadora específica ao calcular a métrica.
Optional, Bool
0

Exemplo de um arquivo JSONL para deteção 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}]}

Exemplo de imagem para deteção de objetos.

Segmentação de instâncias

Por exemplo, a segmentação, o ML automatizado suporta apenas polígonos como entrada e saída, sem máscaras.

A seguir está um exemplo de arquivo JSONL, por exemplo, segmentação.

{
   "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"]]
      }
   ]
}
Chave Description Exemplo
image_url Localização da imagem no armazenamento de dados do Azure Machine Learning.
my-subscription-id precisa ser substituída pela assinatura do Azure onde as imagens estão localizadas. Mais informações sobre assinaturas do Azure podem ser encontradas aqui. my-resource-groupDa mesma forma, , deve my-datastore ser substituído por nome do grupo de recursos, nome do espaço de trabalho e nome do armazenamento de dados, my-workspacerespectivamente.
path_to_image deve ser o caminho completo para a imagem no armazenamento de dados.
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 Detalhes da imagem
Optional, Dictionary
"image_details":{"format": "jpg", "width": "400px", "height": "258px"}
format Tipo de imagem
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 Largura da imagem
Optional, String or Positive Integer
"499px" or 499
height Altura da imagem
Optional, String or Positive Integer
"665px" or 665
label (chave exterior) Lista de máscaras, onde cada máscara é um dicionário 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 (chave interna) Classe/rótulo do objeto na máscara
Required, String
"cat"
isCrowd Indica se a máscara está ao redor da multidão de objetos
Optional, Bool
0
polygon Coordenadas de polígono para o 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]]

Exemplo de um arquivo JSONL para segmentação de instância:

{"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 ]]}]}

Exemplo de imagem, por exemplo, segmentação.

Esquema de dados para pontuação online

Nesta seção, documentamos o formato de dados de entrada necessário para fazer previsões usando um modelo implantado.

Formato de entrada

O JSON a seguir é o formato de entrada necessário para gerar previsões em qualquer tarefa usando o ponto de extremidade do modelo específico da tarefa.

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

Este json é um dicionário com chave input_data externa e chaves columnsinternas, data conforme descrito na tabela a seguir. O ponto de extremidade aceita uma cadeia de caracteres json no formato acima e a converte em um dataframe de amostras exigidas pelo script de pontuação. Cada imagem de entrada na request_json["input_data"]["data"] seção do json é uma cadeia de caracteres codificada em base64.

Chave Description
input_data
(chave exterior)
É uma chave externa na solicitação json. input_data é um dicionário que aceita amostras de imagens de entrada
Required, Dictionary
columns
(chave interna)
Nomes de colunas a serem usados para criar dataframe. Ele aceita apenas uma coluna com image o nome da coluna.
Required, List
data
(chave interna)
Lista de imagens codificadas base64
Required, List

Depois de implantarmos o modelo mlflow, podemos usar o seguinte trecho de código para obter previsões para todas as tarefas.

# 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 saída

As previsões feitas nos pontos de extremidade do modelo seguem uma estrutura diferente, dependendo do tipo de tarefa. Esta seção explora os formatos de dados de saída para tarefas de classificação de imagem multiclasse e rótulo, deteção de objetos e segmentação de instância.

Os esquemas a seguir são aplicáveis quando a solicitação de entrada contém uma imagem.

Classificação de imagens (binária/multiclasse)

O ponto de extremidade para classificação de imagem retorna todos os rótulos no conjunto de dados e suas pontuações de probabilidade para a imagem de entrada no formato a seguir. visualizations e attributions estão relacionados com a explicabilidade e quando o pedido é apenas para pontuação, estas chaves não serão incluídas na saída. Para obter mais informações sobre o esquema de entrada e saída de explicabilidade para classificação de imagens, consulte a seção Explicabilidade para classificação de imagens.

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

Classificação de imagem multi-rótulo

Para classificação de imagem multi-label, o ponto de extremidade do modelo retorna rótulos e suas probabilidades. visualizations e attributions estão relacionados com a explicabilidade e quando o pedido é apenas para pontuação, estas chaves não serão incluídas na saída. Para obter mais informações sobre o esquema de entrada e saída de explicabilidade para classificação de vários rótulos, consulte a seção Explicabilidade para classificação de imagem multirótulo.

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

Deteção de objetos

O modelo de deteção de objetos retorna várias caixas com suas coordenadas dimensionadas superior-esquerda e inferior-direita, juntamente com o rótulo da caixa e a pontuação de confiança.

[
   {
      "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
         }
      ]
   }
]

Segmentação de instâncias

Na segmentação de instâncias, a saída consiste em várias caixas com suas coordenadas escaladas de cima para a esquerda e para a direita, rótulos, pontuações de confiança e polígonos (não máscaras). Aqui, os valores de polígono estão no mesmo formato que discutimos na seção 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 dados para pontuação e explicabilidade online (XAI)

Importante

Essas configurações estão atualmente em visualização pública. Eles são fornecidos sem um acordo de nível de serviço. Algumas funcionalidades poderão não ser suportadas ou poderão ter capacidades limitadas. Para obter mais informações, veja Termos Suplementares de Utilização para Pré-visualizações do Microsoft Azure.

Aviso

A explicabilidade é suportada apenas para classificação multiclasse e classificação multirótulo. Ao gerar explicações no ponto de extremidade online, se você encontrar problemas de tempo limite, use o bloco de anotações de pontuação em lote (SDK v1) para gerar explicações.

Nesta seção, documentamos o formato de dados de entrada necessário para fazer previsões e gerar explicações para a(s) classe(s) prevista(s) usando um modelo implantado. Não há nenhuma implantação separada necessária para explicabilidade. O mesmo ponto final para pontuação on-line pode ser utilizado para gerar explicações. Só precisamos passar alguns parâmetros adicionais relacionados à explicabilidade no esquema de entrada e obter visualizações de explicações e/ou matrizes de pontuação de atribuição (explicações em nível de pixel).

Métodos de explicabilidade suportados:

Formato de entrada (XAI)

Os seguintes formatos de entrada são suportados para gerar previsões e explicações sobre qualquer tarefa de classificação usando o ponto de extremidade do modelo específico da tarefa. Depois de implantar o modelo, podemos usar o esquema a seguir para obter previsões e explicações.

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

Junto com a imagem, há dois parâmetros extras (model_explainability e xai_parameters) necessários no esquema de entrada para gerar explicações.

Chave Description Valor Predefinido
image_base64 imagem de entrada no formato base64
Required, String
-
model_explainability Seja para gerar explicações ou apenas a pontuação
Optional, Bool
False
xai_parameters Se model_explainability é True, então xai_parameters é um dicionário contendo parâmetros relacionados ao algoritmo de explicabilidade com xai_algorithm, visualizations, attributions ask keys.
Optional, Dictionary
Se xai_parameters não for aprovado, o algoritmo de xrai explicabilidade será usado com seu valor padrão
{"xai_algorithm": "xrai", "visualizations": True, "attributions": False}
xai_algorithm Nome do algoritmo de explicabilidade a ser usado. Os algoritmos XAI suportados são {xrai, integrated_gradients, guided_gradcam, guided_backprop}
Optional, String
xrai
visualizations Se deseja retornar visualizações de explicações.
Optional, Bool
True
attributions Se as atribuições de recursos devem ser retornadas.
Optional, Bool
False
confidence_score_threshold_multilabel Limiar de pontuação de confiança para selecionar as melhores classes para gerar explicações na classificação multi-label.
Optional, Float
0.5

A tabela a seguir descreve os esquemas suportados para explicabilidade.

Type Esquema
Inferência em imagem única no formato base64 Dicionário com image_base64 como chave e valor é base64 imagem codificada,
model_explainability chave com True ou False e xai_parameters dicionário com parâmetros específicos do algoritmo XAI
Required, Json String
Works for one or more images

Cada imagem de entrada no request_json, definido no código abaixo, é uma cadeia de caracteres codificada em base64 anexada à 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 saída (XAI)

As previsões feitas nos pontos de extremidade do modelo seguem esquemas diferentes, dependendo do tipo de tarefa. Esta seção descreve os formatos de dados de saída para tarefas de classificação de imagem multiclasse e multirótulo.

Os esquemas a seguir são definidos para o caso de duas imagens de entrada.

Classificação de imagens (binária/multiclasse)

O esquema de saída é o mesmo descrito acima , exceto que visualizations e attributions os valores de chave são incluídos, se essas chaves foram definidas como True na solicitação.

Se model_explainability, visualizations, attributions são definidos como True na solicitação de entrada, então a saída terá visualizations e attributions. Mais detalhes sobre esses parâmetros são explicados na tabela a seguir. As visualizações e atribuições são geradas em relação a uma classe que tem a pontuação de probabilidade mais alta.

Chave de saída Description
visualizations Imagem única no formato de cadeia de caracteres base64 com tipo
Optional, String
attributions Matriz multidimensional com pontuações de forma de atribuição de pixel sábio [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]]]
    }
]

Classificação de imagem multi-rótulo

A única diferença no esquema de saída da classificação multi-label em comparação com a classificação multi-classe é que pode haver várias classes em cada imagem para as quais as explicações podem ser geradas. Assim, visualizations é a lista de cadeias de caracteres de imagem base64 e attributions é a lista de pontuações de atribuição em relação a cada classe selecionada com base no confidence_score_threshold_multilabel (padrão é 0,5).

Se model_explainability, visualizations, attributions são definidos como True na solicitação de entrada, então a saída terá visualizations e attributions. Mais detalhes sobre esses parâmetros são explicados na tabela a seguir. Visualizações e atribuições são geradas contra todas as classes que têm o escore de probabilidade maior ou igual a confidence_score_threshold_multilabel.

Chave de saída Description
visualizations Lista de imagens no formato de cadeia de caracteres base64 com tipo
Optional, String
attributions Lista de matrizes multidimensionais com pontuações de atribuição em pixel wise em relação a cada classe, onde cada matriz multidimensional tem forma [3, valid_crop_size, valid_crop_size]
Optional, List

Aviso

Ao gerar explicações sobre o endpoint online, certifique-se de selecionar apenas algumas classes com base na pontuação de confiança para evitar problemas de tempo limite no endpoint ou usar o endpoint com o tipo de instância GPU. Para gerar explicações para um grande número de classes na classificação de vários rótulos, consulte o bloco de anotações de pontuação em lote (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]]],
                        .
                        .
                        .
                       ]
    }
]

Deteção de objetos

Aviso

XAI não é suportado. Assim, apenas as pontuações são devolvidas. Para obter um exemplo de pontuação, consulte a seção de pontuação online.

Segmentação de instâncias

Aviso

XAI não é suportado. Assim, apenas as pontuações são devolvidas. Para obter um exemplo de pontuação, consulte a seção de pontuação online.

Nota

As imagens usadas neste artigo são do conjunto de dados Fridge Objects, copyright © Microsoft Corporation e disponíveis em computervision-recipes/01_training_introduction.ipynb sob a Licença MIT.

Próximos passos