Vertex AI Vision 流量监控应用

1. 目标

概览

本 Codelab 将重点介绍如何端到端创建 Vertex AI Vision 应用,以监控实时交通视频素材 。我们将使用预训练的专用模型占用情况分析的内置功能来捕获以下内容:

  • 统计在特定线路处过马路的车辆和人数。
  • 统计道路上任何固定区域内的车辆/人数。
  • 检测道路任何部分的拥堵情况。

学习内容

  • 如何设置虚拟机以注入视频进行流式传输
  • 如何在 Vertex AI Vision 中创建应用
  • 占用情况分析中提供的不同功能以及如何使用这些功能
  • 如何部署应用
  • 如何在存储 Vertex AI Vision 的媒体仓库中搜索视频。
  • 如何将输出连接到 BigQuery,编写 SQL 查询以从模型的 JSON 输出中提取洞见,并在 Looker Studio 中实时直观呈现结果。

2. 准备工作

  1. 在 Google Cloud 控制台的“项目选择器”页面上,选择或 创建 Google Cloud 项目。注意:如果您不打算保留在此过程中创建的资源,请创建新的项目,而不要选择现有的项目。完成本教程介绍的步骤后,您可以删除所创建的项目,这会移除与该项目关联的所有资源。前往项目选择器
  2. 确保您的云项目已启用结算功能。了解如何 检查项目是否已启用结算功能。
  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. 设置虚拟机以流式传输视频

在占用情况分析中创建应用之前,您必须注册一个视频流,该视频流稍后可供应用使用。

在本教程中,您将创建一个托管视频的 Compute Engine 虚拟机实例,并从该虚拟机发送流式视频数据。

创建一个 Linux VM

从 Compute Engine 虚拟机实例发送视频的第一步是创建虚拟机实例。

  1. 在控制台中,打开虚拟机实例 页面。转到“虚拟机实例”
  2. 选择您的项目并点击继续。
  3. 点击创建实例。
  4. 为您的虚拟机指定名称 。如需了解详情,请参阅 资源命名惯例。
  5. 可选操作:更改此虚拟机的可用区 。Compute Engine 会随机列出每个区域内的可用区,以支持跨多个可用区使用。
  6. 接受其余默认选项。如需详细了解这些选项,请参阅 创建并启动虚拟机。
  7. 要创建并启动该虚拟机,请点击创建 。

设置虚拟机环境

虚拟机启动后,您可以使用控制台通过浏览器 SSH 连接到虚拟机。然后,您可以下载 vaictl 命令行工具,将视频注入到您的视频流中。

与虚拟机建立 SSH 连接

  1. 在控制台中,打开虚拟机实例 页面。转到“虚拟机实例”
  2. 在您创建的实例行的连接 部分中,点击 SSH 。这会在新的浏览器窗口中打开 SSH 连接。 界面中的 SSH 选项

下载 vaictl 命令行工具

  1. 在 SSH-in-browser 窗口中,使用以下命令下载 Vertex AI Vision (vaictl) 命令行工具:
wget https://github.com/google/visionai/releases/download/v0.0.4/visionai_0.0-4_amd64.deb
  1. 请运行以下命令来安装命令行工具:
sudo apt install ./visionai_0.0-4_amd64.deb
  1. 您可以运行以下命令来测试安装:
vaictl --help

4. 注入视频文件以进行流式传输

设置虚拟机环境后,您可以复制示例视频文件,然后使用 vaictl 将视频数据流式传输到占用情况分析应用。

首先,在 Cloud 控制台中激活 Vision AI API

注册新的视频流

  1. 点击 Vertex AI Vision 左侧面板中的“视频流”标签页。
  2. 点击“注册”
  3. 在“视频流名称”中输入“traffic-stream”
  4. 在“区域”中输入“us-central1”
  5. 点击“注册”

注册视频流需要几分钟时间。

将示例视频复制到虚拟机

  1. 在虚拟机的 SSH-in-browser 窗口中,使用以下 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 .

从虚拟机流式传输视频并将数据注入到视频流中

  1. 如需将此本地视频文件发送到应用输入视频流,请使用以下命令。您必须进行以下变量替换:
  • 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
  1. 此命令会将视频文件流式传输到视频流。如果您使用 –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 信息中心的视频流 标签页中选择 traffic-stream 视频流,以查看视频 Feed。

前往“视频流”标签页

界面中正在直播的实时视频的视图在 Google Cloud 控制台中实时查看注入到视频流中的视频。视频来源: Pixabay 上的 Pixabay(已添加像素化效果)。

5. 创建应用

第一步是创建一个处理数据的应用。应用可以视为连接以下内容的自动化流水线:

  • 数据注入:将视频 Feed 注入到视频流中。
  • 数据分析:注入后可以添加 AI(计算机视觉)模型。
  • 数据存储:视频 Feed 的两个版本(原始视频流和 AI 模型处理的视频流)可以存储在媒体仓库中。

在 Google Cloud 控制台中,应用以图表的形式表示。

创建空应用

在填充应用图表之前,您必须先创建一个空应用。

在 Google Cloud 控制台中创建应用。

  1. 前往 Google Cloud 控制台。
  2. 打开 Vertex AI Vision 信息中心的应用 标签页。

前往“应用”标签页

  1. 点击添加 Create (创建)按钮。
  2. 输入 traffic-app 作为应用名称,然后选择您的区域。
  3. 点击创建 。

添加应用组件节点

