Vision API mit Python verwenden

1. Übersicht

5ab7829fc22b21c4.png

Mit der Vision API können Entwickler auf einfache Weise Funktionen zur visuellen Erkennung in Anwendungen einbinden. Hierzu zählen die Erkennung von Bildlabels, Gesichtern und Sehenswürdigkeiten, die optische Zeichenerkennung (Optical Character Recognition, OCR) sowie die Kennzeichnung expliziter Inhalte mit Tags.

In dieser Anleitung konzentrieren Sie sich auf die Verwendung der Vision API mit Python.

Lerninhalte

  • Umgebung einrichten
  • Labelerkennung durchführen
  • Texterkennung durchführen
  • So führen Sie die Landmark-Erkennung durch
  • Gesichtserkennung durchführen
  • Objekterkennung durchführen

Voraussetzungen

  • Ein Google Cloud-Projekt
  • Ein Browser, z. B. Chrome oder Firefox
  • Python-Vorkenntnisse

Umfrage

Wie werden Sie diese Anleitung verwenden?

Nur lesen Lesen und Übungen durchführen

Wie würden Sie Ihre Erfahrung mit Python bewerten?

Anfänger Mittelstufe Fortgeschrittene

Wie würden Sie Ihre Erfahrungen mit Google Cloud-Diensten bewerten?

Anfänger Mittelstufe Fortgeschritten

2. Einrichtung und Anforderungen

Umgebung zum selbstbestimmten Lernen einrichten

  1. Melden Sie sich in der Google 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 eines erstellen.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Der Projektname ist der Anzeigename für die Teilnehmer dieses Projekts. Es handelt sich um einen String, der nicht von Google APIs verwendet wird. Sie können sie jederzeit aktualisieren.
  • Die Projekt-ID ist für alle Google Cloud-Projekte eindeutig und unveränderlich (kann nach dem Festlegen nicht mehr geändert werden). In der Cloud Console wird automatisch ein eindeutiger String generiert. Normalerweise ist es nicht wichtig, wie dieser String aussieht. In den meisten Codelabs müssen Sie auf Ihre Projekt-ID verweisen (in der Regel als PROJECT_ID angegeben). Wenn Ihnen die generierte ID nicht gefällt, können Sie eine andere zufällige ID generieren. Alternativ können Sie es mit einem eigenen Namen versuchen und sehen, ob er verfügbar ist. Sie kann nach diesem Schritt nicht mehr geändert werden und bleibt für die Dauer des Projekts bestehen.
  • Zur Information: Es gibt einen dritten Wert, die Projektnummer, die von einigen APIs verwendet wird. Weitere Informationen zu diesen drei Werten
  1. Als Nächstes müssen Sie die Abrechnung in der Cloud Console aktivieren, um Cloud-Ressourcen/-APIs zu verwenden. Die Durchführung dieses Codelabs kostet wenig oder gar nichts. Wenn Sie Ressourcen herunterfahren möchten, um Kosten zu vermeiden, die über diese Anleitung hinausgehen, können Sie die erstellten Ressourcen oder das Projekt löschen. Neue Google Cloud-Nutzer können am kostenlosen Testzeitraum mit einem Guthaben von 300$ teilnehmen.

Cloud Shell starten

Während Sie Google Cloud von Ihrem Laptop aus per Fernzugriff nutzen können, wird in diesem Codelab Cloud Shell verwendet, eine Befehlszeilenumgebung, die in der Cloud ausgeführt wird.

Cloud Shell aktivieren

  1. Klicken Sie in der Cloud Console auf Cloud Shell aktivieren 853e55310c205094.png.

55efc1aaa7a4d3ad.png

Wenn Sie die Cloud Shell zum ersten Mal starten, wird ein Fenster mit einer Beschreibung eingeblendet. Klicken Sie in diesem Fall einfach auf Weiter.

9c92662c6a846a5c.png

Das Herstellen der Verbindung mit der Cloud Shell sollte nur wenige Augenblicke dauern.

9f0e51b578fecce5.png

Auf dieser virtuellen Maschine sind alle erforderlichen Entwicklungstools installiert. Sie bietet ein Basisverzeichnis mit 5 GB nichtflüchtigem Speicher und läuft in Google Cloud, was die Netzwerkleistung und Authentifizierung erheblich verbessert. Die meisten, wenn nicht sogar alle Aufgaben in diesem Codelab können mit einem Browser erledigt werden.

