Migrar a la biblioteca cliente de Python v0.25.1

La Biblioteca cliente para Python v0.25.1 incluye algunos cambios significativos con respecto al diseño anterior de las bibliotecas cliente. Estos cambios se pueden resumir de la siguiente manera:

  • Consolidación de módulos en menos tipos

  • Reemplazo de parámetros sin tipo por clases y enumeraciones con tipos sólidos

En este tema, se proporciona información sobre los cambios que deberás realizar a tu código de Python para las bibliotecas cliente de la API de Cloud Vision a fin de usar la biblioteca cliente de Python v0.25.1.

Ejecutar versiones anteriores de la biblioteca cliente

No es necesario que actualices tu biblioteca cliente de Python a la versión v0.25.1. Si deseas seguir usando una versión anterior y no quieres migrar tu código, debes especificar la versión de la biblioteca cliente de Python que usa tu app. Para indicar una versión de biblioteca específica, edita el archivo requirements.txt como se muestra a continuación:

google-cloud-vision==0.25

Módulos quitados

Los siguientes módulos se quitaron del paquete de la Biblioteca cliente de Python v0.25.1.

  • 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

Cambios de código obligatorios

Importaciones

Incluye el nuevo módulo google.cloud.vision.types para acceder a los tipos incorporados en la Biblioteca cliente de Python v0.25.1.

El módulo types contiene las clases nuevas requeridas para crear solicitudes, como types.Image.

from google.cloud import vision
from google.cloud.vision import types

Además, el nuevo módulo google.cloud.vision.enums contiene las enumeraciones útiles para analizar y comprender respuestas de la API, como enums.Likelihood.UNLIKELY y enums.FaceAnnotation.Landmark.Type.LEFT_EYE.

Crea un cliente

La clase Client se reemplazó por la clase ImageAnnotatorClient. Reemplaza las referencias a la clase Client por ImageAnnotatorClient.

Versiones anteriores de las bibliotecas cliente:

old_client = vision.Client()

Biblioteca cliente de Python v0.25.1:

client = vision.ImageAnnotatorClient()

Construir objetos que representen el contexto de la imagen

Para identificar el contenido de un archivo local desde un URI de Google Cloud Storage o desde un URI web, usa la nueva clase Image.

Construir objetos que representen el contenido de la imagen de un archivo local

En el siguiente ejemplo, se muestra la nueva forma de representar el contenido de una imagen de un archivo local.

Versiones anteriores de las bibliotecas cliente:

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

image = old_client.image(content=content)

Biblioteca cliente de Python v0.25.1:

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

image = vision.types.Image(content=content)

Construir objetos que representen el contenido de la imagen de un URI

En el siguiente ejemplo, se muestra la nueva forma de representar el contenido de la imagen de un URI de Google Cloud Storage o de un URI web. uri es el URI de un archivo de imagen en Google Cloud Storage o en la Web.

Versiones anteriores de las bibliotecas cliente:

image = old_client.image(source_uri=uri)

Biblioteca cliente de Python v0.25.1:

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

Realizar solicitudes y procesar respuestas

Con la Biblioteca cliente de Python v.0.25.1, los métodos de la API como face_detection pertenecen al objeto ImageAnnotatorClient y no a los objetos Image.

Los valores que se muestran varían para muchos métodos, como se explica a continuación.

En particular, los vértices del cuadro de límite ahora se almacenan en bounding_poly.vertices y no en bounds.vertices. Las coordenadas de cada vértice se almacenan en vertex.x y vertex.y, no en vertex.x_coordinate ni vertex.y_coordinate.

El cambio del cuadro de límite afecta a face_detection, logo_detection, text_detection, document_text_detection y crop_hints.

Realizar una solicitud de detección de rostro y procesar la respuesta

Las probabilidades de emociones ahora se muestran como enumeraciones almacenadas en face.surprise_likelihood y no en face.emotions.surprise. Los nombres de etiquetas de probabilidades se pueden recuperar mediante la importación de google.cloud.vision.enums.Likelihood.

Versiones anteriores de las bibliotecas cliente:

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

Biblioteca cliente de Python v0.25.1:

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

