Esquemas de dados para preparar modelos de imagem digitalizada com machine learning automatizado

APLICA-SE A:Extensão v2 da CLI do Azure (atual)SDK python azure-ai-ml v2 (atual)

Saiba como formatar os seus ficheiros JSONL para consumo de dados em experimentações de ML automatizadas para tarefas de imagem digitalizada durante a preparação e inferência.

Esquema de dados para preparação

O AutoML do Azure Machine Learning para Imagens requer que os dados de imagem de entrada sejam preparados no formato JSONL (Linhas JSON). Esta secção descreve os formatos de dados de entrada ou o esquema da classificação de imagens de várias classes, da classificação de imagens de várias etiquetas, da deteção de objetos e da segmentação de instâncias. Também forneceremos um exemplo de ficheiro de Linhas JSON de preparação ou validação final.

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 Descrição Exemplo
image_url Localização da imagem no arquivo de dados do Azure Machine Learning.
my-subscription-id tem de ser substituído pela subscrição do Azure onde as imagens estão localizadas. Pode encontrar mais informações sobre as subscrições do Azure aqui. Da mesma formamy-resource-group, , my-workspacemy-datastore deve ser substituído pelo nome do grupo de recursos, nome da área de trabalho e nome do arquivo de dados, respetivamente.
path_to_image deve ser o caminho completo para a imagem no arquivo 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 Pillow 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/etiqueta da imagem
Required, String
"cat"

Exemplo de um ficheiro JSONL para classificação de imagens de várias classes:

