Procesa contenido generado por usuarios con las API de Video Intelligence y Cloud Vision (instructivo)

En este instructivo, se muestra cómo implementar un conjunto de Cloud Functions para procesar imágenes y videos con la API de Cloud Vision y la API de Cloud Video Intelligence. Esta funcionalidad se describió en Cómo procesar contenido generado por el usuario con las API de Video Intelligence y Cloud Vision.

Sigue este instructivo con el fin de implementar Cloud Functions y otros componentes de Google Cloud Platform (GCP) necesarios para la solución.

Objetivos

Costos

En este instructivo, se usan componentes facturables de Cloud Platform, incluidos los siguientes:

  • Cloud Functions
  • Cloud Pub/Sub
  • Cloud Storage
  • BigQuery
  • API de Vision
  • API de Video Intelligence

El costo para ejecutar este instructivo se puede incluir en el precio de nivel gratuito. El costo sin el nivel gratuito es de unos $5 para probar 10 imágenes y 10 videos. Usa la calculadora de precios para generar una estimación de los costos según el uso previsto. Los usuarios nuevos de Cloud Platform pueden ser aptos para una prueba gratuita.

Antes de comenzar

  1. Crea un proyecto de Google Cloud Platform (GCP) o usa uno existente.

    Ir a la página Proyectos

  2. Comprueba que la facturación esté habilitada en tu proyecto.

    Descubre cómo puedes habilitar la facturación

  3. Habilita las API de Cloud Functions, Cloud Storage, BigQuery, Vision, and Video Intelligence.

    Habilita las API

  4. Instala y luego inicializa el SDK de Google Cloud.

  5. Actualiza y, luego, instala los componentes de gcloud:

    gcloud components update && gcloud components install beta
  6. Prepara el entorno para el desarrollo en Node.js.

    IR A LA GUÍA DE CONFIGURACIÓN

Arquitectura

En el siguiente diagrama, se describe la arquitectura de alto nivel:

arquitectura de alto nivel

Clona el repositorio de GitHub

Todas las Cloud Functions incluidas en este instructivo están disponibles en GitHub. Descarga el código desde GitHub con las herramientas que prefieras o usa el siguiente comando:

git clone https://github.com/GoogleCloudPlatform/cloud-functions-intelligentcontent-nodejs

Ve al directorio del repositorio clonado:

cd cloud-functions-intelligentcontent-nodejs

Crea depósitos de Cloud Storage

Los depósitos de Cloud Storage proporcionan una ubicación de almacenamiento para subir tus imágenes y videos. Sigue estos pasos para crear cuatro depósitos de Cloud Storage diferentes:

  1. Crea un bucket para almacenar los archivos de imágenes y videos. Reemplaza [IV_BUCKET_NAME] con un nombre de depósito de Cloud Storage válido.

    gsutil mb gs://[IV_BUCKET_NAME]
  2. Crea un bucket para almacenar los archivos de imágenes y videos filtrados. Reemplaza [FILTERED_BUCKET_NAME] con un nombre de depósito de Cloud Storage válido.

    gsutil mb gs://[FILTERED_BUCKET_NAME]
  3. Crea un bucket para almacenar tus archivos de imágenes y videos marcados. Reemplaza [FLAGGED_BUCKET_NAME] con un nombre de depósito de Cloud Storage válido.

    gsutil mb gs://[FLAGGED_BUCKET_NAME]
  4. Crea un bucket para tus Cloud Functions a fin de usarlo como una ubicación de etapa de pruebas. Reemplaza [STAGING_BUCKET_NAME] por el nombre de un depósito de Cloud Storage válido.

    gsutil mb gs://[STAGING_BUCKET_NAME]

Crea temas de Cloud Pub/Sub

Puedes usar los temas de Cloud Pub/Sub para los mensajes de notificación de Cloud Storage y los mensajes entre tus Cloud Functions.

  1. Crea un tema para recibir notificaciones de Cloud Storage siempre que uno de tus archivos se suba en Cloud Storage. Reemplaza [UPLOAD_NOTIFICATION_TOPIC] con un nombre de tema de Cloud Pub/Sub válido

    gcloud pubsub topics create [UPLOAD_NOTIFICATION_TOPIC]
  2. Crea un tema para recibir los mensajes de la API de Vision. Reemplaza [VISION_TOPIC_NAME] con un nombre de tema válido. El valor predeterminado en el archivo config.json es visionapiservice.

    gcloud pubsub topics create [VISION_TOPIC_NAME]
  3. Crea un tema para recibir los mensajes de la API de Video Intelligence. Reemplaza [VIDEOIQ_TOPIC_NAME] por un nombre de tema válido. El valor predeterminado en el archivo config.json es videointelligenceservice.

    gcloud pubsub topics create [VIDEOIQ_TOPIC_NAME]
  4. Crea un tema para recibir los mensajes y almacenarlos en BigQuery. Reemplaza [BIGQUERY_TOPIC_NAME] con un nombre de tema válido. El valor predeterminado en el archivo config.json es bqinsert.

    gcloud pubsub topics create [BIGQUERY_TOPIC_NAME]

