计算机视觉/视频分析

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

智能交通系统(ITS)的应用在现代城市环境中变得越来越有价值和普遍。使用 ITS 应用程序的好处包括:

  • 提高交通效率:通过实时交通数据分析,ITS 可以优化交通流量,减少拥堵,缩短出行时间。
  • 提高安全性:ITS 可以检测潜在的危险、监测交通违法行为,并更有效地管理事故,从而使道路更加安全。
  • 提高环境可持续性:高效的交通管理通过减少燃料消耗和排放,有助于环境可持续性。

重要的是,这些系统需要在边缘处理信息,以获得可靠的带宽、隐私、实时分析等。

这篇文章解释了如何使用 NVIDIA JetPack 6.0 的新Jetson 平台服务来实现边缘的端到端流量分析解决方案,该系统包括使用NVIDIA JetPack 6.0的视频存储工具包(VST)服务的视频摄取和存储、使用 YOLOv8 和 DeepStream AI Perception 服务的实时物体检测和车辆跟踪,以及车辆运动的时空分析,一旦创建了管道,就使用 API 来生成分析。

Jetson 平台服务的优势

使用 Jetson 平台服务和 NVIDIA Jetpack 构建和部署人工智能应用程序可提供以下好处:

  • 快速、高效的解决方案: 优化 API 驱动微服务的丰富集合有助于缩短解决时间。
  • 可扩展性:微服务架构使各种组件能够独立扩展,从而根据需求优化资源利用率。
  • 模块化:将应用程序分解为更小、可管理的服务,以简化更新、维护和故障排除。
  • 灵活性:服务可以通过多种方式配置和部署,为特定的 ITS 需求提供量身定制的解决方案,无论是监控交通、管理交叉口还是确保行人安全。

要了解最新 JetPack SDK 的更多功能信息,请参阅Power Cloud-Native Microservices at the Edge with NVIDIA JetPack 6.0, Now GA

应用程序概述 

该 ITS 应用程序使用三个主要服务:视频存储工具包(VST)服务、AI 感知服务和 AI 分析服务,还使用了一些基础服务,如 Redis 消息总线、API 网关和 IoT 网关。

Flow chart showing the microservices and connections of the ITS application.
图 1。ITS 应用程序的服务和连接

VST 是视频数据的入口点。它在基于 Jetson 的平台上高效管理摄像机和视频流,提供来自多个视频源的硬件加速视频解码、流媒体和存储。在这个设置中,视频输入文件使用 RTSP 流式传输到 VST。有关使用 VST 和添加 RTSP 流的更多信息,请参阅VST 文档

接下来,视频数据流入 AI Perception 服务,该服务利用NVIDIA DeepStream SDKNvDCF 跟踪器进行对象跟踪,该管道基于NVIDIA Metropolis模式生成元数据,捕获场景中检测到的各种对象的类和定位信息。

生成的元数据和事件随后被发布到 Redis 消息总线,该总线充当系统内消息传递的骨干。人工智能分析服务订阅了该总线,接收执行详细流量分析所需的信息。

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

YOLOv8 对象检测算法

YOLOv8是一款最先进的物体检测模型,以其无与伦比的速度和准确性而闻名。其轻量级架构使其特别适合部署在 NVIDIA Jetson 等边缘设备上。在 ITS 应用中,YOLOv8 可以实时检测和分类车辆、行人和交通标志等物体,为管理和优化交通流、提高道路安全和支持自动化交通系统提供重要数据。有关各种 YOLO 模型的更多信息,请参阅计算机视觉中 YOLO 体系结构的全面回顾

下载并准备 YOLOv8

要开始,请从ultralytics GitHub repo下载 YOLOv8 模型。这篇文章使用了 COCO 数据集中的汽车、公共汽车和卡车类,这些类是 YOLOv8 发布版本所训练的。请注意,用户负责验证每个数据集许可证是否符合预期目的。

