1. 目标
概览
此 Codelab 将重点介绍如何端到端地创建 Vertex AI Vision 应用,以使用事件管理功能发送事件。我们将使用预训练的专用模型“入住分析”的内置功能,根据以下内容的捕获情况生成事件:
- 统计在特定线上穿过道路的车辆和人员数量。
- 统计道路上任意固定区域内的车辆/人数。
- 检测道路任何部分的拥堵情况。
学习内容
- 如何提取视频以进行流式传输
- 如何在 Vertex AI Vision 中创建应用
- 入住率分析中提供的不同功能以及如何使用这些功能
- 如何部署应用
- 如何在 Vertex AI Vision 的媒体仓库中搜索存储的视频。
- 如何创建处理入住分析模型数据的 Cloud Functions 函数。
- 如何创建 Pub/Sub 主题和订阅。
- 如何设置事件管理以通过 Pub/Sub 主题发送事件。
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. 注入视频文件以进行流式传输
您可以使用 vaictl 将视频数据流式传输到入住情况分析应用。
首先在 Cloud 控制台中激活 Vision AI API
注册新的视频流
- 点击 Vertex AI Vision 左侧面板上的“Streams”(视频流)标签页。
- 点击“注册”
- 在“数据流名称”中输入“traffic-stream”
- 在“区域”中输入“us-central1”
- 点击“注册”
注册直播需要几分钟时间。
准备示例视频
- 您可以使用以下 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(添加了像素化效果)。
4. 创建 Cloud Functions 函数
我们需要一个 Cloud Functions 函数来处理模型的数据并生成稍后将通过事件渠道发送的事件。
您可以点击此处详细了解 Cloud Functions
创建监听模型的 Cloud Functions 函数
- 前往 Cloud Functions 界面创建页面。
- 设置函数名称,该名称稍后将用于在“活动管理”设置中引用此 Cloud Functions 函数。
- 确保区域与您的应用相符。
- 调整并保存触发器设置。
- 点击“下一步”按钮,前往“代码”部分。

- 修改您的 Cloud Functions 函数。下面是一个使用 Node.js 运行时的示例。
/**
* Responds to any HTTP request.
*
* @param {!express:Request} req HTTP request context.
* @param {!express:Response} res HTTP response context.
*/
exports.hello_http = (req, res) => {
// Logging statement can be read with cmd `gcloud functions logs read {$functionName}`.
// For more about logging, please see https://cloud.google.com/functions/docs/monitoring
// The processor output will be stored in req.body.
const messageString = constructMessage(req.body);
// Send your message to operator output with res HTTP response context.
res.status(200).send(messageString);
};
function constructMessage(data) {
/**
* Typically, your processor output should contains appPlatformMetadata & it's designed output.
* For example here, if your output is of tyoe OccupancyCountingPredictionResult, you will need
* to construct the return annotation as such.
*/
// access appPlatformMetat.
const appPlatformMetadata = data.appPlatformMetadata;
// access annotations.
const annotations = data.annotations.map(annotation => {
// This is a mock OccupancyCountingPredictionResult annotation.
return {"annotation" : {"track_info": {"track_id": "12345"}}};
});
const events = [];
for(const annotation of annotations) {
events.push({
"event_message": "Detection event",
"payload" : {
"description" : "object detected"
},
"event_id" : "track_id_12345"
});
}
/**
* Typically, your cloud function should return a string represent a JSON which has two fields:
* "annotations" must follow the specification of the target model.
* "events" should be of type "AppPlatformEventBody".
*/
const messageJson = {
"annotations": annotations,
"events": events,
};
return JSON.stringify(messageJson);
}
- 点击“部署”按钮以部署函数。
5. 创建 Pub/Sub 主题和订阅
我们需要向应用提供一个 Pub/Sub 主题,以便应用可以将事件发送到该主题。如需接收这些事件,Pub/Sub 订阅需要订阅已配置的光学数据。
创建 Pub/Sub 主题
如需创建 Pub/Sub 主题,您可以使用 gcloud CLI:(您应将 SUBSCRIPTION_ID 替换为设置中的实际值)
gcloud pubsub topics create TOPIC_ID
或者,您也可以使用 Pub/Sub 界面
创建 Pub/Sub 订阅
如需创建 Pub/Sub 订阅,您可以使用 gcloud CLI:(您应将 SUBSCRIPTION_ID 和 TOPIC_ID 替换为设置中的实际值)
gcloud pubsub subscriptions create SUBSCRIPTION_ID \
--topic=TOPIC_ID \
或者,您也可以使用 Pub/Sub 界面
6. 创建应用
第一步是创建用于处理数据的应用。应用可以看作是一个自动化的流水线,用于连接以下各项:
- 数据注入:将视频 Feed 注入到流中。
- 数据分析:提取数据后,可以添加 AI(计算机视觉)模型。
- 数据存储:视频源的两个版本(原始视频流和由 AI 模型处理的视频流)可以存储在媒体仓库中。
在 Google Cloud 控制台中,应用以图表的形式表示。
创建空应用
在填充应用图之前,您必须先创建一个空应用。
在 Google Cloud 控制台中创建应用。
- 前往 Google Cloud 控制台。
- 打开 Vertex AI Vision 信息中心的应用标签页。
- 点击添加创建按钮。
- 输入 traffic-app 作为应用名称,然后选择您的地区。
- 点击创建。
添加应用组件节点
创建空应用后,您可以将以下三个节点添加到应用图中:
- 注入节点:注入数据的流资源。
- 处理节点:对提取的数据进行处理的入住率分析模型。
- 存储节点:存储已处理视频并充当元数据存储区的媒体仓库。元数据存储区包含有关已注入视频数据的分析信息,以及 AI 模型推断出的信息。
在控制台中向应用添加组件节点。
- 打开 Vertex AI Vision 信息中心的应用标签页。前往“应用”标签页
- 在“流量-应用”行中,选择查看图表。此操作会将您带到处理流水线的图表可视化界面。
添加数据注入节点
- 如需添加输入视频流节点,请选择侧边菜单的连接器部分中的视频流选项。
- 在打开的视频流菜单的来源部分中,选择添加视频流。
- 在添加视频流菜单中,选择注册新的视频流,然后添加 traffic-stream 作为视频流名称。
- 如需将视频流添加到应用图表中,请点击添加视频流。
添加数据处理节点
- 如需添加入住人数统计模型节点,请选择侧边菜单的专用模型部分中的入住分析选项。
- 保留默认选择的人员和车辆。
- 在“越线”中添加线条。使用多点线工具绘制需要检测车辆或人员离开或进入的线路。
- 绘制活跃区域,以统计该区域内的人员/车辆数量。
- 添加了停留时间设置,以便在绘制了活动所涉区域的情况下检测拥堵情况。
- (目前不支持同时启用区域和线路穿越。一次只能使用一项功能。)