Crea notificaciones de Cloud Storage

  1. Crea una notificación que se active solo cuando se coloque uno de tus objetos nuevos en el bucket de carga de archivos de Cloud Storage. Reemplaza [UPLOAD_NOTIFICATION_TOPIC] con un tema y [IV_BUCKET] con un nombre de depósito de carga de archivos.

    gsutil notification create -t [UPLOAD_NOTIFICATION_TOPIC] -f json -e OBJECT_FINALIZE gs://[IV_BUCKET_NAME]
  2. Confirma que la notificación se creó para el bucket:

    gsutil notification list gs://[IV_BUCKET_NAME]

    Si la función tiene éxito, este es el resultado:

    Filters: Event Types: OBJECT_FINALIZE

Crea la tabla y el conjunto de datos de BigQuery

Los resultados de las API de Vision y Video Intelligence se almacenan en BigQuery.

  1. Crea un conjunto de datos de BigQuery. Reemplaza [PROJECT_ID] con tu ID del proyecto y [DATASET_ID] con tu nombre de conjunto de datos. El valor predeterminado [DATASET_ID] en el archivo config.json es intelligentcontentfilter.

    bq --project_id [PROJECT_ID] mk [DATASET_ID]
  2. Crea tu tabla de BigQuery desde el archivo de esquema. Reemplaza [PROJECT_ID] por el ID del proyecto y [DATASET_ID].[TABLE_NAME] por el ID del conjunto de datos y el nombre de la tabla. El valor predeterminado [DATASET_ID] en el archivo config.json es intelligentcontentfilter, y en [TABLE_NAME], el valor predeterminado es filtered_content.

    bq --project_id [PROJECT_ID] mk --schema intelligent_content_bq_schema.json -t [DATASET_ID].[TABLE_NAME]
  3. Verifica que tu tabla de BigQuery se creó. Reemplaza [PROJECT_ID] por el ID del proyecto y [DATASET_ID].[TABLE_NAME] por el ID del conjunto de datos y el nombre de la tabla.

    bq --project_id [PROJECT_ID] show [DATASET_ID].[TABLE_NAME]

    Resultado:

    Tabla de BigQuery

Implementa las funciones de Cloud Functions

El siguiente paso es implementar las funciones de Cloud Functions.

Edita el archivo de configuración JSON

Después de descargar el código, edita el archivo config.json para que use los depósitos de Cloud Storage específicos, los nombres del tema de Cloud Pub/Sub y el ID del conjunto de datos de BigQuery y el nombre de la tabla.

{
  "VISION_TOPIC": "projects/[PROJECT-ID]/topics/visionapiservice",
  "VIDEOINTELLIGENCE_TOPIC": "projects/[PROJECT-ID]/topics/videointelligenceservice",
  "BIGQUERY_TOPIC": "projects/[PROJECT-ID]/topics/bqinsert",
  "REJECTED_BUCKET": "[FLAGGED_BUCKET_NAME]",
  "RESULT_BUCKET": "[FILTERED_BUCKET_NAME]",
  "DATASET_ID": "[DATASET_ID]",
  "TABLE_NAME": "[TABLE_NAME]",
  "GCS_AUTH_BROWSER_URL_BASE": "https://storage.cloud.google.com/" ,
  "API_Constants": {
  	"ADULT" : "adult",
  	"VIOLENCE" : "violence",
  	"SPOOF" : "spoof",
  	"MEDICAL" : "medical"
  }
}

Implementa la función GCStoPubsub

Implementa la función GCStoPubsub de Cloud Functions, que contiene la lógica para recibir un mensaje de notificación de Cloud Storage desde Cloud Pub/Sub y reenviar el mensaje a la función correspondiente con otro mensaje de Cloud Pub/Sub.

  • Reemplaza [STAGING_BUCKET_NAME] por el nombre del depósito de etapa de pruebas de Cloud Storage y [UPLOAD_NOTIIFICATION_TOPIC] por el nombre del tema de notificación de carga de archivos.

    gcloud functions deploy GCStoPubsub \
      --stage-bucket [STAGING_BUCKET_NAME] \
      --trigger-topic [UPLOAD_NOTIIFICATION_TOPIC] \
      --entry-point GCStoPubsub \
      --runtime=nodejs10

