Zu Python-Clientbibliothek v0.25.1 migrieren

In der Python-Clientbibliothek v0.25.1 wurden gegenüber früheren Versionen einige strukturelle Änderungen durchgeführt. Diese Änderungen können so zusammengefasst werden:

  • Konsolidierung der Module in eine kleinere Anzahl von Typen

  • Ersatz von nicht typisierten Parametern durch stark typisierte Klassen und Aufzählungen

Dieses Thema enthält Einzelheiten zu den Änderungen, die Sie in Ihrem Python-Code für die Cloud Vision API-Clientbibliotheken vornehmen müssen, um die Python-Clientbibliothek v0.25.1 verwenden zu können.

Frühere Versionen der Clientbibliothek ausführen

Sie sind nicht verpflichtet, Ihre Python-Clientbibliothek auf v0.25.1 zu aktualisieren. Wenn Sie weiterhin eine frühere Version der Python-Clientbibliothek verwenden und für Ihren Code keine Migration vornehmen möchten, geben Sie die Version der von Ihrer Anwendung verwendeten Python-Clientbibliothek an. Bearbeiten Sie zum Angeben einer bestimmten Bibliotheksversion die Datei requirements.txt so:

google-cloud-vision==0.25

Entfernte Module

Die folgenden Module wurden aus dem Paket Python-Clientbibliothek v0.25.1 entfernt.

  • google.cloud.vision.annotations

  • google.cloud.vision.batch

  • google.cloud.vision.client

  • google.cloud.vision.color

  • google.cloud.vision.crop_hint

  • google.cloud.vision.entity

  • google.cloud.vision.face

  • google.cloud.vision.feature

  • google.cloud.vision.geometry

  • google.cloud.vision.image

  • google.cloud.vision.likelihood

  • google.cloud.vision.safe_search

  • google.cloud.vision.text

  • google.cloud.vision.web

Erforderliche Codeänderungen

Importe

Fügen Sie das neue Modul google.cloud.vision.types ein, um auf die neuen Typen in der Python-Clientbibliothek v0.25.1 zuzugreifen.

Das Modul types enthält die neuen Klassen für das Erstellen von Anfragen, z. B. types.Image.

from google.cloud import vision

Außerdem enthält das neue Modul google.cloud.vision.enums die Aufzählungen, die für die Analyse und das Verständnis von API-Antworten nützlich sind, z. B. enums.Likelihood.UNLIKELY und enums.FaceAnnotation.Landmark.Type.LEFT_EYE.

Client erstellen

Die Klasse Client wurde durch die Klasse ImageAnnotatorClient ersetzt. Ersetzen Sie Verweise auf die Klasse Client durch ImageAnnotatorClient.

Frühere Versionen der Clientbibliotheken:

old_client = vision.Client()

Python-Clientbibliothek v0.25.1:

client = vision.ImageAnnotatorClient()

Objekte zur Darstellung von Bildinhalten erstellen

Verwenden Sie die neue Image-Klasse, um Bildinhalte in einer lokalen Datei, aus einem Google Cloud Storage-URI oder einem Web-URI zu identifizieren.

Objekte erstellen, die Bildinhalte aus einer lokalen Datei darstellen

Das folgende Beispiel zeigt die neue Art der Darstellung von Bildinhalten aus einer lokalen Datei.

Frühere Versionen der Clientbibliotheken:

with io.open(file_name, 'rb') as image_file:
    content = image_file.read()

image = old_client.image(content=content)

Python-Clientbibliothek v0.25.1:

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

image = vision.Image(content=content)

Objekte erstellen, die Bildinhalte aus einem URI darstellen

Das folgende Beispiel zeigt die neue Darstellung von Bildinhalten aus einem Google Cloud Storage-URI oder einem Web-URI. uri ist der URI einer Bilddatei in Google Cloud Storage oder im Web.

Frühere Versionen der Clientbibliotheken:

image = old_client.image(source_uri=uri)

Python-Clientbibliothek v0.25.1:

image = vision.Image()
image.source.image_uri = uri

Anfragen stellen und Antworten verarbeiten

Bei der Python-Clientbibliothek v.0.25.1 gehören die API-Methoden, z. B. face_detection, zum Objekt ImageAnnotatorClient und nicht zu den Objekten des Typs Image.

Für verschiedene Methoden werden wie unten erläutert unterschiedliche Werte zurückgegeben.

Speziell die Eckpunkte von Begrenzungsrahmen werden jetzt in bounding_poly.vertices anstatt in bounds.vertices gespeichert. Die Koordinaten jedes Eckpunkts werden in vertex.x und vertex.y anstatt in vertex.x_coordinate und vertex.y_coordinate gespeichert.

Die Änderung der Begrenzungsrahmen wirkt sich auf face_detection, logo_detection, text_detection, document_text_detection und crop_hints aus.

