Intégrer les API de machine learning

Intégrer les API de machine learning

À propos de cet atelier de programmation

subjectDernière mise à jour : juin 30, 2021
account_circleRédigé par Torry Yang

1. Présentation

Cet atelier de programmation vous explique rapidement comment utiliser certaines API de machine learning. Vous utiliserez:

  • Cloud Vision pour comprendre le contenu d'une image
  • Cloud Speech-to-Text pour transcrire des pistes audio en texte
  • Cloud Translation vous permet de traduire une chaîne arbitraire dans n'importe quelle langue compatible.
  • Cloud Natural Language pour extraire des informations du texte

Objectifs de l'atelier

Vous allez créer un pipeline qui compare un enregistrement audio à une image et détermine leur pertinence. Voici un aperçu de la procédure à suivre pour y parvenir:

e6a/77e5def315116.jpeg

Points abordés

  • Utiliser les API Vision, Speech-to-Text, Translation et Natural Language
  • Où trouver des exemples de code

Ce dont vous avez besoin

  • Un navigateur (Chrome ou Firefox, par exemple)
  • Connaissances de base en Python

2. Prérequis

Configuration de l'environnement au rythme de chacun

  1. Connectez-vous à Cloud Console, 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.)

96a9c957bc475304.png

B9a10ebdf5b5a448.png

A1e3c01a38fa61c2.png

Mémorisez l'ID du projet. Il s'agit d'un nom unique permettant de différencier chaque projet Google Cloud (le nom ci-dessus est déjà pris ; vous devez en trouver un autre). Il sera désigné par le nom PROJECT_ID tout au long de cet atelier de programmation.

  1. Vous devez ensuite activer la facturation dans Cloud Console pour pouvoir utiliser les ressources Google Cloud.

L'exécution de cet atelier de programmation est très peu coûteuse, voire offerte. Veillez à suivre les instructions de la section "Nettoyer" qui indique comment désactiver les ressources afin d'éviter les frais une fois ce tutoriel terminé. Les nouveaux utilisateurs de Google Cloud peuvent bénéficier d'un essai offert de 300 USD.

Activer les API

Cliquez sur ce lien pour activer toutes les API nécessaires. Une fois cette opération effectuée, vous pouvez ignorer les instructions concernant la configuration de l'authentification. Nous nous chargerons de le faire dans quelques instants. Vous avez également la possibilité d'activer chaque API individuellement. Pour cela, cliquez sur l'icône de menu en haut à gauche de l'écran.

2bfc27ef9ba2ec7d.png

Sélectionnez API et services dans la liste déroulante, puis cliquez sur "Tableau de bord".

A9546a22581facd5.png

Cliquez sur Enable APIs and services (Activer les API et les services).

eae7ff043d13a35.png

Recherchez ensuite "visionnage" dans le champ de recherche. Cliquez sur Google Cloud Vision API (API Google Cloud Vision) :

A47893f36372ae2f.png

Cliquez sur Activer pour activer l'API Cloud Vision:

A24fd082a22030ad.png

Patientez quelques secondes. Vous verrez ce message s'afficher une fois l'option activée:

633e58cbfr1b74c6.png

Effectuez la même procédure pour activer les API Cloud Speech, Cloud Translation et Cloud Natural Language.

Cloud Shell

Google Cloud Shell est un environnement de ligne de commande fonctionnant dans le cloud. Cette machine virtuelle basée sur Debian contient tous les outils de développement dont vous aurez besoin (gcloud, bq, git, etc.). Elle offre un répertoire de base persistant de 5 Go. Nous utiliserons Cloud Shell pour créer notre requête auprès des API de machine learning.

Pour commencer à utiliser Cloud Shell, cliquez sur l'icône "Activer Google Cloud Shell" Capture d'écran 2015-06-08 à 17:30.32 PM.pngen haut à droite de la barre d'en-tête.

24ef50000ca737a4.png

Une session Cloud Shell s'ouvre dans un nouveau cadre en bas de la console et affiche une invite de ligne de commande. Attendez que l'invite "user@project:~$" s'affiche.

Facultatif: Éditeur de code

