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 控制台中正在提取到数据流中的视频的实时视图。视频制作人员:Pixabay 上的 Elizabeth Mavor(添加了像素化效果)。
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(计算机视觉)模型。
- 数据存储:视频画面的两个版本(原始数据流和由 AI 模型处理的数据流)可以存储在媒体仓库中。
在 Google Cloud 控制台中,应用以图表的形式表示。
创建空应用
您必须先创建一个空应用,然后才能填充应用图。
在 Google Cloud 控制台中创建应用。
- 前往 Google Cloud 控制台。
- 打开 Vertex AI Vision 信息中心的应用标签页。
- 点击“添加”图标 Create。
- 输入 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
反馈