Anleitung zur Weberkennung

Zielgruppe

Diese Anleitung soll Ihnen die Anwendungsentwicklung mit dem Weberkennungs-Feature der Vision API erleichtern. Es wird angenommen, dass Sie mit grundlegenden Programmierkonstrukten und -techniken vertraut sind. Aber auch als Einsteiger in die Programmierarbeit sollten Sie dieser Anleitung gut folgen und im Anschluss unter Verwendung der Referenzdokumentation für die Cloud Vision API einfache Anwendungen erstellen können.

Sie werden in dieser Anleitung durch eine Vision API-Anwendung geführt. Darin erfahren Sie, wie Sie die Vision API bezüglich der Verwendung der Weberkennungsfunktion anrufen.

Vorbereitung

Überblick

In dieser Anleitung wird eine grundlegende Vision API-Anwendung erläutert, bei der eine Web detection-Anfrage verwendet wird. In der Web detection-Antwort wird das in der Anfrage gesendete Bild mit folgenden Elementen versehen:

  • aus dem Web abgerufene Labels
  • Website-URLs mit übereinstimmenden Bildern
  • URLs zu Webbildern, die teilweise oder vollständig mit dem Bild in der Anfrage übereinstimmen
  • URLs zu visuell ähnlichen Bildern

Codeliste

Wir empfehlen, beim Lesen des Codes die Python-Referenz für die Vision API hinzuzuziehen.

import argparse

from google.cloud import vision

def annotate(path: str) -> vision.WebDetection:
    """Returns web annotations given the path to an image.

    Args:
        path: path to the input image.

    Returns:
        An WebDetection object with relevant information of the
        image from the internet (i.e., the annotations).
    """
    client = vision.ImageAnnotatorClient()

    if path.startswith("http") or path.startswith("gs:"):
        image = vision.Image()
        image.source.image_uri = path

    else:
        with open(path, "rb") as image_file:
            content = image_file.read()

        image = vision.Image(content=content)

    web_detection = client.web_detection(image=image).web_detection

    return web_detection

def report(annotations: vision.WebDetection) -> None:
    """Prints detected features in the provided web annotations.

    Args:
        annotations: The web annotations (WebDetection object) from which
        the features should be parsed and printed.
    """
    if annotations.pages_with_matching_images:
        print(
            f"\n{len(annotations.pages_with_matching_images)} Pages with matching images retrieved"
        )

        for page in annotations.pages_with_matching_images:
            print(f"Url   : {page.url}")

    if annotations.full_matching_images:
        print(f"\n{len(annotations.full_matching_images)} Full Matches found: ")

        for image in annotations.full_matching_images:
            print(f"Url  : {image.url}")

    if annotations.partial_matching_images:
        print(f"\n{len(annotations.partial_matching_images)} Partial Matches found: ")

        for image in annotations.partial_matching_images:
            print(f"Url  : {image.url}")

    if annotations.web_entities:
        print(f"\n{len(annotations.web_entities)} Web entities found: ")

        for entity in annotations.web_entities:
            print(f"Score      : {entity.score}")
            print(f"Description: {entity.description}")

if __name__ == "__main__":
    parser = argparse.ArgumentParser(
        description=__doc__,
        formatter_class=argparse.RawDescriptionHelpFormatter,
    )
    path_help = str(
        "The image to detect, can be web URI, "
        "Google Cloud Storage, or path to local file."
    )
    parser.add_argument("image_url", help=path_help)
    args = parser.parse_args()

    report(annotate(args.image_url))

Diese einfache Anwendung führt folgende Aufgaben aus:

  • Importiert die für die Ausführung der Anwendung erforderlichen Bibliotheken
  • Übergibt einen Bildpfad als Argument an die Funktion main()
  • Führt mithilfe des Google Cloud API-Clients eine Weberkennung durch
  • Führt eine Schleife für die Antwort aus und druckt die Ergebnisse aus
  • Druckt eine Liste der Webentitäten mit Beschreibungen und Punktzahlen aus
  • Druckt eine Liste mit übereinstimmenden Seiten aus
  • Druckt eine Liste mit teilweise übereinstimmenden Bildern aus
  • Druckt eine Liste mit vollständig übereinstimmenden Bildern aus

Eingehendere Betrachtung

Bibliotheken importieren

import argparse

from google.cloud import vision

Importieren Sie Standardbibliotheken:

  • argparse, damit die Anwendung eingegebene Dateinamen als Argumente akzeptiert
  • io zum Lesen aus Dateien

Weitere Importe:

  • Die Klasse ImageAnnotatorClient in der Bibliothek google.cloud.vision für den Zugriff auf die Vision API
  • Das Modul types in der Bibliothek google.cloud.vision zum Erstellen von Anfragen

Anwendung ausführen