Anfrage für eine Gesichtserkennung stellen und Antwort verarbeiten

Wahrscheinlichkeiten von Gesichtsausdrücken werden jetzt als Aufzählungen in face.surprise_likelihood anstatt in face.emotions.surprise gespeichert. Zur Wiederherstellung von Wahrscheinlichkeitslabels importieren Sie google.cloud.vision.enums.Likelihood.

Frühere Versionen der Clientbibliotheken:

with io.open(file_name, 'rb') as image_file:
    content = image_file.read()

image = old_client.image(content=content)

faces = image.detect_faces()

for face in faces:
    print('anger: {}'.format(face.emotions.anger))
    print('joy: {}'.format(face.emotions.joy))
    print('surprise: {}'.format(face.emotions.surprise))

    vertices = (['({},{})'.format(bound.x_coordinate, bound.y_coordinate)
                for bound in face.bounds.vertices])

    print('face bounds: {}'.format(','.join(vertices)))

Python-Clientbibliothek v0.25.1:

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

image = vision.Image(content=content)

response = client.face_detection(image=image)
faces = response.face_annotations

# Names of likelihood from google.cloud.vision.enums
likelihood_name = (
    "UNKNOWN",
    "VERY_UNLIKELY",
    "UNLIKELY",
    "POSSIBLE",
    "LIKELY",
    "VERY_LIKELY",
)
print("Faces:")

for face in faces:
    print(f"anger: {likelihood_name[face.anger_likelihood]}")
    print(f"joy: {likelihood_name[face.joy_likelihood]}")
    print(f"surprise: {likelihood_name[face.surprise_likelihood]}")

    vertices = [
        f"({vertex.x},{vertex.y})" for vertex in face.bounding_poly.vertices
    ]

    print("face bounds: {}".format(",".join(vertices)))

if response.error.message:
    raise Exception(
        "{}\nFor more info on error messages, check: "
        "https://cloud.google.com/apis/design/errors".format(response.error.message)
    )

Anfrage für eine Labelerkennung stellen und Antwort verarbeiten

Frühere Versionen der Clientbibliotheken:

with io.open(file_name, 'rb') as image_file:
    content = image_file.read()

image = old_client.image(content=content)

labels = image.detect_labels()

for label in labels:
    print(label.description)

Python-Clientbibliothek v0.25.1:

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

image = vision.Image(content=content)

response = client.label_detection(image=image)
labels = response.label_annotations
print("Labels:")

for label in labels:
    print(label.description)

if response.error.message:
    raise Exception(
        "{}\nFor more info on error messages, check: "
        "https://cloud.google.com/apis/design/errors".format(response.error.message)
    )

Anfrage zur Erkennung von Sehenswürdigkeiten stellen und Antwort verarbeiten

Frühere Versionen der Clientbibliotheken:

Die Längen- und Breitengrade der Standorte von Sehenswürdigkeiten werden jetzt in location.lat_lng.latitude und location.lat_lng.longitude anstatt in location.latitude und location.longitude gespeichert.

with io.open(file_name, 'rb') as image_file:
    content = image_file.read()

image = old_client.image(content=content)

landmarks = image.detect_landmarks()

for landmark in landmarks:
    print(landmark.description, landmark.score)
    for location in landmark.locations:
        print('Latitude'.format(location.latitude))
        print('Longitude'.format(location.longitude))

Python-Clientbibliothek v0.25.1:

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

image = vision.Image(content=content)

response = client.landmark_detection(image=image)
landmarks = response.landmark_annotations
print("Landmarks:")

for landmark in landmarks:
    print(landmark.description)
    for location in landmark.locations:
        lat_lng = location.lat_lng
        print(f"Latitude {lat_lng.latitude}")
        print(f"Longitude {lat_lng.longitude}")

if response.error.message:
    raise Exception(
        "{}\nFor more info on error messages, check: "
        "https://cloud.google.com/apis/design/errors".format(response.error.message)
    )

Anfrage zur Logoerkennung stellen und Antwort verarbeiten

Frühere Versionen der Clientbibliotheken:

with io.open(file_name, 'rb') as image_file:
    content = image_file.read()

image = old_client.image(content=content)

logos = image.detect_logos()

for logo in logos:
    print(logo.description, logo.score)

Python-Clientbibliothek v0.25.1:

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

image = vision.Image(content=content)

response = client.logo_detection(image=image)
logos = response.logo_annotations
print("Logos:")

for logo in logos:
    print(logo.description)

if response.error.message:
    raise Exception(
        "{}\nFor more info on error messages, check: "
        "https://cloud.google.com/apis/design/errors".format(response.error.message)
    )

Anfrage zur SafeSearch-Erkennung stellen und Antwort verarbeiten