添加数据存储节点
- 如需添加输出目标位置(存储)节点,请选择侧边菜单的连接器部分中的 Vertex AI Vision 的媒体仓库选项。
- 在 Vertex AI Vision 的媒体仓库菜单中,点击连接仓库。
- 在连接仓库菜单中,选择创建新仓库。将仓库命名为“traffic-warehouse”,并将 TTL 时长保留 14 天。
- 点击创建按钮以添加仓库。
7. 配置事件管理
时长 02:00
我们将模型连接到之前创建的 Cloud Functions 以进行后处理,其中 Cloud Functions 可以自由处理模型的输出并生成符合您需求的事件。然后,我们将之前创建的 Pub/Sub 主题配置为目标,从而配置事件渠道。您还可以设置最小间隔,这有助于避免您的事件渠道在短时间内被同一事件淹没。
选择用于后处理的 Cloud Functions 函数
- 点击应用图中的数据处理节点(入住情况分析)以打开侧边菜单。
- 在“后处理”下拉菜单中选择您的 Cloud Functions 函数(通过函数名称识别)。
- 应用图表会自动保存您所做的更改。

配置事件渠道
- 点击应用图中的数据处理节点(入住情况分析)以打开侧边菜单。
- 在“活动通知”部分中,点击“设置活动通知”。

- 在下拉菜单中选择您的 Pub/Sub 主题。
- (可选)设置事件发布的最小间隔/频率。

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

9. 验证 Pub/Sub 订阅中的事件/消息
将视频数据提取到处理应用后,Cloud Functions 函数应在入住率分析模型输出注释后生成事件。然后,这些事件应通过您的 Pub/Sub 主题作为消息发布,并由您的订阅接收。
以下步骤假定您拥有拉取订阅。
- 打开项目中的 Pub/Sub 订阅列表,然后找到相应的订阅。前往 Pub/Sub 订阅列表页面
- 前往“消息”标签页。
- 点击“拉取”按钮。
- 在表格中查看您的消息。

或者,您也可以了解如何在没有界面的情况下接收消息。前往订阅页面
10. 恭喜
恭喜,您已完成本实验!
清理
为避免因本教程中使用的资源导致您的 Google Cloud 账号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。
删除项目
删除各个资源
资源
https://cloud.google.com/vision-ai/docs/overview
https://cloud.google.com/vision-ai/docs/occupancy-count-tutorial
反馈