En fonction de votre maîtrise de la ligne de commande, vous pouvez cliquer sur l'icône &Launch Éditeur de code B885bf07bc1b02e5.png en haut à droite de la barre Cloud Shell.

de00be9278baf7b8.png

Compte de service

Vous devez disposer d'un compte de service pour vous authentifier. Pour en créer un, remplacez [NOM] par le nom de compte de service souhaité et exécutez la commande suivante dans Cloud Shell:

gcloud iam service-accounts create [NAME]

Vous devez à présent générer une clé pour utiliser ce compte de service. Remplacez [NOM_FICHIER] par le nom de clé souhaité, [NOM] par le nom du compte de service ci-dessus et [ID_PROJET] par l'ID de votre projet. La commande suivante crée et télécharge la clé sous la forme [FILE_NAME].json:

gcloud iam service-accounts keys create [FILE_NAME].json --iam-account [NAME]@[PROJECT_ID].iam.gserviceaccount.com

Pour utiliser le compte de service, vous devez définir la variable GOOGLE_APPLICATION_CREDENTIALS pour qu'elle corresponde au chemin d'accès de la clé. Pour ce faire, exécutez la commande suivante après avoir remplacé [PATH_TO_FILE] et [FILE_NAME]:

export GOOGLE_APPLICATION_CREDENTIALS=[PATH_TO_FILE]/[FILE_NAME].json

3. Cloud Vision

Client Python

Vous en aurez besoin pour Cloud Vision. Pour l'installer, saisissez la commande suivante dans Cloud Shell:

pip install --upgrade google-cloud-vision --user

C'est parti

Examinons les exemples de code pour l'API Cloud Vision. Nous souhaitons savoir ce qui se trouve dans une image spécifiée. detect.py semble utile pour y parvenir. Vous pouvez copier le contenu de Detect.py, créer un fichier nommé vision.py dans Cloud Shell et coller tout le code dans vision.py Vous pouvez le faire manuellement dans l'éditeur de code Cloud Shell ou exécuter cette commande curl dans Cloud Shell:

curl https://raw.githubusercontent.com/GoogleCloudPlatform/python-docs-samples/master/vision/cloud-client/detect/detect.py -o vision.py

Ensuite, utilisez l'API en exécutant la commande suivante dans Cloud Shell:

python vision.py labels-uri gs://cloud-samples-data/ml-api-codelab/birds.jpg

Vous devriez obtenir un résultat relatif aux oiseaux et aux autruches, comme dans l'image analysée: https://storage.googleapis.com/cloud-samples-data/ml-api-codelab/birds.jpg

Que se passe-t-il ?

Vous avez transmis deux arguments à vision.py:

  • labels-uri sélectionne la fonction detect_labels_uri() à exécuter.
  • gs://cloud-samples-data/ml-api-codelab/birds.jpg est l'emplacement d'une image dans Google Cloud Storage. Il est transmis en tant que uri dans detect_labels_uri().

Examinons de plus près detect_labels_uri(). Notez les commentaires supplémentaires qui ont été insérés.

def detect_labels_uri(uri):
   
"""Detects labels in the file located in Google Cloud Storage or on the
    Web."""

   
# relevant import from above
   
# from google.cloud import vision

   
# create ImageAnnotatorClient object
    client
= vision.ImageAnnotatorClient()

   
# create Image object
    image
= vision.types.Image()

   
# specify location of image
    image
.source.image_uri = uri

   
# get label_detection response by passing image to client
    response
= client.label_detection(image=image)

   
# get label_annotations portion of response
    labels
= response.label_annotations
   
print('Labels:')

   
for label in labels:
       
# print the label descriptions
       
print(label.description)

4. Cloud Speech-to-Text

Client Python

Vous en aurez besoin pour Cloud Speech-to-Text. Pour l'installer, saisissez la commande suivante dans Cloud Shell:

sudo pip install --upgrade google-cloud-speech

C'est parti

