实时交通监控:YOLOv8与NVIDIA JetPack 6.0的集成应用
本文翻译自NVIDIA Blog:
智能交通系统(ITS)应用在现代城市环境中变得越来越有价值和普遍。使用ITS应用程序的好处包括:
- 提高交通效率 :通过分析实时交通数据,ITS可以优化交通流量,减少拥堵并缩短旅行时间。
- 提高安全性 :ITS可以检测潜在危险,监控交通违规行为,并更有效地管理事故,从而实现更安全的道路。
- 提高环境可持续性 :高效的交通管理可减少燃料消耗和排放,为环境可持续性做出贡献。
重要的是,这些系统需要在边缘处理信息,以实现可靠的带宽、隐私、实时分析等。
这篇文章介绍了如何使用 NVIDIA JetPack 6.0 中的新 Jetson 平台服务 为边缘实施端到端流量分析解决方案。该系统包括使用视频存储工具包 (VST) 服务进行视频摄取和存储、使用 YOLOv8 和 DeepStream AI 感知服务进行实时对象检测和车辆跟踪,以及对车辆运动的时空分析。创建管道后,将使用 API 生成分析。
Jetson 平台服务的优势
使用 Jetson 平台服务和 NVIDIA Jetpack 构建和部署 AI 应用程序具有以下优势:
- 快速、高效的解决方案 :丰富的优化 API 驱动型微服务集合有助于缩短解决方案时间。
- 可扩展 性:微服务架构支持各组件独立扩展,根据需求优化资源利用率。
- 模块化 :将应用程序分解为更小、可管理的服务可简化更新、维护和故障排除。
- 灵活性 :服务可以通过多种方式进行配置和部署,为特定的ITS需求提供量身定制的解决方案,无论是监控交通、管理十字路口还是确保行人安全。
要了解有关最新 JetPack SDK 功能的更多信息,请参阅 使用 NVIDIA JetPack 6.0 在边缘提供 Power Cloud-Native 微服务,现已正式发布 。
应用概述
此 ITS 应用程序使用三个主要服务:视频存储工具包 (VST) 服务、AI 感知服务和 AI 分析服务。它还使用多种基础服务,例如 Redis 消息总线、API 网关和 IoT 网关。
VST 是视频数据的入口点。它在基于 Jetson 的平台上高效管理摄像机和视频流,提供来自多个视频源的硬件加速视频解码、流式传输和存储。在此设置中,视频输入文件使用 RTSP 流式传输到 VST。有关使用 VST 和添加 RTSP 流的详细信息,请参阅 VST 文档 。
接下来,视频数据流入 AI 感知服务,该服务利用 NVIDIA DeepStream SDK 使用 YOLOv8 对象检测模型实现高吞吐量,然后使用 NvDCF 跟踪器 进行对象跟踪。该管道根据 NVIDIA Metropolis 架构生成元数据,捕获场景中检测到的各种对象的类和定位信息。
然后,生成的元数据和事件将发布到 Redis 消息总线,该总线充当系统内消息传递的骨干。AI Analytics 服务订阅此总线,接收执行详细流量分析所需的信息。
这种基于服务的架构利用 NVIDIA Jetson 设备的处理能力,提供从视频输入到分析的流畅高效的数据流。这种方法提高了处理速度和响应能力,使其成为需要实时数据解释和立即行动的ITS应用的理想选择。
用于对象检测的 YOLOv8
YOLOv8 作为最先进的目标检测模型脱颖而出,以其无与伦比的速度和准确性而闻名。其轻量级架构使其特别适合部署在 NVIDIA Jetson 等边缘设备上。在ITS应用中,YOLOv8可以实时检测和分类车辆、行人、交通标志等物体。这可以为管理和优化交通流量、增强道路安全和支持自动化交通系统提供基本数据。有关各种 YOLO 模型的详细信息,请参阅 计算机视觉中 YOLO 架构的综合回顾 。
下载并准备 YOLOv8
首先,从 ultralytics GitHub 存储库 下载 YOLOv8 模型。这篇文章使用了 COCO 数据集中的汽车、公共汽车和卡车类,YOLOv8 的发布版本就是在该数据集上训练的。请注意,用户负责验证每个数据集许可证是否适合预期用途。
然后,需要将模型转换为 NVIDIA TensorRT 执行引擎,该引擎针对 NVIDIA Jetson 的硬件功能对其进行了优化。DeepStream 微服务容器附带一个脚本,可帮助简化此过程。
要运行 YOLOv8 安装脚本,首先确保您已按照 Jetson 平台服务文档的 快速入门 部分中概述的步骤安装微服务、参考应用程序和 NVStreamer。此时,您还可以将 NVStreamer 配置为通过 RTSP 流式传输以下文件。这将用作输入。
opt/nvidia/deepstream/deepstream/samples/streams/sample_1080p_h264.mp4
若要执行脚本,请运行下面提供的硬件命令。
Jetson AGX Orin:
sudo docker run -v ./yolov8s:/yolov8s -v
./config/deepstream:/ds-config-files –rm --runtime nvidia
nvcr.io/nvidia/jps/deepstream:7.0-jps-v1.1.1
/yolov8s-files/yolov8s_setup.sh --agx
Jetson Orin NX16:
sudo docker run -v ./yolov8s:/yolov8s -v
./config/deepstream:/ds-config-files –rm --runtime nvidia
nvcr.io/nvidia/jps/deepstream:7.0-jps-v1.1.1
/yolov8s-files/yolov8s_setup.sh --nx16
安装脚本执行的任务包括:
- 特定于硬件的配置 :根据 NVIDIA 硬件(AGX 或 NX16)调整批量大小等参数以优化性能。
- 依赖管理 :下载 YOLOv8 模型文件和 COCO 数据集,安装所需库,并准备用于量化的校准图像。
- INT8 校准 :将浮点模型量化为 INT8,以获得最佳推理性能。
- 模型转换 :将模型从 PyTorch 转换为 ONNX 格式,并生成 TensorRT 引擎。
此过程大约需要 15 到 30 分钟,并生成 YOLO 部署所需的以下文件:
-
./yolov8s/calib.table
-
./yolov8s/model_b4_gpu0_int8.engine
或(取决于设备类型)./yolov8s/model_b8_gpu0_int8.engine
-
./yolov8s/yolov8s-dependencies/yolov8s.onnx
自定义 AI 感知服务
用于 AI 感知的 DeepStream 容器还包括一个包含自定义函数的库,用于从 YOLOv8 模型创建优化的 NVIDIA TensorRT 引擎并解析模型的输出。转换脚本和库均来自 marcoslucianops/DeepStream-Yolo GitHub 存储库 (MIT 许可证)。
自定义函数用于配置 DeepStream 推理插件:
# Example: nv_ai/config/deepstream/yolov8s/config_infer_primary_yoloV8_nx16.txt
parse-bbox-func-name=NvDsInferParseYolo
custom-lib-path=/yolov8s-files/libnvdsinfer_custom_impl_Yolo.so
engine-create-func-name=NvDsInferYoloCudaEngineGet
…
运行应用程序
完成设置后,即可运行应用程序。应用程序的 Docker Compose 配置包含在 AI-NVR 堆栈中。对硬件配置使用适当的命令,如下所示。
Jetson AGX Orin:
sudo docker compose -f compose_agx_yolov8s.yaml up -d --force-recreate
Jetson Orin NX16:
sudo docker compose -f compose_nx16_yolov8s.yaml up -d --force-recreate
使用 AI Analytics 服务进行车辆分析
可以使用 AI 分析服务的 Tripwire(或越线)和 Trajectory 功能执行车辆交通分析。您可以使用 REST API 配置这些分析。分析包括:
- 在给定时间范围内穿过配置线段的车辆总数(汽车、公共汽车和卡车)。
- 给定时间范围内的车辆交通趋势,具有较小的时间窗口向下钻取。
- 给定时间范围内车辆交通流量的热图。
概念
绊线 或越线是指在相机平面上绘制的虚拟线,用于计算在任一方向上越过线的物体。
轨迹 是指车辆所走的实际路径,由系统逐帧跟踪并记录下来。AI Perception 服务为每辆车分配一个唯一的 ID。车辆的总路径由系统中的轨迹概念表示。
API 规范
有关以下部分中引用的 API 的详细信息,请参阅 AI Analytics Service API 规范。
绊线配置
可以使用以下 API 为给定传感器配置绊线分析。请注意,下面使用的值应与使用 sensor/add API 将流添加到 VST 时设置的值相同。可以使用 cURL 或
Postman
等工具发出 HTTP post 请求。
<SensorID>name
HTTP POST 请求端点:
http://{jetson-device-ip}:30080/api/emdx/api/config/tripwire?sensorId=<SensorID>
请注意,
jetson-device-ip
必须替换为 Jetson 设备的正确 IP 地址。
请求:
{
"sensorId": "<SensorID>",
"tripwires": [
"id": "<TripwireID>",
"name": "<Name>",
"wire": [
"x": 591,
"y": 575
"x": 677,
"y": 618
"x": 1107,
"y": 575
"x": 1105,
"y": 541
"direction": {
"p1": {
"x": 873,
"y": 553
"p2": {
"x": 1010,
"y": 689
"entry": {
"name": "entry"
"exit": {
"name": "exit"
}
生成 Tripwire 时间序列分析
通过 Tripwire 计数 API 检索给定时间范围内不同车辆类型(由 YOLOv8 模型检测到)的总交叉点。
创建绊线后,使用下面的示例查询,在 2024-05-15 格林威治标准时间上午 11 点至格林威治标准时间中午 12 点之间,在传感器
ID ExpressWay
上配置了
ID road-tw
的绊线上检索穿越绊线的总对象交叉点。此外,该查询还请求对汽车、公共汽车和卡车对象类型的计数进行细分。
HTTP GET 查询:
http://{jetson-device-ip}:30080/emdx/api/metrics/tripwire/count?
sensorId=ExpressWay&
tripwireId=road-tw&
fromTimestamp=2024-05-15T11:00:00.000Z&
toTimestamp=2024-05-15T12:00:00.000Z&
objectTypes=car,bus,truckc
请注意,和以前一样,
jetson-device-ip
必须替换为 Jetson 设备的正确 IP 地址。
响应:
{
"counts": [
"sensorId": "ExpressWay",
"total_count": 241,
"count_by_type": {
"bus": 3,
"car": 238,
"truck": 0
"attributes": []
}
流量趋势直方图可视化
还可以使用 Tripwire 计数直方图 API 将之前的总计数聚合到较小的时间窗口中。
使用下面的示例查询检索 2024-05-15 格林威治标准时间上午 11 点至格林威治标准时间中午 12 点之间在传感器 ID
ExpressWay
上配置了
ID road-tw
的绊线的对象(所有类型)交叉计数直方图,细分为 1 分钟窗口。
HTTP GET 查询:
http://{jetson-device-ip}:30080/emdx/api/metrics/tripwire/histogram?
sensorId=ExpressWay&
tripwireId=road-tw
fromTimestamp=2024-05-15T11:00:00.000Z&
toTimestamp=2024-05-15T12:00:00.000Z&
fixedInterval=60000&
objectTypes=car,bus,truck
这将转储每个 1 分钟间隔的 JSON 输出和 1 分钟窗口中的总聚合计数。您可以将此信息绘制在堆叠直方图中,该直方图表示计数随时间的变化趋势(图 2)。
车辆轨迹热图可视化
本部分介绍如何使用 AI Analytics 服务中的行为 API 生成热图。热图提供了一个可视化效果,用于了解一段时间内的交通流量。它是通过积累单个运动轨迹并在空间上将它们映射到整个区域而生成的。
热图生成逻辑
使用给定时间范围内所有对象的轨迹行为坐标 [x,y],使用 计算直方图。应用高斯滤波器来平滑结果。访问 GitHub 上的
NVIDIA-AI-IOT/jetson-platform-services
,查看与此逻辑相关的函数的笔记本。传感器图像快照是使用
VST API
获取的。在图 3 中,将平滑的直方图可视化以生成热图。
numpy.histogram2d
使用下面的示例查询检索对象类型 car、bus 和 truck 在给定持续时间内传感器
ID ExpressWay
的轨迹行为。
HTTP GET 查询:
http://{jetson-device-ip}:30080/emdx/api/behavior?
sensorId=ExpressWay&
fromTimestamp=2024-05-15T11:00:00.000Z&
toTimestamp=2024-05-15T11:00:05.000&
objectTypes=car,bus,truck
响应:
{
"behavior": [
"sensor": {
"id": "Expressway"
"object": {
"id": "134",
"type": "car"
"locations": {
"coordinates": [
1708598580297,
[291,590]
1708598580364,
[285,594]
1708598580474,
[385,694]
1708598580372,
[281,595]
] ],
"type": "linestring"
"length": 4,
"start": "2024-02-22T10:43:00.297Z",