azure-ai-vision-imageanalysis-py

npx skills add https://github.com/microsoft/skills --skill azure-ai-vision-imageanalysis-py

SDK d'analyse d'images Azure AI Vision pour Python

Bibliothèque client pour l'analyse d'images Azure AI Vision 4.0 incluant les légendes, les étiquettes, les objets, l'OCR, et bien plus.

Installation

pip install azure-ai-vision-imageanalysis

Variables d'environnement

VISION_ENDPOINT=https://<resource>.cognitiveservices.azure.com  # Requis pour toutes les méthodes d'auth
VISION_KEY=<your-api-key>  # Requis uniquement pour l'auth AzureKeyCredential
AZURE_TOKEN_CREDENTIALS=prod # Requis uniquement si DefaultAzureCredential est utilisé en production

Authentification

Clé API

import os
from azure.ai.vision.imageanalysis import ImageAnalysisClient
from azure.core.credentials import AzureKeyCredential

endpoint = os.environ["VISION_ENDPOINT"]
key = os.environ["VISION_KEY"]

client = ImageAnalysisClient(
    endpoint=endpoint,
    credential=AzureKeyCredential(key)
)

Entra ID (Recommandé)

import os
from azure.ai.vision.imageanalysis import ImageAnalysisClient
from azure.identity import DefaultAzureCredential, ManagedIdentityCredential

# Dev local : DefaultAzureCredential. Production : définir AZURE_TOKEN_CREDENTIALS=prod ou AZURE_TOKEN_CREDENTIALS=<specific_credential>
credential = DefaultAzureCredential(require_envvar=True)
# Ou utiliser une credential spécifique directement en production :
# Voir https://learn.microsoft.com/python/api/overview/azure/identity-readme?view=azure-python#credential-classes
# credential = ManagedIdentityCredential()

client = ImageAnalysisClient(
    endpoint=os.environ["VISION_ENDPOINT"],
    credential=credential
)

Analyser une image depuis une URL

from azure.ai.vision.imageanalysis.models import VisualFeatures

image_url = "https://example.com/image.jpg"

result = client.analyze_from_url(
    image_url=image_url,
    visual_features=[
        VisualFeatures.CAPTION,
        VisualFeatures.TAGS,
        VisualFeatures.OBJECTS,
        VisualFeatures.READ,
        VisualFeatures.PEOPLE,
        VisualFeatures.SMART_CROPS,
        VisualFeatures.DENSE_CAPTIONS
    ],
    gender_neutral_caption=True,
    language="en"
)

Analyser une image depuis un fichier

with open("image.jpg", "rb") as f:
    image_data = f.read()

result = client.analyze(
    image_data=image_data,
    visual_features=[VisualFeatures.CAPTION, VisualFeatures.TAGS]
)

Légende d'image

result = client.analyze_from_url(
    image_url=image_url,
    visual_features=[VisualFeatures.CAPTION],
    gender_neutral_caption=True
)

if result.caption:
    print(f"Caption: {result.caption.text}")
    print(f"Confidence: {result.caption.confidence:.2f}")

Légendes denses (plusieurs régions)

result = client.analyze_from_url(
    image_url=image_url,
    visual_features=[VisualFeatures.DENSE_CAPTIONS]
)

if result.dense_captions:
    for caption in result.dense_captions.list:
        print(f"Caption: {caption.text}")
        print(f"  Confidence: {caption.confidence:.2f}")
        print(f"  Bounding box: {caption.bounding_box}")

Étiquettes

result = client.analyze_from_url(
    image_url=image_url,
    visual_features=[VisualFeatures.TAGS]
)

if result.tags:
    for tag in result.tags.list:
        print(f"Tag: {tag.name} (confidence: {tag.confidence:.2f})")

Détection d'objets

result = client.analyze_from_url(
    image_url=image_url,
    visual_features=[VisualFeatures.OBJECTS]
)

if result.objects:
    for obj in result.objects.list:
        print(f"Object: {obj.tags[0].name}")
        print(f"  Confidence: {obj.tags[0].confidence:.2f}")
        box = obj.bounding_box
        print(f"  Bounding box: x={box.x}, y={box.y}, w={box.width}, h={box.height}")

OCR (Extraction de texte)

result = client.analyze_from_url(
    image_url=image_url,
    visual_features=[VisualFeatures.READ]
)

if result.read:
    for block in result.read.blocks:
        for line in block.lines:
            print(f"Line: {line.text}")
            print(f"  Bounding polygon: {line.bounding_polygon}")

            # Détails au niveau du mot
            for word in line.words:
                print(f"  Word: {word.text} (confidence: {word.confidence:.2f})")

Détection de personnes

result = client.analyze_from_url(
    image_url=image_url,
    visual_features=[VisualFeatures.PEOPLE]
)

if result.people:
    for person in result.people.list:
        print(f"Person detected:")
        print(f"  Confidence: {person.confidence:.2f}")
        box = person.bounding_box
        print(f"  Bounding box: x={box.x}, y={box.y}, w={box.width}, h={box.height}")

Recadrage intelligent

result = client.analyze_from_url(
    image_url=image_url,
    visual_features=[VisualFeatures.SMART_CROPS],
    smart_crops_aspect_ratios=[0.9, 1.33, 1.78]  # Portrait, 4:3, 16:9
)

if result.smart_crops:
    for crop in result.smart_crops.list:
        print(f"Aspect ratio: {crop.aspect_ratio}")
        box = crop.bounding_box
        print(f"  Crop region: x={box.x}, y={box.y}, w={box.width}, h={box.height}")

Client asynchrone

from azure.ai.vision.imageanalysis.aio import ImageAnalysisClient
from azure.identity.aio import DefaultAzureCredential

async def analyze_image():
    async with ImageAnalysisClient(
        endpoint=endpoint,
        credential=DefaultAzureCredential()
    ) as client:
        result = await client.analyze_from_url(
            image_url=image_url,
            visual_features=[VisualFeatures.CAPTION]
        )
        print(result.caption.text)

Fonctionnalités visuelles

Fonctionnalité Description
CAPTION Phrase unique décrivant l'image
DENSE_CAPTIONS Légendes pour plusieurs régions
TAGS Étiquettes de contenu (objets, scènes, actions)
OBJECTS Détection d'objets avec boîtes englobantes
READ Extraction de texte OCR
PEOPLE Détection de personnes avec boîtes englobantes
SMART_CROPS Régions de recadrage suggérées pour les miniatures

Gestion des erreurs

from azure.core.exceptions import HttpResponseError

try:
    result = client.analyze_from_url(
        image_url=image_url,
        visual_features=[VisualFeatures.CAPTION]
    )
except HttpResponseError as e:
    print(f"Status code: {e.status_code}")
    print(f"Reason: {e.reason}")
    print(f"Message: {e.error.message}")

Exigences relatives aux images

  • Formats : JPEG, PNG, GIF, BMP, WEBP, ICO, TIFF, MPO
  • Taille max : 20 Mo
  • Dimensions : 50x50 à 16 000x16 000 pixels

Bonnes pratiques

  1. Sélectionner uniquement les fonctionnalités nécessaires pour optimiser la latence et les coûts
  2. Utiliser le client asynchrone pour les scénarios à haut débit
  3. Gérer HttpResponseError pour les images invalides ou les problèmes d'authentification
  4. Activer gender_neutral_caption pour des descriptions inclusives
  5. Spécifier la langue pour les légendes localisées
  6. Utiliser smart_crops_aspect_ratios correspondant à vos besoins de miniatures
  7. Mettre en cache les résultats lors de l'analyse d'une même image plusieurs fois

Skills similaires