多目标跟踪方法:deep-sort
多目标跟踪方法:deep-sort
读'Simple Online and Realtime Tracking with a Deep Association Metric, arXiv:1703.07402v1 ' 总结
前言
这篇文章依然属于tracking-by-detection 类,其在匹配detections时使用的是传统的匈牙利算法。文章中需要注意的几点包括:
在计算detections和tracks之间的匹配程度时,使用了融合的度量方式。包括卡尔曼滤波中预测位置和观测位置在马氏空间中的距离 和 bounding boxes之间表观特征的余弦距离。
其中bounding box的表观特征是通过一个深度网络得到的128维的特征
在匈牙利匹配detections和tracks时,使用的是级联匹配的方式。这里要注意的是,并不是说级联匹配的方式就比global assignment效果好,而是因为本文使用kalman滤波计算运动相似度的缺陷导致使用级联匹配方式效果更好。
具体内容
We adopt a conventional single hypothesis tracking methodology with recursive kalman filtering and frame-by-frame data association.
轨迹处理和状态估计
状态估计: 使用一个8维空间去刻画轨迹在某时刻的状态
,分别表示bounding box中心的位置、纵横比、高度、以及在图像坐标中对应的速度信息。然后使用一个kalman滤波器预测更新轨迹,该卡尔曼滤波器采用匀速模型和线性观测模型。其观测变量为
轨迹处理: 这个主要说轨迹什么时候终止、什么时候产生新的轨迹。首先对于每条轨迹都有一个阈值a用于记录轨迹从上一次成功匹配到当前时刻的时间。当该值大于提前设定的阈值
则认为改轨迹终止,直观上说就是长时间匹配不上的轨迹认为已经结束。然后在匹配时,对于没有匹配成功的detections都认为可能产生新的轨迹。但由于这些detections可能是一些false alarms,所以对这种情形新生成的轨迹标注状态'tentative' ,然后观查在接下来的连续若干帧(论文中是3帧)中是否连续匹配成功,是的话则认为是新轨迹产生,标注为'confirmed',否则则认为是假性轨迹,状态标注为'deleted'。
分配
匹配自然是指当前有效的轨迹和当前的detections之间的匹配。所谓有效的轨迹是指那些还存活着的轨迹,即状态为tentative和confirmed的轨迹。轨迹和detection之间的匹配程度结合了运动信息和表观信息。
运动匹配度
使用detection和track在kalman 滤波器预测的位置之间的马氏距离刻画运动匹配程度。

表示第j个detection和第i条轨迹之间的运动匹配度,其中
是轨迹由kalman滤波器预测得到的在当前时刻观测空间的协方差矩阵,
是轨迹在当前时刻的预测观测量,
时第j个detection的状态
考虑到运动的连续性,可以通过该马氏距离对detections进行筛选,文中使用卡方分布的0.95分位点作为阈值
,定义如下示性函数

表观匹配度
单独使用马氏距离最为匹配度度量会导致IDSwitch等情形严重,特别的当相机运动时可能导致马氏距离度量失效,所以这个时候应该靠表观匹配度补救。对于每一个detection,包括轨迹中的detections,使用深度网络提取出单位范数的特征向量$r$,深度网络稍后再说。然后使用detection和轨迹包含的detections的特征向量之间的最小余弦距离作为detection和track之间的表观匹配程度。当然轨迹太长导致表观产生变化,在使用这种最小距离作为度量就有风险,所以文中只对轨迹的最新的
之内detections进行计算最小余弦距离。

