AI学习者 · 2023年01月16日

YOLOv8 + DeepSORT | YOLO与DeepSORT跟踪的难分难舍,直接用吧(附源码)

1、DeepSORT

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

预测(track)——>观测(detection+数据关联)——>更新
  1. 预测:预测下一帧的目标的bbox,即后文中的tracks
  2. 观测:对当前帧进行目标检测,仅仅检测出目标并不能与上一帧的目标对应起来,所以还要进行数据关联
  3. 更新:预测Bbox和检测Bbox都会有误差,所以进行更新,更新后的跟踪结果通常比单纯预测或者单纯检测的误差小很多。

核心流程示意图:

image.png

如图所示:

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

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

下面来看一下Deep SORT的大体流程:

image.png

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

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

image.png

  • 1.1. 从预测(Tracks)开始,由于每一时刻的track Bbox组在一起就相当于构成一组轨迹,所以写的是复数tracks,并且后文都会称跟踪的Bbox为轨迹;
  • 1.2. 经过kalman滤波预测后,会对当前帧预测一个轨迹Bbox,先不看unconfirmed,假如预测出的是confirmed(对于confirmed和unconfirmed,是用来区别跟踪的目标是不是一个东西,比如一个杂七杂八的背景那就是unconfirmed,真真切切的人或者车就是confirmed);
  • 1.3. 对当前帧进行detection,然后将detection Bboxs结果和预测的confirmed track Bbox进行数据关联(matched tracks);
  • 1.4. 匹配完成后,更新跟踪的bbox(卡尔曼滤波预测的Bbox)。这里要注意,更新和匹配不是在时刻上顺延的(不是T2时刻匹配,T3时刻更新的关系),而是在下一帧时刻需要完成的两项流程(T2时刻匹配,继续在T2时刻更新)。
  • 1.5. 更新后,对当前帧预测,下一帧观测,并更新;再预测,下一帧观测,更新…………

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

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

image.png

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

  • 2.1 发现此时的tracks匹配失败,为什么会有tracks匹配失败的情况呢?检测可能发生了漏检,某时刻,预测的轨迹tracks还在,但是检测器没有检测到与之对应的目标。
  • 2.2 为什么会有detection匹配失败的情况呢?可能某一时刻有一个物体是新进入的镜头(比如,之前一直只有三个物体,某时刻突然镜头中出现了第四个新物体),就会发生detection匹配不到tracks的情况,因为这个物体是新来的,在这之前并没有它的轨迹用于预测;还有一种情况就是物体长时间被遮挡,导致检测到的物体没有可以与之匹配的轨迹。针对上述匹配失败问题,处理方法就是对匹配失败的tracks和匹配失败的detection进行IOU匹配。如果能匹配成功,则再进行更新,然后继续进行预测–观测–更新的追踪流程。
  1. 再次匹配也匹配不成功的怎么办呢?如下图:

image.png

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

image.png

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

作者:小书童
文章来源:集智书童

推荐阅读

更多嵌入式AI干货请关注嵌入式AI专栏。欢迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。
推荐阅读
关注数
18790
内容数
1342
嵌入式端AI,包括AI算法在推理框架Tengine,MNN,NCNN,PaddlePaddle及相关芯片上的实现。欢迎加入微信交流群,微信号:aijishu20(备注:嵌入式)
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息