image = vision.types.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('anger: {}'.format(likelihood_name[face.anger_likelihood]))
    print('joy: {}'.format(likelihood_name[face.joy_likelihood]))
    print('surprise: {}'.format(likelihood_name[face.surprise_likelihood]))

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

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

Realizar una solicitud de detección de etiquetas y procesar la respuesta

Versiones anteriores de las bibliotecas cliente:

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)

Biblioteca cliente de Python v0.25.1:

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

image = vision.types.Image(content=content)

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

for label in labels:
    print(label.description)

Realizar una solicitud de detección de puntos de referencia y procesar la respuesta

Versiones anteriores de las bibliotecas cliente:

La latitud y longitud de las ubicaciones de puntos de referencia ahora se almacenan en location.lat_lng.latitude y location.lat_lng.longitude, y no en location.latitude ni location.longitude.

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

Biblioteca cliente de Python v0.25.1:

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

image = vision.types.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('Latitude {}'.format(lat_lng.latitude))
        print('Longitude {}'.format(lat_lng.longitude))

Realizar una solicitud de detección de logotipos y procesar la respuesta

Versiones anteriores de las bibliotecas cliente:

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)

Biblioteca cliente de Python v0.25.1:

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

image = vision.types.Image(content=content)

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

for logo in logos:
    print(logo.description)

Realizar una solicitud de búsqueda segura y procesar la respuesta

Las probabilidades de búsqueda segura ahora se muestran como enumeraciones. Los nombres de etiquetas de probabilidades se pueden recuperar mediante la importación de google.cloud.vision.enums.Likelihood.

Versiones anteriores de las bibliotecas cliente:

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

Biblioteca cliente de Python v0.25.1:

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

image = vision.types.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('adult: {}'.format(likelihood_name[safe.adult]))
print('medical: {}'.format(likelihood_name[safe.medical]))
print('spoofed: {}'.format(likelihood_name[safe.spoof]))
print('violence: {}'.format(likelihood_name[safe.violence]))
print('racy: {}'.format(likelihood_name[safe.racy]))

Realizar una solicitud de detección de texto y procesar la respuesta

Versiones anteriores de las bibliotecas cliente:

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

Biblioteca cliente de Python v0.25.1:

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

image = vision.types.Image(content=content)

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

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

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

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

Realizar una solicitud de detección de texto en documentos y procesar la respuesta

Versiones anteriores de las bibliotecas cliente:

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

Biblioteca cliente de Python v0.25.1:

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

image = vision.types.Image(content=content)

response = client.document_text_detection(image=image)

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

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

Realizar una solicitud de propiedades de una imagen y procesar la respuesta

La información de color predominante ahora se almacena en props.dominant_colors.colors y no en props.colors.

Versiones anteriores de las bibliotecas cliente:

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

Biblioteca cliente de Python v0.25.1:

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

image = vision.types.Image(content=content)

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

for color in props.dominant_colors.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))

Realizar una solicitud de detección en la Web y procesar la respuesta

Versiones anteriores de las bibliotecas cliente:

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

Biblioteca cliente de Python v0.25.1:

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

image = vision.types.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('\nBest guess label: {}'.format(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('\n\tPage url   : {}'.format(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('\t\tImage url  : {}'.format(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('\t\tImage url  : {}'.format(image.url))

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

    for entity in annotations.web_entities:
        print('\n\tScore      : {}'.format(entity.score))
        print(u'\tDescription: {}'.format(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('\tImage url    : {}'.format(image.url))

Realizar una solicitud de sugerencias de recorte y procesar la respuesta

Versiones anteriores de las bibliotecas cliente:

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

Biblioteca cliente de Python v0.25.1:

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

crop_hints_params = vision.types.CropHintsParams(aspect_ratios=[1.77])
image_context = vision.types.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('\nCrop Hint: {}'.format(n))

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

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

Ten en cuenta que las relaciones de aspecto deben pasarse a través de un CropHintsParams y un ImageContext.

¿Te ha resultado útil esta página? Enviar comentarios:

Enviar comentarios sobre...

Documentación de la API de Cloud Vision
Si necesitas ayuda, visita nuestra página de asistencia.