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. 设置虚拟机以流式传输视频
在 Google 占用情况分析中创建应用之前,您必须注册一个流,以便应用稍后使用。
在本教程中,您将创建一个托管视频的 Compute Engine 虚拟机实例,并从该虚拟机发送流式视频数据。
创建一个 Linux VM
从 Compute Engine 虚拟机实例发送视频的第一步是创建虚拟机实例。
- 在控制台中,打开虚拟机实例页面。转到“虚拟机实例”
- 选择您的项目并点击继续。
- 点击创建实例。
- 为您的虚拟机指定名称。如需了解详情,请参阅资源命名惯例。
- 可选操作:更改此虚拟机的可用区。Compute Engine 会随机列出每个区域内的可用区,以鼓励跨多个可用区使用。
- 接受其余默认选项。如需详细了解这些选项,请参阅创建和启动虚拟机。
- 要创建并启动该虚拟机,请点击创建。
设置虚拟机环境
虚拟机启动后,您可以使用控制台从浏览器 SSH 连接到虚拟机。然后,您可以下载 vaictl 命令行工具,将视频提取到数据流中。
建立与虚拟机的 SSH 连接
- 在控制台中,打开虚拟机实例页面。转到“虚拟机实例”
- 在您创建的实例行中的连接部分,点击 SSH。这将在新浏览器窗口中打开 SSH 连接。
下载 vaictl 命令行工具
- 在 SSH-in-browser 窗口中,使用以下命令下载 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 左侧面板中的“数据流”标签页。
- 点击“注册”
- 在“数据流名称”中输入“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 秒时间。
流式传输功能可用后,您可以选择“traffic-stream”数据流,在 Vertex AI Vision 信息中心的数据流标签页中查看视频画面。
Google Cloud 控制台中正在提取到数据流中的视频的实时视图。视频来源: Elizabeth Mavor 的 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 的媒体仓库菜单中,点击连接仓库。
- 在关联仓库菜单中,选择创建新仓库。为仓库交通仓库命名,并将 TTL 时长保留为 14 天。
- 点击创建按钮以添加仓库。
6. 将输出连接到 BigQuery 表
将 BigQuery 连接器添加到 Vertex AI Vision 应用后,所有关联的应用模型输出都将提取到目标表中。
您可以创建自己的 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 控制台中与搜索条件匹配的存储视频数据的视图。视频制作人员:Pixabay 上的 Elizabeth Mavor(应用了搜索条件)。
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
在上面的查询中,您可以将“车辆”更改为“人员”以统计人员数量。
此 Codelab 将仅显示 Query1 的示例数据和可视化内容。您可以按照类似的流程处理 Query2。
点击右侧菜单中的“探索数据”,然后选择“使用 Looker Studio 探索”
在“维度”窗格中,添加“时间”,并将时间配置更改为“日期时间”。在“细分维度”中,添加 line_id。
上图显示了每分钟每条线路的车辆/人员数。
深蓝色和浅蓝色条表示两个不同的线条 ID。
10. 恭喜
恭喜,您已完成本实验!
清理
为避免因本教程中使用的资源导致您的 Google Cloud 账号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。
删除项目
删除各个资源
资源
https://cloud.google.com/vision-ai/docs/overview
https://cloud.google.com/vision-ai/docs/occupancy-count-tutorial
反馈