多目标跟踪常用的是tracking by detection,这种方法就是将每帧中所有感兴趣的目标物体均检测出来,然后与前一帧检测出来的目标进行关联,从而实现跟踪效果。这种方法的前提就是要拥有一种表现好的目标检测算法还有好的关联方法。
具体流程是:
step1:使用目标检测算法将每帧中感兴趣的目标检测出来,得到对应的(坐标,分类,可信度),假设检测出来的目标个数为M
step2:通过某种方式将step1中的检测结果与上一帧的检测目标(假设目标个数为N)一一关联起来(也就是在M*N的pair中找出最相似的pair)
目标关联方式:
①两帧的两个目标间的欧氏距离(最短则认为是同一个目标),通过匈牙利算法找出最匹配的pair;
②计算两个目标bbox的交并比,越接近于1代表是同一个目标;
③判断目标外观是否相似
关联中可能出现的情况:
①上一帧中N个目标中找到本次检测的目标;
②上一帧的N个目标中未找到本次检测的目标,该目标是新出现的,需要记录下来用于下一次跟踪关联;
③上一帧中存在某个目标,这一帧中没有与之关联的目标,说明该目标可能消失了,需将其移除。
可想而知,这种简单的位置对比关联方式针对目标运动速度太快的情况不适用,容易误判,因此提出基于轨迹预测的跟踪方式,在对比之前,先预测目标的下一帧会出现的位置。也就是说,用下一帧预测的位置和实际检测出来的位置进行对比关联。那么怎么预测目标在下一帧的位置呢?一种是用卡尔曼滤波来预测位置,一种是用根据前几帧拟合出来的曲线预测位置。
匈牙利算法:
匈牙利算法的百度百科定义是:基于Hall定理中充分性证明的思想,部图匹配的最常见算法。????不懂,其实它的核心就是寻找增广路径,求二分图最大匹配的算法。那么二分图又是什么?它可以分成两组点,同一组内的点不能相互连通,只能与另一组点相连。对于视频帧的话这些点相当于图中的目标,连起来的目标就是认为同一目标可能性较大,但是通常这样的结果不能保证每张图都有一对一匹配,可能存在多对一的情况。
那如何保证最终的一对一跟踪结果?正是匈牙利算法要做的事:左边的图依次按照连线匹配右边的图,当右边的目标已经被匹配,将与右边的图匹配的左边的图重新匹配,最后若左边存在图没有匹配对象则放弃匹配。
一些概念:
tubelet:视频目标检测中的边框被称为tubelet,tubelet是一系列候选边框的集合。视频目标检测算法使用tubelet来获得时间上的信息。但是,tubelet的产生一般是基于对每一帧的检测结果,过程非常耗时,产生每一帧中的每一个检测边框都需要0.5s,而一个视频通常有上百帧,每一帧又有上百个检测边框,所以无法在一个可以接受的时间范围内产生足够的候选tubelet。
SSD目标跟踪:SSD目标跟踪是在Yolo上的改进,和Yolo一样属于one-stage方法的一种,和Yolo相比,SSD将最后的全连层换为卷积层,SSD利用了多尺度特征图,是在原图上进行密集型采样的方法。在特征图上的每个单元生成多个先验框(不同长宽比),对于每个先验框,SSD的输出有两个:一个边界框的位置、所属各个类别的置信度或者评分(置信度个数包含背景和类),最后先验框的类别由最高置信度值决定,然后真实的预测框位置由先验框和边界框共同决定。由于一个