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
- Implementar cuatro Cloud Functions
- Crear los Depósitos de Cloud Storage complementarios, temas de Cloud Pub/Sub y Notificaciones de Cloud Storage Pub/Sub
- Crear el conjunto de datos y la tabla complementaria para BigQuery
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
Crea un proyecto de Google Cloud Platform (GCP) o usa uno existente.
-
Asegúrate de que la facturación esté habilitada para tu proyecto de Cloud. Descubre cómo confirmar que tienes habilitada la facturación en un proyecto.
- Habilita las API de Cloud Functions, Cloud Storage, BigQuery, Vision, and Video Intelligence.
Instala y luego inicializa el SDK de Google Cloud.
Actualiza y, luego, instala los componentes de
gcloud
:gcloud components update && gcloud components install beta
Prepara el entorno para el desarrollo en Node.js.
Arquitectura
En el siguiente diagrama, se describe la 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
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:
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 [IV_BUCKET_NAME]
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 [FILTERED_BUCKET_NAME]
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 [FLAGGED_BUCKET_NAME]
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 [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.
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álidogcloud pubsub topics create [UPLOAD_NOTIFICATION_TOPIC]
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 archivoconfig.json
esvisionapiservice
.gcloud pubsub topics create [VISION_TOPIC_NAME]
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 archivoconfig.json
esvideointelligenceservice
.gcloud pubsub topics create [VIDEOIQ_TOPIC_NAME]
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 archivoconfig.json
esbqinsert
.gcloud pubsub topics create [BIGQUERY_TOPIC_NAME]
Crea notificaciones de Cloud Storage
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 [IV_BUCKET_NAME]
Confirma que la notificación se creó para el bucket:
gsutil notification list [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.
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 archivoconfig.json
esintelligentcontentfilter
.bq --project_id [PROJECT_ID] mk [DATASET_ID]
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 archivoconfig.json
esintelligentcontentfilter
, y en[TABLE_NAME]
, el valor predeterminado esfiltered_content
.bq --project_id [PROJECT_ID] mk --schema intelligent_content_bq_schema.json -t [DATASET_ID].[TABLE_NAME]
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:
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.
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
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óninsertIntoBigQuery
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
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óninsertIntoBigQuery
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
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
Prueba el flujo
En el siguiente diagrama, se describe el flujo de procesamiento.
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.
Sube un archivo de imagen y video a
[IV_BUCKET_NAME]
.[LOCAL_FILE_NAME]
corresponde al nombre de archivo.gsutil cp [LOCAL_FILE_NAME] [IV_BUCKET_NAME]
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:
Prueba
GCStoPubsub
:gcloud functions logs read --filter "finished with status" "GCStoPubsub" --limit 100
Resultado:
Prueba
insertIntoBigQuery
:gcloud functions logs read --filter "finished with status" "insertIntoBigQuery" --limit 100
Resultado:
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
Ve los resultados de BigQuery con el siguiente comando:
bq --project_id [PROJECT_ID] query < sql.txt
Resultado:
De manera alternativa, puedes acceder a la IU web de BigQuery y ejecutar las consultas:
- Abre https://bigquery.cloud.google.com en tu navegador.
Haz clic en Redactar consulta para comenzar una consulta como se muestra aquí:
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:
Resultado:
Limpieza
Sigue estos pasos para evitar que se apliquen cargos a tu cuenta de Google Cloud Platform por los recursos que usaste en el instructivo:
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:
- En Cloud Console, ve a la página Proyectos.
- En la lista de proyectos, selecciona el proyecto que deseas borrar y haz clic en Borrar proyecto.
- En el cuadro de diálogo, escribe el ID del proyecto y haz clic en Cerrar.
Borra todos los componentes
Borra las Cloud Functions:
gcloud functions delete GCStoPubsub gcloud functions delete visionAPI gcloud functions delete videoIntelligenceAPI gcloud functions delete insertIntoBigQuery
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]
Reemplaza las variables con tus valores para borrar los depósitos de Cloud Storage:
gsutil -m rm -r [IV_BUCKET_NAME]
gsutil -m rm -r [FLAGGED_BUCKET_NAME]
gsutil -m rm -r [FILTERED_BUCKET_NAME]
gsutil -m rm -r [STAGING_BUCKET_NAME]
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?
- Revisa el código de muestra en la repositorio de Procesamiento de contenido generado por el usuario con la API de Video Intelligence y la API de Cloud Vision en GitHub.
- Obtén más información sobre otras soluciones de reconocimiento de patrones.
- Obtén más información sobre la API de Video Intelligence.
- Obtén más información sobre la API de Cloud Vision
- Obtén más información sobre las Cloud Functions.
- Prueba otras funciones de Google Cloud. Consulta nuestros instructivos.