{"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 imagens de várias classes.

Classificação de imagens com várias etiquetas

Segue-se um exemplo de esquema/formato 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 Descrição Exemplo
image_url Localização da imagem no arquivo de dados do Azure Machine Learning.
my-subscription-id tem de ser substituído pela subscrição do Azure onde as imagens estão localizadas. Pode encontrar mais informações sobre as subscrições do Azure aqui. Da mesma formamy-resource-group, , my-workspacemy-datastore deve ser substituído pelo nome do grupo de recursos, nome da área de trabalho e nome do arquivo de dados, respetivamente.
path_to_image deve ser o caminho completo para a imagem no arquivo 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 Pillow 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/etiquetas na imagem
Required, List of Strings
["cat","dog"]

Exemplo de um ficheiro JSONL para a Etiqueta Múltipla da Classificação de Imagens:

{"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 imagens com várias etiquetas.

Deteção de objetos

Segue-se um ficheiro JSONL de exemplo 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 = y coordenada do canto superior esquerdo da caixa delimitadora
  • xmax = coordenada x do canto inferior direito da caixa delimitadora
  • ymax = y coordenada do canto inferior direito da caixa delimitadora
Chave Descrição Exemplo
image_url Localização da imagem no arquivo de dados do Azure Machine Learning.
my-subscription-id tem de ser substituído pela subscrição do Azure onde as imagens estão localizadas. Pode encontrar mais informações sobre as subscrições do Azure aqui. Da mesma formamy-resource-group, , my-workspacemy-datastore deve ser substituído pelo nome do grupo de recursos, nome da área de trabalho e nome do arquivo de dados, respetivamente.
path_to_image deve ser o caminho completo para a imagem no arquivo 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 almofadas são suportados. Mas apenas para formatos de imagem YOLO 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 (tecla externa) Lista de caixas delimitadoras, em que cada caixa é um dicionário das label, topX, topY, bottomX, bottomY, isCrowd 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 (tecla interna) Classe/etiqueta 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 de y coordenada do canto superior esquerdo da caixa delimitadora e 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 de y coordenada 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á à volta da multidão de objetos. Se este sinalizador especial estiver definido, ignoramos esta caixa delimitadora específica ao calcular a métrica.
Optional, Bool
0

Exemplo de um ficheiro 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 de instâncias, o ML automatizado só suporta o polígono como entrada e saída, sem máscaras.

Segue-se um ficheiro JSONL de exemplo, 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 Descrição Exemplo
image_url Localização da imagem no arquivo de dados do Azure Machine Learning.
my-subscription-id tem de ser substituído pela subscrição do Azure onde as imagens estão localizadas. Pode encontrar mais informações sobre as subscrições do Azure aqui. Da mesma formamy-resource-group, , my-workspacemy-datastore deve ser substituído pelo nome do grupo de recursos, nome da área de trabalho e nome do arquivo de dados, respetivamente.
path_to_image deve ser o caminho completo para a imagem no arquivo 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 (tecla externa) Lista de máscaras, em que 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 (tecla interna) Classe/etiqueta do objeto na máscara
Required, String
"cat"
isCrowd Indica se a máscara está à volta da multidão de objetos
Optional, Bool
0
polygon Coordenadas de polígonos 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 ficheiro JSONL para Segmentação de Instâncias:

{"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 para segmentação de instâncias.

Esquema de dados para classificação online

Nesta secção, documentamos o formato de dados de entrada necessário para fazer predições com um modelo implementado.

Formato de entrada

O seguinte JSON é o formato de entrada necessário para gerar predições em qualquer tarefa através do ponto final de modelo específico da tarefa.

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

Este json é um dicionário com tecla input_data externa e teclas columnsinternas, data conforme descrito na tabela seguinte. O ponto final aceita uma cadeia json no formato acima e converte-a num dataframe de exemplos necessários para o script de classificação. Cada imagem de entrada na request_json["input_data"]["data"] secção do json é uma cadeia codificada base64.

Chave Descrição
input_data
(tecla externa)
É uma chave externa no pedido json. input_data é um dicionário que aceita exemplos de imagem de entrada
Required, Dictionary
columns
(chave interna)
Nomes de colunas a utilizar para criar o dataframe. Aceita apenas uma coluna com image o nome da coluna.
Required, List
data
(chave interna)
Lista de imagens codificadas com base64
Required, List

Depois de implementarmos o modelo de mlflow, podemos utilizar o seguinte fragmento de código para obter prediçõ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 predições feitas em pontos finais de modelo seguem uma estrutura diferente consoante o tipo de tarefa. Esta secção explora os formatos de dados de saída para tarefas de segmentação de instâncias de várias classes, classificação de imagens com várias etiquetas, deteção de objetos e instâncias.

Os seguintes esquemas são aplicáveis quando o pedido de entrada contém uma imagem.

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

O ponto final para a classificação de imagens devolve todas as etiquetas no conjunto de dados e as respetivas pontuações de probabilidade para a imagem de entrada no seguinte formato. visualizations e attributions estão relacionados com a explicação e quando o pedido é apenas para classificação, estas chaves não serão incluídas no resultado. Para obter mais informações sobre a introdução de explicação e o esquema de saída para a classificação de imagens, veja a secção explicar a 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 imagens com várias etiquetas

Para classificação de imagens com várias etiquetas, o ponto final do modelo devolve etiquetas e as respetivas probabilidades. visualizations e attributions estão relacionados com a explicação e quando o pedido é apenas para classificação, estas chaves não serão incluídas no resultado. Para obter mais informações sobre a introdução de explicação e o esquema de saída para a classificação de várias etiquetas, veja a secção explicar a classificação de imagens com várias etiquetas.

[
   {
      "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 devolve várias caixas com as respetivas coordenadas superior esquerda e inferior direita, juntamente com etiqueta de caixa e classificaçã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 múltiplas caixas com as respetivas coordenadas, etiquetas, classificações de confiança e polígonos dimensionados na parte superior esquerda e inferior direita (não máscaras). Aqui, os valores do polígono estão no mesmo formato que discutimos na secçã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 Classificação e Explicação Online (XAI)

Importante

Estas definições estão atualmente em pré-visualização pública. São fornecidos sem um contrato 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 explicação é suportada apenas para classificação de várias classes e classificação de várias etiquetas. Ao gerar explicações no ponto final online, se encontrar problemas de tempo limite, utilize o bloco de notas de classificação em lote (SDK v1) para gerar explicações.

Nesta secção, documentamos o formato de dados de entrada necessário para fazer predições e gerar explicações para a classe/classes previstas com um modelo implementado. Não é necessária nenhuma implementação separada para a explicação. O mesmo ponto final para classificação online pode ser utilizado para gerar explicações. Só precisamos de transmitir alguns parâmetros relacionados com a explicação extra no esquema de entrada e obter visualizações de explicações e/ou matrizes de classificação de atribuição (explicações ao nível do pixel).

Métodos de explicação suportados:

Formato de entrada (XAI)

Os seguintes formatos de entrada são suportados para gerar predições e explicações sobre qualquer tarefa de classificação com o ponto final de modelo específico da tarefa. Depois de implementarmos o modelo, podemos utilizar o seguinte esquema para obter predições e explicações.

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

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

Chave Descrição Valor Predefinido
image_base64 imagem de entrada no formato base64
Required, String
-
model_explainability Quer gerar explicações ou apenas a classificação
Optional, Bool
False
xai_parameters Se model_explainability for Verdadeiro, xai_parameters é um dicionário que contém parâmetros relacionados com algoritmos de explicação com xai_algorithm, visualizations, attributions perguntar chaves.
Optional, Dictionary
Se xai_parameters não for transmitido, o algoritmo de explicação é utilizado com o xrai valor predefinido
{"xai_algorithm": "xrai", "visualizations": True, "attributions": False}
xai_algorithm Nome do algoritmo explainability a ser utilizado. Os algoritmos XAI suportados são {xrai, integrated_gradients, guided_gradcam, guided_backprop}
Optional, String
xrai
visualizations Se pretende devolver visualizações de explicações.
Optional, Bool
True
attributions Se pretende devolver atribuições de funcionalidades.
Optional, Bool
False
confidence_score_threshold_multilabel Limiar de classificação de confiança para selecionar classes superiores para gerar explicações na classificação de várias etiquetas.
Optional, Float
0.5

A tabela seguinte descreve os esquemas suportados para explicação.

Tipo Esquema
Inferência numa única imagem no formato base64 O dicionário com image_base64 como chave e valor é imagem codificada com base64,
model_explainability chave com Verdadeiro ou Falso 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, definida no código abaixo, é uma cadeia codificada 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 predições feitas nos pontos finais do modelo seguem um esquema diferente consoante o tipo de tarefa. Esta secção descreve os formatos de dados de saída para tarefas de classificação de imagens de várias classes e de várias etiquetas.

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

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

O esquema de saída é igual ao descrito acima , exceto que visualizations e attributions os valores de chave estão incluídos, se estas chaves tiverem sido definidas True como no pedido.

Se model_explainability, visualizations, attributions estiverem definidos como True no pedido de entrada, o resultado terá visualizations e attributions. São explicados mais detalhes sobre estes parâmetros na tabela seguinte. As visualizações e as atribuições são geradas numa classe que tem a classificação de probabilidade mais alta.

Chave de saída Description
visualizations Imagem única no formato de cadeia base64 com o tipo
Optional, String
attributions matriz multidimensional com pontuações de atribuição em termos de pixels de 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]]]
    }
]