创建空应用后,您可以将以下三个节点添加到应用图表中:

  1. 注入节点:注入从您创建的 Compute Engine 虚拟机实例发送的数据的流资源。
  2. 处理节点:对注入的数据执行操作的占用情况分析模型。
  3. 存储节点:存储已处理视频并充当元数据存储区的媒体仓库。元数据存储区包括有关注入的视频数据和 AI 模型推断的信息的分析信息。

在控制台中向应用添加组件节点。

  1. 打开 Vertex AI Vision 信息中心的应用 标签页。前往“应用”标签页
  2. 在 traffic-app 行中,选择 查看图表。这会将您带到处理流水线的图可视化界面。

添加数据注入节点

  1. 如需添加输入视频流节点,请选择侧边菜单的连接器 部分中的视频流 选项。
  2. 在打开的信息流 菜单的来源 部分中,选择添加信息流 。
  3. 在添加视频流 菜单中,选择注册新的视频流 ,然后添加 traffic-stream 作为视频流名称。
  4. 如需将视频流添加到应用图表,请点击添加视频流 。

添加数据处理节点

  1. 如需添加占用情况计数模型节点,请选择侧边菜单的专用模型 部分中的占用情况分析 选项。
  2. 保留默认选择的人员 和车辆 。
  3. 在“线路交叉”中添加线路。使用多点线工具绘制需要检测车辆或人员离开或进入的线路。
  4. 绘制活跃区域以统计该区域内的人员/车辆。
  5. 如果绘制了活跃区域,请添加停留时间设置以检测拥堵情况。
  • (目前不支持同时使用活跃区域和线路交叉。一次只能使用一项功能。)

3acdb6f1e8474e07.png ce63449d601995e9.png

194c54d2bbcf7e8a.png

添加数据存储节点

  1. 如需添加输出目标位置(存储)节点,请选择侧边菜单的连接器部分中的Vertex AI Vision 的媒体仓库选项。
  2. 在 Vertex AI Vision 的媒体仓库 菜单中,点击 连接仓库。
  3. 在连接仓库 菜单中,选择创建新仓库 。将仓库命名为 traffic-warehouse,并将 TTL 时长保留 14 天。
  4. 点击创建 按钮以添加仓库。

6. 将输出连接到 BigQuery 表

当您向 Vertex AI Vision 应用添加 BigQuery 连接器时,所有关联的应用模型输出都将注入到目标表中。

您可以创建自己的 BigQuery 表,并在向应用添加 BigQuery 连接器时指定该表,也可以让 Vertex AI Vision 应用平台自动创建该表。

自动创建表

如果您让 Vertex AI Vision 应用平台自动创建表,则可以在添加 BigQuery 连接器节点时指定此选项。

如果您想使用自动创建表,则适用以下数据集和表条件:

  • 数据集:自动创建的数据集名称为 visionai_dataset。
  • 表:自动创建的表名称为 visionai_dataset.APPLICATION_ID。
  • 错误处理:
  • 如果同一数据集下存在同名的表,则不会自动创建。
  1. 打开 Vertex AI Vision 信息中心的应用 标签页。前往“应用”标签页
  2. 从列表中选择应用名称旁边的查看应用 。
  3. 在应用构建器页面上,从连接器 部分中选择 BigQuery 。
  4. 将 BigQuery 路径 字段留空。 ee0b67d4ab2263d.png
  5. 在存储元数据来源: 中,仅选择“占用情况分析”,并取消选中“视频流”。

最终的应用图表应如下所示:

1787242465fd6da7.png

7. 部署应用以供使用

使用所有必要组件构建端到端应用后,使用应用的最后一步是部署应用。

  1. 打开 Vertex AI Vision 信息中心的应用 标签页。前往“应用”标签页
  2. 在列表中选择 traffic-app 应用旁边的查看图表 。
  3. 在应用图表构建器页面中,点击部署 按钮。
  4. 在以下确认对话框中,选择部署 。部署操作可能需要几分钟才能完成。部署完成后,节点旁边会显示绿色对勾标记。 ee78bbf00e5db898.png

8. 在存储仓库中搜索视频内容

将视频数据注入到处理应用后,您可以查看分析的视频数据,并根据占用情况分析信息搜索数据。

  1. 打开 Vertex AI Vision 信息中心的仓库 标签页。前往“仓库”标签页
  2. 在列表中找到 traffic-warehouse 仓库,然后点击查看资产 。
  3. 在人数统计 或车辆数统计 部分中,将最小值 设置为 1,将最大值 设置为 5。
  4. 如需过滤存储在 Vertex AI Vision 的媒体仓库中的已处理视频数据,请点击搜索 。

e636361b19738c8d.png

在 Google Cloud 控制台中查看与搜索条件匹配的存储视频数据。Pixabay

9. 分析 BigQuery 表中的输出

转至 BigQuery

选择数据集:visionai_dataset

选择表:您的应用 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 将仅显示查询 1 的示例数据和可视化图表。您可以按照类似的过程进行查询 2。

e6fd891f3a46246.png

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

9e737ddb4d0d25b6.png

在“维度”窗格中,添加时间并将时间配置更改为日期时间。在“细分维度”中,添加 line_id。 b5da9704ccd8db.png

上图显示了每分钟通过每条线路的车辆/人数。

深蓝色和浅蓝色条形表示两个不同的 line-id。

10. 恭喜

恭喜!您已完成此实验!

清理

为避免因本教程中使用的资源导致您的 Google Cloud 账号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。

删除项目

删除各个资源

资源

https://cloud.google.com/vision-ai/docs/overview

https://cloud.google.com/vision-ai/docs/occupancy-count-tutorial

反馈

点击此处可提供反馈

调查问卷

您将如何使用本教程?

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

本 Codelab 对您是否有用?

非常有用 有用