实际应用中,做工程落地所遵从的原则是能够在保证实现功能的情况下,以最快的速度实现,先出一版,后期再不断迭代优化。所以定方案是最重要的,前期的调研工作做的好,对于后续的部署会极为方便,否则会走很多弯路。
回到本文的内容中来,目标检测已产生出很多优秀的算法(这里提的都是基于神经网络的算法,传统的CV检测算法不在考虑范围内),类似的综述性文章很多,无论单阶段式的(ssd/yolo),还是两阶段式的(faster rcnn)在实际工程中都有被应用,哪种框架用的熟练就用哪种框架,目标检测这一块就不过多讨论;
多目标追踪顾名思义就是跟踪视频画面中的多个目标,得到这些目标的运动轨迹;核心在于目标检测和数据关联,即在每一帧进行目标检测,再利用目标检测的结果来进行目标跟踪,后面一步一般称之为数据关联,数据关联更多依赖于手工特征提取(外观特征、运动特征、形状特征)。下面就多目标跟踪算法总结归纳为以下几类:
一、以卡尔曼滤波和匈牙利、KM匹配的后端追踪优化算法(代表性的应用有SORT、DEEP-SORT)
这类算法特点在于能达到实时性,但依赖于检测算法效果要好,特征区分要好(有点互相甩锅的味道,输出最终结果的好坏依赖于较强的检测算法,而基于卡尔曼加匈牙利匹配的追踪算法作用在于能够输出检测目标的id,其次能保证追踪算法的实时性),这样追踪效果会好,id切换少。相关论文和代码如下:
DeepSort : Wojke, Nicolai and Bewley, Alex and Paulus, Dietrich "Simple Online and Realtime Tracking with a Deep Association Metric" [paper] [code] In ICIP 2017
Sort : Bewley, Alex and Ge, Zongyuan and Ott, Lionel and Ramos, Fabio and Upcroft, Ben "Simple Online and Realtime Tracking"[paper] [code] In ICIP 2016.
二、基于多线程的单目标跟踪器的多目标追踪算法(代表性的算法有KCF、LEDS)
这类算法特点是跟踪效果会很好,因为其为每一类物体都单独分配了一个跟踪器。但该算法对目标尺度变化要求较大,参数调试需要合理,同时该算法极耗cpu资源,实时性不高。相关论文和代码如下:
KCF: "High-Speed Tracking with Kernelized Correlation Filters" [paper] [code] In TPAMI 2015
LEDS:"Robust Estimation of Similarity Transformation for Visual Object Tracking" [paper] [code] In AAAI 2019.
三、 基于深度学习端到端的多目标跟踪算法。(代表性的算法有SST)
现阶段end-to-end的算法还不多,大多处于实验室刷榜阶段,有进一步落地应用的及时更新。相关论文和代码如下:
DAN: "Deep Affinity Network for Multiple Object Tracking" [paper] [code] In TPAMI 2019.
MCSA: "Multi-Object Tracking with Multiple Cues and Switcher-Aware Classification" [paper] In CVPR 2019.
(这篇文章没有开源,基于SiameseRPN单目标跟踪器和行人ReID的多目标跟踪算法,解决长期跟踪下的目标漂移问题。利用SiameseRPN获取短期的目标线索,利用ReID特征计算目标间的匹配置信度,基于该置信度构建二分图,求解最小费用流得到长期的跟踪结果)
上述文章参考来源:
github.com/SpyderXu/multi-object-tracking-paper-list
第一类算法原理介绍:
SORT 是一种实用的多目标跟踪算法,引入了线性速度模型与卡尔曼滤波来进行位置预测,在无合适匹配检测框的情况下,使用运动模型来预测物体的位置。匈牙利算法是一种寻找二分图的最大匹配的算法,在多目标跟踪问题中可以简单理解为寻找前后两帧的若干目标的匹配最优解的一种算法。而卡尔曼滤波可以看作是一种运动模型,用来对目标的轨迹进行预测,并且使用确信度较高的跟踪结果进行预测结果的修正。
然而由于现实中目标运动多变且遮挡频繁,该算法的身份转换(Identity Switches)次数较高。于是衍生出带有深度关联特征的DeepSORT 方案,其沿用SORT中的卡尔曼滤波和逐帧数据关联方法并整合外观信息,使得身份转换的数量减少了45%。所提方案为:
l 使用马氏距离和深度特征余弦距离两种度量;
l 采取级联匹配,优先匹配距上次出现间隔短的目标;
l 第一级关联以余弦距离作为成本函数,但设定马氏距离和余弦距离两个阈值约束;
l 第二级关联与 SORT 中相同,尝试关联未确认和年龄为 n=1的不匹配轨迹;
l 同样采用试用期甄别目标,但大幅提高轨迹寿命 Amax=30。
核心:轨迹处理和状态估计、关联问题、级联匹配、特征描述器
Deepsort处理流程
实现应用:实际工程中存在一些硬性指标,必须考虑硬件平台的资源(车载控制器iecu、Nvidia平台、FPGA),cpu内存大小,是否有gpu,是否支持神经网络(caffe),是否支持部署在硬件端的编程语言(C++、verilog)。目前在学术界极受欢迎的pytorch框架,训练模型可以,部署在硬件端不现实,底层调用的接口还是纯正的c代码。现在各类网络模型可以实现的框架很多,举个例子:目标检测网络ssd可以用caffe框架实现,也可以用pytorch框架实现,按正常的想法,两种最后训练出来的模型精度、速度应该类似,实际情况是最后出来的效果是有差别的,部署在硬件端同样有差别。另外用pytorch框架还需要转成支持C++的语言,不过现在pytorch已经出了可以调用libtorch的c++接口,以及支持tensort转换,方便基于pytorch的研究者们将代码部署在硬件端。
多目标追踪一般接在目标检测后。在工业界目标检测采用比较多的是ssd检测网络,单阶段式,速度快,精度不差,修改其backbone,速度会进一步提升,部署在NV的平台帧率可以达到30fps以上。所以要实现目标检测代码和多目标追踪代码集成的任务,需要先将两者的框架统一,若采用C++的目标检测网络(Yolo,ssd均可),多目标追踪也采用C++框架,这里因为都是跟实际工程打交道,就直接考虑C++语言了,训练模型还是可以采用任意框架,最后转成C++可以调用的模型即可。先实现目标检测网络,检测的输出结果主要是将检测框的位置信息输入到多目标追踪算法中。在实验室阶段,看多目标跟踪的效果即可。实际过程中,针对多目标跟踪的输出接口是有需求的,输出的物体类别,对应类别物体的id,以及增加个数对应的id号,持续的帧数等,这些信息都会通过lcm通信的方式传输给智驾融合层。
Deep-Sort视频效果展示
追踪结果分析:淡绿色的检测框为检测的结果,红色框为跟踪后的结果,很明显若检测效果鲁棒的话,对于追踪的效果也会提升。在视频中,远处的检测框会不稳定(这跟检测的距离有关),距离靠近时还存在不太稳定的检测框(如右转的红灯:检测的淡蓝色检测框时而存在时而消失),而代表多目标追踪的红色框能够继续维持,说明多目标跟踪起了维持检测框轨迹的作用,确保其检测框不消失,起到了跟踪的作用。而且基本不耗时,实时性也能达到要求。
内存占用率: 0.4%;
耗时: 40fps;
准确率: 基本取决于检测效果,能起到维持检测框的作用。
第二类算法原理介绍:
多目标追踪本质上是多个目标同时运动的问题,所以有提出将单目标跟踪器引入到多目标追踪的问题,为每一个目标分配一个跟踪器,然后间接地使用匹配算法来修正那些跟踪失败或新出现的目标。代表性的单目标跟踪算法为核相关滤波算法(KCF),它于2014年提出,在精度和速度上能够同时达到很高的水平,是当时单目标跟踪最优秀的算法之一。后来的很多单目标跟踪算法都是基于此做的改进,经典的还是最好的。实际工程不需要刷榜,能快速实现功能,更多的针对具体问题加一些边界条件,约束条件,使得最终结果能够满足实际的需求。
核相关滤波(Kernelized Correlation Filter,KCF)是相关滤波算法的一种扩展。相关滤波是指在模板的一个邻域内搜索和模板响应值最大的位置,可以视为一种模板匹配的方法,具有很高的实时性。将滤波器表示成一个权值向量,将滤波器和模板的响应值写作权值和特征向量的内积:
其中w表示滤波器权重,z表示模板。求解一个最优的滤波器,使得滤波器的权值和模板特征向量的内积和标准响应图的误差最小,可以写作:
X表示一个循环采样的样本集合。在频域中可求得上式的解为:
实际应用过程中会为每个目标分配一个KCF跟踪器并采用多线程的方式来组织这些跟踪器。同时因为实际硬件条件的限制,不可能提供强大的计算力资源,会采用检测器与跟踪器交替进行的跟踪策略。
多线程的单目标跟踪方式
实际效果:采用多线程的单目标跟踪器的方法,在该离线视频上检测框的维持效果还是不错的,而且id几乎没有切换,很稳定;但实车测试的时候,将其移植于嵌入式端,由于检测的帧率不高,使得跟踪的维持效果出现滞后或框飘的现象较为严重,实用性不大。
实车验证时严重的框飘现象
内存占用率: 10-20%;
耗时: 18-24fps(物体类别越多,速度越慢);
准确率: 车速较慢时,维持检测框的效果很稳定; 但当车速较快时,这种跟踪方法维持检测框效果较差,会出现框飘的现象。
第三类算法原理介绍: