Utiliser l'API Vision avec Python

1. Présentation

5ab7829fc22b21c4.png

L'API Vision permet aux développeurs d'intégrer facilement des fonctionnalités de détection visuelle dans des applications, comme l'étiquetage d'images, la détection de visages et de points de repère, la reconnaissance optique des caractères (OCR) et l'ajout de tags au contenu explicite.

Dans ce tutoriel, vous allez vous concentrer sur l'utilisation de l'API Vision avec Python.

Points abordés

  • Configurer votre environnement
  • Lancer une détection de thèmes
  • Lancer une détection de texte
  • Comment lancer la détection de points de repère
  • Utiliser la détection des visages
  • Lancer une détection d'objets

Prérequis

  • Un projet Google Cloud
  • Un navigateur tel que Chrome ou Firefox
  • Connaissances de base sur Python

Enquête

Comment allez-vous utiliser ce tutoriel ?

Je vais le lire uniquement Je vais le lire et effectuer les exercices

Quel est votre niveau d'expérience avec Python ?

Débutant Intermédiaire Expert

Comment évalueriez-vous votre expérience des services Google Cloud ?

<ph type="x-smartling-placeholder"></ph> Débutant Intermédiaire Expert
.

2. Préparation

Configuration de l'environnement au rythme de chacun

  1. Connectez-vous à la console Google Cloud, puis créez un projet ou réutilisez un projet existant. (Si vous ne possédez pas encore de compte Gmail ou Google Workspace, vous devez en créer un.)

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Le nom du projet est le nom à afficher pour les participants au projet. Il s'agit d'une chaîne de caractères non utilisée par les API Google. Vous pourrez toujours le modifier.
  • L'ID du projet est unique parmi tous les projets Google Cloud et non modifiable une fois défini. La console Cloud génère automatiquement une chaîne unique (en général, vous n'y accordez d'importance particulière). Dans la plupart des ateliers de programmation, vous devrez indiquer l'ID de votre projet (généralement identifié par PROJECT_ID). Si l'ID généré ne vous convient pas, vous pouvez en générer un autre de manière aléatoire. Vous pouvez également en spécifier un et voir s'il est disponible. Après cette étape, l'ID n'est plus modifiable et restera donc le même pour toute la durée du projet.
  • Pour information, il existe une troisième valeur (le numéro de projet) que certaines API utilisent. Pour en savoir plus sur ces trois valeurs, consultez la documentation.
  1. Vous devez ensuite activer la facturation dans la console Cloud pour utiliser les ressources/API Cloud. L'exécution de cet atelier de programmation est très peu coûteuse, voire sans frais. Pour désactiver les ressources et éviter ainsi que des frais ne vous soient facturés après ce tutoriel, vous pouvez supprimer le projet ou les ressources que vous avez créées. Les nouveaux utilisateurs de Google Cloud peuvent participer au programme d'essai sans frais pour bénéficier d'un crédit de 300 $.

Démarrer Cloud Shell

Bien que Google Cloud puisse être utilisé à distance depuis votre ordinateur portable, vous allez utiliser Cloud Shell dans cet atelier de programmation, un environnement de ligne de commande exécuté dans le cloud.

Activer Cloud Shell

  1. Dans Cloud Console, cliquez sur Activer Cloud Shell 853e55310c205094.png.

55efc1aaa7a4d3ad.png

Si vous démarrez Cloud Shell pour la première fois, un écran intermédiaire vous explique de quoi il s'agit. Si un écran intermédiaire s'est affiché, cliquez sur Continuer.

9c92662c6a846a5c.png

Le provisionnement et la connexion à Cloud Shell ne devraient pas prendre plus de quelques minutes.

9f0e51b578fecce5.png

Cette machine virtuelle contient tous les outils de développement nécessaires. Elle comprend un répertoire d'accueil persistant de 5 Go et s'exécute dans Google Cloud, ce qui améliore considérablement les performances du réseau et l'authentification. Une grande partie, voire la totalité, de votre travail dans cet atelier de programmation peut être effectué dans un navigateur.

Une fois connecté à Cloud Shell, vous êtes authentifié et le projet est défini sur votre ID de projet.

  1. Exécutez la commande suivante dans Cloud Shell pour vérifier que vous êtes authentifié :
gcloud auth list

Résultat de la commande

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. Exécutez la commande suivante dans Cloud Shell pour vérifier que la commande gcloud connaît votre projet:
gcloud config list project

Résultat de la commande

[core]
project = <PROJECT_ID>

Si vous obtenez un résultat différent, exécutez cette commande :

gcloud config set project <PROJECT_ID>

Résultat de la commande

Updated property [core/project].

3. Cofiguration de l'environnement

Avant de pouvoir utiliser l'API Vision, vous devez l'activer en exécutant la commande suivante dans Cloud Shell:

gcloud services enable vision.googleapis.com

L'écran qui s'affiche devrait ressembler à ce qui suit :

Operation "operations/..." finished successfully.

Vous pouvez maintenant utiliser l'API Vision.

Accédez à votre répertoire d'accueil:

cd ~

Créez un environnement virtuel Python pour isoler les dépendances:

virtualenv venv-vision

Activez l'environnement virtuel :

source venv-vision/bin/activate

Installez IPython et la bibliothèque cliente de l'API Vision:

pip install ipython google-cloud-vision

L'écran qui s'affiche devrait ressembler à ce qui suit :

...
Installing collected packages: ..., ipython, google-cloud-vision
Successfully installed ... google-cloud-vision-3.4.0 ...

Vous êtes maintenant prêt à utiliser la bibliothèque cliente de l'API Vision.

Dans les étapes suivantes, vous allez utiliser un interpréteur Python interactif appelé IPython, que vous avez installé à l'étape précédente. Démarrez une session en exécutant ipython dans Cloud Shell:

ipython

L'écran qui s'affiche devrait ressembler à ce qui suit :

Python 3.9.2 (default, Feb 28 2021, 17:03:44)
Type 'copyright', 'credits' or 'license' for more information
IPython 8.12.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]:

Vous êtes prêt à envoyer votre première demande...

4. Effectuer une détection de thèmes

L'une des principales fonctionnalités de l'API Vision consiste à identifier des objets ou des entités dans une image. C'est ce que l'on appelle l'annotation de thèmes. La détection de thèmes identifie des objets généraux, des lieux, des activités, des espèces animales, des produits, etc. L'API Vision prend une image d'entrée et renvoie les thèmes les plus probables qui s'appliquent à cette image. Elle renvoie les étiquettes les plus pertinentes ainsi que le score de confiance d'une correspondance avec l'image.

Dans cet exemple, vous allez détecter des thèmes sur une image (avec l'aimable autorisation d'Alex Knight) de Setagaya, un quartier populaire de Tokyo:

756f97f0b1e46c38.jpeg

Copiez le code suivant dans votre session IPython:

from typing import Sequence

from google.cloud import vision


def analyze_image_from_uri(
    image_uri: str,
    feature_types: Sequence,
) -> vision.AnnotateImageResponse:
    client = vision.ImageAnnotatorClient()

    image = vision.Image()
    image.source.image_uri = image_uri
    features = [vision.Feature(type_=feature_type) for feature_type in feature_types]
    request = vision.AnnotateImageRequest(image=image, features=features)

    response = client.annotate_image(request=request)

    return response


def print_labels(response: vision.AnnotateImageResponse):
    print("=" * 80)
    for label in response.label_annotations:
        print(
            f"{label.score:4.0%}",
            f"{label.description:5}",
            sep=" | ",
        )
        

Prenez quelques instants pour étudier le code et découvrir comment il utilise la méthode de la bibliothèque cliente annotate_image afin d'analyser une image pour un ensemble de caractéristiques données.

Envoyez une requête avec la fonctionnalité LABEL_DETECTION:

image_uri = "gs://cloud-samples-data/vision/label/setagaya.jpeg"
features = [vision.Feature.Type.LABEL_DETECTION]

response = analyze_image_from_uri(image_uri, features)
print_labels(response)

Vous devez obtenir le résultat suivant :

================================================================================
 97% | Bicycle
 96% | Tire
 94% | Wheel
 91% | Automotive lighting
 89% | Infrastructure
 87% | Bicycle wheel
 86% | Mode of transport
 85% | Building
 83% | Electricity
 82% | Neighbourhood

Voici comment les résultats sont présentés dans la démonstration en ligne:

2191b0425c9c148f.png

Résumé

Au cours de cette étape, vous avez pu effectuer une détection de thèmes sur une image et afficher les thèmes les plus probables associés à cette image. En savoir plus sur la détection de thèmes

5. Effectuer une détection de texte

La détection de texte effectue une reconnaissance optique des caractères (OCR). Elle détecte et extrait le texte contenu dans une image, et est compatible avec de nombreuses langues. Compatible avec un grand nombre de langues, elle permet également une identification automatique de la langue.

Dans cet exemple, vous allez effectuer une détection de texte sur une image de panneau de signalisation:

4dedd3fcfd9ad99b.jpeg

Copiez le code suivant dans votre session IPython:

def print_text(response: vision.AnnotateImageResponse):
    print("=" * 80)
    for annotation in response.text_annotations:
        vertices = [f"({v.x},{v.y})" for v in annotation.bounding_poly.vertices]
        print(
            f"{repr(annotation.description):42}",
            ",".join(vertices),
            sep=" | ",
        )
        

Envoyez une requête avec la fonctionnalité TEXT_DETECTION:

image_uri = "gs://cloud-samples-data/vision/ocr/sign.jpg"
features = [vision.Feature.Type.TEXT_DETECTION]

response = analyze_image_from_uri(image_uri, features)
print_text(response)

Vous devez obtenir le résultat suivant :

================================================================================
'WAITING?\nPLEASE\nTURN OFF\nYOUR\nENGINE' | (310,821),(2225,821),(2225,1965),(310,1965)
'WAITING'                                  | (344,821),(2025,879),(2016,1127),(335,1069)
'?'                                        | (2057,881),(2225,887),(2216,1134),(2048,1128)
'PLEASE'                                   | (1208,1230),(1895,1253),(1891,1374),(1204,1351)
'TURN'                                     | (1217,1414),(1718,1434),(1713,1558),(1212,1538)
'OFF'                                      | (1787,1437),(2133,1451),(2128,1575),(1782,1561)
'YOUR'                                     | (1211,1609),(1741,1626),(1737,1747),(1207,1731)
'ENGINE'                                   | (1213,1805),(1923,1819),(1920,1949),(1210,1935)

Voici comment les résultats sont présentés dans la démonstration en ligne:

9c70fbce871c5fe5.png

Résumé

Au cours de cette étape, vous avez pu effectuer une détection de texte sur une image et afficher le texte reconnu de l'image. En savoir plus sur la détection de texte

6. Effectuer une détection de points de repère

La détection de points de repère détecte les structures naturelles ou créées par l'homme dans une image.

