1. 目标
概览
此 Codelab 将重点介绍如何端到端地创建 Vertex AI Vision 应用,以监控实时交通视频片段。我们将使用预训练的专业模型“入住情况分析”的内置功能来捕获以下内容:
- 统计在特定线上穿过道路的车辆和人员数量。
- 统计道路上任意固定区域内的车辆/人数。
- 检测道路任何部分的拥堵情况。
学习内容
- 如何设置虚拟机以提取视频进行流式传输
- 如何在 Vertex AI Vision 中创建应用
- 入住率分析中提供的不同功能以及如何使用这些功能
- 如何部署应用
- 如何在 Vertex AI Vision 的媒体仓库中搜索存储的视频。
- 如何将输出连接到 BigQuery,编写 SQL 查询以从模型的 JSON 输出中提取数据洞见,并在 Looker Studio 中实时直观呈现结果。
2. 准备工作
- 在 Google Cloud 控制台的“项目选择器”页面上,选择或创建 Google Cloud 项目。注意:如果您不打算保留在此过程中创建的资源,请创建新的项目,而不要选择现有的项目。完成本教程介绍的步骤后,您可以删除所创建的项目,并移除与该项目关联的所有资源。前往“项目选择器”
- 确保您的 Cloud 项目已启用结算功能。了解如何检查项目是否已启用结算功能。
- 启用 Compute Engine 和 Vision AI API。启用 API
创建服务账号:
- 在 Google Cloud 控制台中,前往创建服务账号页面。前往“创建服务账号”
- 选择您的项目。
- 在服务账号名称字段中,输入一个名称。Google Cloud 控制台会根据此名称填充服务账号 ID 字段。在服务账号说明字段中,输入说明。例如,快速入门服务账号。
- 点击创建并继续。
- 如需提供对项目的访问权限,请向服务账号授予以下角色:Vision AI > Vision AI Editor、Compute Engine > Compute Instance Admin(Beta 版)、Storage > Storage Object Viewer †。在选择角色列表中,选择一个角色。如需添加其他角色,请点击添加其他角色,然后添加其他各个角色。注意:角色字段会影响您的服务账号可以访问项目中的哪些资源。您可以撤消这些角色或稍后授予其他角色。在生产环境中,请勿授予 Owner、Editor 或 Viewer 角色。应授予满足您的需求的预定义角色或自定义角色。
- 点击继续。
- 点击完成以完成服务账号的创建过程。不要关闭浏览器窗口。您将在下一步骤中用到它。
创建服务账号密钥:
- 在 Google Cloud 控制台中,点击您创建的服务账号的电子邮件地址。
- 点击密钥。
- 点击添加密钥,然后点击创建新密钥。
- 点击创建。JSON 密钥文件将下载到您的计算机上。
- 点击关闭。
- 安装并初始化 Google Cloud CLI。
† 仅当您从 Cloud Storage 存储分区复制示例视频文件时,才需要此角色。
3. 设置用于流式传输视频的虚拟机
在入住分析中创建应用之前,您必须先注册一个可供该应用日后使用的流。
在本教程中,您将创建一个托管视频的 Compute Engine 虚拟机实例,并从该虚拟机发送流式视频数据。
创建一个 Linux VM
从 Compute Engine 虚拟机实例发送视频的第一步是创建虚拟机实例。
- 在控制台中,打开虚拟机实例页面。转到“虚拟机实例”
- 选择您的项目并点击继续。
- 点击创建实例。
- 为您的虚拟机指定名称。如需了解详情,请参阅资源命名惯例。
- 可选操作:更改此虚拟机的可用区。Compute Engine 会随机列出每个区域内的可用区,以支持跨多个可用区使用。
- 接受其余的默认选项。如需详细了解这些选项,请参阅创建并启动虚拟机。
- 要创建并启动该虚拟机,请点击创建。
设置虚拟机环境
虚拟机启动后,您可以使用控制台从浏览器通过 SSH 连接到虚拟机。然后,您可以下载 vaictl 命令行工具,将视频提取到您的直播中。
与虚拟机建立 SSH 连接
- 在控制台中,打开虚拟机实例页面。转到“虚拟机实例”
- 在您创建的实例行的连接部分中,点击 SSH。这将在新的浏览器窗口中打开 SSH 连接。

