APIs für maschinelles Lernen einbinden

1. Übersicht

In diesem Codelab erhalten Sie einen kurzen Überblick über einige APIs für maschinelles Lernen. Sie benötigen Folgendes:

  • Cloud Vision, um den Inhalt eines Bildes zu verstehen
  • Cloud Speech-to-Text zum Transkribieren von Audio in Text
  • Cloud Translation zum Übersetzen eines beliebigen Strings in eine unterstützte Sprache
  • Cloud Natural Language zum Extrahieren von Informationen aus Text

Umfang

Sie erstellen eine Pipeline, in der eine Audioaufzeichnung mit einem Bild verglichen wird, um ihre Relevanz für einander zu ermitteln. Hier ist ein kleiner Vorgeschmack darauf, wie Sie das erreichen:

e6a57e5def315116.jpeg

Lerninhalte

  • Vision, Speech-to-Text, Translation und Natural Language APIs verwenden
  • Wo finde ich Codebeispiele?

Voraussetzungen

2. Einrichtung und Anforderungen

Einrichtung der Umgebung im eigenen Tempo

  1. Melden Sie sich in der Cloud Console an und erstellen Sie ein neues Projekt oder verwenden Sie ein vorhandenes Projekt. Wenn Sie noch kein Gmail- oder Google Workspace-Konto haben, müssen Sie eins erstellen.

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

Notieren Sie sich die Projekt-ID, also den projektübergreifend nur einmal vorkommenden Namen eines Google Cloud-Projekts. Der oben angegebene Name ist bereits vergeben und kann leider nicht mehr verwendet werden. Sie wird in diesem Codelab später als PROJECT_ID bezeichnet.

  1. Als Nächstes müssen Sie die Abrechnung in der Cloud Console aktivieren, um Google Cloud-Ressourcen verwenden zu können.

Die Durchführung dieses Codelabs sollte keine oder nur geringe Kosten verursachen. Folgen Sie unbedingt den Anweisungen im Abschnitt „Bereinigen“, in dem beschrieben wird, wie Sie Ressourcen herunterfahren, damit nach dieser Anleitung keine weiteren Kosten anfallen. Neuen Nutzern von Google Cloud steht das Programm Kostenlose Testversion mit einem Guthaben von 300$ zur Verfügung.

APIs aktivieren

Klicken Sie auf diesen Link, um alle erforderlichen APIs zu aktivieren. Danach können Sie die Anleitung zum Einrichten der Authentifizierung ignorieren. Wir werden das gleich tun. Alternativ können Sie jede API einzeln aktivieren. Klicken Sie dazu links oben auf dem Bildschirm auf das Menüsymbol.

2bfc27ef9ba2ec7d.png

Wählen Sie im Drop-down-Menü APIs & Services (APIs & Dienste) aus und klicken Sie auf „Dashboard“.

a9546a22581facd5.png

Klicken Sie auf APIs und Dienste aktivieren.

eae7ff043d13a35.png

Geben Sie dann in das Suchfeld „vision“ ein. Klicken Sie auf Google Cloud Vision API:

a47893f36372ae2f.png

Klicken Sie auf Aktivieren, um die Cloud Vision API zu aktivieren:

a24fd082a22030ad.png

Es dauert einige Sekunden, bis die Funktion aktiviert ist. So sieht es aus, wenn die Funktion aktiviert ist:

633e58cbde1b74c6.png

Wiederholen Sie den Vorgang, um die Cloud Speech API, Cloud Translation API und Cloud Natural Language API zu aktivieren.

Cloud Shell

Google Cloud Shell ist eine Befehlszeilenumgebung, die in der Cloud ausgeführt wird. Auf dieser Debian-basierten virtuellen Maschine sind alle erforderlichen Entwicklungstools (gcloud, bq, git usw.) installiert und sie stellt ein Basisverzeichnis mit 5 GB nichtflüchtigem Speicher zur Verfügung. Wir verwenden Cloud Shell, um unsere Anfrage an die Machine-Learning-APIs zu erstellen.

