Instructivo sobre sugerencias de recorte

Público

El objetivo de este instructivo es ayudarte a desarrollar aplicaciones mediante la característica de sugerencias de recorte de la API de Cloud Vision. Se supone que estás familiarizado con las construcciones y técnicas de programación básicas. Sin embargo, aunque seas un programador principiante, podrás seguir y ejecutar este instructivo sin dificultad y, luego, usar la documentación de referencia de la API de Cloud Vision para crear aplicaciones básicas.

En este instructivo, se explica una aplicación de la API de Vision y se muestra cómo realizar una llamada a la API de Vision para usar la característica de sugerencias de recorte.

Requisitos previos

Descripción general

En este instructivo se explica una aplicación básica de la API de Vision que usa una solicitud de Crop Hints. Puedes proporcionar la imagen a procesar a través de un URI de Google Cloud Storage (ubicación del depósito de Cloud Storage) o incorporarla en la solicitud. Una respuesta de Crop Hints exitosa muestra las coordenadas de un cuadro de límite recortado alrededor del objeto o rostro predominante en la imagen.

Mostrar el código

Te recomendamos que, a medida que leas el código, consultes la referencia de la API de Cloud Vision para Python.

import argparse
import io

from google.cloud import vision
from google.cloud.vision import types
from PIL import Image, ImageDraw

def get_crop_hint(path):
    """Detect crop hints on a single image and return the first result."""
    client = vision.ImageAnnotatorClient()

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

    image = types.Image(content=content)

    crop_hints_params = types.CropHintsParams(aspect_ratios=[1.77])
    image_context = 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

    # Get bounds for the first crop hint using an aspect ratio of 1.77.
    vertices = hints[0].bounding_poly.vertices

    return vertices

def draw_hint(image_file):
    """Draw a border around the image using the hints in the vector list."""
    vects = get_crop_hint(image_file)

    im = Image.open(image_file)
    draw = ImageDraw.Draw(im)
    draw.polygon([
        vects[0].x, vects[0].y,
        vects[1].x, vects[1].y,
        vects[2].x, vects[2].y,
        vects[3].x, vects[3].y], None, 'red')
    im.save('output-hint.jpg', 'JPEG')
    print('Saved new image to output-crop.jpg')

def crop_to_hint(image_file):
    """Crop the image using the hints in the vector list."""
    vects = get_crop_hint(image_file)

    im = Image.open(image_file)
    im2 = im.crop([vects[0].x, vects[0].y,
                  vects[2].x - 1, vects[2].y - 1])
    im2.save('output-crop.jpg', 'JPEG')
    print('Saved new image to output-crop.jpg')

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('image_file', help='The image you\'d like to crop.')
    parser.add_argument('mode', help='Set to "crop" or "draw".')
    args = parser.parse_args()

    parser = argparse.ArgumentParser()

    if args.mode == 'crop':
        crop_to_hint(args.image_file)
    elif args.mode == 'draw':
        draw_hint(args.image_file)

Información detallada

Importar las bibliotecas

import argparse
import io

from google.cloud import vision
from google.cloud.vision import types
from PIL import Image, ImageDraw

Importamos las siguientes bibliotecas estándar:

  • argparse para permitir que la aplicación acepte nombres de archivos de entrada como argumentos
  • io para la E/S de archivos

También se importan:

  • la clase ImageAnnotatorClient de la biblioteca google.cloud.vision para acceder a la API de Vision
  • el módulo types de la biblioteca google.cloud.vision para construir solicitudes
  • el módulo Image y el módulo ImageDraw de la biblioteca Python Imaging Library (PIL) para crear un cuadro de límite en la imagen de entrada.

Ejecutar la aplicación

parser = argparse.ArgumentParser()
parser.add_argument('image_file', help='The image you\'d like to crop.')
parser.add_argument('mode', help='Set to "crop" or "draw".')
args = parser.parse_args()

parser = argparse.ArgumentParser()

if args.mode == 'crop':
    crop_to_hint(args.image_file)
elif args.mode == 'draw':
    draw_hint(args.image_file)

Aquí, simplemente analizamos el argumento ingresado que especifica el nombre de archivo de la imagen local y lo pasamos a una función para recortar la imagen o crear la sugerencia.