下载 vaictl 命令行工具
- 在浏览器中的 SSH 窗口中,使用以下命令下载 Vertex AI Vision (vaictl) 命令行工具:
wget https://github.com/google/visionai/releases/download/v0.0.4/visionai_0.0-4_amd64.deb
- 运行以下命令来安装命令行工具:
sudo apt install ./visionai_0.0-4_amd64.deb
- 您可以运行以下命令来测试安装:
vaictl --help
4. 注入视频文件以进行流式传输
设置虚拟机环境后,您可以复制一个示例视频文件,然后使用 vaictl 将视频数据流式传输到入住率分析应用。
首先在 Cloud 控制台中激活 Vision AI API
注册新的视频流
- 点击 Vertex AI Vision 左侧面板上的“Streams”(视频流)标签页。
- 点击“注册”
- 在“数据流名称”中输入“traffic-stream”
- 在“区域”中输入“us-central1”
- 点击“注册”
注册直播需要几分钟时间。
将示例视频复制到虚拟机
- 在虚拟机的浏览器中的 SSH 窗口中,使用以下 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 .
从虚拟机流式传输视频并将数据提取到您的直播中
- 如需将此本地视频文件发送到应用输入流,请使用以下命令。您必须进行以下变量替换:
- 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 export LOCAL_FILE=street_vehicles_people.mp4
- 此命令会将视频文件流式传输到流中。如果您使用 –loop 标志,视频会循环播放到数据流中,直到您停止该命令。我们将以后台作业的形式运行此命令,以便即使虚拟机断开连接,它也能继续流式传输。
- (在开头添加 nohup,在结尾添加“&”,使其成为后台作业)
nohup vaictl -p $PROJECT_ID \
-l $LOCATION_ID \
-c application-cluster-0 \
--service-endpoint visionai.googleapis.com \
send video-file to streams 'traffic-stream' --file-path $LOCAL_FILE --loop &
从开始执行 vaictl 提取操作到视频显示在信息中心,可能需要大约 100 秒的时间。
在流注入可用后,您可以在 Vertex AI Vision 信息中心的流标签页中选择流量流,以查看视频 Feed。
在 Google Cloud 控制台中实时查看正在提取到直播中的视频。视频来源: Elizabeth Mavor on Pixabay(添加了像素化效果)。
5. 创建应用
第一步是创建用于处理数据的应用。应用可以看作是一个自动化的流水线,用于连接以下各项:
- 数据注入:将视频 Feed 注入到流中。
- 数据分析:提取数据后,可以添加 AI(计算机视觉)模型。
- 数据存储:视频源的两个版本(原始视频流和由 AI 模型处理的视频流)可以存储在媒体仓库中。
在 Google Cloud 控制台中,应用以图表的形式表示。
创建空应用
在填充应用图之前,您必须先创建一个空应用。
在 Google Cloud 控制台中创建应用。
- 前往 Google Cloud 控制台。
- 打开 Vertex AI Vision 信息中心的应用标签页。
- 点击添加创建按钮。
- 输入 traffic-app 作为应用名称,然后选择您的地区。
- 点击创建。
添加应用组件节点
创建空应用后,您可以将以下三个节点添加到应用图中:
- 提取节点:用于提取您创建的 Compute Engine 虚拟机实例发送的数据的流资源。
- 处理节点:对提取的数据进行处理的入住率分析模型。
- 存储节点:存储已处理视频并充当元数据存储区的媒体仓库。元数据存储区包含有关已注入视频数据的分析信息,以及 AI 模型推断出的信息。
在控制台中向应用添加组件节点。
- 打开 Vertex AI Vision 信息中心的应用标签页。前往“应用”标签页
- 在“流量-应用”行中,选择查看图表。此操作会将您带到处理流水线的图表可视化界面。
添加数据注入节点
- 如需添加输入视频流节点,请选择侧边菜单的连接器部分中的视频流选项。
- 在打开的视频流菜单的来源部分中,选择添加视频流。
- 在添加视频流菜单中,选择注册新的视频流,然后添加 traffic-stream 作为视频流名称。
- 如需将视频流添加到应用图表中,请点击添加视频流。
添加数据处理节点
- 如需添加入住人数统计模型节点,请选择侧边菜单的专用模型部分中的入住分析选项。
- 保留默认选择的人员和车辆。
- 在“越线”中添加线条。使用多点线工具绘制需要检测车辆或人员离开或进入的线路。
- 绘制活跃区域,以统计该区域内的人员/车辆数量。
- 添加了停留时间设置,以便在绘制了活动所涉区域的情况下检测拥堵情况。
- (目前不支持同时启用区域和线路穿越。一次只能使用一项功能。)


添加数据存储节点
- 如需添加输出目标位置(存储)节点,请选择侧边菜单的连接器部分中的 Vertex AI Vision 的媒体仓库选项。
- 在 Vertex AI Vision 的媒体仓库菜单中,点击连接仓库。
- 在连接仓库菜单中,选择创建新仓库。将仓库命名为“traffic-warehouse”,并将 TTL 时长保留 14 天。
- 点击创建按钮以添加仓库。
6. 将输出连接到 BigQuery 表
向 Vertex AI Vision 应用添加 BigQuery 连接器后,所有已连接的应用模型输出都将提取到目标表中。
您可以自行创建 BigQuery 表,并在向应用添加 BigQuery 连接器时指定该表,也可以让 Vertex AI Vision 应用平台自动创建该表。
自动创建表格
如果您让 Vertex AI Vision 应用平台自动创建表,则可以在添加 BigQuery 连接器节点时指定此选项。
如果您想使用自动创建表功能,则必须满足以下数据集和表条件:
- 数据集:自动创建的数据集名称为 visionai_dataset。
- 表格:自动创建的表格名称为 visionai_dataset.APPLICATION_ID。
- 错误处理:
- 如果同一数据集下存在同名表,则不会自动创建。
- 打开 Vertex AI Vision 信息中心的应用标签页。前往“应用”标签页
- 从列表中选择应用名称旁边的查看应用。
- 在应用构建器页面上,从连接器部分选择 BigQuery。
- 将 BigQuery 路径字段留空。