Passons aux exemples de code pour Cloud Speech-to-Text. Nous souhaitons transcrire des données audio vocales. transcribe.py semble être un bon point de départ pour votre chaîne. Voyons cela de plus près. Copiez le contenu de transcript.py, créez un fichier dans Cloud Shell appelé speech2text.py et collez tout le code dans speech2text.py. Vous pouvez le faire manuellement dans l'éditeur de code Cloud Shell ou exécuter cette commande curl dans Cloud Shell:

curl https://raw.githubusercontent.com/GoogleCloudPlatform/python-docs-samples/master/speech/cloud-client/transcribe.py -o speech2text.py

Ensuite, utilisez l'API en exécutant la commande suivante dans Cloud Shell:

python speech2text.py gs://cloud-samples-data/ml-api-codelab/tr-ostrich.wav

Des erreurs liées à l'encodage et au taux d'échantillons hertz peuvent s'afficher. Ne vous inquiétez pas, accédez à transcribe_gcs() dans le code et supprimez les paramètres encoding et sampe_hertz_rate de RecognitionConfig(). Pendant que vous y êtes, modifiez le code de langue sur"tr-TR&#39", car tr-ostrich.wav est un enregistrement vocal en turc.

config = types.RecognitionConfig(language_code='tr-TR')

Maintenant, exécutez à nouveau speech2text.py. Le résultat doit contenir du texte turc comme dans l'analyse audio : https://storage.googleapis.com/cloud-samples-data/ml-api-codelab/tr-ostrich.wav

Que se passe-t-il ?

Vous avez transmis l'adresse gs://cloud-samples-data/ml-api-codelab/tr-ostrich.wav à speech2text.py, l'emplacement d'un fichier audio de Google Cloud Storage qui est ensuite transmis à gcs_uri.

Examinons de plus près nos transcribe_uri() modifiées.

def transcribe_gcs(gcs_uri):
   
"""Transcribes the audio file specified by the gcs_uri."""

   
from google.cloud import speech
   
# enums no longer used
   
# from google.cloud.speech import enums
   
from google.cloud.speech import types

   
# create ImageAnnotatorClient object
    client
= speech.SpeechClient()

   
# specify location of speech
    audio
= types.RecognitionAudio(uri=gcs_uri)

   
# set language to Turkish
   
# removed encoding and sample_rate_hertz
    config
= types.RecognitionConfig(language_code='tr-TR')

   
# get response by passing config and audio settings to client
    response
= client.recognize(config, audio)

   
# Each result is for a consecutive portion of the audio. Iterate through
   
# them to get the transcripts for the entire audio file.
   
for result in response.results:
       
# The first alternative is the most likely one for this portion.
       
# get the transcript of the first alternative
       
print(u'Transcript: {}'.format(result.alternatives[0].transcript))

5. Cloud Translation

Client Python

Vous en aurez besoin pour Cloud Translation. Pour l'installer, saisissez la commande suivante dans Cloud Shell:

sudo pip install --upgrade google-cloud-translate

C'est parti

Passons maintenant aux exemples de code pour Cloud Translation. Dans cet atelier de programmation, nous voulons traduire le texte en anglais. snippets.py semble être ce que nous voulons. Copiez le contenu des extraits.py, créez un fichier nommé Cloud Shell dans translate.py et collez tout le code dans translate.py. Vous pouvez le faire manuellement dans l'éditeur de code Cloud Shell ou exécuter cette commande curl dans Cloud Shell:

curl https://raw.githubusercontent.com/GoogleCloudPlatform/python-docs-samples/master/translate/cloud-client/snippets.py -o translate.py

Ensuite, utilisez l'API en exécutant la commande suivante dans Cloud Shell:

python translate.py translate-text en '你有沒有帶外套'

La traduction doit être "guère-t-elle ?".

Que se passe-t-il ?

Vous avez transmis trois arguments à translate.py:

  • translate-text sélectionne la fonction translate_text() à exécuter.
  • en est transmis en tant que cible dans translate_text() et sert à spécifier la langue dans laquelle la traduction doit être effectuée.
  • '你有沒有帶外套' est la chaîne à traduire. Elle est transmise sous forme de texte en translate_text().

Examinons de plus près translate_text(). Notez les commentaires ajoutés.

