Esquemas de dados para treinar modelos de visão computacional com aprendizado de máquina automatizado (v1)
APLICA-SE A: Python SDK azureml v1
Importante
Alguns dos comandos da CLI do Azure neste artigo usam a extensão , ou v1, para o azure-cli-ml
Azure Machine Learning. O suporte para a extensão v1 terminará em 30 de setembro de 2025. Você poderá instalar e usar a extensão v1 até essa data.
Recomendamos que você faça a transição para a ml
extensão , ou v2, antes de 30 de setembro de 2025. Para obter mais informações sobre a extensão v2, consulte Extensão CLI do Azure ML e Python SDK v2.
Importante
Esta funcionalidade está atualmente em pré-visualização pública. Esta versão de pré-visualização é fornecida 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.
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":"AmlDatastore://data_directory/../Image_name.image_format",
"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 LearningRequired, String |
"AmlDatastore://data_directory/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 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 imagemOptional, String or Positive Integer |
"400px" or 400 |
height |
Altura da imagemOptional, String or Positive Integer |
"200px" or 200 |
label |
Classe/rótulo da imagemRequired, String |
"cat" |
Exemplo de um arquivo JSONL para classificação de imagem multiclasse:
{"image_url": "AmlDatastore://image_data/Image_01.jpg", "image_details":{"format": "jpg", "width": "400px", "height": "258px"}, "label": "can"}
{"image_url": "AmlDatastore://image_data/Image_02.jpg", "image_details": {"format": "jpg", "width": "397px", "height": "296px"}, "label": "milk_bottle"}
.
.
.
{"image_url": "AmlDatastore://image_data/Image_n.jpg", "image_details": {"format": "jpg", "width": "1024px", "height": "768px"}, "label": "water_bottle"}
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":"AmlDatastore://data_directory/../Image_name.image_format",
"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 LearningRequired, String |
"AmlDatastore://data_directory/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 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 imagemOptional, String or Positive Integer |
"400px" or 400 |
height |
Altura da imagemOptional, String or Positive Integer |
"200px" or 200 |
label |
Lista de classes/rótulos na imagemRequired, List of Strings |
["cat","dog"] |
Exemplo de um arquivo JSONL para classificação de imagem Multi-label:
{"image_url": "AmlDatastore://image_data/Image_01.jpg", "image_details":{"format": "jpg", "width": "400px", "height": "258px"}, "label": ["can"]}
{"image_url": "AmlDatastore://image_data/Image_02.jpg", "image_details": {"format": "jpg", "width": "397px", "height": "296px"}, "label": ["can","milk_bottle"]}
.
.
.
{"image_url": "AmlDatastore://image_data/Image_n.jpg", "image_details": {"format": "jpg", "width": "1024px", "height": "768px"}, "label": ["carton","milk_bottle","water_bottle"]}
Deteção de objetos
A seguir está um exemplo de arquivo JSONL para deteção de objetos.
{
"image_url":"AmlDatastore://data_directory/../Image_name.image_format",
"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
= coordenada y do canto superior esquerdo da caixa delimitadoraxmax
= coordenada x do canto inferior direito da caixa delimitadoraymax
= 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 LearningRequired, String |
"AmlDatastore://data_directory/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 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 imagemOptional, String or Positive Integer |
"499px" or 499 |
height |
Altura da imagemOptional, 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 direitaRequired, 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 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 da coordenada y do canto superior esquerdo da caixa delimitadora e da 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 da coordenada y 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á 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": "AmlDatastore://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": "AmlDatastore://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": "AmlDatastore://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, o ML automatizado suporta apenas polígonos como entrada e saída, sem máscaras.
A seguir está um exemplo de arquivo JSONL para segmentação de exemplo.
{
"image_url":"AmlDatastore://data_directory/../Image_name.image_format",
"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 LearningRequired, String |
"AmlDatastore://data_directory/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 (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áscaraRequired, String |
"cat" |
isCrowd |
Indica se a máscara está ao redor da multidão de objetosOptional, Bool |
0 |
polygon |
Coordenadas de polígono 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 arquivo JSONL para segmentação de instância:
{"image_url": "AmlDatastore://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": "AmlDatastore://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": "AmlDatastore://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 ]]}]}
Formato dos dados para inferência
Nesta seção, documentamos o formato de dados de entrada necessário para fazer previsões ao usar um modelo implantado. Qualquer formato de imagem acima mencionado é aceito com o tipo application/octet-stream
de conteúdo.
Formato de entrada
A seguir está o formato de entrada necessário para gerar previsões em qualquer tarefa usando o ponto de extremidade do modelo específico da tarefa. Depois de implantar o modelo, podemos usar o trecho de código a seguir para obter previsões para todas as tarefas.
# input image for inference
sample_image = './test_image.jpg'
# load image data
data = open(sample_image, 'rb').read()
# set the content type
headers = {'Content-Type': 'application/octet-stream'}
# if authentication is enabled, set the authorization header
headers['Authorization'] = f'Bearer {key}'
# make the request and display the response
response = requests.post(scoring_uri, data, headers=headers)
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.
Classificação de imagens
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.
{
"filename":"/tmp/tmppjr4et28",
"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.
{
"filename":"/tmp/tmpsdzxlmlm",
"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.
{
"filename":"/tmp/tmpdkg2wkdy",
"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.
{
"filename":"/tmp/tmpi8604s0h",
"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
]
]
}
]
}
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.