Classificação de imagens com várias etiquetas

A única diferença no esquema de saída da classificação de várias etiquetas em comparação com a classificação de várias classes é 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 imagem base64 e attributions é a lista de classificações de atribuição em cada classe selecionada com base na (a confidence_score_threshold_multilabel predefinição é 0,5).

Se model_explainability, visualizations, attributions estiverem definidos como True no pedido de entrada, o resultado terá visualizations e attributions. São explicados mais detalhes sobre estes parâmetros na tabela seguinte. As visualizações e atribuições são geradas em todas as classes que têm a classificação de probabilidade maior ou igual a confidence_score_threshold_multilabel.

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

Aviso

Ao gerar explicações no ponto final online, certifique-se de que seleciona apenas algumas classes com base na classificação de confiança para evitar problemas de tempo limite no ponto final ou utilizar o ponto final com o tipo de instância de GPU. Para gerar explicações para um grande número de classes na classificação de várias etiquetas, veja bloco de notas de classificaçã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

O XAI não é suportado. Assim, só são devolvidas pontuações. Para obter o exemplo de classificação, veja a secção de classificação online.

Segmentação de instâncias

Aviso

O XAI não é suportado. Assim, só são devolvidas pontuações. Para obter o exemplo de classificação, veja a secção de classificação online.

Nota

As imagens utilizadas neste artigo são do conjunto de dados Objetos de Frigorífico, copyright © Microsoft Corporation e disponíveis em computervision-recipes/01_training_introduction.ipynb ao abrigo da Licença do MIT.

Passos seguintes