同样的,该度量同样可以确定一个门限函数
,这个阈值由训练集得到
两种度量的融合: 加权平均 
其中
是超参数,用于调整不同项的权重。
门限函数 
总结: 距离度量对于短期的预测和匹配效果很好,而表观信息对于长时间丢失的轨迹而言,匹配度度量的比较有效。超参数的选择要看具体的数据集,比如文中说对于相机运动幅度较大的数据集,直接不考虑运动匹配程度。
另外还有一点我想说的是这两个匹配度度量的阈值范围是不同的,如果想取相通的重要程度,
应该取0.1左右。
级联匹配
为什么采用级联匹配?
如果一条轨迹被遮挡了一段较长的时间,那么在kalman滤波器的不断预测中就会导致概率弥散。那么假设现在有两条轨迹竞争同一个detection,那么那条遮挡时间长的往往得到马氏距离更小,使detection倾向于分配给丢失时间更长的轨迹,但是直观上,该detection应该分配给时间上最近的轨迹。导致这种现象的原因正是由于kalman滤波器连续预测没法更新导致的概率弥散。这么理解吧,假设本来协方差矩阵是一个正态分布,那么连续的预测不更新就会导致这个正态分布的方差越来越大,那么离均值欧氏距离远的点可能和之前分布中离得较近的点获得同样的马氏距离值。
所以文中才引入了级联匹配的策略让'more frequently seen objects'分配的优先级更高。这样每次分配的时候考虑的都是遮挡时间相同的轨迹,就不存在上面说的问题了。具体的算法如下:

在匹配的最后阶段还对unconfirmed和age=1的未匹配轨迹进行基于IoU的匹配。这可以缓解因为表观突变或者部分遮挡导致的较大变化。当然有好处就有坏处,这样做也有可能导致一些新产生的轨迹被连接到了一些旧的轨迹上。但这种情况较少。
【妈蛋,这个编辑器稍微写长一点就卡成狗,卡的心情烦躁】
深度表观描述子
预训练的网络时一个在大规模ReID数据集上训练得到的,这个ReID数据集包含1261个人的1100000幅图像,使得学到的特征很适合行人跟踪。
然后使用该预训练网络作为基础网络,构建wide ResNet,用来提取bounding box的表观特征,网络结构如下:

该网络在Nvidia GeForce GTX 1050 mobile GPU下提出32个bounding boxes大约花费30ms,显然可以满足实时性要求。
实验
实验设置和结果
实验是在MOT16数据集上跑的,使用的detections并非公共检测结果。而是参考文献1中提供的检测结果. 实验结果如下表所示。

