Buscar productos

Una vez que hayas creado tu conjunto de productos y se haya indexado, podrás consultar el conjunto de productos mediante la API Cloud Vision.

Para encontrar productos similares a una imagen determinada, puedes enviar el URI de Google Cloud Storage, la URL web o la cadena codificada en Base64 de la imagen a la API Vision Product Search. Consulta los límites de uso para obtener información sobre el tamaño máximo de las solicitudes y las cuotas.

Consulta el tema Comprender las respuestas de búsqueda y la multidetección para ver un ejemplo de detección de un solo producto y de varios productos en una imagen.

Buscar con una imagen local

En los siguientes ejemplos se lee un archivo local y se consulta la API incluyendo en la solicitud los bytes de la imagen sin procesar (imagen codificada en base64).

REST

Antes de usar los datos de la solicitud, haz las siguientes sustituciones:

  • BASE64_ENCODED_IMAGE: representación en base64 (cadena ASCII) de los datos de imagen binarios. Esta cadena debe ser similar a la siguiente:
    • /9j/4QAYRXhpZgAA...9tAVx/zDQDlGxn//2Q==
    Consulta el tema sobre la codificación en base64 para obtener más información.
  • PROJECT_ID: tu ID de proyecto Google Cloud .
  • LOCATION_ID: identificador de ubicación válido. Los identificadores de ubicación válidos son us-west1, us-east1, europe-west1 y asia-east1.
  • PRODUCT_SET_ID: el ID del conjunto de productos en el que quiere ejecutar la operación.

Consideraciones específicas de los campos:

  • features.maxResults: número máximo de resultados que se devolverán.
  • imageContext.productCategories: la categoría de producto en la que se va a buscar. Actualmente, solo puede especificar una categoría de producto (artículos para el hogar, ropa, juguetes, productos de gran consumo y generales).
  • imageContext.filter - (Opcional) Expresión de filtrado por clave-valor (o varias expresiones) de la etiqueta de producto. Formato: "key=value". Los pares clave-valor de filtrado se pueden vincular con expresiones AND u OR: "color=blue AND style=mens" o "color=blue OR color=black". Si se usa la expresión OR, todas las claves de la expresión deben ser iguales.

Método HTTP y URL:

POST https://vision.googleapis.com/v1/images:annotate

Cuerpo JSON de la solicitud:

{
  "requests": [
    {
      "image": {
        "content": base64-encoded-image
      },
      "features": [
        {
          "type": "PRODUCT_SEARCH",
          "maxResults": 5
        }
      ],
      "imageContext": {
        "productSearchParams": {
          "productSet": "projects/project-id/locations/location-id/productSets/product-set-id",
          "productCategories": [
               "apparel"
          ],
          "filter": "style = womens"
        }
      }
    }
  ]
}

Para enviar tu solicitud, elige una de estas opciones:

curl

Guarda el cuerpo de la solicitud en un archivo llamado request.json y ejecuta el siguiente comando:

curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "x-goog-user-project: project-id" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://vision.googleapis.com/v1/images:annotate"

PowerShell

Guarda el cuerpo de la solicitud en un archivo llamado request.json y ejecuta el siguiente comando:

$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred"; "x-goog-user-project" = "project-id" }

Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://vision.googleapis.com/v1/images:annotate" | Select-Object -Expand Content

Si la solicitud se realiza de forma correcta, el servidor devuelve un código de estado HTTP 200 OK y la respuesta en formato JSON.

El JSON de respuesta incluye los dos tipos de resultados siguientes:

  • productSearchResults: contiene una lista de productos coincidentes de toda la imagen. En la respuesta de ejemplo, los productos coincidentes son: product_id65, product_id35, product_id34, product_id62, product_id32.
  • productGroupedResults: contiene las coordenadas del cuadro delimitador y los elementos coincidentes de cada producto identificado en la imagen. En la siguiente respuesta solo se identifica un producto, seguido de los productos coincidentes del conjunto de productos de muestra: product_id65, product_id35, product_id34, product_id93 y product_id62.

Ten en cuenta que, aunque hay una superposición entre los dos tipos de resultados, también puede haber diferencias (por ejemplo, product_id32 y product_id93 en la respuesta).

Go

Para saber cómo instalar y usar la biblioteca de cliente de Product Search de la API de Vision, consulta Bibliotecas de cliente de Product Search de la API de Vision. Para obtener más información, consulta la documentación de referencia de la API Product Search de la API Vision Go.

Para autenticarte en Product Search de la API Vision, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.


import (
	"context"
	"fmt"
	"io"
	"os"

	vision "cloud.google.com/go/vision/apiv1"
	"cloud.google.com/go/vision/v2/apiv1/visionpb"
)

