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. Accede a tu cuenta de Google Cloud. Si eres nuevo en Google Cloud, crea una cuenta para evaluar el rendimiento de nuestros productos en situaciones reales. Los clientes nuevos también obtienen $300 en créditos gratuitos para ejecutar, probar y, además, implementar cargas de trabajo.
  2. Instala Google Cloud CLI.
  3. Para inicializar la CLI de gcloud, ejecuta el siguiente comando:

    gcloud init
  4. Crea o selecciona un proyecto de Google Cloud.

    • Crea un proyecto de Google Cloud:

      gcloud projects create PROJECT_ID

      Reemplaza PROJECT_ID por un nombre para el proyecto de Google Cloud que estás creando.

    • Selecciona el proyecto de Google Cloud que creaste:

      gcloud config set project PROJECT_ID

      Reemplaza PROJECT_ID por el nombre del proyecto de Google Cloud.

  5. Asegúrate de que la facturación esté habilitada para tu proyecto de Google Cloud.

  6. Habilita la Vision API:

    gcloud services enable vision.googleapis.com
  7. Otorga roles a tu Cuenta de Google. Ejecuta el siguiente comando una vez para cada uno de los siguientes roles de IAM: roles/storage.objectViewer

    gcloud projects add-iam-policy-binding PROJECT_ID --member="user:EMAIL_ADDRESS" --role=ROLE
    • Reemplaza PROJECT_ID con el ID del proyecto.
    • Reemplaza EMAIL_ADDRESS por tu dirección de correo electrónico.
    • Reemplaza ROLE por cada rol individual.
  8. Instala Google Cloud CLI.
  9. Para inicializar la CLI de gcloud, ejecuta el siguiente comando:

    gcloud init
  10. Crea o selecciona un proyecto de Google Cloud.

    • Crea un proyecto de Google Cloud:

      gcloud projects create PROJECT_ID

      Reemplaza PROJECT_ID por un nombre para el proyecto de Google Cloud que estás creando.

    • Selecciona el proyecto de Google Cloud que creaste:

      gcloud config set project PROJECT_ID

      Reemplaza PROJECT_ID por el nombre del proyecto de Google Cloud.

  11. Asegúrate de que la facturación esté habilitada para tu proyecto de Google Cloud.

  12. Habilita la Vision API:

    gcloud services enable vision.googleapis.com
  13. Otorga roles a tu Cuenta de Google. Ejecuta el siguiente comando una vez para cada uno de los siguientes roles de IAM: roles/storage.objectViewer

    gcloud projects add-iam-policy-binding PROJECT_ID --member="user:EMAIL_ADDRESS" --role=ROLE
    • Reemplaza PROJECT_ID con el ID del proyecto.
    • Reemplaza EMAIL_ADDRESS por tu dirección de correo electrónico.
    • Reemplaza ROLE por cada rol individual.

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. Opcional: Revoca credenciales desde gcloud CLI.

    gcloud auth revoke
  2. Borra un proyecto de Google Cloud:

    gcloud projects delete PROJECT_ID

¿Qué sigue?