Vertex AI Vision 运动滤镜

1. 目标

概览

此 Codelab 重点介绍如何创建端到端 Vertex AI Vision 应用,以演示发送具有运动过滤功能的视频。在本教程中,我们将介绍运动滤镜配置中的不同参数:

  • 移动侦测灵敏度
  • 事件录制时长下限
  • 回溯期
  • 冷却时间
  • 移动侦测区域

学习内容

  • 如何提取视频以进行流式传输
  • 运动滤镜中提供的不同功能以及如何使用这些功能
  • 在哪里查看运动滤镜的统计数据
  • 如何根据视频调整设置

2. 准备工作

  1. 在 Google Cloud 控制台的“项目选择器”页面上,选择或创建 Google Cloud 项目注意:如果您不打算保留在此过程中创建的资源,请创建新的项目,而不要选择现有的项目。完成本教程介绍的步骤后,您可以删除所创建的项目,并移除与该项目关联的所有资源。前往“项目选择器”
  2. 确保您的 Cloud 项目已启用结算功能。了解如何检查项目是否已启用结算功能
  3. 启用 Compute Engine 和 Vision AI API。启用 API

创建服务账号

  1. 在 Google Cloud 控制台中,前往创建服务账号页面。前往“创建服务账号”
  2. 选择您的项目。
  3. 服务账号名称字段中,输入一个名称。Google Cloud 控制台会根据此名称填充服务账号 ID 字段。在服务账号说明字段中,输入说明。例如,快速入门服务账号。
  4. 点击创建并继续
  5. 如需提供对项目的访问权限,请向服务账号授予以下角色:Vision AI > Vision AI Editor、Compute Engine > Compute Instance Admin(Beta 版)、Storage > Storage Object Viewer †。在选择角色列表中,选择一个角色。如需添加其他角色,请点击添加其他角色,然后添加其他各个角色。注意角色字段会影响您的服务账号可以访问项目中的哪些资源。您可以撤消这些角色或稍后授予其他角色。在生产环境中,请勿授予 Owner、Editor 或 Viewer 角色。应授予满足您的需求的预定义角色自定义角色
  6. 点击继续
  7. 点击完成以完成服务账号的创建过程。不要关闭浏览器窗口。您将在下一步骤中用到它。

创建服务账号密钥

  1. 在 Google Cloud 控制台中,点击您创建的服务账号的电子邮件地址。
  2. 点击密钥
  3. 点击添加密钥,然后点击创建新密钥
  4. 点击创建。JSON 密钥文件将下载到您的计算机上。
  5. 点击关闭
  6. 安装初始化 Google Cloud CLI。

† 仅当您从 Cloud Storage 存储分区复制示例视频文件时,才需要此角色。

3. 动态滤镜

运动过滤器可捕获包含运动事件的运动和产品视频片段。通过调整运动灵敏度、最短事件时长、回溯期、冷却期和移动侦测区域,用户可以根据自己的需求配置过滤器。

运动滤镜配置

运动滤镜中有 5 种配置可供自定义。

  1. 移动感应灵敏度:应在多大程度上触发移动感应。
  2. 最短事件时长:系统会捕获的最短动作事件时长。
  3. 回溯期:在检测到动作事件之前,视频应开始录制多长时间。
  4. 冷却期:动作事件结束后,系统会进入指定时长的冷却期。在冷却期内,不会触发运动事件。
  5. 移动侦测区域:用户配置的区域,用于指定应在何处运行移动侦测。(将在后面的部分中详细说明)

移动感应灵敏度

在 vaictl 命令中使用标志 motion_detection_sensitivity
字符串。默认媒介。可以选择低、中或高。

移动侦测灵敏度越高,对噪声和较小动作的敏感度就越高。建议在有较小的移动对象(例如远处的人)且光线稳定的环境中采用此设置。

另一方面,低敏感度对光线干扰的敏感度较低。此设置非常适合在光线干扰较多的情况下(例如在室外环境)使用,也适合在视频画质较低且可能存在更多噪音的情况下使用。由于此设置是所有过滤条件中最严格的,因此可能会忽略小对象的移动。

事件录制时长下限

在 vaictl 命令中使用标志 min_event_length_in_seconds
整数。默认值为 10 秒。范围介于 0 秒到 3600 秒之间。

在帧中检测到动作事件细分集后,将解析的动作事件视频的最短时长。

回溯期

在 vaictl 命令中使用标志 look_back_window_in_seconds
整数。默认值为 3 秒。范围介于 0 秒到 3600 秒之间。

回溯期是指在检测到动作事件之前缓存的时长。如果我们想了解在检测到运动事件之前几秒钟的帧中发生了什么,此属性会很有用。

冷却期

在 vaictl 命令中使用标志 cool_down_period_in_seconds
整数。默认值为 300 秒。范围介于 0 秒到 3600 秒之间。

