Schemi di dati per eseguire il training di modelli di visione artificiale con Machine Learning automatizzato

SI APPLICA A:Estensione ML dell'interfaccia della riga di comando di Azure v2 (corrente)Python SDK azure-ai-ml v2 (corrente)

Informazioni su come formattare i file JSONL per l'utilizzo dei dati in esperimenti di Machine Learning automatizzati per le attività di visione artificiale durante il training e l'inferenza.

Schema dei dati per il training

AutoML di Azure Machine Learning per le immagini richiede che i dati dell'immagine di input siano preparati in formato JSONL (righe JSON). In questa sezione vengono descritti i formati di dati di input o lo schema per la classificazione di immagini multiclasse, la classificazione di immagini multi-etichetta, il rilevamento degli oggetti e la segmentazione dell'istanza. Verrà inoltre fornito un esempio di file JSON Lines di training o convalida finale.

Classificazione delle immagini (binary/multiclasse)

Formato/schema di dati di input in ogni riga 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",
}
Chiave Descrizione Esempio
image_url Percorso dell'immagine nell'archivio dati di Azure Machine Learning.
my-subscription-id deve essere sostituito dalla sottoscrizione di Azure in cui si trovano le immagini. Altre informazioni sulle sottoscrizioni di Azure sono disponibili qui. Analogamentemy-resource-group, , my-datastore my-workspacedeve essere sostituito rispettivamente dal nome del gruppo di risorse, dal nome dell'area di lavoro e dal nome dell'archivio dati.
path_to_image deve essere il percorso completo dell'immagine nell'archivio dati.
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 Dettagli immagine
Optional, Dictionary
"image_details":{"format": "jpg", "width": "400px", "height": "258px"}
format Tipo di immagine (sono supportati tutti i formati di immagine disponibili nella libreria 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 Larghezza dell'immagine
Optional, String or Positive Integer
"400px" or 400
height Altezza dell'immagine
Optional, String or Positive Integer
"200px" or 200
label Classe/etichetta dell'immagine
Required, String
"cat"

Esempio di file JSONL per la classificazione di immagini multiclasse:

{"image_url": "azureml://subscriptions/my-subscription-id/resourcegroups/my-resource-group/workspaces/my-workspace/datastores/my-datastore/paths/image_data/Image_01.jpg", "image_details":{"format": "jpg", "width": "400px", "height": "258px"}, "label": "can"}
{"image_url": "azureml://subscriptions/my-subscription-id/resourcegroups/my-resource-group/workspaces/my-workspace/datastores/my-datastore/paths/image_data/Image_02.jpg", "image_details": {"format": "jpg", "width": "397px", "height": "296px"}, "label": "milk_bottle"}
.
.
.
{"image_url": "azureml://subscriptions/my-subscription-id/resourcegroups/my-resource-group/workspaces/my-workspace/datastores/my-datastore/paths/image_data/Image_n.jpg", "image_details": {"format": "jpg", "width": "1024px", "height": "768px"}, "label": "water_bottle"}

Esempio di immagine per la classificazione delle immagini multiclasse.

Classificazione delle immagini con più etichette

Di seguito è riportato un esempio di formato/schema di dati di input in ogni riga JSON per la classificazione delle immagini.

{
   "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"
        
   ]
}
Chiave Descrizione Esempio
image_url Percorso dell'immagine nell'archivio dati di Azure Machine Learning.
my-subscription-id deve essere sostituito dalla sottoscrizione di Azure in cui si trovano le immagini. Altre informazioni sulle sottoscrizioni di Azure sono disponibili qui. Analogamentemy-resource-group, , my-datastore my-workspacedeve essere sostituito rispettivamente dal nome del gruppo di risorse, dal nome dell'area di lavoro e dal nome dell'archivio dati.
path_to_image deve essere il percorso completo dell'immagine nell'archivio dati.
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 Dettagli immagine
Optional, Dictionary
"image_details":{"format": "jpg", "width": "400px", "height": "258px"}
format Tipo di immagine (sono supportati tutti i formati di immagine disponibili nella libreria 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 Larghezza dell'immagine
Optional, String or Positive Integer
"400px" or 400
height Altezza dell'immagine
Optional, String or Positive Integer
"200px" or 200
label Elenco di classi/etichette nell'immagine
Required, List of Strings
["cat","dog"]

Esempio di file JSONL per Classificazione immagini con più etichette:

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

Esempio di immagine per la classificazione di immagini con più etichette.

Rilevamento oggetti

Di seguito è riportato un file JSONL di esempio per il rilevamento degli oggetti.

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

Qui

  • xmin = x coordinata dell'angolo superiore sinistro del rettangolo di selezione
  • ymin = coordinata y dell'angolo superiore sinistro del rettangolo di selezione
  • xmax = x coordinata dell'angolo inferiore destro del rettangolo di selezione
  • ymax = coordinata y dell'angolo inferiore destro del rettangolo di selezione
Chiave Descrizione Esempio
image_url Percorso dell'immagine nell'archivio dati di Azure Machine Learning.
my-subscription-id deve essere sostituito dalla sottoscrizione di Azure in cui si trovano le immagini. Altre informazioni sulle sottoscrizioni di Azure sono disponibili qui. Analogamentemy-resource-group, , my-datastore my-workspacedeve essere sostituito rispettivamente dal nome del gruppo di risorse, dal nome dell'area di lavoro e dal nome dell'archivio dati.
path_to_image deve essere il percorso completo dell'immagine nell'archivio dati.
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 Dettagli immagine
Optional, Dictionary
"image_details":{"format": "jpg", "width": "400px", "height": "258px"}
format Tipo di immagine (sono supportati tutti i formati immagine disponibili nella libreria Pillow . Ma per YOLO sono supportati solo i formati di immagine consentiti da opencv )
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 Larghezza dell'immagine
Optional, String or Positive Integer
"499px" or 499
height Altezza dell'immagine
Optional, String or Positive Integer
"665px" or 665
label (chiave esterna) Elenco di rettangoli delimitatori, dove ogni casella è un dizionario delle label, topX, topY, bottomX, bottomY, isCrowd rispettive coordinate in alto a sinistra e in basso a destra
Required, List of dictionaries
[{"label": "cat", "topX": 0.260, "topY": 0.406, "bottomX": 0.735, "bottomY": 0.701, "isCrowd": 0}]
label (chiave interna) Classe/etichetta dell'oggetto nel rettangolo di selezione
Required, String
"cat"
topX Rapporto di x coordinate dell'angolo superiore sinistro del rettangolo di selezione e larghezza dell'immagine
Required, Float in the range [0,1]
0.260
topY Rapporto della coordinata y dell'angolo superiore sinistro del rettangolo di selezione e dell'altezza dell'immagine
Required, Float in the range [0,1]
0.406
bottomX Rapporto delle coordinate x dell'angolo inferiore destro del rettangolo di selezione e larghezza dell'immagine
Required, Float in the range [0,1]
0.735
bottomY Rapporto di coordinata y dell'angolo inferiore destro del rettangolo di selezione e altezza dell'immagine
Required, Float in the range [0,1]
0.701
isCrowd Indica se il rettangolo di selezione è intorno alla folla di oggetti. Se questo flag speciale è impostato, ignorare questo particolare rettangolo di selezione quando si calcola la metrica.
Optional, Bool
0

Esempio di file JSONL per il rilevamento degli oggetti:

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

Esempio di immagine per il rilevamento degli oggetti.

Segmentazione istanza

Ad esempio, machine learning automatizzato supporta solo il poligono come input e output, senza maschere.

Di seguito è riportato un file JSONL di esempio, ad esempio la segmentazione.

{
   "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"]]
      }
   ]
}
Chiave Descrizione Esempio
image_url Percorso dell'immagine nell'archivio dati di Azure Machine Learning.
my-subscription-id deve essere sostituito dalla sottoscrizione di Azure in cui si trovano le immagini. Altre informazioni sulle sottoscrizioni di Azure sono disponibili qui. Analogamentemy-resource-group, , my-datastore my-workspacedeve essere sostituito rispettivamente dal nome del gruppo di risorse, dal nome dell'area di lavoro e dal nome dell'archivio dati.
path_to_image deve essere il percorso completo dell'immagine nell'archivio dati.
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 Dettagli immagine
Optional, Dictionary
"image_details":{"format": "jpg", "width": "400px", "height": "258px"}
format Tipo di immagine
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 Larghezza dell'immagine
Optional, String or Positive Integer
"499px" or 499
height Altezza dell'immagine
Optional, String or Positive Integer
"665px" or 665
label (chiave esterna) Elenco di maschere, dove ogni maschera è un dizionario di 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 (chiave interna) Classe/etichetta dell'oggetto nella maschera
Required, String
"cat"
isCrowd Indica se la maschera è intorno alla folla di oggetti
Optional, Bool
0
polygon Coordinate poligono per l'oggetto
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]]