def translate_text(target, text):
   
"""Translates text into the target language.

    Target must be an ISO 639-1 language code.
    See https://g.co/cloud/translate/v2/translate-reference#supported_languages
    """

   
# relevant imports from above
   
# from google.cloud import translate
   
# import six

   
# create Client object
    translate_client
= translate.Client()

   
# decode text if it's a binary type
   
# six is a python 2 and 3 compatibility library
   
if isinstance(text, six.binary_type):
        text
= text.decode('utf-8')

   
# get translation result by passing text and target language to client
   
# Text can also be a sequence of strings, in which case this method
   
# will return a sequence of results for each text.
    result
= translate_client.translate(text, target_language=target)

   
# print original text, translated text and detected original language
   
print(u'Text: {}'.format(result['input']))
   
print(u'Translation: {}'.format(result['translatedText']))
   
print(u'Detected source language: {}'.format(
        result
['detectedSourceLanguage']))

6. Cloud Natural Language

Client Python

Vous en aurez besoin pour Cloud Natural Language. Pour l'installer, saisissez la commande suivante dans Cloud Shell:

sudo pip install --upgrade google-cloud-language

C'est parti

Enfin, examinons les exemples de code pour l'API Cloud Natural Language. Nous souhaitons détecter des entités dans le texte. snippets.py semble contenir du code qui effectue cette opération. Copiez le contenu des extraits.py, créez un fichier nommé Cloud Shell dans natural_language.py et collez tout le code dans natural_language.py. Vous pouvez le faire manuellement dans l'éditeur de code Cloud Shell ou exécuter cette commande curl dans Cloud Shell:

curl https://raw.githubusercontent.com/GoogleCloudPlatform/python-docs-samples/master/language/cloud-client/v1/snippets.py -o natural_language.py

Ensuite, utilisez l'API en exécutant la commande suivante dans Cloud Shell:

python natural_language.py entities-text 'where did you leave my bike'

L'API doit identifier "vélo" en tant qu'entité. Les entités peuvent être des noms propres (personnages publics, points de repère, etc.) ou des noms courants (restaurant, stade, etc.).

Que se passe-t-il ?

Vous avez transmis deux arguments à natural_language.py :

  • entities-text sélectionne la fonction entities_text() à exécuter.
  • 'where youisse mon vélo' est la chaîne à analyser pour les entités et est transmise en tant que texte dans entities_text()

Examinons de plus près entities_text(). Notez les nouveaux commentaires insérés.

def entities_text(text):
   
"""Detects entities in the text."""
   
# relevant imports from above
   
# from google.cloud import language
   
# from google.cloud.language import enums
   
# from google.cloud.language import types
   
# import six

   
# create LanguageServiceClient object
    client
= language.LanguageServiceClient()

   
# decode text if it's a binary type
   
# six is a python 2 and 3 compatibility library
   
if isinstance(text, six.binary_type):
        text
= text.decode('utf-8')

   
# Instantiates a plain text document.
    document
= types.Document(
        content
=text,
        type
=enums.Document.Type.PLAIN_TEXT)

   
# Detects entities in the document. You can also analyze HTML with:
   
#   document.type == enums.Document.Type.HTML
    entities
= client.analyze_entities(document).entities

   
# entity types from enums.Entity.Type
    entity_type
= ('UNKNOWN', 'PERSON', 'LOCATION', 'ORGANIZATION',
                   
'EVENT', 'WORK_OF_ART', 'CONSUMER_GOOD', 'OTHER')

   
# print information for each entity found
   
for entity in entities:
       
print('=' * 20)
       
print(u'{:<16}: {}'.format('name', entity.name))
       
print(u'{:<16}: {}'.format('type', entity_type[entity.type]))
       
print(u'{:<16}: {}'.format('metadata', entity.metadata))
       
print(u'{:<16}: {}'.format('salience', entity.salience))
       
print(u'{:<16}: {}'.format('wikipedia_url',
              entity
.metadata.get('wikipedia_url', '-')))

7. Intégrer ces appareils

Souvenez-vous de ce que vous créez.

e6a/77e5def315116.jpeg

