天天看点

DeepSORT(工作流程)

关于多目标跟踪

    DeepSORT是针对多目标跟踪的跟踪算法。有人可能会想,将传统的单目标跟踪算法直接用于多目标跟踪,一起对每一个目标进行单目标跟踪不可以吗?理论上似乎可行,但是实际应用中会发现,单纯的套用单目标跟踪算法用于多个目标进行跟踪的结果并不理想。

    至于有多不理想,举个栗子,把KCF用于多目标跟踪,结果就是KCF的帧率变低(初始帧框完后,后继帧中框出目标的速度极慢,完全跟不上目标的移动速度);即便把极速的mosse用于多目标跟踪,结果也是不尽人意,精度大幅降低(更多的是把背景框出而不是目标)。如图1,可以看见每个跟踪框都跟不上行人,在人体的侧边;如图2,框的甚至都是背景。

DeepSORT(工作流程)
DeepSORT(工作流程)

    那么如何对多目标进行跟踪呢?

常见的跟踪策略就是track+detection。
           

    为什么选择与detection进行结合呢?

这是因为目标检测算法大多是基于多目标的
           

    那么问题又来了,为什么不可以直接用detection进行多目标跟踪呢?

这是因为检测算法有时会出现漏检的情况.
在跟踪算法中一旦跟踪丢了目标就很难再继续跟踪下去了。
如果遇到漏检的情况,将失去身份ID。所以仅仅使用detection进行跟踪结果也并不理想。
           

    所以就提出了track+detection的多目标跟踪思路。这里需要提一句的是,对于跟踪,算法并不知道自己跟踪的目标内容是什么,它只负责跟踪,具体是什么并不需要知道,那么就会出现重识别(ReID)的问题:

DeepSORT(工作流程)

    什么是重识别?

    如上图,紫色框表示上一帧的目标track,黑框表示当前帧检测到的四个目标,上一帧的目标(紫)跟检测出来的四个目标(黑)中哪一个是同一个目标呢?这也是多目标跟踪要做的数据关联:上一时刻的目标,和当前时刻的目标,怎么匹配关联起来。实现策略有很多,思路就是训练一个网络使它最小化类内误差,最大化类间误差。此处不进行展开。

    在目标跟踪中还会遇到一个问题就是身份变换(IDswitch)问题:

DeepSORT(工作流程)

    如上图:白色框表示track,蓝色框表示detection;

    图1中有四个ID:37,41,45,38。随着目标移动,ID41把ID38挡住(图4),detection检测不到ID38,而ID37如果刚好走到ID38原来的位置附近(从图片可以看出来,37走向和38走向是相对的,38被从右侧走到了左侧途中经过了遮挡,37从左侧走到了右侧可能也发生了遮挡),检测器可能会把37识别成38,把后继帧出现的38识别成37,从而导致身份变换。也就是说如何在目标交叉的过程中保证身份不会发生变化呢?

    基于此,我们来看一下DeepSORT算法是怎么进行多目标跟踪的。

DeepSORT

    在DeepSORT提出之前是SORT算法(SORT论文链接),但是它对身份变换的问题,仅仅采取框和框之间距离的匹配方式,没有考虑框内的内容,所以容易发生身份变换,不过这个问题已经在2017年的论文中进行了解决,即DeepSORT。

    首先来看一下DeepSORT的核心流程:

    预测(track)——>观测(detection+数据关联)——>更新

    预测:预测下一帧的目标的bbox,即后文中的tracks

    观测:对当前帧进行目标检测,仅仅检测出目标并不能与上一帧的目标对应起来,所以还要进行数据关联

    更新:预测Bbox和检测Bbox都会有误差,所以进行更新,更新后的跟踪结果通常比单纯预测或者单纯检测的误差小很多。

    核心流程示意图:

DeepSORT(工作流程)

    如图所示:

    在T1时刻track预测到一个行人的轨迹(图1紫框)后;

    T2时刻detection对图中物体进行检测,检测出了四个目标(图2黑框),通过数据关联,将代表ID1的物体跟踪的BBOX(图2紫框,其实就对应图1track的紫框)与对应的检测BBOX(图2黑框)关联;

    同样还是T2时刻,确定关联关系后,更新track预测的结果,用物体检测的Bbox来代表T2时刻物体追踪的Bbox。(这里不太清楚是detection直接代替track的Bbox,还是融合了track与detection的结果)

