当前位置: 首页 > news >正文

ByteTrack跟踪理解

1.ByteTrack 核心思路

(1)区分高置信度检测框与低置信度检测框,不同置信度检测框采取不同处理方式。

(2)保留低置信度检测框,在后续可能会重新确认为 confirm 状态。而不是像传统 MOT 算法选择删除。

2.bytetrack跟踪流程

(1)把检测的bbox按照置信度阈值分成高低分两组D_high,D_low。

        a.其中高分阈值th_h,thd_l,在工程中设置为0.6和0.1

        b. th_h<bbox_score的为高分组, th_l<bbox_score<th_h为低分组。

(2)使用高分组的bbox和轨迹track进行匹(第一次匹配),保留未匹配上的bbox D_remain和未匹配上的高分轨迹T_remain。

        a.匹配仅仅使用IOU作为相似性计算。(在人群密集和遮挡严重的场景appearance model并明显,作者没有使用Re-ID)

        b.IOU匹配的阈值是0.2

(3)使用低分组bbox和T_remain继续进行匹配,继续保留未匹配上的轨迹T_remain。

        a.此时可以过滤掉误检测的背景,因为其没有对应tracklet。同时可以恢复被遮挡的目标。

(4)对于未匹的轨迹保留一定生命周期(30帧),期间如果没有匹配到bbox,则删除。

(5)对于未匹配到轨迹的高分bbox(大于阈值th_theta=0.7)的,继续观察帧,如果能连续检测到,分配tracklet。

(6)轨迹插补

        a.对于遮挡严重的目标,真值中会消失,这里采用线性插值的方法的补齐这个bbox。用于插值的前后帧间隔不能间隔太大,因为人的运动不一定是线性,短时间内可以近似为线性的。通过这种方法,对跟踪器性能也是有提升的。

3.bytetrack代码理解

(1)新的航迹

        只有是高(大于 high_thrash) 置信度框才可以新起航迹。区分高低置信度检测框阈值是 track_thresh = 0.5。但一般high_thresh设定的值要比 track_thresh 大。如high_thresh = 0.6。新起的航迹中 state = Tracked,只第一帧新起航迹 is_activated =True,否则is_activated = false。

        总结:当第一帧时,航迹本身为空时,只有置信度超过 high_thresh 时,才新起始航迹, 此时state = Tracked,is_activated = true。后续只有未匹配的且置信度很高(超过high_thresh )时才新起始航迹,此时state = Tracked,is_activated = false。

(2)预测

        合并is_activated = true 与 state = Lost 航迹。合并后进行预测,预测遵循kalman滤波预测。

每个新的检测信息都会初始化一个 STrack 对象,此对象是否能新起航迹前文已经明确了。

        此时 _motion_mat 为一个 8*8 的矩阵。对应运动状态方程为匀速。

        box 状态 mean为:(xCenter,yCenter,w/h,h,Vx,Vy,Vr,Vh)。 预测predict 获得新状态 new_mean = _motion_mat * mean.T

        更新协方差 covariance = _motion_mat * convariance *_motion_mat.T + motion_cov 。 montion_cov为过程噪声矩阵。一般可以保持不变,初始化时可以设定,源码中设定为与 w/h 相关的对角矩阵。

(3)匹配

i.第一次匹配 预测框与高置信度检测框

        (2)中的跟踪预测框。他们state为Tracked或Lost

        高置信度检测框:置信度大于track_thresh中的检测框,文中track_thresh 设定为0.5。

        文中采取了计算 iou 进行匹配,预测框与检测框的交并比。 当预测框匹配上时,此时state = Tracked,is_activated = true。 匹配上后需要更新框的状态mean与协方差covariance。

kalman中update:

mean 1*8矩阵(xCenter, yCenter, w/h, h, Vx, Vy, Vr, Vh)

mean1 相当于提取了 mean 中前四个元素。

covariance1 是为了方便后续更新 covariance 一个中间量。

diag 为测量噪声协方差,文中设定与过程噪声矩阵类似。

kalman_gain 为卡尔曼增益,原本需要求 projected_cov 的逆矩阵,再与 B 矩阵相乘求得,这里直接通过解线性方程组的形式求的,省略了一些计算步骤。

new_meannew_covariance 为新的 box 状态与 新的协方差。 预测框与高置信度检测框匹配成功后,无论此时目标 state 为Tracked 还是 Lost,都需更新为Tracked状态,且is_activated 均更新为 true。且都需要进行 kalman 中 update 操作。 一旦目标匹配后:

a.目标的state 均变为 Tracked

b.目标的is_activated 均变为true

c.目标的mean与covariance均需update

第一次未匹配上的预测框与检测框额外缓存。方便后续操作。

ii.第二次匹配 :第一次未匹配的预测框与低置信度检测框

        第一次未匹配的预测框:第一次未匹配上,state为Tracked的预测框。state为Tracked表明该目标为上一帧匹配上的目标

        低置信度检测框:置信度小于track_thresh中的检测框,文中track_thresh = 0.5。

        匹配仍然计算iou匹配。匹配上的目标与第一次匹配类似处理。未匹配上的目标会被标记,state后续可能会被修改为Lost。