parser = argparse.ArgumentParser(
    description=__doc__,
    formatter_class=argparse.RawDescriptionHelpFormatter,
)
path_help = str(
    "The image to detect, can be web URI, "
    "Google Cloud Storage, or path to local file."
)
parser.add_argument("image_url", help=path_help)
args = parser.parse_args()

report(annotate(args.image_url))

Hier parsen Sie das übergebene Argument, das die URL des Webbildes angibt, und übergeben es an die Funktion main().

Bei der API authentifizieren

Damit Sie mit dem Vision API-Dienst kommunizieren können, müssen Sie den Dienst mit den zuvor abgerufenen Anmeldedaten authentifizieren. Innerhalb einer Anwendung erhalten Sie die Anmeldedaten am einfachsten über die Verwendung der Standardanmeldedaten für Anwendungen (Application Default Credentials, ADC). Die Clientbibliothek ruft die Anmeldedaten automatisch ab. Standardmäßig werden hierfür die Anmeldedaten von der Umgebungsvariable GOOGLE_APPLICATION_CREDENTIALS abgerufen. Diese sollte auf die JSON-Schlüsseldatei Ihres Dienstkontos verweisen. Weitere Informationen finden Sie unter Dienstkonto einrichten.

Anfrage erstellen

client = vision.ImageAnnotatorClient()

if path.startswith("http") or path.startswith("gs:"):
    image = vision.Image()
    image.source.image_uri = path

else:
    with open(path, "rb") as image_file:
        content = image_file.read()

    image = vision.Image(content=content)

web_detection = client.web_detection(image=image).web_detection

Sie können jetzt an den bereitstehenden Vision API-Dienst eine Anfrage stellen.

Dieses Code-Snippet:

  1. Erstellt die Instanz ImageAnnotatorClient als Client.
  2. Erstellt ein Image-Objekt aus einer lokalen Datei oder einem URI.
  3. Übergibt das Image-Objekt an die Methode web_detection des Clients.
  4. Sie gibt die Annotationen zurück.

Antwort drucken

if annotations.pages_with_matching_images:
    print(
        f"\n{len(annotations.pages_with_matching_images)} Pages with matching images retrieved"
    )

    for page in annotations.pages_with_matching_images:
        print(f"Url   : {page.url}")

if annotations.full_matching_images:
    print(f"\n{len(annotations.full_matching_images)} Full Matches found: ")

    for image in annotations.full_matching_images:
        print(f"Url  : {image.url}")

if annotations.partial_matching_images:
    print(f"\n{len(annotations.partial_matching_images)} Partial Matches found: ")

    for image in annotations.partial_matching_images:
        print(f"Url  : {image.url}")

if annotations.web_entities:
    print(f"\n{len(annotations.web_entities)} Web entities found: ")

    for entity in annotations.web_entities:
        print(f"Score      : {entity.score}")
        print(f"Description: {entity.description}")

Gehen Sie nach Abschluss des Vorgangs die WebDetection durch und drucken Sie die in der Anmerkung enthaltenen Entitäten und URLs. Im nächsten Abschnitt sehen Sie die beiden besten Ergebnisse jedes Anmerkungstyps.

Anwendung ausführen

Um die Anwendung auszuführen, übergeben Sie die Web-URL http://www.photos-public-domain.com/wp-content/uploads/2011/01/old-vw-bug-and-van.jpg des folgenden Autobildes.

Hier sehen Sie den Python-Befehl mit der eingereichten Web-URL des Autobildes, gefolgt von der Konsolenausgabe. Nach den aufgelisteten Elementen wird eine Punktzahl für die Relevanz angegeben. Die Punktzahlen werden nicht normalisiert und können nicht mit den Ergebnissen anderer Bildanfragen verglichen werden.

python web_detect.py "http://www.photos-public-domain.com/wp-content/uploads/2011/01/old-vw-bug-and-van.jpg"
5 Pages with matching images retrieved
Url   : http://www.photos-public-domain.com/2011/01/07/old-volkswagen-bug-and-van/
Url   : http://pix-hd.com/old+volkswagen+van+for+sale
...

2 Full Matches found:
Url  : http://www.photos-public-domain.com/wp-content/uploads/2011/01/old-vw-bug-and-van.jpg
Url  : http://www.wbwagen.com/media/old-volkswagen-bug-and-van-picture-free-photograph-photos-public_s_66f487042adad5a6.jpg

4 Partial Matches found:
Url  : http://www.photos-public-domain.com/wp-content/uploads/2011/01/old-vw-bug-and-van.jpg
Url  : http://www.wbwagen.com/media/old-vw-bug-and-vanjpg_s_ac343d7f041b5f8d.jpg
...

5 Web entities found:
Score      : 5.35028934479
Description: Volkswagen Beetle
Score      : 1.43998003006
Description: Volkswagen
Score      : 0.828279972076
Description: Volkswagen Type 2
Score      : 0.75271999836
Description: Van
Score      : 0.690039992332
Description: Car

Das wars! Sie haben die Weberkennung mit der Vision API ausgeführt.