Sobald die Verbindung mit der Cloud Shell hergestellt ist, sehen Sie, dass Sie authentifiziert sind und für das Projekt Ihre Projekt-ID eingestellt ist.

  1. Führen Sie in der Cloud Shell den folgenden Befehl aus, um zu prüfen, ob Sie authentifiziert sind:
gcloud auth list

Befehlsausgabe

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

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. Führen Sie den folgenden Befehl in Cloud Shell aus, um zu bestätigen, dass der gcloud-Befehl Ihr Projekt kennt:
gcloud config list project

Befehlsausgabe

[core]
project = <PROJECT_ID>

Ist dies nicht der Fall, können Sie die Einstellung mit diesem Befehl vornehmen:

gcloud config set project <PROJECT_ID>

Befehlsausgabe

Updated property [core/project].

3. Umgebung einrichten

Bevor Sie die Vision API verwenden können, müssen Sie sie aktivieren. Führen Sie dazu den folgenden Befehl in Cloud Shell aus:

gcloud services enable vision.googleapis.com

Auf dem Bildschirm sollte Folgendes zu sehen sein:

Operation "operations/..." finished successfully.

Jetzt können Sie die Vision API verwenden.

Wechseln Sie zu Ihrem Basisverzeichnis:

cd ~

Erstellen Sie eine virtuelle Python-Umgebung, um die Abhängigkeiten zu isolieren:

virtualenv venv-vision

Aktivieren Sie die virtuelle Umgebung:

source venv-vision/bin/activate

Installieren Sie IPython und die Vision API-Clientbibliothek:

pip install ipython google-cloud-vision

Auf dem Bildschirm sollte Folgendes zu sehen sein:

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

Jetzt können Sie die Vision API-Clientbibliothek verwenden.

In den nächsten Schritten verwenden Sie einen interaktiven Python-Interpreter namens IPython, den Sie im vorherigen Schritt installiert haben. Starten Sie eine Sitzung, indem Sie ipython in Cloud Shell ausführen:

ipython

Auf dem Bildschirm sollte Folgendes zu sehen sein:

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]:

Sie können Ihre erste Anfrage stellen…

4. Labelerkennung durchführen

Eine der Kernfunktionen der Vision API ist die Identifizierung von Objekten oder Entitäten in einem Bild, auch als Labelannotation bezeichnet. Bei der Labelerkennung werden allgemeine Objekte, Orte, Aktivitäten, Tierarten, Produkte und vieles mehr identifiziert. Die Vision API nimmt ein Eingabebild entgegen und gibt die wahrscheinlichsten Labels zurück, die auf dieses Bild zutreffen. Es werden die am besten passenden Labels zusammen mit einem Konfidenzwert für die Übereinstimmung mit dem Bild zurückgegeben.

In diesem Beispiel führen Sie die Labelerkennung für ein Bild (mit freundlicher Genehmigung von Alex Knight) von Setagaya, einem beliebten Stadtteil in Tokio, durch:

756f97f0b1e46c38.jpeg

Kopieren Sie den folgenden Code in Ihre IPython-Sitzung:

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=" | ",
        )
        

Sehen Sie sich den Code an und achten Sie darauf, wie mit der annotate_image-Clientbibliotheksmethode ein Bild für eine Reihe von angegebenen Funktionen analysiert wird.

Senden Sie eine Anfrage mit dem LABEL_DETECTION-Feature:

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)

Sie sollten die folgende Ausgabe erhalten:

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

So werden die Ergebnisse in der Onlinedemo präsentiert:

2191b0425c9c148f.png

Zusammenfassung

In diesem Schritt haben Sie die Labelerkennung für ein Bild durchgeführt und die wahrscheinlichsten Labels für dieses Bild angezeigt. Weitere Informationen zur Labelerkennung

5. Texterkennung durchführen

Bei der Texterkennung wird eine optische Zeichenerkennung (Optical Character Recognition, OCR) durchgeführt. Sie erkennt und extrahiert Text in einem Bild und unterstützt eine Vielzahl von Sprachen. Die Funktion beinhaltet auch eine automatische Spracherkennung.

In diesem Beispiel führen Sie die Texterkennung für ein Bild eines Verkehrsschilds durch:

4dedd3fcfd9ad99b.jpeg

Kopieren Sie den folgenden Code in Ihre IPython-Sitzung:

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=" | ",
        )
        

Senden Sie eine Anfrage mit dem TEXT_DETECTION-Feature:

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)

Sie sollten die folgende Ausgabe erhalten:

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

So werden die Ergebnisse in der Onlinedemo präsentiert:

9c70fbce871c5fe5.png

Zusammenfassung

