Tutorial de detección web

Audiencia

El objetivo de este tutorial es ayudarte a desarrollar aplicaciones con la función de detección web de la API Vision. Se presupone que conoces las técnicas y las estructuras de programación básicas, pero, aunque seas un programador principiante, deberías poder seguir este tutorial y ejecutarlo sin dificultad. Después, podrás usar la documentación de referencia de la API Vision para crear aplicaciones básicas.

En este tutorial se explica paso a paso una aplicación de la API Vision y se muestra cómo hacer una llamada a la API Vision para usar su función de detección web.

Requisitos previos

Información general

En este tutorial se explica cómo crear una aplicación básica de la API Vision que usa una Web detection solicitud. Una Web detection respuesta anota la imagen enviada en la solicitud con lo siguiente:

  • etiquetas obtenidas de la Web
  • URLs de sitios que tienen imágenes coincidentes
  • URLs de imágenes web que coinciden parcial o totalmente con la imagen de la solicitud
  • URLs de imágenes visualmente similares

Listado de código

Mientras lees el código, te recomendamos que consultes la referencia de Python de la API Vision.

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

Esta sencilla aplicación realiza las siguientes tareas:

  • Importa las bibliotecas necesarias para ejecutar la aplicación
  • Toma una ruta de imagen como argumento y la pasa a la función main().
  • Usa el cliente de la API de Google Cloud para realizar la detección web.
  • Itera sobre la respuesta e imprime los resultados
  • Imprime una lista de entidades web con su descripción y puntuación.
  • Imprime una lista de páginas coincidentes.
  • Imprime una lista de imágenes que coinciden parcialmente.
  • Imprime una lista de imágenes que coinciden completamente.

Una mirada en profundidad

Importar bibliotecas

import argparse

from google.cloud import vision

Importamos bibliotecas estándar:

  • argparse para permitir que la aplicación acepte nombres de archivo de entrada como argumentos
  • io para leer de archivos

Otras importaciones:

  • La clase ImageAnnotatorClient de la biblioteca google.cloud.vision para acceder a la API Vision.
  • El módulo types de la biblioteca google.cloud.vision para crear solicitudes.

Ejecutar la aplicación

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

Aquí, simplemente analizamos el argumento que se ha transferido y que especifica la URL de la imagen web, y lo transferimos a la función main().

Autenticar a la API

Antes de comunicarte con el servicio de la API Vision, debes autenticar tu servicio con las credenciales que hayas obtenido previamente. En una aplicación, la forma más sencilla de obtener credenciales es usar las credenciales predeterminadas de la aplicación (ADC). La biblioteca de cliente obtiene las credenciales automáticamente. De forma predeterminada, esto se hace obteniendo las credenciales de la variable de entorno GOOGLE_APPLICATION_CREDENTIALS, que debe configurarse para que apunte al archivo JSON de la clave de tu cuenta de servicio (consulta Configurar una cuenta de servicio para obtener más información).

Generar la petición

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

Ahora que nuestro servicio de la API Vision está listo, podemos crear una solicitud para el servicio.

Este fragmento de código realiza las siguientes tareas:

  1. Crea una instancia de ImageAnnotatorClient como cliente.
  2. Crea un objeto Image a partir de un archivo local o un URI.
  3. Transfiere el objeto Image al método web_detection del cliente.
  4. Devuelve las anotaciones.

Imprimir la respuesta

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

Una vez que se haya completado la operación, analizaremos el objeto WebDetection e imprimiremos las entidades y las URLs que contiene la anotación (en la siguiente sección se muestran los dos primeros resultados de cada tipo de anotación).

Ejecutar la aplicación

Para ejecutar la aplicación, introducimos la URL web (http://www.photos-public-domain.com/wp-content/uploads/2011/01/old-vw-bug-and-van.jpg) de la siguiente imagen de un coche.

A continuación, se muestra el comando de Python con la URL web de la imagen del coche, seguido del resultado de la consola. Ten en cuenta que se añade una puntuación de relevancia después de las entidades de la lista. Ten en cuenta que las puntuaciones no se normalizan ni se pueden comparar entre diferentes consultas de imágenes.

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

¡Enhorabuena! Has realizado una detección de sitios web con la API Vision.