Crea un conjunto de productos y busca productos

En esta guía de inicio rápido, se muestra cómo crear y usar los tres tipos de recursos de Product Search de la API de Vision: conjunto de productos que contiene un grupo de productos e imágenes de referencia asociadas con esos productos.

En esta guía de inicio rápido, crearás un conjunto de productos, productos y sus imágenes de referencia en un solo paso mediante la importación por lotes.

Después de indexar el conjunto de productos, puedes consultarlo mediante Product Search de la API de Vision.

En esta guía de inicio rápido, se te guiará por los siguientes procesos:

  • Usar un CSV y la importación masiva para crear un conjunto de productos, imágenes de referencia y productos
  • Enviar una solicitud a Product Search de la API de Vision con una imagen almacenada en un bucket de Cloud Storage

Antes de comenzar

Si aún no lo hiciste, configura tu proyecto como se explica a continuación.

Configura tu proyecto

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. Install the Google Cloud CLI.
  3. To initialize the gcloud CLI, run the following command:

    gcloud init
  4. Create or select a Google Cloud project.

    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

  5. Make sure that billing is enabled for your Google Cloud project.

  6. Enable the Vision API:

    gcloud services enable vision.googleapis.com
  7. Grant roles to your user account. Run the following command once for each of the following IAM roles: roles/storage.objectViewer

    gcloud projects add-iam-policy-binding PROJECT_ID --member="USER_IDENTIFIER" --role=ROLE
    • Replace PROJECT_ID with your project ID.
    • Replace USER_IDENTIFIER with the identifier for your user account. For example, user:myemail@example.com.

    • Replace ROLE with each individual role.
  8. Install the Google Cloud CLI.
  9. To initialize the gcloud CLI, run the following command:

    gcloud init
  10. Create or select a Google Cloud project.

    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

  11. Make sure that billing is enabled for your Google Cloud project.

  12. Enable the Vision API:

    gcloud services enable vision.googleapis.com
  13. Grant roles to your user account. Run the following command once for each of the following IAM roles: roles/storage.objectViewer

    gcloud projects add-iam-policy-binding PROJECT_ID --member="USER_IDENTIFIER" --role=ROLE
    • Replace PROJECT_ID with your project ID.
    • Replace USER_IDENTIFIER with the identifier for your user account. For example, user:myemail@example.com.

    • Replace ROLE with each individual role.

Configura las variables de entorno

Para que sea más conveniente ejecutar las muestras de curl en esta guía de inicio rápido, establece estas variables de entorno en las que se ilustra lo siguiente:

  • PROJECT_ID es el ID de tu proyecto de Google Cloud.
  • LOCATION_ID es la ubicación de Google Cloud que ejecutará el instructivo, por ejemplo, us-east1. Los identificadores de ubicación válidos son: us-west1, us-east1, europe-west1 y asia-east1.

Usa un conjunto de datos

En esta guía de inicio rápido, usarás un conjunto de datos de aproximadamente 100 entradas de categoría de producto apparel-v2. Este conjunto de datos público se encuentra en un bucket público de Cloud Storage en esta ruta:

El formato CSV es el siguiente:

gs://cloud-ai-vision-data/product-search-tutorial/images/filename1.jpg,image0,product_set0,product_id0,apparel-v2,,"style=women,category=shoe",
gs://cloud-ai-vision-data/product-search-tutorial/images/filename2.jpg,image1,product_set0,product_id1,apparel-v2,,"style=men,category=shoe",
gs://cloud-ai-vision-data/product-search-tutorial/images/filename3.jpg,image2,product_set0,product_id2,apparel-v2,,"style=women,category=dress",
.

Usa la importación por lotes para crear un conjunto productos, imágenes de referencia y productos

Usa el siguiente comando de curl para crear un nuevo conjunto de productos con imágenes de referencia y productos. Este conjunto se llama product_set0, un valor declarado en el archivo CSV de importación.

Primero, crea un archivo JSON de solicitud llamado import_request.json y guárdalo en el directorio de trabajo actual.

import_request.json

{
  "inputConfig": {
    "gcsSource": {
      "csvFileUri": "gs://cloud-samples-data/vision/product_search/product_catalog.csv"
    }
  }
}

