Schémas de données pour former des modèles de vision par ordinateur avec Machine Learning automatisé
S’APPLIQUE À :Extension Azure CLI v2 (actuelle)Kit de développement logiciel (SDK) Python azure-ai-ml v2 (version actuelle)
Découvrez comment mettre en forme vos fichiers JSONL pour la consommation des données dans des expériences de ML automatisées pour les tâches de vision par ordinateur pendant l’apprentissage et l’inférence.
Schéma de données pour l’apprentissage
Azure Machine Learning AutoML pour les images requiert la préparation des données d’image d’entrée au format JSON (Lignes JSON). Cette section décrit les formats de données d’entrée ou le schéma pour la classification d’images multiclasse, la classification d’images multi-étiquette, la détection d’objets et la segmentation d’instance. Nous fournirons également un exemple de fichier de lignes JSON d’apprentissage ou de validation final.
Classification d’images (binaire/multiclasse)
Format/schéma des données d’entrée dans chaque ligne 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",
}
Clé | Description | Exemple |
---|---|---|
image_url |
Emplacement d’image dans le magasin de données Azure Machine Learning. my-subscription-id doit être remplacé par l’abonnement Azure où se trouvent les images. Vous trouverez plus d’informations sur les abonnement Azure ici. De même, my-resource-group , my-workspace , my-datastore devraient être remplacés respectivement par le nom du groupe de ressources, le nom de l’espace de travail et le nom du magasin de données. path_to_image devrait être le chemin d’accès complet à l’image sur le magasin de données.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 |
Détails d’imageOptional, Dictionary |
"image_details":{"format": "jpg", "width": "400px", "height": "258px"} |
format |
Type d’image (tous les formats d’images disponibles dans la bibliothèque Pillow sont pris en charge)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 |
Largeur de l'imageOptional, String or Positive Integer |
"400px" or 400 |
height |
Hauteur de l’imageOptional, String or Positive Integer |
"200px" or 200 |
label |
Classe/étiquette de l’imageRequired, String |
"cat" |
Exemple de fichier JSON pour la classification d’images 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"}
Classification d’images multi-étiquette
Voici un exemple de format/schéma de données d’entrée dans chaque ligne JSON pour la classification d’images.
{
"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"
]
}
Clé | Description | Exemple |
---|---|---|
image_url |
Emplacement d’image dans le magasin de données Azure Machine Learning. my-subscription-id doit être remplacé par l’abonnement Azure où se trouvent les images. Vous trouverez plus d’informations sur les abonnement Azure ici. De même, my-resource-group , my-workspace , my-datastore devraient être remplacés respectivement par le nom du groupe de ressources, le nom de l’espace de travail et le nom du magasin de données. path_to_image devrait être le chemin d’accès complet à l’image sur le magasin de données.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 |
Détails d’imageOptional, Dictionary |
"image_details":{"format": "jpg", "width": "400px", "height": "258px"} |
format |
Type d’image (tous les formats d’images disponibles dans la bibliothèque Pillow sont pris en charge)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 |
Largeur de l'imageOptional, String or Positive Integer |
"400px" or 400 |
height |
Hauteur de l’imageOptional, String or Positive Integer |
"200px" or 200 |
label |
Liste des classes/étiquettes dans l’imageRequired, List of Strings |
["cat","dog"] |
Exemple de fichier JSON pour la classification d’images multi-étiquette :
{"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"]}
Détection d’objets
Voici un exemple de fichier JSONL pour la détection d’objets.
{
"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"
},
"..."
]
}
Ici,
xmin
= coordonnée x de l’angle supérieur gauche du cadre englobantymin
= coordonnée y de l’angle supérieur gauche du cadre englobantxmax
= coordonnée x de l’angle inférieur droit du cadre englobantymax
= coordonnée y de l’angle inférieur droit du cadre englobant
Clé | Description | Exemple |
---|---|---|
image_url |
Emplacement d’image dans le magasin de données Azure Machine Learning. my-subscription-id doit être remplacé par l’abonnement Azure où se trouvent les images. Vous trouverez plus d’informations sur les abonnement Azure ici. De même, my-resource-group , my-workspace , my-datastore devraient être remplacés respectivement par le nom du groupe de ressources, le nom de l’espace de travail et le nom du magasin de données. path_to_image devrait être le chemin d’accès complet à l’image sur le magasin de données.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 |
Détails d’imageOptional, Dictionary |
"image_details":{"format": "jpg", "width": "400px", "height": "258px"} |
format |
Type d’image (tous les formats d’image disponibles dans la bibliothèque Coussins sont pris en charge. Toutefois, pour YOLO, seuls les formats d’images autorisés par OpenCV sont pris en charge.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 |
Largeur de l'imageOptional, String or Positive Integer |
"499px" or 499 |
height |
Hauteur de l’imageOptional, String or Positive Integer |
"665px" or 665 |
label (clé externe) |
Liste de cadres englobante, où chaque zone est un dictionnaire de \leurs coordonnées en haut à gauche et en bas à droite 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 (clé interne) |
Classe/étiquette de l’objet dans le cadre englobantRequired, String |
"cat" |
topX |
Taux de coordonnée x du coin supérieur gauche du cadre englobant et de la largeur de l’imageRequired, Float in the range [0,1] |
0.260 |
topY |
Taux de coordonnée y du coin supérieur gauche du cadre englobant et de la hauteur de l’imageRequired, Float in the range [0,1] |
0.406 |
bottomX |
Taux de coordonnée x du coin inférieur droit du cadre englobant et de la largeur de l’imageRequired, Float in the range [0,1] |
0.735 |
bottomY |
Taux de coordonnée y du coin inférieur droit du cadre englobant et de la hauteur de l’imageRequired, Float in the range [0,1] |
0.701 |
isCrowd |
Indique si le cadre englobant est autour de la foule d’objets. Si cet indicateur spécial est défini, nous ignorons ce cadre englobant lors du calcul de la métrique.Optional, Bool |
0 |
Exemple de fichier JSON pour la détection d’objets :
{"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}]}
Segmentation d’instances
Pour la segmentation d’instances, le ML automatisé prend uniquement en charge le polygone comme entrée et sortie, sans aucun masque.
Voici un exemple de fichier JSON pour la segmentation d’instance.
{
"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"]]
}
]
}
Clé | Description | Exemple |
---|---|---|
image_url |
Emplacement d’image dans le magasin de données Azure Machine Learning. my-subscription-id doit être remplacé par l’abonnement Azure où se trouvent les images. Vous trouverez plus d’informations sur les abonnement Azure ici. De même, my-resource-group , my-workspace , my-datastore devraient être remplacés respectivement par le nom du groupe de ressources, le nom de l’espace de travail et le nom du magasin de données. path_to_image devrait être le chemin d’accès complet à l’image sur le magasin de données.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 |
Détails d’imageOptional, Dictionary |
"image_details":{"format": "jpg", "width": "400px", "height": "258px"} |
format |
Type d’imageOptional, 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 |
Largeur de l'imageOptional, String or Positive Integer |
"499px" or 499 |
height |
Hauteur de l’imageOptional, String or Positive Integer |
"665px" or 665 |
label (clé externe) |
Liste de masques, où chaque masque est un dictionnaire 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 (clé interne) |
Classe/étiquette de l’objet dans le masqueRequired, String |
"cat" |
isCrowd |
Indique si le masque est autour de la foule d’objetsOptional, Bool |
0 |
polygon |
Coordonnées de polygone pour l’objetRequired, 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]] |
Exemple de fichier JSON pour la segmentation d’instance :
{"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 ]]}]}
Schéma de données pour le scoring en ligne
Dans cette section, nous documentons le format de données d’entrée requis pour effectuer des prédictions lors de l’utilisation d’un modèle déployé.
Format d’entrée
Le format d’entrée JSON suivant est nécessaire pour générer des prédictions sur n’importe quelle tâche à l’aide d’un point de terminaison de modèle spécifique à la tâche.
{
"input_data": {
"columns": [
"image"
],
"data": [
"image_in_base64_string_format"
]
}
}
Ce json est un dictionnaire avec une clé input_data
externe et des clés columns
internes, data
comme décrit dans le tableau suivant. Le point de terminaison accepte une chaîne json au format ci-dessus et la convertit en dataframe d’exemples requis par le script de scoring. Chaque image d’entrée dans la section request_json["input_data"]["data"]
du json est une chaîne encodée en Base64.
Clé | Description |
---|---|
input_data (clé externe) |
Il s’agit d’une clé externe dans la requête json. input_data est un dictionnaire qui accepte des exemples d’images d’entrée Required, Dictionary |
columns (clé interne) |
Noms de colonnes à utiliser pour créer une dataframe. Elle n’accepte qu’une seule colonne avec image comme nom de colonne.Required, List |
data (clé interne) |
Liste des images encodées en base64 Required, List |
Après avoir déployé le modèle mlflow, nous pouvons utiliser l’extrait de code suivant pour obtenir des prédictions pour toutes les tâches.
# 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,
)
Format de sortie
Les prédictions effectuées sur les points de terminaison de modèle suivent une structure différente selon le type de tâche. Cette section explore les formats de données de sortie pour les tâches de classification d’image multiclasse et multi-étiquette, de détection d’objets et de segmentation d’instance.
Les schémas suivants s’appliquent lorsque la demande d’entrée contient une image.
Classification d’images (binaire/multiclasse)
Le point de terminaison de la classification d’image retourne toutes les étiquettes du jeu de données et leurs scores de probabilité pour l’image d’entrée au format suivant. visualizations
et attributions
sont liés à l’explication et lorsque la demande est uniquement pour le scoring, ces clés ne sont pas incluses dans la sortie. Pour plus d’informations sur le schéma d’entrée et de sortie explicabilité pour la classification d’images, consultez la section Explicabilité pour la classification d’images.
[
{
"probs": [
2.098e-06,
4.783e-08,
0.999,
8.637e-06
],
"labels": [
"can",
"carton",
"milk_bottle",
"water_bottle"
]
}
]
Classification d’images multi-étiquette
Pour la classification d’image à multi-étiquettes, le point de terminaison de modèle retourne les étiquettes et leurs probabilités. visualizations
et attributions
sont liés à l’explication et lorsque la demande est uniquement pour le scoring, ces clés ne sont pas incluses dans la sortie. Pour plus d’informations sur le schéma d’entrée et de sortie explicabilité pour la classification multi-étiquette, consultez la section Explicabilité pour la classification d’images multi-étiquettes.
[
{
"probs": [
0.997,
0.960,
0.982,
0.025
],
"labels": [
"can",
"carton",
"milk_bottle",
"water_bottle"
]
}
]
Détection d’objets
Le modèle de détection d’objets retourne plusieurs zones avec les coordonnées de l’angle supérieur gauche et de l’angle inférieur droit, ainsi que l’étiquette de zone et le score de confiance.
[
{
"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
}
]
}
]
Segmentation d’instances
Dans la segmentation de l’instance, la sortie est constituée de plusieurs zones avec les coordonnées en haut à gauche et en bas à droite, les étiquettes, les scores de confiance et les polygones (pas les masques). Ici, les valeurs de polygone sont au même format que nous avons abordé dans la section des schémas.
[
{
"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
]
]
}
]
}
]
Format de données pour le scoring et l’explicabilité en ligne (XAI)
Important
Ces paramètres sont actuellement en préversion publique. Ils sont fournis sans contrat de niveau de service. Certaines fonctionnalités peuvent être limitées ou non prises en charge. Pour plus d’informations, consultez Conditions d’Utilisation Supplémentaires relatives aux Évaluations Microsoft Azure.
Avertissement
L’explicabilité est prise en charge uniquement pour la classification multi-classe et la classification multi-étiquette. Lors de la génération d’explications sur le point de terminaison en ligne, si vous rencontrez des problèmes de délai d’expiration, utilisez le notebook de scoring par lots (kit de développement logiciel (SDK) v1) pour générer des explications.
Dans cette section, nous documentons le format des données d’entrée nécessaires pour faire des prédictions et générer des explications pour la ou les classes prédites à l’aide d'un modèle déployé. Aucun déploiement distinct n’est nécessaire pour l’explicabilité. Le même point de terminaison pour le scoring en ligne peut être utilisé pour générer des explications. Il nous suffit de passer des paramètres supplémentaires liés à l’explicabilité dans le schéma d’entrée et d’obtenir des visualisations d’explications et/ou des matrices de score d’attribution (explications au niveau des pixels).
Méthodes d’explicabilité prises en charge :
- XRAI (xrai)
- Dégradés intégrés (integrated_gradients)
- GradCAM guidé (guided_gradcam)
- BackPropagation guidée (guided_backprop)
Format d’entrée (XAI)
Les formats d’entrée suivants sont pris en charge pour générer des prédictions et des explications sur n’importe quelle tâche de classification à l’aide d’un point de terminaison de modèle spécifique à une tâche. Après avoir déployé le modèle, nous pouvons utiliser le schéma suivant pour obtenir des prédictions et des explications.
{
"input_data": {
"columns": ["image"],
"data": [json.dumps({"image_base64": "image_in_base64_string_format",
"model_explainability": True,
"xai_parameters": {}
})
]
}
}
Avec l’image, deux paramètres supplémentaires (model_explainability
et xai_parameters
) sont requis dans le schéma d’entrée pour générer des explications.
Clé | Description | Valeur par défaut |
---|---|---|
image_base64 |
image d’entrée au format base64Required, String |
- |
model_explainability |
S’il faut générer des explications ou seulement le scoringOptional, Bool |
False |
xai_parameters |
Si model_explainability a la valeur True, xai_parameters est un dictionnaire contenant des paramètres liés à l’algorithme d’explicabilité avec les clés xai_algorithm , visualizations , attributions . Optional, Dictionary Si xai_parameters n’est pas passé, l’algorithme xrai d’explicabilité est utilisé avec sa valeur par défaut |
{"xai_algorithm": "xrai", "visualizations": True, "attributions": False} |
xai_algorithm |
Nom de l’algorithme d’explicabilité à utiliser. Les algorithmes XAI pris en charge sont {xrai , integrated_gradients , guided_gradcam , guided_backprop }Optional, String |
xrai |
visualizations |
Indique s’il faut retourner des visualisations d’explications. Optional, Bool |
True |
attributions |
Indique s’il faut retourner des attributions de fonctionnalités. Optional, Bool |
False |
confidence_score_threshold_multilabel |
Seuil de score de confiance pour sélectionner les classes supérieures afin de générer des explications dans la classification multiétiquette. Optional, Float |
0.5 |
Le tableau suivant décrit les schémas pris en charge pour l’explicabilité.
Type | schéma |
---|---|
Inférence sur une image unique au format base64 | Le dictionnaire avec image_base64 comme clé et valeur est une image encodée en base64, model_explainability clé avec True ou False et xai_parameters dictionnaire avec des paramètres spécifiques à l’algorithme XAI Required, Json String Works for one or more images |
Chaque image d’entrée du request_json
, définie dans le code ci-dessous, est une chaîne encodée en base64 ajoutée à la liste 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)
Format de sortie (XAI)
Les prédictions effectuées sur les points de terminaison de modèle suivent un schéma différent selon le type de tâche. Cette section décrit les formats de données de sortie pour les tâches de classification d’images multi-classes et multi-étiquettes.
Les schémas suivants sont définis pour le cas de deux images d’entrée.
Classification d’images (binaire/multiclasse)
Le schéma de sortie est identique à celui décrit ci-dessus , sauf que visualizations
les attributions
valeurs de clé sont incluses, si ces clés ont été définies True
dans la requête.
Si model_explainability
, visualizations
sont attributions
définis sur True
dans la demande d’entrée, la sortie aura visualizations
et attributions
. Pour plus d’informations sur ces paramètres, consultez le tableau suivant. Les visualisations et les attributions sont générées par rapport à une classe qui a le score de probabilité le plus élevé.
Clé de sortie | Description |
---|---|
visualizations |
Image unique au format de chaîne base64 avec type Optional, String |
attributions |
tableau multidimensionnel avec des scores de forme d’attribution en pixels [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]]]
}
]
Classification d’images multi-étiquette
La seule différence dans le schéma de sortie de la classification multi-étiquette par rapport à la classification multi-classe est qu’il peut y avoir plusieurs classes dans chaque image pour lesquelles des explications peuvent être générées. Ainsi, visualizations
est la liste des chaînes d’image en base64 et attributions
est la liste des scores d’attribution par rapport à chaque classe sélectionnée en fonction deconfidence_score_threshold_multilabel
(la valeur par défaut est 0,5).
Si model_explainability
, visualizations
sont attributions
définis sur True
dans la demande d’entrée, la sortie aura visualizations
et attributions
. Pour plus d’informations sur ces paramètres, consultez le tableau suivant. Des visualisations et des attributions sont générées sur toutes les classes dont le score de probabilité est supérieur ou égal à confidence_score_threshold_multilabel
.
Clé de sortie | Description |
---|---|
visualizations |
Liste d’images au format de chaîne base64 avec type Optional, String |
attributions |
Liste de tableaux multidimensionnels avec des scores d’attribution en pixels par rapport à chaque classe, où chaque tableau multidimensionnel est de forme [3, valid_crop_size, valid_crop_size] Optional, List |
Avertissement
Lors de la génération d’explications sur le point de terminaison en ligne, veillez à sélectionner uniquement quelques classes basées sur le score de confiance afin d’éviter les problèmes de délai d’expiration sur le point de terminaison ou d’utiliser le point de terminaison avec le type d’instance GPU. Pour générer des explications pour un grand nombre de classes dans la classification multi-étiquette, consultez le notebook de scoring par lots (kit de développement logiciel (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]]],
.
.
.
]
}
]
Détection d’objets
Avertissement
XAI n’est pas pris en charge. Ainsi, seuls les scores sont retournés. Pour obtenir un exemple de scoring, reportez-vous à la section scoring en ligne.
Segmentation d’instance
Avertissement
XAI n’est pas pris en charge. Ainsi, seuls les scores sont retournés. Pour obtenir un exemple de scoring, reportez-vous à la section scoring en ligne.
Notes
Les images utilisées dans cet article proviennent du jeu de données Fridge Objects, copyright© Microsoft Corporation, et sont disponibles sur computervision-recipes/01_training_introduction.ipynb en vertu de la licence MIT.