Dans cet exemple, vous allez effectuer la détection de points de repère sur une image de la tour Eiffel (avec l'aimable autorisation de John Towner) :

fb7801e36884b875.jpeg

Copiez le code suivant dans votre session IPython:

def print_landmarks(response: vision.AnnotateImageResponse, min_score: float = 0.5):
    print("=" * 80)
    for landmark in response.landmark_annotations:
        if landmark.score < min_score:
            continue
        vertices = [f"({v.x},{v.y})" for v in landmark.bounding_poly.vertices]
        lat_lng = landmark.locations[0].lat_lng
        print(
            f"{landmark.description:18}",
            ",".join(vertices),
            f"{lat_lng.latitude:.5f}",
            f"{lat_lng.longitude:.5f}",
            sep=" | ",
        )
        

Envoyez une requête avec la fonctionnalité LANDMARK_DETECTION:

image_uri = "gs://cloud-samples-data/vision/landmark/eiffel_tower.jpg"
features = [vision.Feature.Type.LANDMARK_DETECTION]

response = analyze_image_from_uri(image_uri, features)
print_landmarks(response)

Vous devez obtenir le résultat suivant :

================================================================================
Trocadéro Gardens  | (303,36),(520,36),(520,371),(303,371) | 48.86160 | 2.28928
Eiffel Tower       | (458,76),(512,76),(512,263),(458,263) | 48.85846 | 2.29435

Voici comment les résultats sont présentés dans la démonstration en ligne:

2788697365670985.png

Résumé

Au cours de cette étape, vous avez pu effectuer la détection de points de repère sur une image de la tour Eiffel. En savoir plus sur la détection des points de repère

7. Détecter des visages

La détection des traits du visage détecte plusieurs visages dans une image, ainsi que leurs caractéristiques principales, telles que l'état émotionnel ou le port d'un chapeau.

Dans cet exemple, vous allez détecter les visages sur l'image suivante (avec l'aimable autorisation d'Himanshu Singh Gurjar):

58c578ece524cf32.jpeg

Copiez le code suivant dans votre session IPython:

def print_faces(response: vision.AnnotateImageResponse):
    print("=" * 80)
    for face_number, face in enumerate(response.face_annotations, 1):
        vertices = ",".join(f"({v.x},{v.y})" for v in face.bounding_poly.vertices)
        print(f"# Face {face_number} @ {vertices}")
        print(f"Joy:     {face.joy_likelihood.name}")
        print(f"Exposed: {face.under_exposed_likelihood.name}")
        print(f"Blurred: {face.blurred_likelihood.name}")
        print("-" * 80)
        

Envoyez une requête avec la fonctionnalité FACE_DETECTION:

image_uri = "gs://cloud-samples-data/vision/face/faces.jpeg"
features = [vision.Feature.Type.FACE_DETECTION]

response = analyze_image_from_uri(image_uri, features)
print_faces(response)

Vous devez obtenir le résultat suivant :

================================================================================
# Face 1 @ (1077,157),(2146,157),(2146,1399),(1077,1399)
Joy:     VERY_LIKELY
Exposed: VERY_UNLIKELY
Blurred: VERY_UNLIKELY
--------------------------------------------------------------------------------
# Face 2 @ (144,1273),(793,1273),(793,1844),(144,1844)
Joy:     VERY_UNLIKELY
Exposed: VERY_UNLIKELY
Blurred: UNLIKELY
--------------------------------------------------------------------------------
# Face 3 @ (785,167),(1100,167),(1100,534),(785,534)
Joy:     VERY_UNLIKELY
Exposed: LIKELY
Blurred: VERY_LIKELY
--------------------------------------------------------------------------------

Voici comment les résultats sont présentés dans la démonstration en ligne:

cbb7f59299651b83.png

Résumé

Au cours de cette étape, vous avez pu utiliser la détection de visages. En savoir plus sur la détection des visages

8. Effectuer une détection d'objets

Dans cet exemple, vous allez effectuer la détection d'objets sur la même image précédente (avec l'aimable autorisation d'Alex Knight) de Setagaya:

756f97f0b1e46c38.jpeg

Copiez le code suivant dans votre session IPython:

def print_objects(response: vision.AnnotateImageResponse):
    print("=" * 80)
    for obj in response.localized_object_annotations:
        nvertices = obj.bounding_poly.normalized_vertices
        print(
            f"{obj.score:4.0%}",
            f"{obj.name:15}",
            f"{obj.mid:10}",
            ",".join(f"({v.x:.1f},{v.y:.1f})" for v in nvertices),
            sep=" | ",
        )
        

Envoyez une requête avec la fonctionnalité OBJECT_LOCALIZATION:

image_uri = "gs://cloud-samples-data/vision/label/setagaya.jpeg"
features = [vision.Feature.Type.OBJECT_LOCALIZATION]

response = analyze_image_from_uri(image_uri, features)
print_objects(response)

Vous devez obtenir le résultat suivant :

================================================================================
 93% | Bicycle         | /m/0199g   | (0.6,0.6),(0.8,0.6),(0.8,0.9),(0.6,0.9)
 92% | Bicycle wheel   | /m/01bqk0  | (0.6,0.7),(0.7,0.7),(0.7,0.9),(0.6,0.9)
 91% | Tire            | /m/0h9mv   | (0.7,0.7),(0.8,0.7),(0.8,1.0),(0.7,1.0)
 75% | Bicycle         | /m/0199g   | (0.3,0.6),(0.4,0.6),(0.4,0.7),(0.3,0.7)
 51% | Tire            | /m/0h9mv   | (0.3,0.6),(0.4,0.6),(0.4,0.7),(0.3,0.7)

Voici comment les résultats sont présentés dans la démonstration en ligne:

e1c2ca803d874a6b.png

Résumé

Au cours de cette étape, vous avez pu effectuer une détection d'objets. En savoir plus sur la détection d'objets

9. Fonctionnalités multiples

Vous avez vu comment utiliser certaines fonctionnalités de l'API Vision, mais il en existe beaucoup d'autres et vous pouvez demander plusieurs caractéristiques en une seule requête.

Voici le type de requête que vous pouvez envoyer pour obtenir tous les insights en même temps:

image_uri = "gs://..."
features = [
    vision.Feature.Type.OBJECT_LOCALIZATION,
    vision.Feature.Type.FACE_DETECTION,
    vision.Feature.Type.LANDMARK_DETECTION,
    vision.Feature.Type.LOGO_DETECTION,
    vision.Feature.Type.LABEL_DETECTION,
    vision.Feature.Type.TEXT_DETECTION,
    vision.Feature.Type.DOCUMENT_TEXT_DETECTION,
    vision.Feature.Type.SAFE_SEARCH_DETECTION,
    vision.Feature.Type.IMAGE_PROPERTIES,
    vision.Feature.Type.CROP_HINTS,
    vision.Feature.Type.WEB_DETECTION,
    vision.Feature.Type.PRODUCT_SEARCH,
    vision.Feature.Type.OBJECT_LOCALIZATION,
]

# response = analyze_image_from_uri(image_uri, features)

Il existe d'autres possibilités, comme effectuer des détections sur un lot d'images, de manière synchrone ou asynchrone. Consultez tous les guides d'utilisation.

10. Félicitations !

5ab7829fc22b21c4.png

Vous avez appris à utiliser l'API Vision avec Python et vous avez testé quelques fonctionnalités de détection d'images.

Effectuer un nettoyage

Pour nettoyer votre environnement de développement à partir de Cloud Shell:

  • Si vous êtes toujours dans votre session IPython, revenez au shell: exit
  • Cessez d'utiliser l'environnement virtuel Python: deactivate
  • Supprimez le dossier d'environnement virtuel: cd ~ ; rm -rf ./venv-vision.

Pour supprimer votre projet Google Cloud à partir de Cloud Shell, procédez comme suit:

  • Récupérez l'ID de votre projet actuel: PROJECT_ID=$(gcloud config get-value core/project)
  • Assurez-vous qu'il s'agit bien du projet que vous souhaitez supprimer: echo $PROJECT_ID
  • Supprimez le projet: gcloud projects delete $PROJECT_ID

En savoir plus

Licence

Ce document est publié sous une licence Creative Commons Attribution 2.0 Generic.