Después de crear el archivo JSON, envía la solicitud:

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 @import_request.json \
    https://vision.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/productSets:import

Una respuesta correcta contiene un objeto de operación de larga duración como el que se muestra a continuación:

{
  "name": "locations/LOCATION_ID/operations/0a0aec86192599fa"
}

La respuesta también contiene un ID de operación relativo (por ejemplo, 0a0aec86192599fa) que se puede usar para obtener el estado de la operación.

Obtén el estado de la operación de importación

Puedes usar el operation-id que muestra la operación de importación para verificar el estado de la operación de importación masiva:

curl -X GET \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "x-goog-user-project: PROJECT_ID" \
    -H "Content-Type: application/json" \
    https://vision.googleapis.com/v1/locations/LOCATION_ID/operations/OPERATION_ID

Una respuesta correcta se ve de la siguiente manera:

{
  "name": "locations/LOCATION_ID/operations/0a0aec86192599fb",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.vision.v1.BatchOperationMetadata",
    "state": "SUCCESSFUL",
    "submitTime": "2018-11-30T03:11:04.808114024Z",
    "endTime": "2018-11-30T03:11:38.624444324Z"
  },
  "done": true,
  "response": {
    "@type": "type.googleapis.com/google.cloud.vision.v1.ImportProductSetsResponse",
    "referenceImages": [
      {
        "name": "projects/PROJECT_ID/locations/LOCATION_ID/products/product_id0/referenceImages/image0",
        "uri": "gs://cloud-ai-vision-data/product-search-tutorial/images/46a0cbcf70ba11e89399d20059124800.jpg"
      },
      {
        "name": "projects/PROJECT_ID/locations/LOCATION_ID/products/product_id1/referenceImages/image1",
        "uri": "gs://cloud-ai-vision-data/product-search-tutorial/images/46a1aea370ba11e888d4d20059124800.jpg"
      },
      ...
      {
        "name": "projects/PROJECT_ID/locations/LOCATION_ID/products/product_id93/referenceImages/image93",
        "uri": "gs://cloud-ai-vision-data/product-search-tutorial/images/4697319970ba11e8a7bfd20059124800.jpg"
      },
      {
        "name": "projects/PROJECT_ID/locations/LOCATION_ID/products/product_id94/referenceImages/image94",
        "uri": "gs://cloud-ai-vision-data/product-search-tutorial/images/4698596370ba11e8bf6ad20059124800.jpg"
      }
    ],
    "statuses": [
      {},
      {},
      [...]
      {},
      {}
    ]
  }
}

Indexación

El índice de productos de Product Search se actualiza cada 30 minutos aproximadamente. Cuando se agregan o se borran imágenes, los cambios no se reflejarán en las respuestas de Product Search hasta que el índice se actualice.

Para asegurarse de que la indexación se completó con éxito, revise el campo indexTime de un conjunto de productos.

Enumera conjuntos de productos y verifica la indexación

Puedes enumerar todos los conjuntos de productos y usar el campo indexTime para verificar que la indexación se haya completado de forma correcta:

curl -X GET \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "x-goog-user-project: PROJECT_ID" \
    -H "Content-Type: application/json" \
    https://vision.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/productSets

En una respuesta correcta, se enumeran todos los conjuntos de productos, incluido el ID del conjunto (por ejemplo, product_set0) y el campo indexTime, que indica cuándo se completó la indexación:

{
  "productSets": [
    {
      "name": "projects/PROJECT_ID/locations/LOCATION_ID/productSets/product_set0",
      "displayName": " ",
      "indexTime": "2019-11-30T18:33:40.093508652Z",
      "indexError": {}
    }
  ]
}

Enumera productos

Puedes usar el PRODUCT_SET_ID que se muestra en la lista de conjuntos de productos para enumerar todos los productos del conjunto:

curl -X GET \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "x-goog-user-project: PROJECT_ID" \
    -H "Content-Type: application/json" \
    https://vision.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/productSets/PRODUCT_SET_ID/products?pageSize=15

Una respuesta exitosa enumera los detalles de los productos.