SafeSearch-Wahrscheinlichkeiten werden jetzt als Aufzählungen zurückgegeben. Zur Wiederherstellung von Wahrscheinlichkeitslabels importieren Sie google.cloud.vision.enums.Likelihood.

Frühere Versionen der Clientbibliotheken:

with io.open(file_name, 'rb') as image_file:
    content = image_file.read()

image = old_client.image(content=content)

safe = image.detect_safe_search()
print('Safe search:')
print('adult: {}'.format(safe.adult))
print('medical: {}'.format(safe.medical))
print('spoofed: {}'.format(safe.spoof))
print('violence: {}'.format(safe.violence))

Python-Clientbibliothek v0.25.1:

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

image = vision.Image(content=content)

response = client.safe_search_detection(image=image)
safe = response.safe_search_annotation

# Names of likelihood from google.cloud.vision.enums
likelihood_name = (
    "UNKNOWN",
    "VERY_UNLIKELY",
    "UNLIKELY",
    "POSSIBLE",
    "LIKELY",
    "VERY_LIKELY",
)
print("Safe search:")

print(f"adult: {likelihood_name[safe.adult]}")
print(f"medical: {likelihood_name[safe.medical]}")
print(f"spoofed: {likelihood_name[safe.spoof]}")
print(f"violence: {likelihood_name[safe.violence]}")
print(f"racy: {likelihood_name[safe.racy]}")

if response.error.message:
    raise Exception(
        "{}\nFor more info on error messages, check: "
        "https://cloud.google.com/apis/design/errors".format(response.error.message)
    )

Anfrage zur Texterkennung stellen und Antwort verarbeiten

Frühere Versionen der Clientbibliotheken:

with io.open(file_name, 'rb') as image_file:
    content = image_file.read()

image = old_client.image(content=content)

texts = image.detect_text()

for text in texts:
    print('\n"{}"'.format(text.description))

    vertices = (['({},{})'.format(bound.x_coordinate, bound.y_coordinate)
                for bound in text.bounds.vertices])

    print('bounds: {}'.format(','.join(vertices)))

Python-Clientbibliothek v0.25.1:

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

image = vision.Image(content=content)

response = client.text_detection(image=image)
texts = response.text_annotations
print("Texts:")

for text in texts:
    print(f'\n"{text.description}"')

    vertices = [
        f"({vertex.x},{vertex.y})" for vertex in text.bounding_poly.vertices
    ]

    print("bounds: {}".format(",".join(vertices)))

if response.error.message:
    raise Exception(
        "{}\nFor more info on error messages, check: "
        "https://cloud.google.com/apis/design/errors".format(response.error.message)
    )

Anfrage zur Dokumenttexterkennung stellen und Antwort verarbeiten

Frühere Versionen der Clientbibliotheken:

with io.open(file_name, 'rb') as image_file:
    content = image_file.read()

image = old_client.image(content=content)

document = image.detect_full_text()

for page in document.pages:
    for block in page.blocks:
        block_words = []
        for paragraph in block.paragraphs:
            block_words.extend(paragraph.words)

        block_symbols = []
        for word in block_words:
            block_symbols.extend(word.symbols)

        block_text = ''
        for symbol in block_symbols:
            block_text = block_text + symbol.text

        print('Block Content: {}'.format(block_text))
        print('Block Bounds:\n {}'.format(block.bounding_box))

Python-Clientbibliothek v0.25.1:

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

image = vision.Image(content=content)

response = client.document_text_detection(image=image)

for page in response.full_text_annotation.pages:
    for block in page.blocks:
        print(f"\nBlock confidence: {block.confidence}\n")

        for paragraph in block.paragraphs:
            print("Paragraph confidence: {}".format(paragraph.confidence))

            for word in paragraph.words:
                word_text = "".join([symbol.text for symbol in word.symbols])
                print(
                    "Word text: {} (confidence: {})".format(
                        word_text, word.confidence
                    )
                )

                for symbol in word.symbols:
                    print(
                        "\tSymbol: {} (confidence: {})".format(
                            symbol.text, symbol.confidence
                        )
                    )

if response.error.message:
    raise Exception(
        "{}\nFor more info on error messages, check: "
        "https://cloud.google.com/apis/design/errors".format(response.error.message)
    )

Anfrage zur Erkennung von Bildeigenschaften stellen und Antwort verarbeiten

Informationen zu dominanten Farben werden jetzt in props.dominant_colors.colors anstatt in props.colors gespeichert.

Frühere Versionen der Clientbibliotheken:

with io.open(file_name, 'rb') as image_file:
    content = image_file.read()

image = old_client.image(content=content)

props = image.detect_properties()

for color in props.colors:
    print('fraction: {}'.format(color.pixel_fraction))
    print('\tr: {}'.format(color.color.red))
    print('\tg: {}'.format(color.color.green))
    print('\tb: {}'.format(color.color.blue))
    print('\ta: {}'.format(color.color.alpha))