Klicken Sie zum Starten von Cloud Shell rechts oben in der Kopfzeile auf das Symbol „Google Cloud Shell aktivieren“ Screen Shot 2015-06-08 at 5.30.32 PM.png.

24ef50000ca737a4.png

Im unteren Bereich der Konsole wird ein neuer Frame für die Cloud Shell-Sitzung geöffnet, in dem eine Befehlszeilen-Eingabeaufforderung angezeigt wird. Warten Sie, bis die Eingabeaufforderung user@project:~$ angezeigt wird.

Optional: Code-Editor

Je nachdem, wie vertraut Sie mit der Befehlszeile sind, können Sie oben rechts in der Cloud Shell-Leiste auf das Symbol b885bf07bc1b02e5.png Code-Editor starten klicken.

de00be9278baf7b8.png

Dienstkonto

Zur Authentifizierung benötigen Sie ein Dienstkonto. Ersetzen Sie [NAME] durch den gewünschten Namen des Dienstkontos und führen Sie den folgenden Befehl in Cloud Shell aus:

gcloud iam service-accounts create [NAME]

Jetzt müssen Sie einen Schlüssel generieren, um dieses Dienstkonto zu verwenden. Ersetzen Sie [FILE_NAME] durch den gewünschten Namen des Schlüssels, [NAME] durch den Namen des Dienstkontos von oben und [PROJECT_ID] durch die ID Ihres Projekts. Mit dem folgenden Befehl wird der Schlüssel als [FILE_NAME].json erstellt und heruntergeladen:

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

Wenn Sie das Dienstkonto verwenden möchten, müssen Sie die Variable GOOGLE_APPLICATION_CREDENTIALS auf den Pfad des Schlüssels festlegen. Führen Sie dazu den folgenden Befehl aus, nachdem Sie [PATH_TO_FILE] und [FILE_NAME] ersetzt haben:

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

3. Cloud Vision

Python-Client

Sie benötigen den Python-Client für Cloud Vision. Geben Sie zum Installieren Folgendes in Cloud Shell ein:

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

Ausprobieren

Sehen wir uns die Codebeispiele für die Cloud Vision API an. Wir möchten wissen, was auf einem bestimmten Bild zu sehen ist. detect.py scheint dafür nützlich zu sein. Eine Möglichkeit besteht darin, den Inhalt von detect.py zu kopieren, eine neue Datei in Cloud Shell mit dem Namen vision.py zu erstellen und den gesamten Code in vision.py einzufügen. Sie können dies manuell im Cloud Shell-Code-Editor tun oder den folgenden curl-Befehl in Cloud Shell ausführen:

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

Führen Sie dann in Cloud Shell den folgenden Befehl aus, um die API zu verwenden:

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

Sie sollten eine Ausgabe über Vögel und Strauße sehen, da dies das analysierte Bild war: https://storage.googleapis.com/cloud-samples-data/ml-api-codelab/birds.jpg

Was ist da los?

Sie haben zwei Argumente an vision.py übergeben:

  • Mit labels-uri wird die auszuführende detect_labels_uri()-Funktion ausgewählt.
  • gs://cloud-samples-data/ml-api-codelab/birds.jpg ist der Speicherort eines Bildes in Google Cloud Storage und wird als uri an detect_labels_uri() übergeben.

Sehen wir uns detect_labels_uri() genauer an. Beachten Sie die zusätzlichen Kommentare, die eingefügt wurden.

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

Python-Client

Sie benötigen den Python-Client für Cloud Speech-to-Text. Geben Sie zum Installieren Folgendes in Cloud Shell ein:

sudo pip install --upgrade google-cloud-speech

Ausprobieren