Esempio di un file JSONL per la segmentazione dell'istanza:

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

Esempio di immagine per la segmentazione dell'istanza.

Schema dei dati per l'assegnazione dei punteggi online

In questa sezione viene illustrato il formato dei dati di input necessario per eseguire stime usando un modello distribuito.

Formato di input

Il codice JSON seguente è il formato di input necessario per generare stime su qualsiasi attività usando un endpoint del modello specifico dell'attività.

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

Questo json è un dizionario con chiave input_data esterna e chiavi columnsinterne, data come descritto nella tabella seguente. L'endpoint accetta una stringa JSON nel formato precedente e la converte in un dataframe di esempi richiesti dallo script di assegnazione dei punteggi. Ogni immagine di input nella request_json["input_data"]["data"] sezione del json è una stringa con codifica Base64.

Chiave Descrizione
input_data
(chiave esterna)
Si tratta di una chiave esterna nella richiesta JSON. input_data è un dizionario che accetta esempi di immagini di input
Required, Dictionary
columns
(chiave interna)
Nomi di colonna da usare per creare il dataframe. Accetta solo una colonna con image come nome di colonna.
Required, List
data
(chiave interna)
Elenco di immagini con codifica Base64
Required, List

Dopo aver distribuito il modello mlflow, è possibile usare il frammento di codice seguente per ottenere stime per tutte le attività.