Maintenant, assemblez-les. Créez un fichier solution.py, puis copiez et collez detect_labels_uri(), transcribe_gcs(), translate_text() et entities_text() des étapes précédentes dans solution.py.

Importer des instructions

Supprimez les commentaires et déplacez les instructions d'importation en haut. speech.types et language.types sont en cours d'importation. Cette opération entraîne des conflits. Nous allons donc les supprimer, puis remplacer chaque occurrence de types par transcribe_gcs() et entities_text() par speech.types et language.types, respectivement. Vous devriez voir les éléments suivants:

from google.cloud import vision
from google.cloud import speech
from google.cloud import translate
from google.cloud import language
from google.cloud.language import enums
import six

Résultats renvoyés

Au lieu d'imprimer, les fonctions renvoient les résultats. Le résultat doit ressembler à ceci:

# import statements

def detect_labels_uri(uri):
   
# code

   
# we only need the label descriptions
    label_descriptions
= []
   
for label in labels:
        label_descriptions
.append(label.description)

   
return label_descriptions

def transcribe_gcs(gcs_uri):
   
# code

   
# naive assumption that audio file is short
   
return response.results[0].alternatives[0].transcript

def translate_text(target, text):
   
# code

   
# only interested in translated text
   
return result['translatedText']

def entities_text(text):
   
# code

   
# we only need the entity names
    entity_names
= []
   
for entity in entities:
        entity_names
.append(entity.name)

   
return entity_names

Utiliser les fonctions

Après tout ce travail acharné, vous pouvez appeler ces fonctions. Allez-y ! Exemple :

def compare_audio_to_image(audio, image):
   
"""Checks whether a speech audio is relevant to an image."""

   
# speech audio -> text
    transcription
= transcribe_gcs(audio)

   
# text of any language -> english text
    translation
= translate_text('en', transcription)

   
# text -> entities
    entities
= entities_text(translation)

   
# image -> labels
    labels
= detect_labels_uri(image)

   
# naive check for whether entities intersect with labels
    has_match
= False
   
for entity in entities:
       
if entity in labels:
           
# print result for each match
           
print('The audio and image both contain: {}'.format(entity))
            has_match
= True

   
# print if there are no matches
   
if not has_match:
       
print('The audio and image do not appear to be related.')

Langues multiples

Nous avons codé en turc jusqu'à transcribe_gcs(). Modifiez cette fonction pour que la langue puisse être spécifiée dans compare_audio_to_image(). Voici les modifications requises:

def transcribe_gcs(language, gcs_uri):
   
...
    config
= speech.types.RecognitionConfig(language_code=language)
def compare_audio_to_image(language, audio, image):
    transcription
= transcribe_gcs(language, audio)

Essayer

Le code final se trouve dans solution.py dans ce dépôt GitHub. Voici une commande curl pour l'obtenir:

curl https://raw.githubusercontent.com/googlecodelabs/integrating-ml-apis/master/solution.py -O

La version de GitHub contient un élément argparse, qui permet d'effectuer les opérations suivantes à partir de la ligne de commande:

python solution.py tr-TR gs://cloud-samples-data/ml-api-codelab/tr-ball.wav gs://cloud-samples-data/ml-api-codelab/football.jpg

Pour chaque élément détecté, le code doit renvoyer le code "audio" et l'image (contenant """). Dans l'exemple ci-dessus, il s'agit du champ "audio" et "image" contenant tous les deux.

Bonus: essayez plus

Voici d'autres emplacements pour les fichiers audio et les fichiers image.

8. Félicitations !

Vous avez exploré et intégré quatre API de machine learning pour déterminer si un échantillon vocal parle de l'image fournie. Ce n'est que le début, car il existe de nombreuses autres façons d'améliorer ce pipeline.

Points abordés

  • Envoyer des requêtes à l'API Cloud Vision
  • Envoyer des requêtes à l'API Cloud Speech-to-Text
  • Envoyer des requêtes à l'API Cloud Translation
  • Envoyer des requêtes à l'API Cloud Natural Language
  • Utiliser toutes les API ci-dessus

Étapes suivantes