En esta solicitud, se usa el parámetro de búsqueda opcional pageSize para establecer la lista de resultados en 15 productos. El nextPageToken en la respuesta también indica que hay más productos para enumerar. Puedes usar este token para recuperar más resultados. Para obtener más información sobre cómo usar pageToken, consulta Obtén y enumera recursos.

{
  "products": [
    {
      "name": "projects/PROJECT_ID/locations/LOCATION_ID/products/product_id0",
      "displayName": " ",
      "productCategory": "apparel",
      "productLabels": [
        {
          "key": "style",
          "value": "women"
        },
        {
          "key": "category",
          "value": "shoe"
        }
      ]
    },
    {
      "name": "projects/PROJECT_ID/locations/LOCATION_ID/products/product_id1",
      "displayName": " ",
      "productCategory": "apparel",
      "productLabels": [
        {
          "key": "style",
          "value": "men"
        },
        {
          "key": "category",
          "value": "shoe"
        }
      ]
    },
    ...
    {
      "name": "projects/PROJECT_ID/locations/LOCATION_ID/products/product_id21",
      "displayName": " ",
      "productCategory": "apparel",
      "productLabels": [
        {
          "key": "style",
          "value": "women"
        },
        {
          "key": "category",
          "value": "dress"
        }
      ]
    }
  ],
  "nextPageToken": "1LqhSgZfM_uWKOxvog"
}

Busca productos que coincidan mediante Product Search de la API de Vision

Una vez que se complete la indexación, puedes buscar productos que coincidan con una imagen de muestra. En esta guía de inicio rápido, se usa una imagen almacenada en un bucket de Google Cloud Storage, como la imagen que aparece a continuación.

Una imagen de un vestido en un bucket de Cloud Storage.
gs://cloud-ai-vision-data/product-search-tutorial/images/468f782e70ba11e8941fd20059124800.jpg

Busca con una imagen remota

Usa la siguiente solicitud para buscar mediante la imagen almacenada en un bucket público de Cloud Storage.

Primero, crea un archivo JSON de solicitud llamado search_request.json y guárdalo en el directorio de trabajo actual. Cambia los siguientes valores en la solicitud JSON para que coincidan con la información de tu proyecto:

  • PROJECT_ID
  • LOCATION_ID
  • PRODUCT_SET_ID

search_request.json

{
  "requests": [
    {
      "image": {
        "source": {
          "gcsImageUri": "gs://cloud-ai-vision-data/product-search-tutorial/images/468f782e70ba11e8941fd20059124800.jpg"
        }
      },
      "features": [
        {
          "type": "PRODUCT_SEARCH"
        }
      ],
      "imageContext": {
        "productSearchParams": {
          "productSet": "projects/PROJECT_ID/locations/LOCATION_ID/productSets/PRODUCT_SET_ID",
          "productCategories": [
            "apparel-v2"
          ],
          "filter": "style=womens OR style=women"
        }
      }
    }
  ]
}

Después de crear el archivo JSON, envía la solicitud:

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 @search_request.json \
    https://vision.googleapis.com/v1/images:annotate

Una solicitud correcta muestra una lista de los productos coincidentes, indicados por su ID. Estos resultados se desglosan en productos individuales identificados por cuadros de límite si hay varios productos en una sola imagen.

Para ver un ejemplo de detección de un solo producto y detección múltiple de productos en una imagen, consulta Información sobre las respuestas de búsqueda y la detección múltiple.

También se muestra un campo score. En este campo, se indica la confianza con la que el servicio considera que el producto coincide con la imagen dada, en una escala del 0 (sin confianza) al 1 (confianza total).

En el campo indexTime, se muestra la versión del índice que se busca. Los cambios de imágenes que se realicen después de esto no se reflejarán en los resultados.

¡Felicitaciones! Realizaste tu primera solicitud images.annotate al servicio de Product Search de la API de Vision.

Realiza una limpieza

  1. Optional: Revoke credentials from the gcloud CLI.

    gcloud auth revoke
  2. Delete a Google Cloud project:

    gcloud projects delete PROJECT_ID

¿Qué sigue?