利用 YOLOv8 和 NVIDIA JetPack 6.0 生成交通洞察

Weixin Screenshot_20240813114321.png

智能交通系统 (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 网关等几项基础服务。

Weixin Screenshot_20240813114546.png
图 1. ITS 应用的服务和连接

VST 是视频数据的入口。它能在基于 Jetson 的平台上高效地管理摄像头和视频流,提供从多个视频源进行的硬件加速视频解码、流式传输和存储。在该设置中,视频输入文件通过 RTSP 协议流式传输到 VST。有关使用 VST 和添加 RTSP 流的更多信息,请参见 VST 文档:

https://docs.nvidia.com/moj/V...

接下来,视频数据流进入利用 NVIDIA DeepStream SDK 的 AI 感知服务,其先采用 YOLOv8 物体检测模型实现高吞吐量,随后使用 NvDCF 追踪器进行物体追踪。该流程基于 NVIDIA Metropolis 架构生成元数据,捕获场景中检测到的各种物体的类别和坐标信息。

紧接着生成的元数据和事件被发布到 Redis 消息总线,该总线是系统内部消息传递的骨干。AI 分析服务订阅了该总线,接收执行详细交通分析所需的信息。

这种基于服务的架构确保从视频输入到分析的数据流畅且高效,充分利用了 NVIDIA Jetson 设备的处理能力。该方法提高了处理速度和响应能力,非常适合需要实时数据解释和即时行动的 ITS 应用。

用于物体检测的 YOLOv8

YOLOv8 作为最先进的物体检测模型脱颖而出,以其无与伦比的速度和准确性著称。其轻量级架构特别适合部署在 NVIDIA Jetson 等边缘设备上。在 ITS 应用中,YOLOv8 能够实时检测和分类车辆、行人、交通标志等对象。这为管理和优化交通流量、加强道路安全以及支持自动化交通系统提供关键数据。有关各种 YOLO 模型的更多信息,请参阅计算机视觉中的 YOLO 架构综述:

https://arxiv.org/abs/2304.00501

下载和准备 YOLOv8

开始使用前,请先在 GitHub 的 ultralytics 资源库下载 YOLOv8 模型。本文使用 YOLOv8 发布版本所训练的 COCO 数据集中轿车、公交车和卡车三类作为示例。请注意,用户有责任验证每个数据集许可证是否符合预定用途。

接下来,需要将该模型转换成 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 引擎,并解析该模型输出结果。这个转换脚本和程序库均来自 GitHub 上的 marcoslucianops/DeepStream-Yolo 资源库(遵循 MIT 许可):

https://github.com/marcosluci...

这些自定义函数用于配置 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 分析服务规范:

https://docs.nvidia.com/jetso...

绊线配置

绊线分析可以针对给定的传感器,通过以下 API 进行配置。请注意,下面使用的 <SensorID> 值应与通过 sensor/add API 向 VST 添加流时设置的 name 相同。可以使用 cURL 或 Postman 等工具发出 HTTP post 请求。

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"
                }
            }
        }
    ]
}

生成绊线时间序列分析

可通过绊线计数 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)。

Weixin Screenshot_20240813142515.png
图 2. 以 1 分钟为间隔的交通流量计数直方图

车辆轨迹热力图可视化

本部分将介绍如何使用 AI 分析服务中的行为 API 生成热力图。热力图是通过累积运动轨迹并将它们映射到区域空间中生成的,它提供了一种可视化方式帮助呈现交通流随时间的变化趋势。

Weixin Screenshot_20240813142559.png
图 3. 移动交通热力图

热力图生成逻辑

根据给定时间范围内所有物体的轨迹行为坐标 [x, y],通过 numpy.histogram2d. 计算出直方图。然后应用高斯滤波器对结果进行平滑处理。请访问 GitHub 上的 NVIDIA-AI-IOT/jetson-platform-services 资源库,查看与此逻辑相关的函数笔记。使用 VST API 获取传感器图像快照。在图 3 中,平滑后的直方图被可视化成热力图。

GitHub:

https://github.com/NVIDIA-AI-...

VST API:

https://docs.nvidia.com/moj/v...

使用下面的示例,查询检索传感器 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",
            "end": "2024-02-22T10:43:01.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 应用中。

马上下载 JetPack 6.0 开始使用 Jetson 平台服务,在 NVIDIA 开发者论坛上提问并参与讨论:

JetPack 6.0:

https://developer.nvidia.com/...

Jetson 平台服务:

https://developer.nvidia.com/...

NVIDIA 开发者论坛:

https://forums.developer.nvid...

推荐阅读
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息