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-workspace my-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 imagemOptional, 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 imagemOptional, String or Positive Integer |
"400px" or 400 |
height |
Altura da imagemOptional, String or Positive Integer |
"200px" or 200 |
label |
Classe/etiqueta da imagemRequired, 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"}
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-workspace my-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 imagemOptional, 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 imagemOptional, String or Positive Integer |
"400px" or 400 |
height |
Altura da imagemOptional, String or Positive Integer |
"200px" or 200 |
label |
Lista de classes/etiquetas na imagemRequired, 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"]}
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 delimitadoraymin
= y coordenada do canto superior esquerdo da caixa delimitadoraxmax
= coordenada x do canto inferior direito da caixa delimitadoraymax
= 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-workspace my-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 imagemOptional, 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 imagemOptional, String or Positive Integer |
"499px" or 499 |
height |
Altura da imagemOptional, 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 direitaRequired, 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 delimitadoraRequired, String |
"cat" |
topX |
Proporção de x coordenada do canto superior esquerdo da caixa delimitadora e largura da imagemRequired, Float in the range [0,1] |
0.260 |
topY |
Proporção de y coordenada do canto superior esquerdo da caixa delimitadora e altura da imagemRequired, Float in the range [0,1] |
0.406 |
bottomX |
Proporção de x coordenada do canto inferior direito da caixa delimitadora e largura da imagemRequired, Float in the range [0,1] |
0.735 |
bottomY |
Proporção de y coordenada do canto inferior direito da caixa delimitadora e altura da imagemRequired, 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}]}
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-workspace my-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 imagemOptional, Dictionary |
"image_details":{"format": "jpg", "width": "400px", "height": "258px"} |
format |
Tipo de imagemOptional, 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 imagemOptional, String or Positive Integer |
"499px" or 499 |
height |
Altura da imagemOptional, 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áscaraRequired, String |
"cat" |
isCrowd |
Indica se a máscara está à volta da multidão de objetosOptional, Bool |
0 |
polygon |
Coordenadas de polígonos para o 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]] |
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 ]]}]}
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 columns
internas, 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 entradaRequired, 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 base64Required, 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:
- XRAI (xrai)
- Gradações Integradas (integrated_gradients)
- GradCAM Guiado (guided_gradcam)
- BackPropagation Guiado (guided_backprop)
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 base64Required, String |
- |
model_explainability |
Quer gerar explicações ou apenas a classificaçãoOptional, 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 XAIRequired, 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 tipoOptional, 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 tipoOptional, 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.