智能交通系统 (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 版本现已发布。
应用概述
ITS 应用主要采用了三项核心服务:视频存储工具包 (VST)、AI 感知和 AI 分析。此外,它还运用 Redis 消息总线、API 网关、IoT 网关等几项基础服务。
图 1. ITS 应用的服务和连接
VST 是视频数据的入口。它能在基于 Jetson 的平台上高效地管理摄像头和视频流,提供从多个视频源进行的硬件加速视频解码、流式传输和存储。在该设置中,视频输入文件通过 RTSP 协议流式传输到 VST。有关使用 VST 和添加 RTSP 流的更多信息,请参见 VST 文档。
接下来,视频数据流进入利用 NVIDIA DeepStream SDK 的 AI 感知服务,其先采用 YOLOv8 物体检测模型实现高吞吐量,随后使用 NvDCF 追踪器进行物体追踪。该流程基于 NVIDIA Metropolis 架构生成元数据,捕获场景中检测到的各种物体的类别和坐标信息。
紧接着生成的元数据和事件被发布到 Redis 消息总线,该总线是系统内部消息传递的骨干。AI 分析服务订阅了该总线,接收执行详细交通分析所需的信息。
这种基于服务的架构确保从视频输入到分析的数据流畅且高效,充分利用了 NVIDIA Jetson 设备的处理能力。该方法提高了处理速度和响应能力,非常适合需要实时数据解释和即时行动的 ITS 应用。
用于物体检测的 YOLOv8
YOLOv8 作为最先进的物体检测模型脱颖而出,以其无与伦比的速度和准确性著称。其轻量级架构特别适合部署在 NVIDIA Jetson 等边缘设备上。在 ITS 应用中,YOLOv8 能够实时检测和分类车辆、行人、交通标志等对象。这为管理和优化交通流量、加强道路安全以及支持自动化交通系统提供关键数据。有关各种 YOLO 模型的更多信息,请参阅计算机视觉中的 YOLO 架构综述。
下载和准备 YOLOv8
开始使用前,请先在 GitHub 的 ultralytics 资源库下载 YOLOv8 模型。本文使用 YOLOv8 发布版本所训练的 COCO 数据集中轿车、公交车和卡车三类作为示例。请注意,用户有责任验证每个数据集许可证是否符合预定用途。
接下来,需要将该模型转换成 NVIDIA TensorRT 执行引擎,以针对 NVIDIA Jetson 的硬件能力对其进行优化。DeepStream 微服务容器附带的脚本可帮助简化这一转换过程。
要运行 YOLOv8 安装脚本,首先要确保您已按照 Jetson 平台服务文档中的“快速入门”部分所述的步骤安装了微服务、参考应用以及 NVStreamer。此时,您还可以配置 NVStreamer 以通过 RTSP 传输以下文件,该文件将作为输入使用。
要执行脚本,请运行针对您的硬件提供的以下命令。
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 --agxJetson 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 引擎,并解析该模型输出结果。这个转换脚本和程序库均来自 GitHub 上的 marcoslucianops/DeepStream-Yolo 资源库(遵循 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 …
运行应用程序
设置完成后,就可以运行应用了。AI-NVR 堆栈中包含了该应用程序的 Docker Compose 配置。请使用下方提供的与您硬件配置相匹配的命令来运行。
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 分析服务进行车辆数据分析
利用 AI 分析服务的绊线(或越线)和轨迹功能进行车流量分析。您可以通过 REST API 配置这些分析功能,包括:
在给定的时间范围内统计穿越预设线段的车辆总数(包括轿车、公交车和卡车)。
在给定时间范围内的车流量趋势分析,可缩短时间窗口进行深入研究。
在给定时间范围内的车流量热力图展示。
概念
绊线(或越线)是指在摄像头平面上绘制的虚拟线条,用于统计双向穿越该线条的物体数量。
轨迹指车辆实际行驶的路径,由系统逐帧追踪并记录。AI 感知服务会为每辆车分配一个唯一 ID。系统中的“轨迹”概念代表车辆行驶的总路径。
API 规范
有关以下部分中提到的 API 详细信息,请参阅 AI 分析服务规范。
绊线配置
绊线分析可以针对给定的传感器,通过以下 API 进行配置。请注意,下面使用的
HTTP POST 请求端点:
请注意,必须将 jetson-device-ip 替换为 Jetson 设备正确的 IP 地址。
请求:
{ "sensorId": "", "tripwires": [ { "id": " ", "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" } } } ] }
生成绊线时间序列分析
可通过绊线计数 API 检索给定时间范围内不同车辆类型(由 YOLOv8 模型检测)的总穿越次数。
一旦绊线创建完成,您可以使用以下示例查询来检索在 2024 年 5 月 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": [] } ] }
交通趋势直方图可视化
还可以使用绊线计数直方图 API 将之前的总计数汇总到更小的时间窗口中。
使用以下示例查询来检索在格林威治标准时间 2024 年 5 月 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)。
图 2. 以 1 分钟为间隔的交通流量计数直方图
车辆轨迹热力图可视化
本部分将介绍如何使用 AI 分析服务中的行为 API 生成热力图。热力图是通过累积运动轨迹并将它们映射到区域空间中生成的,它提供了一种可视化方式帮助呈现交通流随时间的变化趋势。
热力图生成逻辑
根据给定时间范围内所有物体的轨迹行为坐标 [x, y],通过 numpy.histogram2d. 计算出直方图。然后应用高斯滤波器对结果进行平滑处理。请访问 GitHub 上的 NVIDIA-AI-IOT/jetson-platform-services 资源库,查看与此逻辑相关的函数笔记。使用 VST API 获取传感器图像快照。在图 3 中,平滑后的直方图被可视化成热力图。
使用下面的示例,查询检索传感器 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-22T1000.297Z", "end": "2024-02-22T1001.255Z", "distance": 204.81118737109063, "timeInterval": 0.958 } ] }
响应了一个给定对象随时间变化的轨迹项数组,其中每个项都是由两个元素构成的。第一个元素是以毫秒为单位的视频帧时间戳(1708598580297,Unix 时间),第二个元素是位置坐标数组 [x,y],例如 [291, 590],表示该图像平面上 x=291,y=590。
交通分析文件
请访问 GitHub 上的 NVIDIA-AI-IOT/jetson-platform-services 资源库,并下载文件在您的本地系统上运行。请按照步骤说明尝试使用您自己的视频文件或摄像头进行操作。
总结
本文介绍了如何使用 NVIDIA JetPack 6.0 中的 Jetson 平台服务和 YOLOv8 物体检测模型来构建智能交通应用。Jetson 平台服务是一组功能丰富的微服务,可用于边缘构建 AI 应用。开发者可以使用这些 API 快速、高效地开发应用,并生成车辆计数、交通热力图等洞察。这些微服务具有可替换性,并且可以扩展到多种边缘 AI 应用中。
全部0条评论
快来发表一下你的评论吧 !