最近学习了下DeepSORT+Yolov5的多目标跟踪算法,针对ID switch的后处理,进行了一些思考,想了点思路。
DeepSORT算法在进行目标跟踪时,当检测器受到噪声干扰,或目标暂时受遮挡、目标超出视线范围时,检测器无法检测到目标,Tracks失配,DeepSORT的kalman滤波器停止更新,直到超出max_age,删除ID、特征向量等相关信息。但当检测器再次检测到同一目标,DeepSORT则会赋予另一个新ID。
针对噪声干扰、目标暂时受遮挡这两种情况,导致检测器短时间内检测不到目标,致使ID发生变化,做如下后处理方案:
(1)连续记录检测器目标框的中心位置坐标。例FPS=60的图像,连续记录4秒数据,即检测器应检测到目标超过4秒,记录最后4秒位置,并记录最后一帧的特征向量。
(2)在max_age内,DeepSORT可能会再次跟踪相同ID,因此不做处理。在超出max_age(本人设的60)时,根据步骤1记录的数据,先等间隔平均,如20帧做一次平均(因为这个检测器用的预训练模型,检测框抖个不停,影响贼大)。得到12组数据,连续做6次加权平均预测(位移、速度、加速度),每预测一次,得到一组数据,抛掉12组中的第一组。预测6组,后3组即超出max_age的60帧内的3组数据(第10、30、50帧)。
(3)在超出max_age的60帧内的3组数据(第10、30、50帧)对应的时间。在对应的时间,根据预测位置信息,设定距离阈值(毕竟是预测,存在误差,该距离指的像素数量),搜寻该时间、距离范围内检测器检测到的目标框,再通过之前保存的特征向量做余弦距离计算代价等方式进行匹配,设定代价阈值,将满足阈值的代价最小的现ID切换回消失前的ID,仅仅更换ID,其余的现ID数据,包括特征向量全部继承。(如果第10帧检测并切换ID,则不再计算第30、50帧)
效果如下图,图中右边的ID-6、11较为明显,发生了ID的消失、赋予新ID,最后又回到初始的ID。别在意检测类型标签QAQ,直接用的预训练的yolov5s权重,毕竟只是验证方法,懒得去单独跑个模型,随便扒的视频,分辨率是720p。
这个处理思路的话,目前看只能用在后处理,实时处理的话,毕竟会造成ID的两次switch,会产生什么样的影响,只能说⑧清楚。





另外,在处理过程中,还需要计算下目标的运动方向向量,计算下原目标与现目标两个方向向量的夹角。因为不这样可能会造成,两个相反运动的目标,由于特征向量之间的代价小,导致与原ID目标运动方向相反的现目标被更换ID,这个在大部分情况下是肯定不合理的。
先就这样。。。。。。