// getSimilarProducts searches for products from a product set similar to products in an image file.
func getSimilarProducts(w io.Writer, projectID string, location string, productSetID string, productCategory string, file string, filter string) error {
	ctx := context.Background()
	c, err := vision.NewImageAnnotatorClient(ctx)
	if err != nil {
		return fmt.Errorf("NewImageAnnotatorClient: %w", err)
	}
	defer c.Close()

	f, err := os.Open(file)
	if err != nil {
		return fmt.Errorf("Open: %w", err)
	}
	defer f.Close()

	image, err := vision.NewImageFromReader(f)
	if err != nil {
		return fmt.Errorf("NewImageFromReader: %w", err)
	}

	ictx := &visionpb.ImageContext{
		ProductSearchParams: &visionpb.ProductSearchParams{
			ProductSet:        fmt.Sprintf("projects/%s/locations/%s/productSets/%s", projectID, location, productSetID),
			ProductCategories: []string{productCategory},
			Filter:            filter,
		},
	}

	response, err := c.ProductSearch(ctx, image, ictx)
	if err != nil {
		return fmt.Errorf("ProductSearch: %w", err)
	}

	fmt.Fprintf(w, "Product set index time:\n")
	fmt.Fprintf(w, "seconds: %d\n", response.IndexTime.Seconds)
	fmt.Fprintf(w, "nanos: %d\n", response.IndexTime.Nanos)

	fmt.Fprintf(w, "Search results:\n")
	for _, result := range response.Results {
		fmt.Fprintf(w, "Score(Confidence): %f\n", result.Score)
		fmt.Fprintf(w, "Image name: %s\n", result.Image)

		fmt.Fprintf(w, "Prodcut name: %s\n", result.Product.Name)
		fmt.Fprintf(w, "Product display name: %s\n", result.Product.DisplayName)
		fmt.Fprintf(w, "Product labels: %s\n", result.Product.ProductLabels)
	}

	return nil
}

Java

Para saber cómo instalar y usar la biblioteca de cliente de Product Search de la API de Vision, consulta Bibliotecas de cliente de Product Search de la API de Vision. Para obtener más información, consulta la documentación de referencia de la API Product Search de la API Vision Java.

Para autenticarte en Product Search de la API Vision, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.

/**
 * Search similar products to image in local file.
 *
 * @param projectId - Id of the project.
 * @param computeRegion - Region name.
 * @param productSetId - Id of the product set.
 * @param productCategory - Category of the product.
 * @param filePath - Local file path of the image to be searched
 * @param filter - Condition to be applied on the labels. Example for filter: (color = red OR
 *     color = blue) AND style = kids It will search on all products with the following labels:
 *     color:red AND style:kids color:blue AND style:kids
 * @throws IOException - on I/O errors.
 */
public static void getSimilarProductsFile(
    String projectId,
    String computeRegion,
    String productSetId,
    String productCategory,
    String filePath,
    String filter)
    throws IOException {
  try (ImageAnnotatorClient queryImageClient = ImageAnnotatorClient.create()) {

    // Get the full path of the product set.
    String productSetPath = ProductSetName.format(projectId, computeRegion, productSetId);

    // Read the image as a stream of bytes.
    File imgPath = new File(filePath);
    byte[] content = Files.readAllBytes(imgPath.toPath());

    // Create annotate image request along with product search feature.
    Feature featuresElement = Feature.newBuilder().setType(Type.PRODUCT_SEARCH).build();
    // The input image can be a HTTPS link or Raw image bytes.
    // Example:
    // To use HTTP link replace with below code
    //  ImageSource source = ImageSource.newBuilder().setImageUri(imageUri).build();
    //  Image image = Image.newBuilder().setSource(source).build();
    Image image = Image.newBuilder().setContent(ByteString.copyFrom(content)).build();
    ImageContext imageContext =
        ImageContext.newBuilder()
            .setProductSearchParams(
                ProductSearchParams.newBuilder()
                    .setProductSet(productSetPath)
                    .addProductCategories(productCategory)
                    .setFilter(filter))
            .build();

    AnnotateImageRequest annotateImageRequest =
        AnnotateImageRequest.newBuilder()
            .addFeatures(featuresElement)
            .setImage(image)
            .setImageContext(imageContext)
            .build();
    List<AnnotateImageRequest> requests = Arrays.asList(annotateImageRequest);

    // Search products similar to the image.
    BatchAnnotateImagesResponse response = queryImageClient.batchAnnotateImages(requests);

    List<Result> similarProducts =
        response.getResponses(0).getProductSearchResults().getResultsList();
    Sy