# 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 di output

Le stime effettuate sugli endpoint del modello seguono una struttura diversa a seconda del tipo di attività. In questa sezione vengono esaminati i formati di dati di output per attività di segmentazione di immagini multiclasse, classificazione di immagini con più etichette, rilevamento oggetti e segmentazione dell'istanza.

Gli schemi seguenti sono applicabili quando la richiesta di input contiene un'immagine.

Classificazione delle immagini (binary/multiclasse)

L'endpoint per la classificazione delle immagini restituisce tutte le etichette nel set di dati e i relativi punteggi di probabilità per l'immagine di input nel formato seguente. visualizations e attributions sono correlati alla spiegazione e quando la richiesta è solo per l'assegnazione dei punteggi, queste chiavi non verranno incluse nell'output. Per altre informazioni sull'input di spiegazione e sullo schema di output per la classificazione delle immagini, vedere la sezione spiegabilità per la classificazione delle immagini.

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

Classificazione delle immagini con più etichette

Per la classificazione delle immagini con più etichette, l'endpoint del modello restituisce le etichette e le relative probabilità. visualizations e attributions sono correlati alla spiegazione e quando la richiesta è solo per l'assegnazione dei punteggi, queste chiavi non verranno incluse nell'output. Per altre informazioni sull'input di spiegazione e sullo schema di output per la classificazione con più etichette, vedere la sezione spiegabilità per la classificazione di immagini con più etichette.

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

Rilevamento oggetti

Il modello di rilevamento oggetti restituisce più caselle con le coordinate in alto a sinistra e in basso a destra insieme all'etichetta della casella e al punteggio di attendibilità.

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

Segmentazione istanza

Nella segmentazione dell'istanza, l'output è costituito da più caselle con le relative coordinate in alto a sinistra e in basso a destra, etichette, punteggi di attendibilità e poligoni (non maschere). In questo caso, i valori del poligono si trovano nello stesso formato illustrato nella sezione schema.

