1. Objetivos
Descripción general
Este codelab se enfoca en crear una aplicación de Vertex AI Vision de extremo a extremo para demostrar la función de envío de videos con filtrado de movimiento. En este instructivo, analizaremos los diferentes parámetros de configuración del filtro de movimiento:
- Sensibilidad de la detección de movimiento
- Duración mínima del evento
- Ventana de visualización
- Tiempo de enfriamiento
- Zona de detección de movimiento
Qué aprenderás
- Cómo transferir videos para la transmisión
- Las diferentes funciones disponibles en el Filtro de movimiento y cómo usarlas
- Dónde consultar las estadísticas del Filtro de movimiento
- Cómo ajustar el parámetro de configuración según tu video
2. Antes de comenzar
- En la página del selector de proyectos de la consola de Google Cloud, selecciona o crea un proyecto de Google Cloud. Nota: Si no planeas conservar los recursos que creaste durante este procedimiento, crea un proyecto en lugar de seleccionar uno existente. Cuando termines, puedes borrar el proyecto y quitar todos los recursos asociados con él. Ir al selector de proyectos
- Asegúrate de que la facturación esté habilitada para tu proyecto de Cloud. Obtén información sobre cómo verificar si la facturación está habilitada en un proyecto.
- Habilita las APIs de Compute Engine y Vision AI. Habilitar las API
Crea una cuenta de servicio:
- En la consola de Google Cloud, ve a la página Crear cuenta de servicio. Ve a Crear cuenta de servicio
- Elige tu proyecto.
- Escribe un nombre en el campo Nombre de cuenta de servicio. La consola de Google Cloud completa el campo ID de cuenta de servicio según este nombre. En el campo Descripción de la cuenta de servicio, ingresa una descripción. Por ejemplo, Cuenta de servicio para la guía de inicio rápido.
- Haz clic en Crear y continuar.
- Para proporcionar acceso a tu proyecto, otorga los siguientes roles a tu cuenta de servicio: Vision AI > Editor de Vision AI, Compute Engine > Administrador de instancias de Compute (beta), Storage > Visualizador de objetos de Storage † . En la lista Seleccionar un rol, elige uno. Para obtener roles adicionales, haz clic en Agregar otro rol y agrega cada rol adicional. Nota: El campo Rol afecta a qué recursos puede acceder tu cuenta de servicio en el proyecto. Puedes revocar estas funciones o asignar otras más adelante. En entornos de producción, no otorgues los roles de propietario, editor o visualizador. En su lugar, otorga un rol predefinido o un rol personalizado que satisfaga tus necesidades.
- Haz clic en Continuar.
- Haz clic en Listo para terminar de crear la cuenta de servicio. No cierres la ventana del navegador, ya que La usarás en la próxima tarea.
Crea una clave de cuenta de servicio:
- En la consola de Google Cloud, haz clic en la dirección de correo electrónico de la cuenta de servicio que creaste.
- Haga clic en Claves.
- Haz clic en Agregar clave y, luego, en Crear clave nueva.
- Haga clic en Crear. Se descargará un archivo de claves JSON en tu computadora.
- Haz clic en Cerrar.
- Instala y, luego, inicializa Google Cloud CLI.
† El rol solo es necesario si copias un archivo de video de muestra de un bucket de Cloud Storage.
3. Filtro de movimiento
El filtro de movimiento captura segmentos de movimiento y de videos de productos que contienen eventos de movimiento. Si ajustan la sensibilidad al movimiento, la duración mínima del evento, el período de observación, el período de inactividad y la zona de detección de movimiento, los usuarios pueden configurar el filtro según sus propias necesidades.
Configuración del filtro de movimiento
Hay 5 parámetros de configuración disponibles en el filtro de movimiento para la personalización.
- Sensibilidad al movimiento: Indica qué tan sensible debe ser el movimiento para activar la cámara.
- Duración mínima del evento: Es la duración mínima que se registrará un evento de movimiento.
- Ventana de visualización: Indica cuánto tiempo antes de que se detecte un evento de movimiento debe comenzar a grabar el video.
- Período de inactividad: Después de que finalice un evento de movimiento, se producirá un período de inactividad con la duración especificada. Durante el período de enfriamiento, no se activarán los eventos de movimiento.
- Zona de detección de movimiento: Es la zona configurada por el usuario para especificar dónde se debe ejecutar la detección de movimiento. (Se explicará en detalle en una sección posterior)
Sensibilidad al movimiento
Usa la marca motion_detection_sensitivity en el comando vaictl.
Cadena. Es el medio predeterminado. Puedes elegir entre bajo, medio o alto.
Cuanto mayor sea la sensibilidad de la detección de movimiento, más sensible será al ruido y a los movimientos más pequeños. Se recomienda usar este parámetro de configuración en entornos en los que haya objetos en movimiento más pequeños (como personas a la distancia) y una iluminación estable.
Por otro lado, la sensibilidad baja es menos sensible a la interferencia de la iluminación. Este parámetro de configuración es perfecto para cuando hay más interferencia de iluminación, como en un entorno al aire libre, y para una calidad de video más baja en la que puede haber más ruidos. Dado que este parámetro de configuración es el filtro más agresivo de todos, podría ignorar los movimientos de objetos pequeños.
Duración mínima del evento
Usa la marca min_event_length_in_seconds en el comando vaictl.
Número entero. El valor predeterminado es de 10 segundos. El rango es de 0 a 3,600 segundos.
Es la duración mínima de los videos de eventos de movimiento que se analizarán una vez que se detecte un segmento de evento de movimiento en el fotograma.
Ventana de visualización
Usa la marca look_back_window_in_seconds en el comando vaictl.
Número entero. El valor predeterminado es de 3 segundos. El rango es de 0 a 3,600 segundos.
La ventana de visualización es la duración almacenada en caché antes de que se detecte un evento de movimiento. Es útil cuando nos interesa ver qué sucede en el fotograma unos segundos antes de que se detecten eventos de movimiento.
Período de inactividad
Usa la marca cool_down_period_in_seconds en el comando vaictl.
Número entero. El valor predeterminado es de 300 segundos. El rango es de 0 a 3,600 segundos.
El período de enfriamiento es el tiempo durante el que se pausará la detección de movimiento después de que se capture un evento de movimiento. Durante el período de inactividad, no se ejecutará ningún cálculo para detectar movimiento.
4. Ejemplo de filtro de movimiento básico
Manual del SDK de Vaictl
Para consultar el manual de vaictl sobre la transmisión de entrada con filtro de movimiento, usa el siguiente comando.
vaictl send video-file applying motion-filter -h
Prepara un video de muestra
- Puedes copiar un video de ejemplo con el siguiente comando gsutil cp. Reemplaza la siguiente variable:
- FUENTE: Es la ubicación de un archivo de video que se usará. Puedes usar tu propio archivo de video fuente (por ejemplo, gs://BUCKET_NAME/FILENAME.mp4) o el video de muestra (gs://cloud-samples-data/vertex-ai-vision/street_vehicles_people.mp4)(video con personas y vehículos, fuente).
export SOURCE=gs://cloud-samples-data/vertex-ai-vision/street_vehicles_people.mp4 gsutil cp $SOURCE .
Prepara las variables de entorno
Establece las siguientes variables de entorno para usar la plantilla de comandos proporcionada.
Variables de vaictl
- PROJECT_ID: Es el ID de tu proyecto de Google Cloud.
- LOCATION_ID: Es tu ID de ubicación. Por ejemplo, us-central1. Para obtener más información, consulta Ubicaciones de Cloud.
- LOCAL_FILE: Es el nombre de un archivo de video local. Por ejemplo, street_vehicles_people.mp4.
- Marca -loop: Opcional. Itera los datos del archivo para simular la transmisión.
export PROJECT_ID=<Your Google Cloud project ID> export LOCATION_ID=us-central1
Variables de filtro de movimiento
- MOTION_SENSITIVITY: Indica qué tan sensible será la detección de movimiento.
- MIN_EVENT_LENGTH: Es la duración mínima de los eventos de movimiento.
- LOOK_BACK_WINDOW: Es la duración que se captura antes del primer movimiento en un evento de movimiento.
- COOL_DOWN_PERIOD: Es el período durante el cual se pausará la detección de movimiento después de que se capture un evento de movimiento.
export MOTION_SENSITIVITY=<low or medium or high> export MIN_EVENT_LENGTH=<0-3600> export LOOK_BACK_WINDOW=<0-3600> export COOL_DOWN_PERIOD=<0-3600>
Prepara el comando del filtro de movimiento
Existen dos opciones para usar el filtro de movimiento con la transmisión de entrada. La primera opción es enviar los eventos de movimiento a una transmisión en la consola de Cloud. La segunda opción es enviar los eventos de movimiento al almacenamiento local.
Envía resultados a la consola de Cloud
Puedes usar vaictl para transmitir los datos de video de salida a la consola de Cloud. Comienza por activar la API de Vision AI en Cloud Console.
Registra una transmisión nueva
- Haz clic en la pestaña Streams de clics en el panel izquierdo de Vertex AI Vision.
- Haz clic en Registrarse.
- En el nombre de la transmisión, ingresa
motion-detection-stream. - En la región, ingresa
us-central1. - Haz clic en Registrar.
Envía resultados a la transmisión
Este comando transmite un archivo de video a una transmisión. Si usas la marca –loop, el video se reproducirá en bucle en la transmisión hasta que detengas el comando. Ejecutaremos este comando como un trabajo en segundo plano para que siga transmitiendo.
Agrega nohup al principio y & al final para que se ejecute en segundo plano.
INPUT_VIDEO=street_vehicles_people.mp4
vaictl -p $PROJECT \
-l $LOCATION_ID \
-c application-cluster-0 \
--service-endpoint visionai.googleapis.com \
send video-file --file-path $INPUT_VIDEO \
applying motion-filter
--motion-sensitivity=$MOTION_SENSITIVITY \
--min-event-length=$MIN_EVENT_LENGTH \
--lookback-length=$LOOK_BACK_WINDOW \
--cooldown-length=$COOL_DOWN_PERIOD \
to streams motion-detection-stream --loop
Es posible que transcurran alrededor de 100 segundos entre el inicio de la operación de transferencia de vaictl y la aparición del video en el panel.
Una vez que la transferencia de la transmisión esté disponible, podrás ver el feed de video en la pestaña Transmisiones del panel de Vertex AI Vision. Para ello, selecciona la transmisión de tráfico.
Envía resultados al almacenamiento local
Este comando transmite un archivo de video a una transmisión.
Agrega nohup al principio y & al final para que se ejecute en segundo plano.
INPUT_VIDEO=street_vehicles_people.mp4
OUTPUT_PATH=<path_to_store_motion_events_on_local_disk>
nohup vaictl -p $PROJECT \
-l $LOCATION_ID \
-c application-cluster-0 \
--service-endpoint visionai.googleapis.com \
send video-file --file-path $INPUT_VIDEO \
applying motion-filter
--motion-sensitivity=$MOTION_SENSITIVITY \
--min-event-length=$MIN_EVENT_LENGTH \
--lookback-length=$LOOK_BACK_WINDOW \
--cooldown-length=$COOL_DOWN_PERIOD \
to mp4file --mp4-file-path=$OUTPUT_PATH --loop
5. Zona de detección de movimiento
En esta sección, analizaremos el uso de la zona de detección de movimiento y cómo configurarla. La zona tiene como objetivo mejorar la detección de movimiento, ya que enmascara el movimiento proveniente de áreas que no te interesan.
La zona de detección de movimiento tiene dos tipos: (1) zonas positivas, en las que la detección de movimiento solo se ejecuta en el área anotada, y (2) zonas negativas, en las que la detección de movimiento ignora cualquier movimiento en el área anotada.
Anotación de zona
Usa la marca zone_annotation en el comando vaictl para ingresar las coordenadas de los polígonos de zona.
Cadena. El valor predeterminado es vacío para la anotación de zona.
La anotación de zona será una entrada de cadena del usuario que denota las zonas del fotograma que el usuario desea ocultar o en las que desea enfocarse. Para anotar la zona, el usuario deberá especificar las coordenadas de la imagen de los ejes X e Y para cada nodo de la zona. Una zona debe tener tres o más nodos para formar un polígono. Puede haber varias zonas en un fotograma. Si las zonas se superponen, el área cubierta por ambas zonas seguirá cubierta.
La anotación de zona tiene una sintaxis de entrada específica que se debe seguir.
- Para indicar un solo nodo, usa
:para conectar los ejes X e Y de una coordinación de imagen. Por ejemplo, un nodo de(0,0)en la esquina superior izquierda se indicará como0:0. - Para indicar todos los nodos de una sola zona, usa
;para conectarlos. Por ejemplo, para una zona con nodos de(0,0),(100,0),(100,100)y(0, 100), la zona se denotará como0:0;100:0;100:100;0:100. Siempre ingresa los nodos como nodos de conexión uno al lado del otro. El orden puede ser en el sentido de las manecillas del reloj o en el sentido contrario.
*Una zona cuadrada con cuatro nodos.
*Una zona triangular con tres nodos.
- Para indicar varias zonas en un solo fotograma, usa
-para conectar diferentes zonas. Por ejemplo, si queremos ingresar(0,0),(100,0),(100,100),(0,100)y(120,120),(110,150),(200,160), la anotación de la zona de entrada será0:0;100:0;100:100;0:100-120:120;110:150;200:160.
*Dos zonas dentro de un marco.
Para obtener las coordenadas de una imagen, hay algunas herramientas disponibles en línea que te ayudarán a hacerlo. Por ejemplo, consulta Wolfram - Get Coordinates from Image.
Excluir zona anotada
Usa la marca exclude_annotated_zone en el comando vaictl para configurar la detección de movimiento dentro o fuera de la zona.
Booleano. El valor predeterminado es falso.
La zona excluida anotada es una entrada booleana del usuario que indica si este desea excluir la zona anotada en la detección de movimiento o no.
- Si se establece en
true, la zona anotada actuará como una zona negativa. No se detectarán movimientos en las zonas anotadas.
*Solo ejecuta la detección de movimiento fuera de las zonas de entrada.
- Si se configura como falso, la zona actuará como una zona positiva, en la que se enfocará la detección de movimiento.
*Solo ejecuta la detección de movimiento en las zonas de entrada.
6. Ejemplo de filtro de movimiento con zona de detección de movimiento
En este ejemplo, usaremos un video en el que un árbol se mueve constantemente en primer plano. En el parámetro de configuración de filtro de movimiento normal, el video solo producirá un evento de movimiento que tendrá la duración del video original, ya que el filtro de movimiento registra el árbol en movimiento como "en movimiento constante durante todo el video". Sin embargo, con la ayuda de la zona de detección de movimiento, podemos enmascarar correctamente el movimiento del árbol y enfocarnos en el movimiento de los automóviles y los peatones.
Preparación del video
El video de muestra (gs://cloud-samples-data/vertex-ai-vision/dynamic-background-fall.mp4) contiene árboles, automóviles y peatones de www.changedetection.net.
Crédito del video: N. Goyette, P.-M. Jodoin, F. Porikli, J. Konrad y P. Ishwar, changedetection.net: A new change detection benchmark dataset, en Proc. IEEE Workshop on Change Detection (CDW-2012) en CVPR-2012, Providence, RI, 16-21 de junio, 2012
Preparación de variables de entorno
Son variables del proyecto de Google Cloud.
export PROJECT_ID=<Your Google Cloud project ID> export LOCATION_ID=us-central1 export LOCAL_FILE=street_vehicles_people.mp4
Es la configuración básica del filtro de movimiento.
export MOTION_SENSITIVITY=<low or medium or high> export MIN_EVENT_LENGTH=<0-3600> export LOOK_BACK_WINDOW=<0-3600> export COOL_DOWN_PERIOD=<0-3600>
Configuración de la zona de detección de movimiento
Elige una de las opciones a continuación para ver los diferentes tipos de uso de la zona de detección de movimiento.
Excluye el árbol de la detección de movimiento.
export ZONE_ANNOTATION="0:0;680:0;660:70;380:320;100:150" export EXCLUDE_ANNOTATED_ZONE=true
*Solo ejecuta la detección de movimiento fuera de las zonas de entrada.
Enfoca la detección de movimiento en la calle.
export ZONE_ANNOTATION="0:300;780:300;780:480;0:480" export EXCLUDE_ANNOTATED_ZONE=false
*Solo ejecuta la detección de movimiento fuera de las zonas de entrada.
Envía una transmisión de video con un filtro de movimiento
Envía los eventos de movimiento a la consola de Cloud
Puedes usar vaictl para transmitir los datos de video de salida a la consola de Cloud. Comienza por activar la API de Vision AI en Cloud Console.
Registra una transmisión nueva
- Haz clic en la pestaña Streams de clics en el panel izquierdo de Vertex AI Vision.
- Haz clic en Registrarse.
- En el nombre de la transmisión, ingresa
motion-detection-stream. - En la región, ingresa
us-central1. - Haz clic en Registrar.
Envía resultados a la transmisión
Este comando transmite un archivo de video a una transmisión. Si usas la marca –loop, el video se reproducirá en bucle en la transmisión hasta que detengas el comando. Ejecutaremos este comando como un trabajo en segundo plano para que siga transmitiendo.
Agrega nohup al principio y & al final para que se ejecute en segundo plano.
vaictl -p $PROJECT \
-l $LOCATION_ID \
-c application-cluster-0 \
--service-endpoint visionai.googleapis.com \
send video-file --file-path $INPUT_VIDEO \
applying motion-filter
--motion-sensitivity=$MOTION_SENSITIVITY \
--min-event-length=$MIN_EVENT_LENGTH \
--lookback-length=$LOOK_BACK_WINDOW \
--cooldown-length=$COOL_DOWN_PERIOD \
--zone_annotation=ZONE_ANNOTATION \
--exclude_annotated_zone=$EXCLUDE_ANNOTATED_ZONE \
to streams motion-detection-stream --loop
Es posible que transcurran alrededor de 100 segundos entre el inicio de la operación de transferencia de vaictl y la aparición del video en el panel.
Una vez que la transferencia de la transmisión esté disponible, podrás ver el feed de video en la pestaña Transmisiones del panel de Vertex AI Vision. Para ello, selecciona la transmisión de tráfico.
Envía resultados al almacenamiento local
Este comando transmite un archivo de video a una transmisión. Si usas la marca –loop, el video se reproducirá en bucle en la transmisión hasta que detengas el comando. Ejecutaremos este comando como un trabajo en segundo plano para que siga transmitiendo.
Agrega nohup al principio y & al final para que se ejecute en segundo plano.
OUTPUT_PATH=<path_to_store_motion_events>
vaictl -p $PROJECT \
-l $LOCATION_ID \
-c application-cluster-0 \
--service-endpoint visionai.googleapis.com \
send video-file --file-path $INPUT_VIDEO \
applying motion-filter
--motion-sensitivity=$MOTION_SENSITIVITY \
--min-event-length=$MIN_EVENT_LENGTH \
--lookback-length=$LOOK_BACK_WINDOW \
--cooldown-length=$COOL_DOWN_PERIOD \
--zone_annotation=$ZONE_ANNOTATION \
--exclude_annotated_zone=$EXCLUDE_ANNOTATED_ZONE \
to mp4file --mp4-file-path=$OUTPUT_PATH --loop
7. Felicitaciones
¡Felicitaciones! Completaste el lab.
Realiza una limpieza
Para evitar que se generen cargos en tu cuenta de Google Cloud por los recursos que se usaron en este instructivo, finaliza la operación del SDK de vaictl a través de la línea de comandos con ctrl + z.
Recursos
https://cloud.google.com/vision-ai/docs/overview
https://cloud.google.com/vision-ai/docs/motion-filtering-model
https://cloud.google.com/vision-ai/docs/create-manage-streams
Comentarios
Haz clic aquí para enviar comentarios