In diesem Schritt haben Sie die Texterkennung für ein Bild durchgeführt und den erkannten Text aus dem Bild angezeigt. Weitere Informationen zur Texterkennung

6. Sehenswürdigkeiten erkennen

Mit der Funktion zur Erkennung von Sehenswürdigkeiten können Sie bekannte natürliche oder von Menschen erschaffene Strukturen in einem Bild erkennen.

In diesem Beispiel führen Sie die Erkennung von Sehenswürdigkeiten in einem Bild des Eiffelturms durch (mit freundlicher Genehmigung von John Towner):

fb7801e36884b875.jpeg

Kopieren Sie den folgenden Code in Ihre IPython-Sitzung:

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=" | ",
        )
        

Senden Sie eine Anfrage mit dem LANDMARK_DETECTION-Feature:

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)

Sie sollten die folgende Ausgabe erhalten:

================================================================================
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

So werden die Ergebnisse in der Onlinedemo präsentiert:

2788697365670985.png

Zusammenfassung

In diesem Schritt haben Sie die Sehenswürdigkeit „Eiffelturm“ auf einem Bild erkannt. Weitere Informationen zur Markierungserkennung

7. Gesichtserkennung durchführen

Mithilfe der Gesichtserkennung können Sie in einem Bild mehrere Gesichter und die damit verknüpften wichtigsten Gesichtsmerkmale wie den Gesichtsausdruck oder Kopfbedeckungen erkennen.

In diesem Beispiel erkennen Sie Gesichter auf dem folgenden Bild (mit freundlicher Genehmigung von Himanshu Singh Gurjar):

58c578ece524cf32.jpeg

Kopieren Sie den folgenden Code in Ihre IPython-Sitzung:

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)
        

Senden Sie eine Anfrage mit dem FACE_DETECTION-Feature:

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)

Sie sollten die folgende Ausgabe erhalten:

================================================================================
# 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
--------------------------------------------------------------------------------

So werden die Ergebnisse in der Onlinedemo präsentiert:

cbb7f59299651b83.png

Zusammenfassung

In diesem Schritt konnten Sie die Gesichtserkennung durchführen. Weitere Informationen zur Gesichtserkennung

8. Objekterkennung durchführen

In diesem Beispiel führen Sie die Objekterkennung für dasselbe vorherige Bild (mit freundlicher Genehmigung von Alex Knight) von Setagaya durch:

756f97f0b1e46c38.jpeg

Kopieren Sie den folgenden Code in Ihre IPython-Sitzung:

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=" | ",
        )
        

Senden Sie eine Anfrage mit dem OBJECT_LOCALIZATION-Feature:

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)

Sie sollten die folgende Ausgabe erhalten:

================================================================================
 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)

So werden die Ergebnisse in der Onlinedemo präsentiert:

e1c2ca803d874a6b.png

Zusammenfassung

In diesem Schritt haben Sie die Objekterkennung durchgeführt. Weitere Informationen zur Objekterkennung

9. Mehrere Funktionen

Sie haben gesehen, wie Sie einige Funktionen der Vision API verwenden. Es gibt jedoch noch viele weitere und Sie können mehrere Funktionen in einer einzigen Anfrage anfordern.

So können Sie alle Statistiken auf einmal abrufen:

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)

Es gibt noch weitere Möglichkeiten, z. B. die Erkennung für einen Batch von Bildern synchron oder asynchron auszuführen. Alle Anleitungen ansehen

10. Glückwunsch!

5ab7829fc22b21c4.png

Sie haben gelernt, wie Sie die Vision API mit Python verwenden, und einige Bilderkennungsfunktionen getestet.

Bereinigen

So bereinigen Sie Ihre Entwicklungsumgebung über Cloud Shell:

  • Wenn Sie sich noch in Ihrer IPython-Sitzung befinden, kehren Sie zur Shell zurück: exit
  • Beenden Sie die Verwendung der virtuellen Python-Umgebung: deactivate
  • Löschen Sie den Ordner für die virtuelle Umgebung: cd ~ ; rm -rf ./venv-vision

So löschen Sie Ihr Google Cloud-Projekt über Cloud Shell:

  • Rufen Sie Ihre aktuelle Projekt-ID ab: PROJECT_ID=$(gcloud config get-value core/project)
  • Prüfen Sie, ob dies das Projekt ist, das Sie löschen möchten: echo $PROJECT_ID
  • Projekt löschen: gcloud projects delete $PROJECT_ID

Weitere Informationen

Lizenz

Dieser Text ist mit einer Creative Commons Attribution 2.0 Generic License lizenziert.