DeepSORT
背景:deepsort之前是sort算法,但是它对身份变换的问题,仅仅采取框和框之间距离的匹配方式,没有考虑框内的内容,所以容易发生身份变换,该问题在deepsort中得到了解决。
1、DeepSORT的核心流程:
预测(track)–》 观测(detection+数据关联)–》更新
1.1 预测:预测下一帧目标的bbox,即后文中的tracks;;
1.2 观测:对当前帧进行目标检测,仅仅检测出目标并不能与上一帧的目标对应起来,所以还要进行数据关联;
1.3 更新:预测Bbox和检测Bbox都会有误差,所以进行更新,更新后的跟踪结果通常比单独预测或单独检测的误差小很多。
核心流程示意图:
如图所示:
1)、在T1时刻track预测到一个行人的轨迹后;
2)、T2时刻detection对图中物体进行检测,检测出四个目标(图2黑框),通过数据关联,将代表ID1的物体跟踪的Bbox(图2紫框,其实就对应图1track的紫框)与对应的检测Bbox(图2黑框)关联;
3)、同样在T2时刻,确定关联关系后,更新track预测结果,用物体检测Bbox来代表T2时刻物体追踪的Bbox。
2、deepsort的大体流程:
2.1、首先核心流程:下图绿框部分
1)、从预测(Tracks)开始,由于每一时刻的track Bbox组在一起就相当于构成一组轨迹,所以写的是复数tracks,且后面会称跟踪的Bbox为轨迹;
2)、经过kalman滤波预测后,会对当前帧预测一个轨迹Bbox,先不看unconfirmed,假如预测出的是confirmed(对于unconfirmed(背景)和confirmed(目标),是用来区别跟踪的物体是不是目标);
3)、对当前帧进行detection,然后将detection Bbox结果和预测的confirmed track Bbox进行数据关联;
4)、匹配完成后,更新跟踪的bbox(卡尔曼滤波预测的Bbox)。此处需注意:更新和匹配不是在时刻顺延的(不是T2时刻匹配,T3时刻更新的关系),而是在下一帧时刻需要完成的两项流程(T2时刻匹配,继续在T2时刻更新)。
5)、更新后,对当前帧预测,下一帧观测并更新;再预测,下一帧观测,更新。。。
上面只讨论了跟踪目标是真实存在的物体且匹配成功的情况下流程,不过匹配过程中肯定有track是匹配不上detection的,也有detection匹配不到track的,如何处理?
匹配失败的情况下,对于匹配不上的tracks和detection再次进行匹配,此时会出现两种情况,匹配成功或失败。
2.2 再次匹配时匹配成功的流程:
依然从预测的tracks开始,经过卡尔曼滤波预测,与detection匹配
1) 发现此时的tracks匹配失败,为什么会有tracks匹配失败的情况呢?检测可能发生了漏检,某时刻,预测的轨迹tracks还在,但是检测器没有检测到与之对应的目标。
2) 为什么会有detection匹配失败的情况呢?可能某一时刻有一个物体是新进入的镜头(比如,之前一直只有三个物体,某时刻突然镜头中出现了第四个新物体),就会发生detection匹配不到tracks的情况,因为这个物体是新来的,在这之前并没有它的轨迹用于预测;还有一种情况就是物体长时间被遮挡,导致检测到的物体没有可以与之匹配的轨迹。针对上述匹配失败问题,处理方法就是对匹配失败的tracks和匹配失败的detection进行IOU匹配。如果能匹配成功,则再进行更新,然后继续进行预测–观测–更新的追踪流程。
2.3 再次匹配也匹配失败
此时处理流程如下图:
对于再次匹配依然失败的detections,前面讨论过detections匹配失败的原因可能是新出现的目标在之前没有它的轨迹tracks,或者长时遮挡的也没有轨迹tracks,所以对其建立一个new tracks,前面也提到,tracks都会设置confirmed/unconfirmed,对于新建立的tracks,尚未确定是否就是真切存在的,万一是检测错的杂七杂八呢,所以将其设置为unconfirmed,并对其进行三次考察,如果是实际目标修改为confirmed,再进行 预测-观测-更新。
对于再次匹配依然失败的tracks,前面讨论过可能是检测器漏检了目标,此时看其是否是confirmed,如果是unconfirmed,将其删除;反之,为其设置寿命,在寿命时间之内都没发生变化(>max_age)则将其delete,认为其已移出镜头;如果寿命之内(<max_age),同样对其进行三次考察,是否是跟踪的杂七杂八,再进行 预测-观测-更新。
这就是deepsort的具体流程,下一步会编写yolov5+deepsort+tensorrt的使用案例。