Codebeispiele für Cloud Speech-to-Text Wir möchten Audioinhalte mit gesprochenem Text transkribieren. transcribe.py scheint ein guter Ausgangspunkt zu sein. Kopieren Sie den Inhalt von „transcribe.py“, erstellen Sie in Cloud Shell eine neue Datei namens speech2text.py und fügen Sie den gesamten Code in speech2text.py ein. Sie können dies manuell im Cloud Shell-Code-Editor tun oder den folgenden curl-Befehl in Cloud Shell ausführen:

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

Führen Sie dann in Cloud Shell den folgenden Befehl aus, um die API zu verwenden:

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

Es sollten Fehlermeldungen zur falschen Codierung und Abtastrate angezeigt werden. Keine Sorge. Gehe im Code zu transcribe_gcs() und lösche die Einstellungen für encoding und sampe_hertz_rate aus RecognitionConfig(). Ändern Sie dabei den Sprachcode in „tr-TR“, da tr-ostrich.wav eine Sprachaufzeichnung auf Türkisch ist.

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

Führen Sie speech2text.py jetzt noch einmal aus. Die Ausgabe sollte türkischer Text sein, da dies die analysierte Audioquelle war: https://storage.googleapis.com/cloud-samples-data/ml-api-codelab/tr-ostrich.wav

Worum geht es?

Sie haben gs://cloud-samples-data/ml-api-codelab/tr-ostrich.wav, den Speicherort einer Audiodatei in Google Cloud Storage, an speech2text.py übergeben, die dann als gcs_uri an transcribe_uri() übergeben wird.

Sehen wir uns die modifizierte transcribe_uri() genauer an.

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

Python-Client

Sie benötigen den Python-Client für Cloud Translation. Geben Sie zum Installieren Folgendes in Cloud Shell ein:

sudo pip install --upgrade google-cloud-translate

Ausprobieren

Sehen wir uns nun die Codebeispiele für Cloud Translation an. In diesem Codelab möchten wir Text ins Englische übersetzen. snippets.py sieht so aus, wie wir es uns vorstellen. Kopieren Sie den Inhalt von snippets.py, erstellen Sie in Cloud Shell eine neue Datei mit dem Namen translate.py und fügen Sie den gesamten Code in translate.py ein. Sie können dies manuell im Cloud Shell-Code-Editor tun oder den folgenden curl-Befehl in Cloud Shell ausführen:

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

Führen Sie dann in Cloud Shell den folgenden Befehl aus, um die API zu verwenden:

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

Die Übersetzung sollte „Hast du eine Jacke?“ lauten.

Worum geht es?

Sie haben drei Argumente an translate.py übergeben:

  • Mit translate-text wird die auszuführende Funktion translate_text() ausgewählt.
  • en wird als target an translate_text() übergeben und dient zur Angabe der Sprache, in die übersetzt werden soll.
  • ‘你有沒有帶外套' ist der zu übersetzende String, der als text an translate_text() übergeben wird.

Sehen wir uns translate_text() genauer an. Beachten Sie die hinzugefügten Kommentare.

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

Python-Client

Sie benötigen den Python-Client für Cloud Natural Language. Geben Sie zum Installieren Folgendes in Cloud Shell ein:

sudo pip install --upgrade google-cloud-language

Ausprobieren

Sehen wir uns zum Schluss die Codebeispiele für die Cloud Natural Language API an. Wir möchten Entitäten im Text erkennen. snippets.py enthält anscheinend Code, der das tut. Kopieren Sie den Inhalt von snippets.py, erstellen Sie in Cloud Shell eine neue Datei mit dem Namen natural_language.py und fügen Sie den gesamten Code in natural_language.py ein. Sie können dies manuell im Cloud Shell-Code-Editor tun oder den folgenden curl-Befehl in Cloud Shell ausführen:

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

Führen Sie dann in Cloud Shell den folgenden Befehl aus, um die API zu verwenden:

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

Die API sollte „Fahrrad“ als Entität erkennen. Entitäten können Eigennamen (Personen des öffentlichen Lebens, Sehenswürdigkeiten usw.) oder Gattungsnamen (Restaurant, Stadion usw.) sein.

Worum geht es?