- 在存储来自以下来源的元数据:中,仅选择“人员/车辆数量分析”,并取消选中数据流。
最终的应用图应如下所示:

7. 部署应用以供使用
在构建包含所有必需组件的端到端应用后,使用该应用的最后一步是部署它。
- 打开 Vertex AI Vision 信息中心的应用标签页。前往“应用”标签页
- 选择列表中的“traffic-app”应用旁边的查看图表。
- 在应用图构建器页面中,点击部署按钮。
- 在随后的确认对话框中,选择部署。部署操作可能需要几分钟才能完成。部署完成后,节点旁边会显示绿色对勾标记。

8. 搜索存储仓中的视频内容
将视频数据提取到处理应用后,您可以查看分析后的视频数据,并根据入住情况分析信息搜索数据。
- 打开 Vertex AI Vision 信息中心的仓库标签页。前往“数据仓库”标签页
- 在列表中找到流量仓库,然后点击查看资产。
- 在人数或车辆数部分,将最小值设置为 1,将最大值设置为 5。
- 如需过滤存储在 Vertex AI Vision 的媒体仓库中的已处理视频数据,请点击搜索。

Google Cloud 控制台中与搜索条件匹配的存储视频数据的视图。视频提供方: Elizabeth Mavor(来自 Pixabay,应用了搜索条件)。
9. 分析 BigQuery 表中的输出
转至 BigQuery
选择数据集:visionai_dataset
选择表:您的 APPLICATION_ID(在本例中为 traffic-app)
点击表格名称右侧的三个点,然后点击“查询”
编写以下查询
查询 1:查询每分钟通过每条线的车辆数量
abc.sql
—- Get list of active marked lines for each timeframe
WITH line_array AS (
SELECT
t.ingestion_time AS ingestion_time,
JSON_QUERY_ARRAY(t.annotation.stats["crossingLineCounts"]) AS lines
FROM
`PROJ_ID.visionai_dataset.APP_ID` AS t
),
—- Flatten active lines to get individual entities details
flattened AS (
SELECT
line_array.ingestion_time,
JSON_VALUE(line.annotation.id) as line_id,
JSON_QUERY_ARRAY(line["positiveDirectionCounts"]) AS entities
FROM line_array, unnest(line_array.lines) as line
)
—- Generate aggregate vehicle count per zone w.r.t time
SELECT
STRING(TIMESTAMP_TRUNC(ingestion_time, MINUTE) ) AS time, line_id,
SUM(INT64(entity["count"])) as vehicle_count
FROM
flattened, UNNEST(flattened.entities) AS entity
WHERE JSON_VALUE(entity['entity']['labelString']) = 'Vehicle'
GROUP BY time, line_id
查询 2:用于检查每个区域每分钟的车辆数量的查询
—- Get list of active zones for each timeframe
WITH zone_array AS (
SELECT
t.ingestion_time AS ingestion_time,
JSON_QUERY_ARRAY(t.annotation.stats["activeZoneCounts"]) AS zones
FROM
`PROJ_ID.visionai_dataset.APP_ID` AS t
),
—- Flatten active zones to get individual entities details
flattened AS (
SELECT zone_array.ingestion_time, JSON_VALUE(zone.annotation.id) as zone_id,
JSON_QUERY_ARRAY(zone["counts"]) AS entities
FROM zone_array, unnest(zone_array.zones) as zone
)
—- Generate aggregate vehicle count per zone w.r.t time
SELECT
STRING(TIMESTAMP_TRUNC(ingestion_time, MINUTE) ) AS time,
zone_id,
SUM(INT64(entity["count"])) as vehicle_count
FROM flattened, UNNEST(flattened.entities) AS entity
WHERE JSON_VALUE(entity['entity']['labelString']) = 'Vehicle'
GROUP BY time, zone_id
在上述查询中,您可以将“Vehicle”更改为“Person”来统计人数。
此 Codelab 将仅显示 Query1 的示例数据和可视化图表。对于 Query2,您可以遵循类似的过程。

点击右侧侧边菜单中的“探索数据”,然后选择“使用 Looker Studio 探索”

在“维度”窗格中,添加时间并将时间配置更改为日期时间。在“细分维度”中添加 line_id。
上图显示了每分钟通过每条线的车辆/人数。
深蓝色和浅蓝色条形表示两个不同的 line-id。
10. 恭喜
恭喜,您已完成本实验!
清理
为避免因本教程中使用的资源导致您的 Google Cloud 账号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。
删除项目
删除各个资源
资源
https://cloud.google.com/vision-ai/docs/overview
https://cloud.google.com/vision-ai/docs/occupancy-count-tutorial
反馈