[
    {
       "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 dei dati per l'assegnazione dei punteggi e la spiegazione online (XAI)

Importante

Queste impostazioni sono attualmente disponibili in anteprima pubblica. Vengono fornite senza un contratto di servizio. Alcune funzionalità potrebbero non essere supportate o potrebbero presentare funzionalità limitate. Per altre informazioni, vedere le Condizioni supplementari per l'uso delle anteprime di Microsoft Azure.

Avviso

La spiegazione è supportata solo per la classificazione multiclasse e la classificazione con più etichette. Durante la generazione di spiegazioni sull'endpoint online, se si verificano problemi di timeout, usare il notebook di assegnazione dei punteggi batch (SDK v1) per generare spiegazioni.

In questa sezione viene illustrato il formato dei dati di input necessario per eseguire stime e generare spiegazioni per la classe o le classi stimate usando un modello distribuito. Non è necessaria una distribuzione separata per la spiegazione. Lo stesso endpoint per l'assegnazione dei punteggi online può essere utilizzato per generare spiegazioni. È sufficiente passare alcuni parametri aggiuntivi correlati alla spiegazione nello schema di input e ottenere visualizzazioni di spiegazioni e/o matrici di punteggio di attribuzione (spiegazioni a livello di pixel).

Metodi di spiegazione supportati:

Formato di input (XAI)

I formati di input seguenti sono supportati per generare stime e spiegazioni su qualsiasi attività di classificazione usando l'endpoint del modello specifico dell'attività. Dopo aver distribuito il modello, è possibile usare lo schema seguente per ottenere stime e spiegazioni.

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

Insieme all'immagine, sono necessari due parametri aggiuntivi (model_explainability e xai_parameters) nello schema di input per generare spiegazioni.

Chiave Descrizione Valore predefinito
image_base64 immagine di input in formato Base64
Required, String
-
model_explainability Se generare spiegazioni o semplicemente l'assegnazione dei punteggi
Optional, Bool
False
xai_parameters Se model_explainability è True, xai_parameters è un dizionario contenente parametri correlati all'algoritmo di spiegazione con xai_algorithm, visualizations, attributions le chiavi ask.
Optional, Dictionary
Se xai_parameters non viene passato, l'algoritmo xrai di spiegazione viene usato con il valore predefinito
{"xai_algorithm": "xrai", "visualizations": True, "attributions": False}
xai_algorithm Nome dell'algoritmo Spiegabilità da usare. Gli algoritmi XAI supportati sono {xrai, integrated_gradients, guided_gradcam, guided_backprop}
Optional, String
xrai
visualizations Indica se restituire visualizzazioni di spiegazioni.
Optional, Bool
True
attributions Indica se restituire le attribuzioni di funzionalità.
Optional, Bool
False
confidence_score_threshold_multilabel Soglia del punteggio di attendibilità per selezionare le classi principali per generare spiegazioni nella classificazione con più etichette.
Optional, Float
0.5

La tabella seguente descrive gli schemi supportati per la spiegazione.

Type Schema
Inferenza su singola immagine in formato Base64 Il dizionario con image_base64 come chiave e valore è un'immagine con codifica Base64,
model_explainability key con True o False e xai_parameters dizionario con parametri specifici dell'algoritmo XAI
Required, Json String
Works for one or more images

Ogni immagine di input in request_json, definita nel codice seguente, è una stringa con codifica Base64 aggiunta all'elenco 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 di output (XAI)

Le stime eseguite sugli endpoint del modello seguono uno schema diverso a seconda del tipo di attività. In questa sezione vengono descritti i formati di dati di output per le attività di classificazione di immagini multiclasse con più etichette.

Gli schemi seguenti vengono definiti per il caso di due immagini di input.

Classificazione delle immagini (binary/multiclasse)

Lo schema di output è uguale a quello descritto in precedenza , ad eccezione del fatto che visualizations e attributions i valori delle chiavi sono inclusi, se queste chiavi sono state impostate True su nella richiesta.

Se model_explainability, visualizations, attributions sono impostati su True nella richiesta di input, l'output avrà visualizations e attributions. Per altre informazioni su questi parametri, vedere la tabella seguente. Le visualizzazioni e le attribuzioni vengono generate in base a una classe con il punteggio di probabilità più alto.

Chiave di output Descrizione
visualizations Singola immagine in formato stringa base64 con tipo
Optional, String
attributions matrice multidimensionale con punteggi di attribuzione per pixel della 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]]]
    }
]

Classificazione delle immagini con più etichette

L'unica differenza nello schema di output della classificazione con più etichette rispetto alla classificazione multiclasse è che in ogni immagine possono essere presenti più classi per cui è possibile generare spiegazioni. Quindi, visualizations è l'elenco delle stringhe di immagine base64 ed attributions è l'elenco dei punteggi di attribuzione per ogni classe selezionata in base a confidence_score_threshold_multilabel (il valore predefinito è 0,5).

Se model_explainability, visualizations, attributions sono impostati su True nella richiesta di input, l'output avrà visualizations e attributions. Per altre informazioni su questi parametri, vedere la tabella seguente. Le visualizzazioni e le attribuzioni vengono generate su tutte le classi con il punteggio di probabilità maggiore o uguale a confidence_score_threshold_multilabel.

Chiave di output Descrizione
visualizations Elenco di immagini in formato stringa base64 con tipo
Optional, String
attributions Elenco di matrici multidimensionali con punteggi di attribuzione in pixel per ogni classe, in cui ogni matrice multidimensionale è di forma [3, valid_crop_size, valid_crop_size]
Optional, List

Avviso

Durante la generazione di spiegazioni sull'endpoint online, assicurarsi di selezionare solo poche classi in base al punteggio di attendibilità per evitare problemi di timeout nell'endpoint o usare l'endpoint con il tipo di istanza GPU. Per generare spiegazioni per un numero elevato di classi nella classificazione con più etichette, vedere notebook di assegnazione dei punteggi batch (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]]],
                        .
                        .
                        .
                       ]
    }
]

Rilevamento oggetti

Avviso

XAI non è supportato. Vengono quindi restituiti solo i punteggi. Per un esempio di punteggio, vedere la sezione assegnazione dei punteggi online.

Segmentazione istanza

Avviso

XAI non è supportato. Vengono quindi restituiti solo i punteggi. Per un esempio di punteggio, vedere la sezione assegnazione dei punteggi online.

Nota

Le immagini usate in questo articolo provengono dal set di dati Refrigerator Objects, copyright © Microsoft Corporation e disponibili in computervision-recipes/01_training_introduction.ipynb con la licenza MIT.

Passaggi successivi