iii.第三次匹配 is_activated=false 的跟踪框与第一次未匹配的高置信度检测框

        is_activated=false的跟踪框:上一帧新起的目标,只有上一帧新起的目标is_activate才为false,且此时的框并未做predict处理,也就是说用的上一帧的原始检测框匹配

        第一次未匹配的高置信度检测框:置信度大于track_thresh,但是第一次未与状态为is_activated跟踪目标匹配。

        如果目标匹配上,则

         a.state = Tracked

         b.is_activated = true

        c.mean 与 covariance 均 update。

        如果目标未匹配上,此时状态会变为 Removed,此目标会被永久移除。为了要连续两规避偶尔出现某一帧假阳性,至少需帧高置信度的检测才可被 confirm,有机会参与后续计算。

(4)结果发布

        在发布结果前,需要变更BYTETrack类成员变量的值。

        a.当 Lost 状态超过 max_time_lost时,state 从 Lost 变为 Removed,此目标被永久遗忘。max_time_lost 构造函数时就已经设定。设定10或者30,根据实际情况调整。

        b.当成员 state 从 Lost 变为 Tracked 或 Remove d时,this->lost_stracks 需剔除id一致的。

        当有重复路径时,存活帧数一致,航迹相似。也需剔除此lost航迹。 输出结果:只有当 is_activated = true、state=Tracked 时,才会输出目标

(5)总结

        a.检测目标未匹配上时,只有当置信度大于 0.6 才可以新起航迹,其他情况直接被遗忘。此时新起航迹 is_activated 为 false(第一帧不同,第一帧新起航迹 is_activated 默认为 true),当与下一帧置信度大于 0.5 的检测目标在第三次匹配匹配上时(is_activated=false 的目标没资格参与前两次匹配),此时 is_activated 变为 true。此时被标记为 confirm,才有资格被输出。

        b.跟踪航迹在匹配中成功匹配,此时无论 state = tracked、is_activated=true。可以参与下一帧匹配中的前两次匹配。如果前两次匹配都未成功,则此时 state = Lost,只能参与下一帧第一次匹配,如果连续 max_time_lost 帧在第一次匹配都未匹配上,此时会被遗忘 Removed,永久移除此航迹。

参考:【目标跟踪】ByteTrack详解与代码细节-腾讯云开发者社区-腾讯云

相关文章:

  • 存储、管理和展示多媒体文件
  • MySQL 连接的使用方法与技巧
  • linux 部署瑞数6实战(维普,药监局)第一部分
  • 前端网站(二)-- 菜单页面【附源码直接可用】
  • chrome 使用本地替换功能替换接口返回内容
  • 基础算法--双指针算法
  • 数据结构历年考研真题对应知识点(单链表、双链表、循环链表)
  • 【机器学习】第11章 神经网络与深度学习(重中之重)
  • 架构师篇-1、总体架构设计
  • 智慧之选:Vatee万腾平台,引领未来的创新引擎
  • hdfs源码解析之DFSClient
  • 【ARM Cache 及 MMU 系列文章 6.5 -- 如何进行 Cache miss 统计?】
  • 利用CUDA加速卷积计算:原理、实践与示例代码
  • 深入理解网络传输协议——TCP/IP协议的可靠交付服务的特征
  • 面向对象进阶--继承(Java继承(超详解))
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • AHK 中 = 和 == 等比较运算符的用法
  • classpath对获取配置文件的影响
  • flask接收请求并推入栈
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • java中的hashCode
  • js中的正则表达式入门
  • vue:响应原理
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 如何正确配置 Ubuntu 14.04 服务器?
  • 无服务器化是企业 IT 架构的未来吗?
  • 译米田引理
  • 鱼骨图 - 如何绘制?
  • 阿里云重庆大学大数据训练营落地分享
  • ​ubuntu下安装kvm虚拟机
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • #Z0458. 树的中心2
  • #宝哥教你#查看jquery绑定的事件函数
  • (0)Nginx 功能特性
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (MIT博士)林达华老师-概率模型与计算机视觉”
  • (Repost) Getting Genode with TrustZone on the i.MX
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (六)c52学习之旅-独立按键
  • (六)软件测试分工
  • (三十)Flask之wtforms库【剖析源码上篇】
  • ***详解账号泄露:全球约1亿用户已泄露
  • .NET 6 Mysql Canal (CDC 增量同步,捕获变更数据) 案例版
  • .net 7和core版 SignalR
  • .net CHARTING图表控件下载地址
  • .Net Core和.Net Standard直观理解
  • .NET Core日志内容详解,详解不同日志级别的区别和有关日志记录的实用工具和第三方库详解与示例
  • .NET Windows:删除文件夹后立即判断,有可能依然存在
  • .net安装_还在用第三方安装.NET?Win10自带.NET3.5安装
  • .net遍历html中全部的中文,ASP.NET中遍历页面的所有button控件
  • .Net程序猿乐Android发展---(10)框架布局FrameLayout
  • @RequestBody与@RequestParam:Spring MVC中的参数接收差异解析
  • [ Socket学习 ] 第一章:网络基础知识
  • [ vulhub漏洞复现篇 ] Django SQL注入漏洞复现 CVE-2021-35042
  • [ vulhub漏洞复现篇 ] GhostScript 沙箱绕过(任意命令执行)漏洞CVE-2019-6116