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 Object Viewer †。在选择角色列表中,选择一个角色。要添加其他角色,请点击添加其他角色,然后添加其他角色。注意:角色字段会影响您的服务账号可以访问项目中的哪些资源。您可以撤消这些角色或稍后授予其他角色。在生产环境中,请勿授予 Owner、Editor 或 Viewer 角色。而应授予符合您需求的预定义角色或自定义角色。
- 点击继续。
- 点击完成以完成服务账号的创建。不要关闭浏览器窗口。您将在下一步骤中用到它。
创建服务账号密钥:
- 在 Google Cloud 控制台中,点击您创建的服务账号的电子邮件地址。
- 点击密钥。
- 点击添加密钥,然后点击创建新密钥。
- 点击创建。JSON 密钥文件将下载到您的计算机上。
- 点击关闭。
- 安装并初始化 Google Cloud CLI。
† 角色:仅当您从 Cloud Storage 存储分区复制示例视频文件时才需要该角色。
3. 提取视频文件以进行流式传输
您可以使用 vaictl 将视频数据流式传输到占用分析应用。
首先在 Cloud 控制台中激活 Vision AI API
注册新数据流
- 点击 Vertex AI Vision 左侧面板上的“流”标签页。
- 点击“Register”(注册)
- 在“数据流名称”中,输入“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 的 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 主题
如需创建 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(计算机视觉)模型。
- 数据存储:两个版本的视频 Feed(原始视频流和 AI 模型处理的视频流)可以存储在媒体仓库中。
在 Google Cloud 控制台中,应用以图表的形式表示。
创建空应用
您必须先创建一个空应用,然后才能填充应用图表。
在 Google Cloud 控制台中创建应用。
- 前往 Google Cloud 控制台。
- 打开 Vertex AI Vision 信息中心的应用标签页。
- 点击创建按钮。
- 输入 traffic-app 作为应用名称,然后选择您所在的区域。
- 点击创建。
添加应用组件节点
创建空应用后,您可以将三个节点添加到应用图中:
- 注入节点:注入数据的流资源。
- 处理节点:对提取的数据执行操作的占用分析模型。
- 存储节点:用于存储已处理的视频并用作元数据存储空间的媒体仓库。元数据存储空间包括有关所提取视频数据的分析信息,以及 AI 模型推断出的信息。
在控制台中向应用添加组件节点。
- 打开 Vertex AI Vision 信息中心的应用标签页。前往“Applications”(应用)标签页
- 在“流量-应用”行中,选择查看图表。您将转到处理流水线的图表可视化。
添加数据注入节点
- 要添加输入流节点,请在侧边菜单的连接器部分中选择流选项。
- 在打开的数据流菜单的来源部分,选择添加数据流。
- 在添加数据流菜单中,选择注册新数据流,然后添加数据流名称。
- 如需将数据流添加到应用图,请点击添加数据流。
添加数据处理节点
- 如需添加入住人数模型节点,请在侧边菜单的专用模型部分中选择入住人数分析选项。
- 保留默认选项人员和车辆。
- 在“交叉线”中添加线条。使用“多点线”工具在需要检测车辆或进出人员的位置绘制线条。
- 绘制活跃区域以统计该区域内的人员/车辆。
- 添加了停留时间设置,以便在绘制活跃区域时检测拥塞。
- (目前不支持同时活动区域和跨越线。一次只能使用一项功能。)
添加数据存储节点
- 如需添加输出目标(存储)节点,请在侧边菜单的连接器部分中选择 Vertex AI Vision 的媒体仓库选项。
- 在 Vertex AI Vision 的 Media Warehouse 菜单中,点击 Connect Warehouse。
- 在关联仓库菜单中,选择创建新仓库。为仓库交通仓库命名,并将 TTL 时长保留为 14 天。
- 点击创建按钮以添加仓库。
7. 配置事件管理
时长:02:00
我们会将模型连接到之前创建的 Cloud Functions 函数以进行后处理,在后处理阶段中,Cloud Functions 函数可以自由消化模型的输出并生成符合您需求的事件。然后,我们将之前创建的 Pub/Sub 主题配置为目标,从而配置事件渠道。您还可以设置最小时间间隔,这将有助于避免您的事件渠道在短时间内因同一事件而被淹没。
选择用于后处理的 Cloud Functions 函数
- 点击应用图表上的数据处理节点(占用分析),打开侧边菜单。
- 在“后处理”下拉菜单中选择您的 Cloud Functions 函数(由函数名称标识)。
- 应用图表将自动保存您的更改。
配置事件渠道
- 点击应用图表上的数据处理节点(占用分析),打开侧边菜单。
- 点击“设置活动通知”“事件通知”部分中的“事件通知”
- 从下拉列表中选择您的 Pub/Sub 主题。
- (可选)设置事件发布的最小间隔/频率。
8. 部署应用以供使用
使用所有必要组件构建端到端应用后,使用应用的最后一步是部署应用。
- 打开 Vertex AI Vision 信息中心的应用标签页。前往“Applications”(应用)标签页
- 选择列表中的流量应用应用旁边的查看图表。
- 从应用图表构建器页面中,点击部署按钮。
- 在下面的确认对话框中,选择部署。部署操作可能需要几分钟才能完成。部署完成后,节点旁边会显示绿色对勾标记。
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
反馈