0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用NVIDIA JetPack 6.0和YOLOv8构建智能交通应用

NVIDIA英伟达企业解决方案 来源:NVIDIA英伟达企业解决方案 2024-08-23 16:49 次阅读

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

wKgZombITTeAJoN0AAFiFjt_ems659.png

图 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 --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 许可)。

这些自定义函数用于配置 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 进行配置。请注意,下面使用的值应与通过 sensor/add API 向 VST 添加流时设置的name相同。可以使用 cURL 或 Postman 等工具发出 HTTP post 请求。

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)。

wKgZombITXKAa2eTAADgPtcLyII603.png

图 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 应用中。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • NVIDIA
    +关注

    关注

    14

    文章

    4929

    浏览量

    102787
  • 智能交通
    +关注

    关注

    12

    文章

    794

    浏览量

    43421
  • AI
    AI
    +关注

    关注

    87

    文章

    30072

    浏览量

    268331
  • 微服务
    +关注

    关注

    0

    文章

    134

    浏览量

    7325

原文标题:利用 YOLOv8 和 NVIDIA JetPack 6.0 生成交通洞察

文章出处:【微信号:NVIDIA-Enterprise,微信公众号:NVIDIA英伟达企业解决方案】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    使用YOLOv8做目标检测和实例分割的演示

    YOLOv8是来自Ultralytics的最新的基于YOLO的对象检测模型系列,提供最先进的性能。
    的头像 发表于 02-06 10:11 7305次阅读

    YOLOv8自定义数据集训练到模型部署推理简析

    如果你只是想使用而不是开发,强烈推荐通过pip安装方式获取YOLOv8包!YOLOv8安装命令行
    的头像 发表于 03-24 09:27 4581次阅读

    英伟达Jetson设备上的YOLOv8性能基准测试

    我们将谈论在不同的NVIDIA Jetson 系列设备上运行YOLOv8 模型的性能基准测试。我们特别选择了3种不同的Jetson设备进行测试,它们是 Jetson AGX Orin 32GB
    的头像 发表于 04-12 14:27 6225次阅读

    在AI爱克斯开发板上用OpenVINO™加速YOLOv8目标检测模型

    《在 AI 爱克斯开发板上用 OpenVINO 加速 YOLOv8 分类模型》介绍了在 AI 爱克斯开发板上使用 OpenVINO 开发套件部署并测评 YOLOv8 的分类模型,本文将介绍在 AI 爱克斯开发板上使用 OpenVINO 加速
    的头像 发表于 05-12 09:08 1256次阅读
    在AI爱克斯开发板上用OpenVINO™加速<b class='flag-5'>YOLOv8</b>目标检测模型

    YOLOv8版本升级支持小目标检测与高分辨率图像输入

    YOLOv8版本最近版本又更新了,除了支持姿态评估以外,通过模型结构的修改还支持了小目标检测与高分辨率图像检测。原始的YOLOv8模型结构如下。
    的头像 发表于 05-16 11:14 1.2w次阅读
    <b class='flag-5'>YOLOv8</b>版本升级支持小目标检测与高分辨率图像输入

    AI爱克斯开发板上使用OpenVINO加速YOLOv8目标检测模型

    《在AI爱克斯开发板上用OpenVINO加速YOLOv8分类模型》介绍了在AI爱克斯开发板上使用OpenVINO 开发套件部署并测评YOLOv8的分类模型,本文将介绍在AI爱克斯开发板上使用OpenVINO加速YOLOv8目标检
    的头像 发表于 05-26 11:03 1185次阅读
    AI爱克斯开发板上使用OpenVINO加速<b class='flag-5'>YOLOv8</b>目标检测模型

    一文彻底搞懂YOLOv8【网络结构+代码+实操】

    从上面可以看出,YOLOv8 主要参考了最近提出的诸如 YOLOX、YOLOv6、YOLOv7 和 PPYOLOE 等算法的相关设计,本身的创新点不多,偏向工程实践,主推的还是 ultralytics 这个框架本身。
    的头像 发表于 06-15 17:15 1.2w次阅读
    一文彻底搞懂<b class='flag-5'>YOLOv8</b>【网络结构+代码+实操】

    教你如何用两行代码搞定YOLOv8各种模型推理

    大家好,YOLOv8 框架本身提供的API函数是可以两行代码实现 YOLOv8 模型推理,这次我把这段代码封装成了一个类,只有40行代码左右,可以同时支持YOLOv8对象检测、实例分割、姿态评估模型的GPU与CPU上推理演示。
    的头像 发表于 06-18 11:50 2968次阅读
    教你如何用两行代码搞定<b class='flag-5'>YOLOv8</b>各种模型推理

    三种主流模型部署框架YOLOv8推理演示

    深度学习模型部署有OpenVINO、ONNXRUNTIME、TensorRT三个主流框架,均支持Python与C++的SDK使用。对YOLOv5~YOLOv8的系列模型,均可以通过C++推理实现模型
    的头像 发表于 08-06 11:39 2633次阅读

    解锁YOLOv8修改+注意力模块训练与部署流程

    很多人也想跟修改YOLOv5源码一样的方式去修改YOLOv8的源码,但是在github上面却发现找到的YOLOv8项目下面TAG分支是空的
    的头像 发表于 08-11 14:14 4143次阅读
    解锁<b class='flag-5'>YOLOv8</b>修改+注意力模块训练与部署流程

    如何修改YOLOv8的源码

    很多人也想跟修改YOLOv5源码一样的方式去修改YOLOv8的源码,但是在github上面却发现找到的YOLOv8项目下面TAG分支是空的,然后就直接从master/main下面把源码克隆出来一通
    的头像 发表于 09-04 10:02 1902次阅读
    如何修改<b class='flag-5'>YOLOv8</b>的源码

    YOLOv8实现任意目录下命令行训练

    当你使用YOLOv8命令行训练模型的时候,如果当前执行的目录下没有相关的预训练模型文件,YOLOv8就会自动下载模型权重文件。这个是一个正常操作,但是你还会发现,当你在参数model中指定已有
    的头像 发表于 09-04 10:50 1064次阅读
    <b class='flag-5'>YOLOv8</b>实现任意目录下命令行训练

    基于YOLOv8的自定义医学图像分割

    YOLOv8是一种令人惊叹的分割模型;它易于训练、测试和部署。在本教程中,我们将学习如何在自定义数据集上使用YOLOv8。但在此之前,我想告诉你为什么在存在其他优秀的分割模型时应该使用YOLOv8呢?
    的头像 发表于 12-20 10:51 724次阅读
    基于<b class='flag-5'>YOLOv8</b>的自定义医学图像分割

    基于OpenCV DNN实现YOLOv8的模型部署与推理演示

    基于OpenCV DNN实现YOLOv8推理的好处就是一套代码就可以部署在Windows10系统、乌班图系统、Jetson的Jetpack系统
    的头像 发表于 03-01 15:52 1388次阅读
    基于OpenCV DNN实现<b class='flag-5'>YOLOv8</b>的模型部署与推理演示

    NVIDIA JetPack 6.0版本的关键功能

    NVIDIA JetPack SDK 支持 NVIDIA Jetson 模块,为构建端到端加速 AI 应用提供全面的解决方案。JetPack
    的头像 发表于 09-09 10:18 330次阅读
    <b class='flag-5'>NVIDIA</b> <b class='flag-5'>JetPack</b> <b class='flag-5'>6.0</b>版本的关键功能