El resultado de la línea de comandos es similar al siguiente para cada una de las Cloud Functions:

Copying file:///var/folders/69/wsyfjkld5fq1w_wf7d5pxbv80030br/T/tmphzfCsc/fun.zip [Content-Type=application/zip]...
/ [1 files][138.4 KiB/138.4 KiB]
Operation completed over 1 objects/138.4 KiB.
Deploying function (may take a while - up to 2 minutes)...
...............................................................done.
availableMemoryMb: 256
entryPoint: GCStoPubsub
eventTrigger:
  eventType: providers/cloud.pubsub/eventTypes/topic.publish
  failurePolicy: {}
  resource: projects/[PROJECT-ID]/topics/intelligentcontentfileupload
latestOperation: operations/c2VjcmV0LXplcGh5ci0xMTIxL3VzLWNlbnRyYWwxL0dDU3RvUHVic3ViL0tRaGxHeVFhZHdR
name: projects/[PROJECT-ID]/locations/us-central1/functions/GCStoPubsub
serviceAccount: [PROJECT-ID]@appspot.gserviceaccount.com
sourceArchiveUrl: gs://[STAGING_BUCKET_NAME]/us-central1-GCStoPubsub-bnnmzdzqtjoo.zip
status: READY
timeout: 60s
updateTime: '2017-09-01T14:59:03Z'
versionId: '01'

Implementa la función visionAPI

  • Implementa la función visionAPI de Cloud Functions, que contiene la lógica para recibir un mensaje con Cloud Pub/Sub, llamar a la API de Vision y reenviar el mensaje a la función insertIntoBigQuery de Cloud Functions con otro mensaje de Cloud Pub/Sub. Reemplaza [STAGING_BUCKET_NAME] por el nombre del depósito de etapa de pruebas de Cloud Storage y [VISION_TOPIC_NAME] por el nombre del tema de la API de Vision.

    gcloud functions deploy visionAPI \
      --stage-bucket [STAGING_BUCKET_NAME] \
      --trigger-topic [VISION_TOPIC_NAME] \
      --entry-point visionAPI \
      --runtime=nodejs10

Implementa la función videoIntelligenceAPI

  • Implementa la función videoIntelligenceAPI de Cloud Functions, que contiene la lógica para recibir un mensaje con Cloud Pub/Sub, llamar a la API de Video Intelligence y reenviar el mensaje a la función insertIntoBigQuery de Cloud Functions con otro mensaje de Cloud Pub/Sub. Reemplaza [STAGING_BUCKET_NAME] por el nombre del depósito de etapa de pruebas de Cloud Storage y [VIDEOIQ_TOPIC_NAME] por el nombre del tema de la API de Video Intelligence.

    gcloud functions deploy videoIntelligenceAPI \
      --stage-bucket [STAGING_BUCKET_NAME] \
      --trigger-topic [VIDEOIQ_TOPIC_NAME] \
      --entry-point videoIntelligenceAPI \
      --timeout 540 \
      --runtime=nodejs10

Implementa la función insertIntoBigQuery

  • Implementa la función insertIntoBigQuery de Cloud Functions, que contiene la lógica para recibir un mensaje con Cloud Pub/Sub y llamar a la API de BigQuery a fin de insertar los datos en la tabla de BigQuery. Reemplaza [STAGING_BUCKET_NAME] por el nombre del depósito de etapa de pruebas de Cloud Storage y [BIGQUERY_TOPIC_NAME] por el nombre del tema de BigQuery.

    gcloud functions deploy insertIntoBigQuery \
      --stage-bucket [STAGING_BUCKET_NAME] \
      --trigger-topic [BIGQUERY_TOPIC_NAME] \
      --entry-point insertIntoBigQuery \
      --runtime=nodejs10

Prueba el flujo

En el siguiente diagrama, se describe el flujo de procesamiento.

processing-flow

