Compartilhar via


Esquemas de dados para treinar modelos de pesquisa visual computacional com machine learning automatizado (v1)

APLICA-SE A: SDK azureml para Pythonv1

Importante

Alguns comandos da CLI do Azure neste artigo usam a extensão azure-cli-ml ou v1 do Azure Machine Learning. O suporte à 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 extensão ml ou v2, antes de 30 de setembro de 2025. Para obter mais informações sobre a extensão v2, confira Extensão da CLI do Azure ML e SDK do Python v2.

Importante

Esse recurso está atualmente em visualização pública. Essa versão prévia é fornecida sem um contrato de nível de serviço. Alguns recursos podem não ter suporte ou podem ter restrição de recursos. Para obter mais informações, consulte Termos de Uso Complementares de Versões Prévias do Microsoft Azure.

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

Esquema de dados para treinamento

O Azure Machine Learning AutoML para imagens requer que os dados de imagem de entrada sejam preparados no formato JSONL (JSON Lines). Esta seção descreve os formatos de dados de entrada ou o esquema para classificação de imagem de várias classes, classificação de imagem de vários rótulos, detecção de objetos e segmentação de instância. Também incluímos um exemplo de arquivo JSON Lines de validação ou treinamento final.

Classificação de imagem (binário/várias classes)

Formato/esquema de dados de entrada em cada JSON Line:

{
   "image_url":"AmlDatastore://data_directory/../Image_name.image_format",
   "image_details":{
      "format":"image_format",
      "width":"image_width",
      "height":"image_height"
   },
   "label":"class_name",
}
Chave Descrição Exemplo
image_url Local da imagem no armazenamento de dados do Azure Machine Learning
Required, String
"AmlDatastore://data_directory/Image_01.jpg"
image_details Detalhes da imagem
Optional, Dictionary
"image_details":{"format": "jpg", "width": "400px", "height": "258px"}
format Tipo de imagem (há suporte para todos os formatos de imagem disponíveis na biblioteca Pillow)
Optional, String from {"jpg", "jpeg", "png", "jpe", "jfif","bmp", "tif", "tiff"}
"jpg" or "jpeg" or "png" or "jpe" or "jfif" or "bmp" or "tif" or "tiff"
width A largura da imagem
Optional, String or Positive Integer
"400px" or 400
height A altura da imagem
Optional, String or Positive Integer
"200px" or 200
label A classe/rótulo da imagem
Required, String
"cat"

Exemplo de um arquivo JSONL para classificação de imagem de várias classes:

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

Exemplo de imagem para classificação de imagem de várias classes.

Classificação de imagem de vários rótulos

Veja a seguir um exemplo de formato/esquema de dados de entrada em cada JSON Line para classificação de imagem.

{
   "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 Descrição Exemplo
image_url Local da imagem no armazenamento de dados do Azure Machine Learning
Required, String
"AmlDatastore://data_directory/Image_01.jpg"
image_details Detalhes da imagem
Optional, Dictionary
"image_details":{"format": "jpg", "width": "400px", "height": "258px"}
format Tipo de imagem (há suporte para todos os formatos de imagem disponíveis na biblioteca Pillow)
Optional, String from {"jpg", "jpeg", "png", "jpe", "jfif", "bmp", "tif", "tiff"}
"jpg" or "jpeg" or "png" or "jpe" or "jfif" or "bmp" or "tif" or "tiff"
width A largura da imagem
Optional, String or Positive Integer
"400px" or 400
height A 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 de vários rótulos:

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

Exemplo de imagem para classificação de imagem com vários rótulos.

Detecção de objetos

Veja a seguir um exemplo de arquivo JSONL para detecçã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 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 Descrição Exemplo
image_url Local da imagem no armazenamento de dados do Azure Machine Learning
Required, String
"AmlDatastore://data_directory/Image_01.jpg"
image_details Detalhes da imagem
Optional, Dictionary
"image_details":{"format": "jpg", "width": "400px", "height": "258px"}
format Tipo de imagem (há suporte para todos os formatos de imagem disponíveis na biblioteca Pillow. Mas para YOLO somente os formatos de imagem permitidos pelo opencv têm suporte)
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 A largura da imagem
Optional, String or Positive Integer
"499px" or 499
height A altura da imagem
Optional, String or Positive Integer
"665px" or 665
label (chave externa) Lista de caixas delimitadoras, em que cada caixa é um dicionário das coordenadas superior esquerda e inferior direita label, topX, topY, bottomX, bottomY, isCrowd
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 Razão entre a coordenada X do canto superior esquerdo da caixa delimitadora e a largura da imagem
Required, Float in the range [0,1]
0.260
topY Razão entre a coordenada Y do canto superior esquerdo da caixa delimitadora e a altura da imagem
Required, Float in the range [0,1]
0.406
bottomX Razão entre a coordenada X do canto inferior direito da caixa delimitadora e a largura da imagem
Required, Float in the range [0,1]
0.735
bottomY Razão entre a coordenada Y do canto inferior direito da caixa delimitadora e a altura da imagem
Required, Float in the range [0,1]
0.701
isCrowd Indica se a caixa delimitadora está em volta do grupo de objetos. Se esse sinalizador especial estiver definido, ignoraremos essa caixa delimitadora ao calcular a métrica.
Optional, Bool
0

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

Exemplo de imagem para detecção de objeto.

Segmentação de instâncias

Para a segmentação de instância, o ML automatizado dá suporte apenas para polígono como entrada e saída, sem máscaras.

Este é um arquivo JSONL de exemplo para segmentação de instâncias.

{
   "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 Descrição Exemplo
image_url Local da imagem no armazenamento de dados do Azure Machine Learning
Required, String
"AmlDatastore://data_directory/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 A largura da imagem
Optional, String or Positive Integer
"499px" or 499
height A altura da imagem
Optional, String or Positive Integer
"665px" or 665
label (chave 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 (chave interna) Classe/rótulo do objeto na máscara
Required, String
"cat"
isCrowd Indica se a máscara está em volta do grupo de objetos
Optional, Bool
0
polygon Coordenadas de polígono do 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âncias:

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

Exemplo de imagem para segmentação de instância.

Formato de 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 mencionado anteriormente é aceito com o tipo de conteúdo application/octet-stream.

Formato de entrada

Este é o formato de entrada necessário para gerar previsões em qualquer tarefa usando o ponto de extremidade de modelo específico da tarefa. Depois de implantar o modelo, podemos usar o seguinte snippet de código para gerar 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 da saída

As previsões feitas em pontos de extremidade de modelo seguem uma estrutura diferente, dependendo do tipo de tarefa. Esta seção explora os formatos de dados de saída para classificação de imagem com várias classes e vários rótulos, detecção de objetos e segmentação de instâncias.

Classificação de imagens

O ponto de extremidade para classificação de imagem retorna todos os rótulos no conjunto de dados e as respectivas 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 de vários rótulos

Para classificação de imagem com vários rótulos, o ponto de extremidade de modelo retorna rótulos e as respectivas probabilidades.

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

Detecção de objetos

O modelo de detecção de objetos retorna várias caixas com as coordenadas superior esquerda e inferior direita em escala, 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 as coordenadas superior esquerda e inferior direita em escala, 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
            ]
         ]
      }
   ]
}

Observação

As imagens usadas neste artigo são do grupo de dados Objects, direitos autorais © Microsoft Corporation e estão disponíveis em computervision-recipes/01_training_introduction.ipynb na Licença MIT.

Próximas etapas