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