Puedes probar el proceso a través de la carga de tus archivos en Cloud Storage, la comprobación de tus registros y la vista de tus resultados en BigQuery.

  1. Sube un archivo de imagen y video a [IV_BUCKET_NAME]. [LOCAL_FILE_NAME] corresponde al nombre de archivo.

    gsutil cp [LOCAL_FILE_NAME] gs://[IV_BUCKET_NAME]
  2. Verifica que tus Cloud Functions se activaron y se ejecutaron de manera exitosa a través de la vista de los registros de Cloud Functions capturados en Cloud Logging:

    1. Prueba GCStoPubsub:

      gcloud functions logs read --filter "finished with status" "GCStoPubsub" --limit 100

      Resultado:

      Registro de GCStoPubsub

    2. Prueba insertIntoBigQuery:

      gcloud functions logs read --filter "finished with status" "insertIntoBigQuery" --limit 100

      Resultado:

      Registro de insertIntoBigQuery

  3. Crea comandos SQL para consultar BigQuery. Reemplaza [PROJECT_ID], [DATASET_ID] y [TABLE_NAME] con el ID del proyecto, el ID de conjunto de datos, y el nombre de tabla de BigQuery.

    echo "
    #standardSql
    SELECT insertTimestamp,
    contentUrl,
    flattenedSafeSearch.flaggedType,
    flattenedSafeSearch.likelihood
    FROM \`${PROJECT_ID}.${DATASET_ID}.${TABLE_NAME}\`
    CROSS JOIN UNNEST(safeSearch) AS flattenedSafeSearch
    ORDER BY insertTimestamp DESC,
    contentUrl,
    flattenedSafeSearch.flaggedType
    LIMIT 1000
    " > sql.txt
    
  4. Ve los resultados de BigQuery con el siguiente comando:

    bq --project_id [PROJECT_ID] query < sql.txt

    Resultado:

    Resultados de BigQuery

    De manera alternativa, puedes acceder a la IU web de BigQuery y ejecutar las consultas:

    1. Abre https://bigquery.cloud.google.com en tu navegador.
    2. Haz clic en Redactar consulta para comenzar una consulta como se muestra aquí:

      Redacta una consulta

    3. Ingresa el siguiente SQL en el cuadro de texto. Reemplaza [PROJECT_ID], [DATASET_ID] y [TABLE_NAME] con el ID del proyecto, el ID de conjunto de datos, y el nombre de tabla de BigQuery.

      #standardSql
      SELECT insertTimestamp,
      contentUrl,
      flattenedSafeSearch.flaggedType,
      flattenedSafeSearch.likelihood
      FROM `[PROJECT_ID].[DATASET_ID].[TABLE_NAME]`
      CROSS JOIN UNNEST(safeSearch) AS flattenedSafeSearch
      ORDER BY insertTimestamp DESC,
      contentUrl,
      flattenedSafeSearch.flaggedType
      LIMIT 1000
      

      El siguiente ejemplo muestra cómo se ve este SQL en la IU:

      Consulta de SQL

      Resultado:

      Resultados de la consulta de SQL

Realice una limpieza

Para evitar que se apliquen cargos a tu cuenta de Google Cloud por los recursos usados en este instructivo, borra el proyecto que contiene los recursos o conserva el proyecto y borra los recursos individuales.

Una vez que termines este instructivo, podrás limpiar los recursos que creaste en Google Cloud para que no consuman la cuota y no se te cobre por ellos en el futuro. En las siguientes secciones, se describe cómo borrar o desactivar estos recursos.

Borra el proyecto

La manera más fácil de eliminar la facturación es borrar el proyecto que creaste para el instructivo.

Para borrar el proyecto, haz lo siguiente:

  1. En Cloud Console, ve a la página Proyectos.
  2. En la lista de proyectos, selecciona el proyecto que deseas borrar y haz clic en Borrar proyecto.
  3. En el cuadro de diálogo, escribe el ID del proyecto y haz clic en Cerrar.

Borra todos los componentes

  1. Borra las Cloud Functions:

    gcloud functions delete GCStoPubsub
    gcloud functions delete visionAPI
    gcloud functions delete videoIntelligenceAPI
    gcloud functions delete insertIntoBigQuery
  2. Reemplaza las variables con tus valores para borrar la tabla y el conjunto de datos de BigQuery:

    bq --project_id [PROJECT_ID] rm -r -f [DATASET_ID]
  3. Reemplaza las variables con tus valores para borrar los depósitos de Cloud Storage:

    gsutil -m rm -r gs://[IV_BUCKET_NAME]
    gsutil -m rm -r gs://[FLAGGED_BUCKET_NAME]
    gsutil -m rm -r gs://[FILTERED_BUCKET_NAME]
    gsutil -m rm -r gs://[STAGING_BUCKET_NAME]
  4. Reemplaza las variables con tus valores para borrar los temas de Cloud Pub/Sub:

    gcloud pubsub topics delete [UPLOAD_NOTIFICATION_TOPIC]
    gcloud pubsub topics delete [VISION_TOPIC_NAME]
    gcloud pubsub topics delete [VIDEOIQ_TOPIC_NAME]
    gcloud pubsub topics delete [BIGQUERY_TOPIC_NAME]

¿Qué sigue?