然后,该模型需要被转换为一个 NVIDIA TensorRT 执行引擎,以便针对 NVIDIA Jetson 的硬件功能进行优化。DeepStream 微服务容器附带了一个脚本,旨在帮助简化这个过程。

要运行 YOLOv8 设置脚本,首先确保您已按照 Jetson 平台服务文档的快速启动部分中概述的步骤安装微服务、参考应用程序和 NVStreamer。此时,您也可以将 NVStreamer 配置为通过 RTSP 流式传输下面的文件,这将被用作输入。

opt/nvidia/deptstream/deptstream/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

安装脚本执行的任务包括:

  1. 硬件特定配置:根据 NVIDIA 硬件(AGX 或 NX16)调整批量大小等参数以优化性能。
  2. 依赖性管理:下载 YOLOv8 模型文件和 COCO 数据集,安装所需的库,并准备校准图像用于量化。
  3. INT8 校准:将浮点模型量化为 INT8,以获得最佳的推理性能。
  4. 模型转换:将 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 感知服务

用于人工智能感知的 DeepStream 容器还包括一个库,该库包含自定义函数,用于从 YOLOv8 模型创建优化的 NVIDIA TensorRT 引擎并解析模型的输出,这些转换脚本和库都来源于marcoslucianops/DeepStream-Yolo GitHub repo(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 Analytics 服务的 Tripwire(或线路交叉)和 Trajectory 功能进行。您可以使用 REST APIs 配置这些分析。这些分析包括:

  1. 给定时间范围内通过配置线段的车辆总数(小汽车、公共汽车和卡车)。
  2. 给定时间范围内车辆交通量的趋势,时间窗口越小。
  3. 给定时间范围内的车辆交通流热图。

概念

Tripwire,或称线交叉,是指在相机平面上绘制的虚拟线,用于计算对象在任意方向上跨越该线的次数。

轨迹是指车辆行驶的实际路径,由系统逐帧跟踪并记录,每辆车都被 AI Perception 服务分配了一个唯一的 ID。车辆的总路径由系统中的轨迹概念表示。

API 规范

有关以下部分引用的 API 的详细信息,请参阅AI Analytics Service API规范。

配置 Tripwire

可以使用以下 API 为给定的传感器配置 Tripwire 分析,请注意,在使用 sensor/add API 将流添加到 VST 时,下面使用的<SensorID>值应与设置的name 值相同,HTTP POST 请求可以使用 cURL 或Postman等工具发出。

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 分钟窗口中转储每个 1 分钟间隔的 JSON 输出和总聚合计数,您可以将这些信息绘制在表示计数随时间变化趋势的堆叠直方图中(Figure 2)。

This plot shows a histogram of traffic count divided between car, bus, and truck at 1-minute intervals.
图 2:以 1 分钟为间隔的流量计数直方图

车辆轨迹热图可视化

本节展示了如何使用 AI Analytics 服务中的行为 API 来生成热图,以了解随时间推移的交通流量。热图提供了一个可视化,它是通过累积单个运动轨迹并在区域上进行空间映射而生成的。

A heat map of the moving traffic generated on the camera view.
图 3。移动交通热图

热图生成逻辑

使用给定时间范围内所有对象的轨迹行为坐标[x,y],使用numpy.histogram2d计算直方图,然后应用高斯滤波器来平滑结果。访问GitHub 上的 NVIDIA-AI-IOT/jetson 平台服务,查看笔记本中与此逻辑相关的函数。使用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-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 平台服务是一组功能丰富的微服务,用于在边缘构建人工智能应用程序,开发人员可以使用 API 快速高效地构建应用程序,并生成车辆计数、交通热图等见解,这些微服务是可替代的,可以扩展到许多边缘人工智能应用程序。

下载 JetPack 6.0并开始使用Jetson 平台服务。在NVIDIA 开发者论坛上提问并加入对话。

 

Tags