冷却期是指在捕获到动作事件后,暂停移动侦测的时间。在冷却期内,系统不会运行任何计算来检测运动。

4. 基本运动滤镜示例

Vaictl SDK 手册

如需查看 vaictl 手册中有关包含运动过滤器的输入流的信息,请使用以下命令。

vaictl send video-file applying motion-filter -h

准备示例视频

  1. 您可以使用以下 gsutil cp 命令复制示例视频。执行以下变量替换操作:
  • SOURCE:要使用的视频文件的位置。您可以使用自己的视频文件来源(例如 gs://BUCKET_NAME/FILENAME.mp4),也可以使用示例视频 (gs://cloud-samples-data/vertex-ai-vision/street_vehicles_people.mp4)(包含人物和车辆的视频,来源
export SOURCE=gs://cloud-samples-data/vertex-ai-vision/street_vehicles_people.mp4
gsutil cp $SOURCE .

准备环境变量

设置以下环境变量以使用提供的命令模板。

vaictl 变量

  • PROJECT_ID:您的 Google Cloud 项目 ID。
  • LOCATION_ID:您的位置 ID。例如,us-central1。如需了解详情,请参阅 Cloud 位置
  • LOCAL_FILE:本地视频文件的文件名。例如,street_vehicles_people.mp4。
  • -loop 标志:可选。循环播放文件数据以模拟流式传输。
export PROJECT_ID=<Your Google Cloud project ID>
export LOCATION_ID=us-central1

运动滤镜变量

  • MOTION_SENSITIVITY:移动侦测的灵敏度。
  • MIN_EVENT_LENGTH:运动事件的最小长度。
  • LOOK_BACK_WINDOW:在动作事件中首次检测到动作之前要捕获的时长。
  • COOL_DOWN_PERIOD:在捕获到动作事件后,移动侦测将暂停的周期。
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>

准备运动滤镜命令

您可以通过两种方式将运动滤镜与输入源搭配使用。第一种方法是将运动事件发送到 Cloud 控制台中的数据流。第二种方法是将运动事件发送到本地存储空间。

将结果发送到 Cloud 控制台

您可以使用 vaictl 将输出视频数据流式传输到 Cloud 控制台。首先,在 Cloud 控制台中激活 Vision AI API。

注册新视频流

  1. 点击 Vertex AI Vision 左侧面板中的“Streams”(视频流)标签页。
  2. 点击“注册”
  3. 在“数据流名称”中输入 motion-detection-stream
  4. 在“地区”中输入 us-central1
  5. 点击“注册”

将结果发送到数据流

此命令会将视频文件流式传输到流中。如果您使用 –loop 标志,视频会循环播放到数据流中,直到您停止该命令。我们将以后台作业的形式运行此命令,以便它持续进行流式传输。

在开头添加 nohup,在末尾添加 &,使其成为后台作业。

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

从开始执行 vaictl 提取操作到视频显示在信息中心,可能需要大约 100 秒的时间。

在流注入可用后,您可以在 Vertex AI Vision 信息中心的标签页中选择流量流,以查看视频 Feed。

前往“数据流”标签页

将结果发送到本地存储空间

此命令会将视频文件流式传输到流中。

在开头添加 nohup,在末尾添加 &,使其成为后台作业。

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. 移动侦测区域

在本部分中,我们将深入探讨移动侦测区域的用法以及如何配置该区域。此区域旨在屏蔽您不感兴趣的区域的动作,从而提高移动侦测的准确性。

移动侦测区域有两种类型:(1) 正区域,移动侦测仅在带批注的区域中运行;(2) 负区域,移动侦测会忽略带批注的区域中的任何运动。

区域注释

在 vaictl 命令中使用标志 zone_annotation 输入区域多边形的坐标。
字符串。对于可用区注释,默认值为空。

区域注释将是用户输入的字符串,用于表示用户想要隐藏或重点关注的画面中的区域。如需为区域添加注释,用户需要为区域中的每个节点指定 x 轴和 y 轴的图片坐标。一个可用区需要有三个或更多节点才能形成多边形。一个帧中可以有多个区域。如果两个区域相互重叠,则这两个区域共同覆盖的区域仍会覆盖。

时区注释具有特定的输入语法,您必须遵循该语法。

  • 如需表示单个节点,请使用 : 连接图片坐标的 x 轴和 y 轴。例如,左上角的 (0,0) 节点将表示为 0:0
  • 如需表示单个可用区中的所有节点,请使用 ; 连接节点。例如,如果某个可用区包含 (0,0)(100,0)(100,100)(0, 100) 节点,则该可用区将表示为 0:0;100:0;100:100;0:100。始终将节点作为相邻的连接节点输入,顺序可以是顺时针或逆时针。

移动侦测区域 - 正方形*一个包含四个节点的正方形区域。

移动侦测区域 - 三角形*一个包含三个节点的三角形区域。

  • 如需在单个框架中表示多个区域,请使用 - 连接不同的区域。例如,如果我们想同时输入 (0,0)(100,0)(100,100)(0,100)(120,120)(110,150)(200,160),则输入区域注释将为 0:0;100:0;100:100;0:100-120:120;110:150;200:160

移动侦测区域 - 包含两个区域的帧*一个画面中包含两个区域。

如需从图片中获取坐标,您可以使用一些在线工具来获取坐标。例如,请参阅 Wolfram - Get Coordinates from Image

排除带注释的区域

在 vaictl 命令中使用标志 exclude_annotated_zone 来配置检测区域内或区域外的运动。
布尔值。默认值为 false。

“排除注释区域”是用户输入的布尔值,用于表示用户是否希望在移动侦测中排除注释区域。

  • 如果设置为 true,带注释的可用区将充当负可用区。系统不会检测带注释区域中的动作。

移动侦测区域 - 排除选项 *仅在输入区域之外运行移动侦测。

  • 如果设置为 false,则该区域将充当正区域,移动侦测将专注于该区域。

移动侦测区域 - 包含选项 *仅在输入区域中运行移动侦测。

6. 包含移动侦测区域的运动滤镜示例

在此示例中,我们将使用前景中有一棵树在不断移动的视频作为示例。在常规运动过滤设置中,视频只会生成一个动作事件,其时长与原始视频的时长相同,因为运动过滤器会将移动的树木注册为“在整个视频中持续移动”。不过,借助移动侦测区域,我们可以适当遮盖树木的运动,并专注于车辆和行人的运动。

视频准备

示例视频 (gs://cloud-samples-data/vertex-ai-vision/dynamic-background-fall.mp4 ) 包含来自 www.changedetection.net 的树木、汽车和行人。

视频来源:N. Goyette, P.-M. Jodoin, F. Porikli, J. Konrad 和 P. Ishwar, changedetection.net: A new change detection benchmark dataset, in Proc. IEEE Workshop on Change Detection (CDW-2012) at CVPR-2012, Providence, RI, 16-21 Jun., 2012

环境变量准备

Google Cloud 项目变量。

export PROJECT_ID=<Your Google Cloud project ID>
export LOCATION_ID=us-central1
export LOCAL_FILE=street_vehicles_people.mp4

基本运动滤镜配置。

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>

移动侦测区域配置。

从下方选择一个选项,了解移动侦测区域的不同使用方式。

排除移动侦测的树。

export ZONE_ANNOTATION="0:0;680:0;660:70;380:320;100:150"
export EXCLUDE_ANNOTATED_ZONE=true

移动侦测区域 - 从示例视频中带注释的区域排除移动侦测 *仅在输入区域之外运行移动侦测。

将移动侦测重点放在街道上。

export ZONE_ANNOTATION="0:300;780:300;780:480;0:480"
export EXCLUDE_ANNOTATED_ZONE=false

移动侦测区域 - 从示例视频中带注释的区域运行移动侦测 *仅在输入区域之外运行移动侦测。

发送带有动态滤镜的视频串流

将运动事件发送到 Cloud 控制台

您可以使用 vaictl 将输出视频数据流式传输到 Cloud 控制台。首先,在 Cloud 控制台中激活 Vision AI API。

注册新视频流

  1. 点击 Vertex AI Vision 左侧面板中的“Streams”(视频流)标签页。
  2. 点击“注册”
  3. 在“数据流名称”中输入 motion-detection-stream
  4. 在“地区”中输入 us-central1
  5. 点击“注册”

将结果发送到数据流

此命令会将视频文件流式传输到流中。如果您使用 –loop 标志,视频会循环播放到数据流中,直到您停止该命令。我们将以后台作业的形式运行此命令,以便它持续进行流式传输。

在开头添加 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 \
         --zone_annotation=ZONE_ANNOTATION \
         --exclude_annotated_zone=$EXCLUDE_ANNOTATED_ZONE \
  to streams motion-detection-stream --loop

从开始执行 vaictl 提取操作到视频显示在信息中心,可能需要大约 100 秒的时间。

在流注入可用后,您可以在 Vertex AI Vision 信息中心的标签页中选择流量流,以查看视频 Feed。

前往“数据流”标签页

将结果发送到本地存储空间

此命令会将视频文件流式传输到流中。如果您使用 –loop 标志,视频会循环播放到数据流中,直到您停止该命令。我们将以后台作业的形式运行此命令,以便它持续进行流式传输。

在开头添加 nohup,在末尾添加 &,使其成为后台作业。

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. 恭喜

恭喜,您已完成本实验!

清理

为避免因本教程中使用的资源导致您的 Google Cloud 账号产生费用,请通过命令行使用 ctrl + z 结束 vaictl SDK 操作。

资源

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

反馈

点击此处可提供反馈

调查问卷

您将如何使用本教程?

仅阅读教程内容 阅读并完成练习

本 Codelab 对您是否有用?

非常有用 用处一般