Sie haben zwei Argumente an natural_language.py übergeben:

  • Mit entities-text wird die auszuführende Funktion entities_text() ausgewählt.
  • where did you leave my bike ist der String, der auf Entitäten analysiert werden soll, und wird als text an entities_text() übergeben.

Sehen wir uns entities_text() genauer an. Beachten Sie die neuen Kommentare, die eingefügt wurden.

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. Einbinden

Sehen wir uns noch einmal an, was Sie entwickeln.

e6a57e5def315116.jpeg

Jetzt wollen wir alles zusammenfügen. Erstellen Sie eine Datei mit dem Namen solution.py und kopieren Sie detect_labels_uri(), transcribe_gcs(), translate_text() und entities_text() aus den vorherigen Schritten in solution.py.

Importanweisungen

Entfernen Sie die Auskommentierung und verschieben Sie die Importanweisungen nach oben. Beachten Sie, dass sowohl speech.types als auch language.types importiert werden. Das wird zu Konflikten führen. Entfernen wir sie einfach und ändern wir jedes einzelne Vorkommen von types in transcribe_gcs() und entities_text() in speech.types bzw. language.types. Sie sollten nun Folgendes sehen:

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

Ergebnisse zurückgeben

Lassen Sie die Funktionen die Ergebnisse zurückgeben, anstatt sie auszugeben. Die Ausgabe sollte in etwa so aussehen:

# 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

Funktionen verwenden

Nach all der harten Arbeit können Sie diese Funktionen aufrufen. Nur zu! Beispiel:

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.')

Mehrere Sprachen unterstützen

Wir haben Türkisch zuvor in transcribe_gcs() fest codiert. Ändern wir das so, dass die Sprache über compare_audio_to_image() angegeben werden kann. Folgende Änderungen sind erforderlich:

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)

Ausprobieren

Der endgültige Code befindet sich in solution.py in diesem GitHub-Repository. Hier ist ein curl-Befehl, um das abzurufen:

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

Die Version auf GitHub enthält „argparse“, was Folgendes über die Befehlszeile ermöglicht:

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

Für jedes gefundene Element sollte der Code „The audio and image both contain: “ ausgeben. Im Beispiel oben wäre das „The audio and image both contain: ball“.

Bonus: Mehr ausprobieren

Hier sind weitere Speicherorte für Audio- und Bilddateien, die Sie ausprobieren können.

Sprachbeispiele für Türkisch:gs://cloud-samples-data/ml-api-codelab/tr-ball.wavgs://cloud-samples-data/ml-api-codelab/tr-bike.wavgs://cloud-samples-data/ml-api-codelab/tr-jacket.wavgs://cloud-samples-data/ml-api-codelab/tr-ostrich.wav

de-DE-Sprachbeispiele:gs://cloud-samples-data/ml-api-codelab/de-ball.wavgs://cloud-samples-data/ml-api-codelab/de-bike.wavgs://cloud-samples-data/ml-api-codelab/de-jacket.wavgs://cloud-samples-data/ml-api-codelab/de-ostrich.wav

Bildbeispiele:gs://cloud-samples-data/ml-api-codelab/bicycle.jpggs://cloud-samples-data/ml-api-codelab/birds.jpggs://cloud-samples-data/ml-api-codelab/coat_rack.jpggs://cloud-samples-data/ml-api-codelab/football.jpg

8. Glückwunsch!

Sie haben vier APIs für maschinelles Lernen untersucht und integriert, um festzustellen, ob in einer Sprachprobe über das bereitgestellte Bild gesprochen wird. Das ist erst der Anfang, denn es gibt noch viele weitere Möglichkeiten, diese Pipeline zu verbessern.

Behandelte Themen

  • Anfragen an die Cloud Vision API stellen
  • Anfragen an die Cloud Speech-to-Text API stellen
  • Anfragen an die Cloud Translation API stellen
  • Anfragen an die Cloud Natural Language API stellen
  • Alle oben genannten APIs zusammen verwenden

Nächste Schritte