Python-Clientbibliothek v0.25.1:

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

image = vision.Image(content=content)

response = client.image_properties(image=image)
props = response.image_properties_annotation
print("Properties:")

for color in props.dominant_colors.colors:
    print(f"fraction: {color.pixel_fraction}")
    print(f"\tr: {color.color.red}")
    print(f"\tg: {color.color.green}")
    print(f"\tb: {color.color.blue}")
    print(f"\ta: {color.color.alpha}")

if response.error.message:
    raise Exception(
        "{}\nFor more info on error messages, check: "
        "https://cloud.google.com/apis/design/errors".format(response.error.message)
    )

Anfrage zur Weberkennung stellen und Antwort verarbeiten

Frühere Versionen der Clientbibliotheken:

with io.open(file_name, 'rb') as image_file:
    content = image_file.read()

image = old_client.image(content=content)

notes = image.detect_web()

if notes.pages_with_matching_images:
    print('\n{} Pages with matching images retrieved')

    for page in notes.pages_with_matching_images:
        print('Score : {}'.format(page.score))
        print('Url   : {}'.format(page.url))

if notes.full_matching_images:
    print ('\n{} Full Matches found: '.format(
           len(notes.full_matching_images)))

    for image in notes.full_matching_images:
        print('Score:  {}'.format(image.score))
        print('Url  : {}'.format(image.url))

if notes.partial_matching_images:
    print ('\n{} Partial Matches found: '.format(
           len(notes.partial_matching_images)))

    for image in notes.partial_matching_images:
        print('Score: {}'.format(image.score))
        print('Url  : {}'.format(image.url))

if notes.web_entities:
    print ('\n{} Web entities found: '.format(len(notes.web_entities)))

    for entity in notes.web_entities:
        print('Score      : {}'.format(entity.score))
        print('Description: {}'.format(entity.description))

Python-Clientbibliothek v0.25.1:

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

image = vision.Image(content=content)

response = client.web_detection(image=image)
annotations = response.web_detection

if annotations.best_guess_labels:
    for label in annotations.best_guess_labels:
        print(f"\nBest guess label: {label.label}")

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

    for page in annotations.pages_with_matching_images:
        print(f"\n\tPage url   : {page.url}")

        if page.full_matching_images:
            print(
                "\t{} Full Matches found: ".format(len(page.full_matching_images))
            )

            for image in page.full_matching_images:
                print(f"\t\tImage url  : {image.url}")

        if page.partial_matching_images:
            print(
                "\t{} Partial Matches found: ".format(
                    len(page.partial_matching_images)
                )
            )

            for image in page.partial_matching_images:
                print(f"\t\tImage url  : {image.url}")

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

    for entity in annotations.web_entities:
        print(f"\n\tScore      : {entity.score}")
        print(f"\tDescription: {entity.description}")

if annotations.visually_similar_images:
    print(
        "\n{} visually similar images found:\n".format(
            len(annotations.visually_similar_images)
        )
    )

    for image in annotations.visually_similar_images:
        print(f"\tImage url    : {image.url}")

if response.error.message:
    raise Exception(
        "{}\nFor more info on error messages, check: "
        "https://cloud.google.com/apis/design/errors".format(response.error.message)
    )

Anfrage für Zuschneidehinweise stellen und Antwort verarbeiten

Frühere Versionen der Clientbibliotheken:

with io.open(file_name, 'rb') as image_file:
    content = image_file.read()

image = old_client.image(content=content)

hints = image.detect_crop_hints(aspect_ratios=[1.77])

for n, hint in enumerate(hints):
    print('\nCrop Hint: {}'.format(n))

    vertices = (['({},{})'.format(bound.x_coordinate, bound.y_coordinate)
                for bound in hint.bounds.vertices])

    print('bounds: {}'.format(','.join(vertices)))

Python-Clientbibliothek v0.25.1:

with open(path, "rb") as image_file:
    content = image_file.read()
image = vision.Image(content=content)

crop_hints_params = vision.CropHintsParams(aspect_ratios=[1.77])
image_context = vision.ImageContext(crop_hints_params=crop_hints_params)

response = client.crop_hints(image=image, image_context=image_context)
hints = response.crop_hints_annotation.crop_hints

for n, hint in enumerate(hints):
    print(f"\nCrop Hint: {n}")

    vertices = [
        f"({vertex.x},{vertex.y})" for vertex in hint.bounding_poly.vertices
    ]

    print("bounds: {}".format(",".join(vertices)))

if response.error.message:
    raise Exception(
        "{}\nFor more info on error messages, check: "
        "https://cloud.google.com/apis/design/errors".format(response.error.message)
    )

Die Seitenverhältnisse müssen über CropHintsParams und ImageContext übergeben werden.