DeepSORT流程

    下面来看一下Deep SORT的大体流程:(图源见右下角水印)

DeepSORT(工作流程)

    下面来逐步看一下DeepSORT到底是如何工作的吧。

    1.首先是核心流程:绿框部分。

DeepSORT(工作流程)

    1)从预测(Tracks)开始,由于每一时刻的track Bbox组在一起就相当于构成一组轨迹,所以写的是复数tracks,并且后文都会称跟踪的Bbox为轨迹;

    2)经过kalman滤波预测后,会对当前帧预测一个轨迹Bbox,先不看unconfirmed,假如预测出的是confirmed(对于confirmed和unconfirmed,是用来区别跟踪的目标是不是一个东西,比如一个杂七杂八的背景那就是unconfirmed,真真切切的人或者车就是confirmed);

    3)对当前帧进行detection,然后将detection Bboxs结果和预测的confirmed track Bbox进行数据关联(matched tracks);

    4)匹配完成后,更新跟踪的bbox(卡尔曼滤波预测的Bbox)。这里要注意,更新和匹配不是在时刻上顺延的(不是T2时刻匹配,T3时刻更新的关系),而是在下一帧时刻需要完成的两项流程(T2时刻匹配,继续在T2时刻更新)。

    5)更新后,对当前帧预测,下一帧观测,并更新;再预测,下一帧观测,更新…………

    上面只讨论了跟踪目标是真实存在的物体且匹配成功的情况下的流程,显然匹配过程中不可能所有都实现一对一的匹配,肯定有的track是匹配不上detection的,也有detection匹配不到track的,那么如何处理呢?

    2.匹配失败的第一种情况,那就是对于匹配不上的tracks和detection再次进行匹配,会出现两种情况,一个是匹配成功了,一个是依然还有部分匹配不到,先来看再次匹配能匹配成功的情况,流程如下:

DeepSORT(工作流程)

    依然从预测的tracks开始,经过卡尔曼滤波预测,与detection匹配

    1)发现此时的tracks匹配失败,为什么会有tracks匹配失败的情况呢?

    检测可能发生了漏检,某时刻,预测的轨迹tracks还在,但是检测器没有检测到与之对应的目标。

    2)为什么会有detection匹配失败的情况呢?

    可能某一时刻有一个物体是新进入的镜头(比如,之前一直只有三个物体,某时刻突然镜头中出现了第四个新物体),就会发生detection匹配不到tracks的情况,因为这个物体是新来的,在这之前并没有它的轨迹用于预测;还有一种情况就是物体长时间被遮挡,导致检测到的物体没有可以与之匹配的轨迹。

    针对上述匹配失败问题,处理方法就是对匹配失败的tracks和匹配失败的detection进行IOU匹配。如果能匹配成功,则再进行更新,然后继续进行预测–观测–更新的追踪流程。

    3.再次匹配也匹配不成功的怎么办呢?如下图:

DeepSORT(工作流程)

    对于再次匹配依然失败的detections,前面讨论过detections匹配失败的原因可能是新出现的目标在之前没有它的轨迹tracks,或者长时遮挡的也没有轨迹tracks,所以对其建立一个new tracks,前面也提到,tracks都会设置confirmed/unconfirmed,对于新建立的tracks,尚未确定是否就是真切存在的,万一是检测错的杂七杂八呢,所以将其设置为unconfirmed,并对其进行三次考察,如果是实际目标修改为confirmed,再进行 预测-观测-更新

DeepSORT(工作流程)

    对于再次匹配依然失败的tracks,前面讨论过可能是检测器漏检了目标,此时看其是否是confirmed,如果是unconfirmed,将其删除;反之,为其设置寿命,在寿命时间之内都没发生变化(>max_age)则将其delete,认为其已移出镜头;如果寿命之内(<max_age),同样对其进行三次考察,是否是跟踪的杂七杂八,再进行 预测-观测-更新

继续阅读