Deepsort工作原理分析
Deepsort工作原理分析
源码解析
deepsort源码解读一
deepsort源码解读二
deepsort源码解读三
deepsort源码解读四
deepsort源码解读五
deepsort源码解读六
deepsort源码解读七
一.重要实现部分
1.卡尔曼滤波
(1)卡尔曼滤波功能是根据系统以前的数据预测系统下一步的操作。如卡尔曼滤波在deepsort中主要功能是基于前一帧图片中的检测框(可能存在很多,假设其中一个检测框为A),预测检测框A在当前这一帧中的位置。
(2)在系统开始运行时,不存在前一帧,那么为了实现卡尔曼滤波的功能,程序会把检测到的第一帧中符合要求的检测框作为新的跟踪对象(track)。
建立新的跟踪对象会进行的操作:
- 输入参数,检测框的位置坐标(检测框中心坐标[x,y],宽/高,高)
- 构造跟踪对象的8维mean均值向量,该向量由位置坐标和速度构成,也称状态向量。第一帧中的mean向量为[312.5,225,0.40277778,72,0,0,0,0]。(初始速度为0)
- 构造协方差矩阵covariance,该矩阵的作用是协调mean中每个参数相互之间的关系,来表示目标位置信息的不确定性质,矩阵中的数字越大表示不确定性越大。由8x8的矩阵表示,该协方差矩阵也是对角矩阵,可以以任意值初始化。将会用在下文提到的马氏距离计算中,用来考虑不确定性。
若mean =
则covariance =
其中每一个track的covariance的初始值由权重与检测框的高度设定。 - 进行其他参数赋值(与卡尔曼滤波无关)。
将新建立的track放入跟踪链中(跟踪链是用来存储所有预测的track)。如图1,下列9个track框都是第一帧中物理检测框的位置(也为第一帧的track位置)。
图 1
(3)当跟踪链中存在前一帧的track时,卡尔曼滤波的工作方式如下(前一帧的所有track都需要如下操作)。
- 每一帧的每一个track都有mean,covariance参数,将这两个参数传入卡尔曼滤波预测函数中。
- 在卡尔曼滤波预测函数中,实现与两个数学等式即可得到新预测的mean和covariance(其中F为8x8的状态转移矩阵)。对于协方差矩阵的预测中,考虑到外部因素的不确定性(如在跟踪一个四轴飞行器,它可能会受到风的冲击,或者行人在冰上或者泥里打滑了),预测步骤后添加一些新的不确定性,可以对与“世界”相关的不确定性进行建模,如将无法确定的外部因素描述成方差为的高斯噪声。
- 得到某一track的和后,进行更新操作:
(1)进行级联操作和iou操作;
(2)对于匹配上的track进行更新操作:
①输入track的mean、covariance、检测框的位置[中心坐标(x,y),w/h,h]到卡尔曼滤波的更新函数;
②输出纠正后track的mean与covariance.也即该帧得到最终的检测框位置信息等。
存在前一帧的track时,得到基于前一帧预测的track和目标检测框。
如图2-图7所示,红色的为目标检测框,其他色为预测的track框(未结合目标检测框进行更新修正)。
图 2 第三帧
图 3 第四帧
图4 第五帧
图5 第六帧
图6 第七帧
图7 第八帧
如图8所示,红色的为目标检测框,其他色为预测的track框结合目标检测框进行更新修正后的框。
图 8 第三帧
图 9 第四帧
图 10 第五帧
图 11 第六帧
图 12 第七帧
图 13 第八帧
2.级联匹配
(1)相比于普通的sort算法,在IOU Match之前做了一次额外的级联匹配,利用了reid外观特征和马氏距离进行track框与detection框匹配。
① Reid外观特征的作用:通过加入外观特征,可以处理更长时间遮挡下的跟踪[经过更长时间的遮挡,运动模型可能完全失效,无法关联上detection,但是如果有外观特征提供的信息,还有可能关联上],以及减少ID切换。
② 马氏距离的作用:判断track框与detection框的状态向量的前四维度(center_x,center_y,w/h,h)的接近程度。如下图14,一般而言,上下帧之间物体移动的距离不会相差太远,所以坐标越接近越可能是同一个目标。
图 14(该图来源于网络)
(2)Reid外观特征匹配原理
在实现中,每一个track都会将每一帧中同一目标的feature保存下来(特征提取网络由deepsort中的deep实现),以便计算第i个track预测框与第j个detection框的外观距离。在计算中,会将每一个track的所有feature(每一个track所保存的feature数量可人为设定,由参数nn_budget设定)与当前帧的全部detection框进行计算匹配的代价,并存入矩阵cost_matrix中(行数为track数目,列数为detection框数目),即所谓的余弦距离。
余弦距离的计算公式为
,是每一个detection框的特征向量,是track的特征向量。由于每个track有一个或多个特征向量,那么需要将每一个特征向量与所有的detection框都进行计算得到行数为track特征向量数量,列数为detection检测框数量的矩阵。然后利用axis=0,从该矩阵中按列选取最小值,然后返回行数为1,列数为detection框数量的矩阵,如下图示例(对应上面图9、10)
初始化cost_matrix为8x11的矩阵,有8个track,11个detection框,如图15所示
图 15
将每一个track的特征向量与detection进行计算,第一个track的facture向量有3个,如图16所示
图 16
计算结果如下图17所示
图 17
然后按列选取最小值,得到如下图18结果
图 18
这就是余弦距离代价矩阵的第一个track与全部的detection框计算后的距离,构成代价矩阵cost_matrix的第一行,然后进行重复操作,得到全部track与detection框的余弦距离,如下图19所示:
图 19
(3)马氏距离计算原理
Track的mean、covariance,和detection框坐标作为马氏距离计算的输入参数;计算后会根据马氏距离更新代价矩阵cost_matrix(如果去掉马氏距离中的协方差矩阵,就退化为欧氏距离)。
马氏距离的关联度量计算公式为
,表示第j个detection检测框位置,表示第i个track框的位置,表示detection检测框与track框之间的协方差矩阵。如果的马氏距离大于指定的阈值,则忽略该detection检测框与track框的关联,认为不匹配。
示例如下:
将detection框与track框的坐标(按照[center_x,center_y,w/h,h]格式)进行相减。图20为某一帧中某一个track的mean值,图21为该帧中所有的detection框坐标,图22为该track坐标与所有的detection框坐标的差值
图 20
图 21
图 22将得到插值结果根据计算公式得出该track与所有的detectiond框的马氏距离矩阵,如图23所示。
图 23将图23得到的马氏距离矩阵进行阈值处理,将马氏距离高于给定阈值的赋值为无穷大。
基于余弦距离处理后的该track与detection框的cost_matrix,如图24所示。
图24
马氏距离判定中设置的阈值为9.4877,将图23中的马氏距离依次与9.4877进行比较,将大于该阈值的cost_matrix中对应位置值设为无穷大(此处为10的五次方),如下图25所示。
图 25对剩余的所有track重复上述操作,得到最后的cost_matrix如下图26所示.
图 26
(4)得到cost_matrix之后,根据匈牙利算法从cost_matrix中找到最佳匹配的track框与detection框,返回匹配的track与detection框。
总的来说,马氏距离提供了目标的可能位置信息,对短期预测有用;余弦距离更多考虑的是预测信息和轨迹信息的外观特征,当跟踪对象位移较少时,对恢复长期遮挡后的id特别有用。
3.Iou匹配
经过级联匹配余下的track与detection框进行iou匹配,iou的原理是用两个方框的交集面积除以并集面积,如下图27:
图 27
为了实现iou匹配,按照上图所示进行计算,得到每一个track框与detection框的iou值构成的代价矩阵cost_matrix.类似级联处理,忽略代价矩阵cost_matrix中大于给定阈值的track与detection关联。然后进行匈牙利匹配算法,得出可匹配的track与detection.
示例如下(以第三帧为例):
初始化为8x11的cost_matrix代价矩阵,8个track框与11个detection框,如图
图 28将track框与detection框的坐标转换为(left_top_x,left_top_y,right_bottom_x,right_bottom_y),然后计算该帧中每一个track框与该帧中所有的detection框的iou值,但cost_matrix中存储的是1-iou值,cost_matrix如下图29所示:
图 29得到cost_matrix经过阈值处理(此处设定为0.7),将大于阈值的值设定为阈值+,即0.70001,得到如图30所示的cost_matrix:
图 30基于步骤三得到的cost_matrix再次利用匈牙利算法进行匹配,找到最小代价的匹配关系的track与detection,返回匹配的track与detection索引。
二.Deepsort整体流程
deepsort是基于已有的检测目标进行跟踪的算法.
该图来源于网络
预备知识
每一个track有两种状态confirmed与unconfirmed状态,confirmed状态的track可参加级联匹配与iou匹配;unconfirmed状态的track只可参加iou匹配。
初始的track(新建的track)的状态为unconfirmed状态。
unconfirmed状态的track转为confirmed状态的方法:
由于每一个新建的track最开始只能进行iou匹配,因此新建的track都设有一个hits变量,用来存储unconfirmed track成功与detection框进行iou匹配的次数。若该次数大于等于deepsort中默认的3次,则将该track的状态由unconfirmed track转为confirmed track。若新建的track(unconfirmed)在后续的三帧中没有连续三次成功进行iou匹配,由于处于unconfirmed状态,那么该unconfirmed track将会被永久删除,不再考虑。
若存在confirmed track在某一帧经过级联匹配与iou匹配均未找到与之对应的detection框时,为了考虑遮挡等问题,deepsort中设置了一个max_age变量,用于容忍该confirmed track可最大连续丢失max_age帧而未匹配,而每一个track则有一个time_since_update变量,记录自身从上次匹配到现在已经有多少帧未匹配。
deepsort中只有confirmed track经过级联匹配或者iou匹配成功后才会在图片中画出跟踪框,不考虑其他track,因此在deepsort刚运行的时候,前几帧不会出现跟踪框。
执行步骤
- 执行每一帧前,可设定的deepsort参数包括
max_dist
余弦距离的最大阈值
min_confidence
置信度的最小阈值
nms_max_overlap
非极大值抑制
max_iou_distance
iou的最大阈值
max_age
允许连续丢失的帧数
n_init
unconfirmed track转为confirmed track需要连续iou匹配成功的次数
nn_budget
每一个track允许保留的最多feature向量数目
(注:为了更好的体现deepsort的功能,下面情况来自运行deepsort一段时间之后的情况。)
每一帧经过非极大值抑制和去掉置信度低于阈值()的检测框(只有背景);
输入每一帧的检测框的坐标,类别,置信度,图到deepsort中;
基于前一帧的track进行预测,得到前一帧中出现的物体在当前这一帧中可能的位置;
将confirmed track与当前帧的detection框进行级联匹配
(1)匹配成功的的confirmed track利用detection框提供的坐标,特征向量等数据进行更新mean与covariance,将detection框的feature向量加入该track的feature列表;
(2)未匹配成功的track与detection框,进入到iou匹配阶段,见步骤5;将unconfirmed track与步骤4中剩余的confirmed track集合作为iou匹配的track输入,将该track集合与未匹配的detection框进行iou匹配。
(1)匹配成功的track(不区分confirmed与unconfirmed状态)利用detection框提供的坐标,特征向量等数据进行更新mean与covariance,将detection框的feature向量加入该track的feature列表;
(2)对于未匹配成功的track,若为confirmed状态则保留,不更新mean与covariance,继续参与到下一帧的预测track中;若为unconfirmed状态,则将该track标记为deleted状态;
(3)对于未匹配成功的detection框,为之建立新的track,根据detection框的数据对新的track进行赋值,初始化新的track的mean、covariance、feature等初始值;将已经匹配成功的track的feature与id,加入到按照{id:feature}存储的列表中,并且根据参数nn_budget限定每一个track的feature数量。若数量超过nn_budget,则按照删除时间久远的,保留时间临近的feature进行该列表中每个{id:feature}的更新。
根据每一个track更新后的mean向量,输出检测框坐标与id。然后读取新的一帧重复上述操作。
Deepsort工作原理分析相关推荐
- RxJs map operator 工作原理分析
使用一个例子来研究 map 操作符的工作原理. 推荐阅读本文之前,先浏览这篇文章RxJs fromEvent 工作原理分析以了解相关知识. 源代码: import { Component, OnIni ...
- Hadoop生态圈-Zookeeper的工作原理分析
Hadoop生态圈-Zookeeper的工作原理分析 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 无论是是Kafka集群,还是producer和consumer都依赖于Zoo ...
- 原理剖析(第 009 篇)ReentrantReadWriteLock工作原理分析
2019独角兽企业重金招聘Python工程师标准>>> 原理剖析(第 009 篇)ReentrantReadWriteLock工作原理分析 一.大致介绍 1.在前面章节了解了AQS和 ...
- 匿名突破网络限制 (Tor工作原理分析)
转载自:http://blog.163.com/mike_gz/blog/static/247532200672932800/ 网管顾名思义,就是天天管着网络.想尽各种手段限制我们上网的人.在网络中订 ...
- 滑环的基本结构及工作原理分析
滑环是工业机械部件,基本原理是利用导电机械部件的折动或滚动在接触旋转部件和静止部件之间传递电能或电信号的产业部部件,作为360度旋转方式的一个相当好的解决方法,那么,下面一起了解下滑环的基本结构及工作 ...
- 【高通SDM660平台 Android 10.0】(19) --- Camera_focus、Camera_snapshot、volume_up 按键工作原理分析
[高通SDM660平台 Android 10.0]19 --- Camera_focus.Camera_snapshot.volume_up 按键工作原理分析 一. DTS代码配置 二. Kernel ...
- 二极管温度补偿电路工作原理分析
众所周知,PN结导通后有一个约为0.6V(指硅材料PN结)的压降,同时PN结还有一个与温度相关的特性:PN结导通后的压降基本不变,但不是不变,PN结两端的压降随温度升高而略有下降,温度愈高其下降的量愈 ...
- 船型开关工作原理分析
船型开关工作原理分析 由于疫情,这几个月一直无聊的待在家里,就把家里翻出来的旧电热锅简单的修理了一下,关于电热锅的修理博客之后有时间再写吧,这次就总结下在修过程中让我一直很头疼的船型开关的工作原理. ...
- 全自动升降柱工作原理分析
全自动升降柱工作原理分析 全自动升降柱使用范围比较广泛,在城市交通安全中提供非常便捷的交通舒缓措施,可控制车辆行驶确保安全,全自动升降柱外观设计精美, 具有高的防撞击效果,当电动升降柱升起可在地面形成 ...
- 结合 category 工作原理分析 OC2.0 中的 runtime
绝大多数 iOS 开发者在学习 runtime 时都阅读过 runtime.h 文件中的这段代码: struct objc_class {Class isa OBJC_ISA_AVAILABILITY ...
最新文章
- python实现socket编程,客户端和服务端之间互相对话(二)
- java 越来越慢_浅析Java语言慢的原因
- 南京晓庄学院大一第二学期计算机数据结构期末考试试卷及答案,南京晓庄学院数据结构题库参考标准答案...
- Shell - 通过hook文件后门实现应用的自动启停
- 关于MySQL相关的查看显示信息:
- vscode里面如何配置库_VSCode中C/C++库文件的配置
- word List16
- 单片机c语言 oxfe,AVR单片机入门及C语言高效设计实践(五)
- lisp提取长方形坐标_用 Python 对图片主体轮廓进行提取、颜色标记、并计算区域面积...
- 有了“质量墙”,程序员再也没有秃头的烦恼
- QTcrateor 编译 ROS
- 风控五大模型、三大风险指的是什么--几大模型PD、LGD、评分模型都有哪些细节点
- Linux之nc命令
- 票房连创新高 数据安全不能成为《熊出没》“拖油瓶”
- 搜索引擎蜘蛛及网站robots.txt文件详解[转载]
- 达奇机器人编程学院_趣味编程机器人:达奇和达达
- matlab数组从小到大排序,matlab数组排序
- git输入 ssh-keygen -t rsa 后只显示Generating public/private rsa key pair. 然后就直接跳出了
- mysql sql loader_Data Loader
- MySQL实现7种 SQL JOINS