结论
相对于没使用深度表观特征的原始sort方法,IDSw下降了约45%,可见该深度表观特征的有效性
由于表观特征的使用,使轨迹因遮挡导致的motion 信息没用时不至于错误分配detection,使得ML更少,MT更多。
该方法存在的一个问题使FP太大。。,论文中分析原因有两点。一方面是detections问题,两一方面是轨迹最大允许丢失匹配的帧数!$A_{max}$太大导致去多false alarms被分配到轨迹中。提高detections的置信度可以显著提升性能。
速度够快,20Hz
总结
该方法相对简单,也容易理解。
我认为其优异性能很大程度上 取决于detections的质量很好,如果在提供的public detections上跑的话,可能要需要很复杂的预处理
在motion 匹配度时仅仅使用了距离关系,并不是真正的运动信息。我觉得这一点改用或结合速度信息,解决相似的人相遇而过导致的IDSw问题。
1 F. Yu, W.Li ,et.al. Poi: Multiple object tracking with high performance detection and appearance feature. ECCV,2016
多目标跟踪方法:deep-sort的更多相关文章
- 多目标跟踪(MOT)论文随笔-SIMPLE ONLINE AND REALTIME TRACKING WITH A DEEP ASSOCIATION METRIC (Deep SORT)
网上已有很多关于MOT的文章,此系列仅为个人阅读随笔,便于初学者的共同成长.若希望详细了解,建议阅读原文. 本文是tracking by detection 方法进行多目标跟踪的文章,在SORT的基础 ...
- springdata 查询思路:基本的单表查询方法(id,sort) ---->较复杂的单表查询(注解方式,原生sql)--->实现继承类---->复杂的多表联合查询 onetomany
springdata 查询思路:基本的单表查询方法(id,sort) ---->较复杂的单表查询(注解方式,原生sql)--->实现继承类---->复杂的多表联合查询 onetoma ...
- 数组升序排序的方法Arrays.sort();的应用
package com.Summer_0421.cn; import java.util.Arrays; /** * @author Summer * 数组升序排序的方法Arrays.sort();应 ...
- 多目标跟踪方法 NOMT 学习与总结
多目标跟踪方法 NOMT 学习与总结 ALFD NOMT MTT 读 'W. Choi, Near-Online Multi-target Tracking with Aggregated Local ...
- js join()和split()方法、reverse() 方法、sort()方法
############ join()和split()方法 join() 方法用于把数组中的所有元素放入一个字符串. 元素是通过指定的分隔符进行分隔的. 指定分隔符方法join("#&q ...
- Python中自定义类未定义__lt__方法使用sort/sorted排序会怎么处理?
在<第8.23节 Python中使用sort/sorted排序与"富比较"方法的关系分析>中介绍了排序方法sort和函数sorted在没有提供key参数的情况下默认调用 ...
- algorithm库介绍之---- stable_sort()方法 与 sort()方法 .
文章转载自:http://www.cnblogs.com/ffhajbq/archive/2012/07/24/2607476.html 关于stable_sort()和sort()的区别: 你发现有 ...
- 《deep sort》复现过程
目录 1. 准备代码与数据 deep_sort开源代码 克隆到本地服务器 git clone https://github.com/nwojke/deep_sort.git 下载MOT16数据集(MO ...
- deep sort
目录 1. 准备代码与数据 deep_sort开源代码 克隆到本地服务器 git clone https://github.com/nwojke/deep_sort.git 下载MOT16数据集( ...
随机推荐
- 20145316许心远《网络对抗》EXP7网络欺诈技术防范
20145316许心远<网络对抗>EXP7网络欺诈技术防范 实验后回答问题 通常在什么场景下容易受到DNS spoof攻击 公共共享网络里,同一网段可以ping通的网络非常容易被攻击 在日 ...
- 50道JavaScript基础面试题(附答案)
https://segmentfault.com/a/1190000015288700 1 介绍JavaScript的基本数据类型 Number.String .Boolean .Null.Undef ...
- C/C++之宏、内联函数和普通函数的区别
内联函数的执行过程与带参数宏定义很相似,但参数的处理不同.带参数的宏定义并不对参数进行运算,而是直接替换:内联函数首先是函数,这就意味着函数的很多性质都适用于内联函数,即内联函数先把参数表达式进行运算 ...
- 9大行为导致Java程序员薪资过低, 你有几个?
Java程序员薪水有高有低,有的人一个月可能拿30K.50K,有的人可能只有2K.3K.同样有五年工作经验的Java程序员,可能一个人每月拿20K,一个拿5K.是什么因素导致了这种差异?本文整理导致J ...
- MySQL之表连接(内外连接和重命名的使用)
#要多练练 1.连接查询根据连接方式分为 内连接 等值连接 非等值连接 自连接 外连接 左外连接(左连接) 右外连接(右连接) 当多张表进行连接查询,若没有任何条件进行限制,会 发生什么现象? 会出现 ...
- TimeUnit简析
TimeUnit是java.util.concurrent包下面的一个类,主要有两种功能: 1.提供可读性更好的线程暂停操作,通常用来替换Thread.sleep() 2.提供便捷方法用于把时间转换成 ...
- PHP中private和public还有protected的区别
原文链接:http://www.thinkphp.cn/code/1898.html <? //父类 class father{ public function a(){ echo " ...
- 20135234mqy-——信息安全系统设计基础第十一周学习总结
第八章 异常控制流 8.1异常 异常是异常控制流的一种形式,它一部分是由硬件实现的,一部分是由操作系统实现的. 异常就是控制流中的突变,用来响应处理器状态中的某些变化. 8.1.1异常处理 异常号是到 ...
- Postgresql数据库实用命令
Postgresql 命令 pg_ctl -D /usr/local/var/postgres -l /usr/local/var/postgres/server.log start 启动数据库 cr ...
- 明码|2018年蓝桥杯B组题解析第二题-fishers
标题:明码 汉字的字形存在于字库中,即便在今天,16点阵的字库也仍然使用广泛. 16点阵的字库把每个汉字看成是16x16个像素信息.并把这些信息记录在字节中. 一个字节可以存储8位信息,用32个字节就 ...