Autenticación para la API

Antes de comunicarte con el servicio de la API de Vision, debes autenticar tu servicio con las credenciales ya adquiridas. Dentro de una aplicación, la manera más simple de obtener credenciales es usar las Credenciales predeterminadas de la aplicación (ADC). De manera predeterminada, la biblioteca cliente intentará obtener credenciales de la variable de entorno GOOGLE_APPLICATION_CREDENTIALS, que debería estar configurada para apuntar al archivo de claves JSON de tu cuenta de servicio (consulta Configurar una cuenta de servicio a fin de obtener más información).

Obtener anotaciones de sugerencias de recorte para la imagen

Una vez que la biblioteca cliente de Vision se autenticó, podemos acceder al servicio mediante una llamada al método crop_hints de la instancia ImageAnnotatorClient. La relación de aspecto para el resultado se especifica en un objeto ImageContext. Si se ingresan múltiples relaciones de aspecto, se mostrarán múltiples sugerencias de recorte, una para cada relación de aspecto.

"""Detect crop hints on a single image and return the first result."""
client = vision.ImageAnnotatorClient()

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

image = types.Image(content=content)

crop_hints_params = types.CropHintsParams(aspect_ratios=[1.77])
image_context = 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

# Get bounds for the first crop hint using an aspect ratio of 1.77.
vertices = hints[0].bounding_poly.vertices

La biblioteca cliente encapsula los detalles de las solicitudes y respuestas a la API. Consulta la referencia de la API de Vision para obtener información completa sobre la estructura de una solicitud.

Usar la respuesta para recortar o crear el cuadro de límite de la sugerencia

Una vez que la operación se completó correctamente, la respuesta de la API contendrá las coordenadas del cuadro de límite de una o más sugerencias cropHint. El método draw_hint crea líneas alrededor del cuadro de límite CropHints y luego guarda la imagen en output-hint.jpg.

vects = get_crop_hint(image_file)

im = Image.open(image_file)
draw = ImageDraw.Draw(im)
draw.polygon([
    vects[0].x, vects[0].y,
    vects[1].x, vects[1].y,
    vects[2].x, vects[2].y,
    vects[3].x, vects[3].y], None, 'red')
im.save('output-hint.jpg', 'JPEG')
print('Saved new image to output-crop.jpg')

El método crop_to_hint recorta la imagen con la sugerencia de recorte proporcionada.

vects = get_crop_hint(image_file)

im = Image.open(image_file)
im2 = im.crop([vects[0].x, vects[0].y,
              vects[2].x - 1, vects[2].y - 1])
im2.save('output-crop.jpg', 'JPEG')
print('Saved new image to output-crop.jpg')

Ejecutar la aplicación

Para ejecutar la aplicación, puedes descargar este archivo cat.jpg (posiblemente debas hacer clic con el botón derecho en el vínculo) y luego pasarle a la aplicación del instructivo (crop_hints.py) la ubicación en la que descargaste el archivo en tu máquina local.

Este es el comando de Python, seguido del resultado de la consola, que muestra la respuesta JSON cropHintsAnnotation. Esta respuesta incluye las coordenadas del cuadro de límite de cropHints. Solicitamos un área de recorte con una relación de aspecto de ancho a altura de 1.77. Las coordenadas x,y de arriba a la izquierda y de abajo a la derecha del rectángulo de recorte que se muestran son 0,336, 1100,967.

python crop_hints.py cat.jpeg crop
{
 "responses": [
  {
   "cropHintsAnnotation": {
    "cropHints": [
     {
      "boundingPoly": {
       "vertices": [
        {
         "y": 336
        },
        {
         "x": 1100,
         "y": 336
        },
        {
         "x": 1100,
         "y": 967
        },
        {
         "y": 967
        }
       ]
      },
      "confidence": 0.79999995,
      "importanceFraction": 0.69
     }
    ]
   }
  }
 ]
}

Y esta es la imagen recortada.

¡Felicitaciones! Ejecutaste la API de sugerencias de recorte de Cloud Vision para mostrar las coordenadas optimizadas del cuadro de límite alrededor del objeto predominante detectado en la imagen.

¿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.