ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

jetson-inference 视频目标跟踪实战:基于 IOU 的 detectNet 多目标跟踪原理与用法

jetson-inference 视频目标跟踪实战:基于 IOU 的 detectNet 多目标跟踪原理与用法 人工智能计算机视觉深度学习微调【免费下载链接】jetson-inferenceHello AI World guide to deploying deep-learning inference networks and deep vision primitives with TensorRT and NVIDIA Jetson.项目地址https://gitcode.com/gh_mirrors/je/jetson-inference点击查看免费下载本文围绕 jetson-inference 官方文档 docs/detectnet-tracking.md 展开系统讲解如何在 Jetson 上使用 detectNet 对视频流启用 IOUIntersection-over-Union多目标跟踪包括--tracking命令行的快速上手、三个跟踪参数的调优、Python/C 两套 API 的编程方式以及Detection结果中跟踪状态字段TrackID/TrackStatus/TrackFrames/TrackLost的读取与语义并深入 objectTrackerIOU 源码剖析其帧间 IOU 边界框匹配的跟踪原理。读完本文你将能够为 detectNet 推理流程一键启用轻量级多目标跟踪并理解如何根据场景调参、如何从检测结果中消费跟踪状态。为什么目标检测还需要跟踪现代检测 DNN如 peoplenet、ssd-mobilenet的精度已经很高从某种意义上你可以直接靠检测来跟踪tracking by detection每一帧都跑一遍检测器拿到物体边界框即可。但纯检测存在两个天然缺陷单帧抖动blips个别帧可能出现误检、漏检导致同一物体在相邻帧之间时有时无临时遮挡occlusion物体被短暂遮挡后检测器会暂时丢失该目标。因此一定程度的时间维过滤temporal filtering可以平滑这些扰动让同一物体在连续帧中保持稳定的身份identity。jetson-inference 内置了一套基础但极快的多目标跟踪器——基于帧间 IOU 边界框比对的objectTrackerIOU其算法思想源自论文High-Speed Tracking-by-Detection Without Using Image InformationBochinski 等2017。正如 objectTrackerIOU.h 头文件注释所总结的该跟踪器本质上是对边界框做时间维聚类不使用任何视觉信息因此非常快但精度相对较低。需要说明的是这套 IOU 跟踪器是 jetson-inference 自带的轻量实现NVIDIA DeepStream 提供了功能更全面的 gst-nvtracker 跟踪插件如需要可另行集成。快速上手一条命令开启视频跟踪在 jetson-inference 中跟踪功能已内置到detectnet/detectnet.py示例程序中只需在命令行加一个--tracking标志即可。以下命令演示了对行人视频使用peoplenet模型进行检测 跟踪的完整流程# 下载测试视频行人场景 wget https://nvidia.box.com/shared/static/veuuimq6pwvd62p9fresqhrrmfqz0e2f.mp4 -O pedestrians.mp4 # C 版本 $ detectnet --modelpeoplenet --tracking pedestrians.mp4 pedestrians_tracking.mp4 # Python 版本 $ detectnet.py --modelpeoplenet --tracking pedestrians.mp4 pedestrians_tracking.mp4命令行为detectnet 输入视频 输出视频输出视频中每个被跟踪目标会显示稳定不变的 TrackID便于直观观察跟踪效果。底层调用链--tracking标志如何生效从源码看--tracking标志的解析发生在detectNet::Create(cmdLine)中。在 c/detectNet.cpp 中// enable tracking if requested net-SetTracker(objectTracker::Create(cmdLine));而objectTracker::Create(cmdLine)c/tracking/objectTracker.cpp会读取命令行参数--tracking标志cmdLine.GetFlag(tracking)或--tracker参数IOU/KLT来决定创建哪种跟踪器。默认情况下--tracking创建的就是objectTrackerIOU。注意KLT 跟踪器只有在编译时启用了 VPIVision Programming Interface的构建中才可用否则会报错回退——普通构建下--tracking即 IOU 跟踪器。随后在每次Detect()的后处理阶段c/detectNet.cpp检测结果会先经过聚类、排序、边界裁剪再交给跟踪器// update tracking if( mTracker ! NULL mTracker-IsEnabled() ) numDetections mTracker-Process(input, width, height, format, detections, numDetections);也就是说跟踪是后处理流水线的一环紧跟在网络推理与边界框解析之后跟踪后的结果数组再返回给上层含 overlay 渲染与打印。跟踪参数详解与调优IOU 跟踪器有三个可调参数既可通过命令行设置也可通过 API 设置。命令行参数定义在 c/tracking/objectTracker.h 的OBJECT_TRACKER_USAGE_STRING中objectTracker arguments: --tracking flag to enable default tracker (IOU) --trackerTRACKER enable tracking with IOU or KLT --tracker-min-framesN the number of re-identified frames for a track to be considered valid (default: 3) --tracker-drop-framesN number of consecutive lost frames before a track is dropped (default: 15) --tracker-overlapN how much IOU overlap is required for a bounding box to be matched (default: 0.5)三个参数的具体含义如下参数默认值含义调优建议--tracker-min-framesN3一个 track 需要被连续重识别多少帧后才被认为是有效轨迹开始输出/分配正式 TrackID减小可更快获得跟踪结果但更容易产生噪声轨迹增大可过滤闪烁的误检--tracker-drop-framesN15连续丢失多少帧后该轨迹被删除遮挡频繁的场景可适当增大让目标消失后仍能短暂保持轨迹--tracker-overlapN0.5边界框匹配所需的最低 IOU 重叠率目标移动快/形变大时可降低如 0.3密集场景可提高以减少错配这些默认值与 objectTrackerIOU.h 中定义的宏一一对应OBJECT_TRACKER_DEFAULT_MIN_FRAMES3、OBJECT_TRACKER_DEFAULT_DROP_FRAMES15、OBJECT_TRACKER_DEFAULT_OVERLAP_THRESHOLD0.5。命令行解析逻辑位于 objectTrackerIOU.cpp通过commandLine读取tracker-min-frames、tracker-drop-frames、tracker-overlap并构造跟踪器实例。示例用法# 要求连续 5 帧重识别才建立轨迹丢失 30 帧才丢弃IOU 匹配阈值 0.4 $ detectnet --modelpeoplenet --tracking --tracker-min-frames5 --tracker-drop-frames30 --tracker-overlap0.4 pedestrians.mp4 pedestrians_tracking.mp4通过编程接口设置跟踪Python / C除命令行外也可以直接在代码中创建跟踪器并配置参数。官方文档给出了 Python 与 C 两种方式。PythondetectNet.SetTrackerParams()Python 绑定实现在 python/bindings/PyDetectNet.cpp 中相关方法包括SetTrackingEnabled、SetTrackingParams、GetTrackingParams等from jetson_utils import detectNet net detectNet() net.SetTrackingEnabled(True) # 启用跟踪无跟踪器时自动创建 IOU 跟踪器 net.SetTrackingParams(minFrames3, dropFrames15, overlapThreshold0.5)值得注意的源码细节PyDetectNet.cppSetTrackingEnabled(True)在跟踪器不存在时会自动调用objectTracker::Create(objectTracker::IOU)创建默认 IOU 跟踪器SetTrackingParams的三个关键字参数minFrames、dropFrames、overlapThreshold都是可选的不传则不修改对应参数且仅对 IOU 类型跟踪器生效。对应的GetTrackingParams()会返回包含minFrames、dropFrames、overlapThreshold三个键的字典。detectNet.py示例程序python/examples/detectnet.py本身通过命令行接受这些参数——它把sys.argv传给detectNet()构造函数跟踪参数即可按上文命令行方式传入。CobjectTrackerIOUAPIC 侧则需要显式创建跟踪器并挂载到网络实例上#include jetson-inference/detectNet.h #include jetson-inference/objectTrackerIOU.h detectNet* net detectNet::Create(); net-SetTracker(objectTrackerIOU::Create(3, 15, 0.5f));objectTrackerIOU::Create()的三个参数顺序与命令行一一对应minFrames、dropFrames、overlapThresholdobjectTrackerIOU.h。此外该类还提供了对应的 getter/setterGetMinFrames()/SetMinFrames()、GetDropFrames()/SetDropFrames()、GetOverlapThreshold()/SetOverlapThreshold()objectTrackerIOU.h支持运行时动态调整。交互式调参Flask Web 应用官方还提供了基于 Flask 的 Web 应用详见 docs/webrtc-flask.md可以在浏览器里实时、交互式地开关跟踪/detection/tracking_enabled并调整上述跟踪参数minFrames、dropFrames、overlapThreshold非常适合快速试验不同参数组合的实际效果。其 REST 端点定义在 python/www/flask/app.py。跟踪状态字段detectNet.Detection的跟踪信息启用跟踪后Detect()返回的每个Detection结果会额外携带跟踪器更新写入的跟踪状态变量。这些字段在 c/detectNet.h 中定义struct Detection { // Detection Info uint32_t ClassID; /** Class index of the detected object. */ float Confidence; /** Confidence value of the detected object. */ // Tracking Info int TrackID; /** Unique tracking ID (or -1 if untracked) */ int TrackStatus; /** -1 for dropped, 0 for initializing, 1 for active/valid */ int TrackFrames; /** The number of frames the object has been re-identified for */ int TrackLost; /** The number of consecutive frames tracking has been lost for */ // Bounding Box Coordinates float Left; /** Left bounding box coordinate (in pixels) */ float Right; /** Right bounding box coordinate (in pixels) */ float Top; /** Top bounding box coordinate (in pixels) */ float Bottom; /** Bottom bounding box coordinate (in pixels) */ };各跟踪字段语义如下字段取值含义TrackID 0或-1全局唯一的跟踪 ID-1表示该检测未被跟踪TrackStatus-1/0/1-1轨迹已丢弃0正在初始化尚未满足minFrames1有效/活跃轨迹TrackFrames 0该物体已被连续重识别的帧数TrackLost 0连续丢失跟踪的帧数此外Detection还内置了一批几何辅助方法c/detectNet.h如Width()、Height()、Area()、Center()、Contains()、IOU()等其中IOU()的实现c/detectNet.h正是跟踪器计算重叠率的底层依据。从 Python 读取跟踪状态在 Python 中同样可以直接访问这些字段。官方文档示例detections net.Detect(img) for detection in detections: if detection.TrackStatus 0: # actively tracking print(fobject {detection.TrackID} at ({detection.Left}, {detection.Top}) has been tracked for {detection.TrackFrames} frames) else: # if tracking was lost, this object will be dropped the next frame print(fobject {detection.TrackID} has lost tracking)关键行为如果某个 track 丢失TrackStatus -1该目标将在后续帧被直接丢弃不再出现在Detect()返回的检测数组中——即轨迹终结语义。C 侧同样可以从Detection数组读取这些字段示例程序 examples/detectnet/detectnet.cpp 中就演示了如何打印跟踪信息if( detections[n].TrackID 0 ) // is this a tracked object? LogVerbose(tracking ID %i status%i frames%i lost%i\n, detections[n].TrackID, detections[n].TrackStatus, detections[n].TrackFrames, detections[n].TrackLost);可视化在 overlay 中显示 TrackID想要在输出画面上直接看到跟踪 ID可在 overlay 标志中加入tracking--overlaybox,labels,conf,tracking。detectNet::OverlayFlags枚举中的OVERLAY_TRACKING位c/detectNet.h专门用于叠加跟踪信息如 TrackIDOverlayFlagsFromStr()解析时接受track或tracking两种写法c/detectNet.cpp。源码级原理IOU 跟踪器的帧间匹配算法objectTrackerIOU::Process()c/tracking/objectTrackerIOU.cpp是整套跟踪的核心它维护一个内部轨迹列表mTracks每一帧执行以下四步1. 更新活跃轨迹匹配阶段对每条已有轨迹调用findBestIOU()objectTrackerIOU.cpp在当前帧的所有检测框里找最优匹配要求类别一致ClassID相同、IOU 超过overlapThreshold且该检测框尚未被其他轨迹匹配TrackID 0在所有候选中取 IOU 最大的一个。匹配成功时detections[bestMatch].TrackID (mTracks[n].TrackFrames mMinFrames) ? mIDCount : mTracks[n].TrackID; detections[bestMatch].TrackFrames mTracks[n].TrackFrames 1; detections[bestMatch].TrackStatus (detections[bestMatch].TrackFrames mMinFrames) ? 1 : 0; detections[bestMatch].TrackLost 0;注意这里有个精妙的细节当轨迹的TrackFrames恰好等于minFrames时才分配全新的递增 IDmIDCount——也就是说正式 ID 在轨迹转正那一刻才发放。匹配成功后TrackLost归零并回写轨迹状态。2. 失配轨迹递增丢失计数若某条轨迹在当前帧没有找到匹配框则TrackLost当TrackLost dropFrames时将该轨迹的TrackStatus置为-1标记丢弃mTracks[n].TrackLost; if( mTracks[n].TrackLost mDropFrames ) mTracks[n].TrackStatus -1;3. 为新检测建立新轨迹当前帧中未被任何轨迹匹配的检测框TrackID 0会被初始化为新轨迹加入mTracks此时TrackID-1、TrackStatus0、TrackFrames0、TrackLost0detections[n].TrackID -1; detections[n].TrackStatus 0; detections[n].TrackFrames 0; detections[n].TrackLost 0; mTracks.push_back(detections[n]);4. 输出有效轨迹并清理丢弃轨迹只有TrackFrames minFrames的轨迹才被写回输出检测数组这也解释了为什么新目标要连续出现minFrames帧后才会出现在结果里随后将所有TrackStatus 0的轨迹从mTracks中 erase 删除。整个算法不使用像素/图像特征只比对边界框几何位置因此开销极小、速度极快——这正是高速跟踪的含义代价是当目标快速移动、形变或相互靠近时仅靠 IOU 匹配可能发生 ID 混淆或轨迹切换这也是它低精度一面的体现。理解这套状态机初始化 → 活跃 → 丢失 → 丢弃你就能准确解释TrackStatus、TrackFrames、TrackLost在任何时刻的取值。小结与延伸本文从为什么需要时间维过滤出发完整覆盖了 jetson-inference 中 IOU 多目标跟踪的启用--tracking、参数调优tracker-min-frames/tracker-drop-frames/tracker-overlap、编程接口PythonSetTrackingParams/ CobjectTrackerIOU以及结果消费TrackID/TrackStatus/TrackFrames/TrackLost并深入到 objectTrackerIOU.cpp 的匹配-计数-建轨-清理四步状态机。相关延伸阅读检测模型与 detectNet 的整体用法见 docs/detectnet-console-2.md基于 Flask 的交互式调参 Web 应用见 docs/webrtc-flask.md完整的检测示例程序见 examples/detectnet/detectnet.cpp 与 python/examples/detectnet.py跟踪器的抽象基类objectTracker与命令行参数定义见 c/tracking/objectTracker.h。赞分享人工智能计算机视觉深度学习微调【免费下载链接】jetson-inferenceHello AI World guide to deploying deep-learning inference networks and deep vision primitives with TensorRT and NVIDIA Jetson.项目地址https://gitcode.com/gh_mirrors/je/jetson-inference点击查看免费下载相关推荐kornia.tracking 平面目标跟踪实战用 HomographyTracker 实现基于局部特征的视频目标跟踪kornia.tracking 平面目标跟踪实战用 HomographyTracker 实现基于局部特征的视频目标跟踪 导读 kornia.tracking计算机视觉深度学习人工智能图像处理5个步骤掌握Flow LauncherWindows效率启动器的终极指南 5个步骤掌握Flow LauncherWindows效率启动器的终极指南 Flow Launcher是一款完全免费开源的Windows快速搜索和应用启动桌面应用插件系统5步解锁苹果平方字体让您的Windows文档瞬间拥有Mac级质感5步解锁苹果平方字体让您的Windows文档瞬间拥有Mac级质感 还在为Windows系统上中文字体显示不够精致而困扰吗想让您的文档、演示文稿和设计作品拥有前端上一篇VersityGW容器化部署全流程Docker与Kubernetes实践指南下一篇fwknop 安装与使用教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表