MOT多目标跟踪及Deep Sort学习笔记

多目标跟踪学习笔记


看到一篇写的很好的文章,放在前面,介绍了目前多目标跟踪的三种框架:
基于Tracking-by-detection的MOT 代表方法:SORT、DeepSORT
基于检测和跟踪联合的MOT 代表方法:JDE、FairMOT、CenterTrack、ChainedTracker等
基于注意力机制的MOT 代表方法:TransTrack、TrackFormer等
多目标跟踪(MOT)最新综述,一文快速入门


多目标跟踪处理的对象是视频,从视频的第一帧到最后一帧里有多个目标在不断运动。多目标跟踪的目的就是将每个目标和其他目标进行区分开来,具体方法是给每个目标分配一个 ID,并记录他们的轨迹。目标跟踪与目标检测不同,目标检测无法给每个对象分配ID,其是不稳定的;而目标跟踪可以优化整个过程,分配ID并进行轨迹追踪。
MOT多目标跟踪的主要步骤:

  • 检测——给定视频原始帧; 运行目标检测器如 Faster R-CNN、YOLOv3等进行检测,获取目标检测框;
  • 特征提取、运动预测——将所有目标框中对应的目标抠出来,进行特征提取(包括表观特征或者运动特征);
  • 相似度计算——进行相似度计算,计算前后两帧目标之间的匹配程度(前后属于同一个目标的之间的距离比较小,不同目标的距离比较大);
  • 数据关联——数据关联,为每个对象分配目标的 ID。

在线跟踪(Online Tracking)

在线方式的多目标跟踪算法根据当前检测观测,计算与已有轨迹的匹配关系。
在线跟踪要求处理每一帧时,决定当前帧的跟踪结果时只能利用当前帧和之前的帧中的信息,也不能根据当前帧的信息来修改之前帧的跟踪结果

离线跟踪(Offline Tracking)

离线方式的多目标跟踪算法通常构造为图模型。其中,设计和计算检测之间的相似度或者距离度量是决定图模型构造正确性的关键。
离线跟踪允许利用之后的帧的信息从而获得全局最优解。离线追踪的设定也不太适合实际应用场景,但是以一种“batch”的形式进行的离线跟踪(每次得到若干帧,在这些帧中求全局最优)也是可行的,只是会导致一点延迟。

1.MOT16数据集

链接:https://pan.baidu.com/s/19y8dSEM9tOIqPK2vxLfrBQ
提取码:mpvi
MOT——Multiple Object Tracking
MOT16 数据集是在 2016 年提出来的用于衡量多目标跟踪检测和跟踪方法标准数据集,专门用于行人跟踪。这个数据集包含了14个在无约束的环境下拍摄的静态和移动的视频序列(7训练,7测试)。跟踪和评估是在其一帧一帧的图像中完成的。所有序列都已严格按照定义良好的协议进行了高精度注释。官网地址是:https://motchallenge.net/
标准数据集是神经网络的训练基础。训练就相当于条件反射中的条件,是已知的条件。来源是“经验”,是已知的映射组,当在神经网络中载入标准数据集后,神经网络随机生成一组矩阵,用矩阵处理标准集中的输入集后,用所得结果与标准输出集比较,将误差提出后根据误差,向减少误差的方向修改矩阵组,然后重复多次以后,误差减小到一定程度,标准输入集输入网络后能得到标准输出集,训练完成。这个矩阵组就是神经网络模型。神经网络就是用电脑在标准数据集上总结经验,来对新的输入进行映射。
MOT中文件:
1.seqinfo.ini
在每个子文件夹中都有这个,主要用于说明这个文件的一些信息,比如名称、帧率、长度、图片的长和宽,图片的后缀名。
2.det.txt
这个文件中存储了图片的检测框的信息
如:1,1,571.03,402.13,104.56,315.68,0.5028,-1,-1,-1
从左到右依次是
frame:在第几帧图片上检测到
ID:检测框分配的对象id
bbox(4位):框左上角坐标位置和长宽
conf:bbox包含对象的置信度,分数越高置信度越高
MOT3D(x,y,z): 是在 MOT3D 中使用到的内容,这里关心的是 MOT2D,所以都设置为-1
3.gt.txt
大致与det.txt相同,相比而言多了倒数3位;
如:582,10,1066,445,41,124,1,1,0.02381
是否忽略:0与1
classes:目标的类别
目标运动时被其他目标包含、覆盖、边缘裁剪的情况

MOT中的评价指标:
MOT多目标跟踪及Deep Sort学习笔记_第1张图片

2.Sort算法

SORT 官方代码:https://github.com/abewley/sort
SORT算法是Deep SORT 的前身, 全称是 Simple Online and Realtime Tracking。简单介绍一下,SORT最大特点是基于 Faster R-CNN 的目标检测方法,并利用卡尔曼滤波算法 + 匈牙利算法,极大提高了多目标跟踪的速度。对于现在的多目标跟踪,更多依赖的是其检测性能的好坏。SORT算法尽管只是把普通的算法如卡尔曼滤波(Kalman Filter)和匈牙利算法(Hungarian algorithm)结合到一起,却可以匹配2016年的SOTA算法,且速度可以达到260Hz,比前者快了20倍。
这个算法是在实际应用中使用较为广泛的一个算法,核心是两个算法:卡尔曼滤波和匈牙利算法。
卡尔曼滤波算法分为两个过程,预测和更新。该算法将目标的运动状态定义为 8 个正态分布的向量。卡尔曼滤波可以根据 Tracks 状态预测下一帧的目标框状态。
预测:当目标经过移动,通过上一帧的目标框和速度等参数,预测出当前帧的目标框位置和速度等参数。
更新:预测值和观测值,两个正态分布的状态进行线性加权,得到目前系统预测的状态。
匈牙利算法:解决的是一个分配问题,在 MOT 主要步骤中的计算相似度的,得到了前后两帧的相似度矩阵。匈牙利算法就是通过求解这个相似度矩阵,从而解决前后两帧真正匹配的目标。这部分sklearn 库有对应的函数 linear_assignment 来进行求解。
SORT 算法中是通过前后两帧 IoU (IoU是两个区域重叠的部分除以两个区域的集合部分得出的结果,通过设定的阈值,与这个IoU计算结果比较)来构建相似度矩阵,所以 SORT 计算速度非常快。
以下为SORT解析图,核心为利用匈牙利算法进行目标检测得到的Detections与卡尔曼滤波算法预测更新的轨迹两者的匹配。
MOT多目标跟踪及Deep Sort学习笔记_第2张图片
流程如下:目标检测器(例如: Faster R-CNN、YOLOv3)得到目标框 Detections,同时卡尔曼滤波器预测当前的帧的 Tracks, 然后将Detections 和 Tracks 进行 IOU 匹配,最终得到的结果分为:
• Unmatched Tracks,这部分被认为是失配,Detection 和 Track 无法匹配,如果失配持续次数过多,该目标 ID 将从图片中删除。
• Unmatched Detections,这部分说明没有任意一个Track 能匹配 Detection, 所以要为这个 detection 分配一个新的 track。
• Matched Track,这部分说明得到了匹配。

3.Deep Sort算法

DeepSORT 官方代码:https://github.com/nwojke/deep_sort
SORT是一个非常简单、有效、实用的多目标跟踪算法。在SORT 中,通过 IOU 来进行匹配虽然速度非常快,但是 ID switch 依然非常大。 Deep SORT 算法是在SORT算法的基础上通过集成表观信息(目标对应的特征)来提升 SORT 的表现。通过这个扩展,模型能够更好地处理目标被长时间遮挡的情况,将 ID switch 指标降低了 45%。

1. 状态估计——卡尔曼滤波算法
延续 SORT 算法使用 8 维的状态空间 (, , , ℎ, ̇, ̇, ̇, ℎ)̇, 其中 (u,v) 代表 bbox 的中心点,宽高比r, 高h,以及对应的在图像坐标上的相对速度。使用能够在存在高斯噪声下的kalman滤波器估计目标的运动位置,预测的结果为(u,v,r,h)。
MOT多目标跟踪及Deep Sort学习笔记_第3张图片
每一个轨迹,都计算当前帧距上次匹配成功帧的差值,代码中对应 time_since_update 变量。该变量在卡尔曼滤波器 predict 的时候递增,在轨迹和 detection 关联的时候重置为 0。
超过最大年龄max_age的轨迹被认为离开图片区域,将从轨迹集合中删除,被设置为删除状态。代码中max_age默认值为 70,是级联匹配中的循环次数。
如果 detection 没有和现有 track 匹配上的,那么将对这个 detection 进行初始化,转变为新的 Track。新的 Track 初始化的时候的状态是未确定态,只有满足连续三帧都成功匹配,才能将未确定态转化为确定态。
如果处于未确定态的 Track 没有在 n_init 帧中匹配上 detection,将变为删除态,从轨迹集合中删除。
2. 匹配问题——匈牙利算法
在这里主要是匹配轨迹 Track 和观测结果 Detection
趣写算法之——匈牙利算法
这个算法在这里的求解对象是一个代价矩阵,通过求解平方马氏距离(协方差距离),设定阈值,通过指示器比较,来度量匹配程度。 DeepSORT的优化主要就是基于匈牙利算法里的这个代价矩阵。它在IOU Match之前做了一次额外的级联匹配,利用了外观特征和马氏距离。难理解
3. 级联匹配
级联匹配是 Deep SORT 区别于 SORT 的一个核心算法,致力于解决目标被长时间遮挡的情况。为了让当前 Detection 匹配上当前时刻较近的 Track,匹配的时候 Detection 优先匹配消失时间较短的Track。
当目标被长时间遮挡,之后卡尔曼滤波预测结果将增加非常大的不确定性 (因为在被遮挡这段时间没有观测对象来调整,所以不确定性会增加),状态空间内的可观察性就会大大降低。在两个 Track 竞争同一个 Detection 的时候,消失时间更长的 Track 往往匹配得到的马氏距离更小,使得 Detection 更可能和遮挡时间较长的 Track 相关联,这种情况会破坏一个 Track 的持续性,这也就是 SORT 中 ID Switch 太高的原因之一。
MOT多目标跟踪及Deep Sort学习笔记_第4张图片

4. 表观特征
表观特征这部分借用了行人重识别领域的网络模型,其功能是提取出具有区分度的特征。
ReID 特征提取部分。ReID 网络是独立于目标检测和跟踪器的模块,功能是提取对应 bounding box中的 feature, 得到一个固定维度的 embedding 作为该 bbox 的代表,供计算相似度时使用。

Deep_Sort流程图

Deep SORT算法在SORT算法的基础上增加了级联匹配(Matching Cascade)+新轨迹的确认(confirmed)。总体流程就是:

  • 卡尔曼滤波器预测轨迹Tracks;
  • 使用匈牙利算法将预测得到的轨迹Tracks和当前帧中的detections进行匹配(级联匹配和IOU匹配);
  • 卡尔曼滤波更新状态转换。

4.Deep Sort官方代码学习

MOT多目标跟踪及Deep Sort学习笔记_第5张图片

  • detection.py
    用于保存通过目标检测器得到的一个检测框,包含左上角坐标 + 框的宽和高,以及该bbox 的置信度还有通过 reid (ReID 模块,用于提取表观特征,论文中是生成了 128 维的 embedding)获取得到的对应的 embedding。除此以外提供了不同 bbox 位置格式的转换方法:
    • tlwh: 代表左上角坐标 + 宽高
    • tlbr: 代表左上角坐标 + 右下角坐标
    • xyah: 代表中心坐标 + 宽高比 + 高
  • iou_matching.py
    通过计算每帧图像在并集上的交集和并集距离度量的交点进行IoU匹配
  • kalman_filter.py
    卡尔曼滤波算法
  • linear_assignment.py
    匈牙利算法求解相似度矩阵
  • nn_matching.py
    计算点a和点b之间成对的平方距离。
    计算a点和b点之间的成对余弦距离。
    最近邻距离度量(欧几里德)的辅助函数。
    最近邻距离度量(余弦)的辅助函数。
    最近邻距离度量,对每个目标返回的到目前为止所观察到的离任何样品最近的距离。
    用新数据更新距离度量。
    计算特征与目标之间的距离。
  • track.py
    Track 类主要存储的是轨迹信息,meancovariance 是保存的框的位置和速度信息,track_id 代表分配给这个轨迹的 ID。state 代表框的状态,有三种,详见deep_sort状态转换
    Tentative: 不确定态,这种状态会在初始化一个 Track 的时候分配,并且只有在连续匹配上n_init 帧(默认为3)才会转变为确定态。如果在处于不确定态的情况下没有匹配上任何 detection,那将转变为删除态。
    Confirmed: 确定态,代表该 Track 确实处于匹配状态。如果当前 Track 属于确定态,但是失配连续达到 max age 次数的时候,就会被转变为删除态。
    Deleted: 删除态,说明该 Track 已经失效。
    max_age 代表一个 Track 存活期限(默认 70),他需要和 time_since_update 变量进行比对。time_since_update是每次轨迹调用 update 函数的时候就会 +1,每次调用 predict 的时候就会重置为 0,也就是说如果一个轨迹长时间没有 update(没有匹配上) 的时候,就会不断增加,直到time_since_update 超过 max_age,将这个 Track 从 Tracker 中的列表删除。
    hits 代表连续确认多少次,用在从不确定态转为确定态的时候。每次 Track 进行 update 的时候,hits就会 +1, 如果 hits>n_init(默认为 3),也就是连续三帧的该轨迹都得到了匹配,这时候才将不确定态转为确定态。
    features 列表,存储该轨迹在不同帧对应位置通过ReID 提取到的特征。
  • tracker.py
    Tracker 类是最核心的类,Tracker 中保存了所有的轨迹信息,负责初始化第一帧的轨迹、卡尔曼滤波的预测和更新、负责级联匹配、IOU 匹配等等核心工作。

由于DeepSort关于SORT加入了一个CNN网络来提取feature(ReID 特征提取部分),导致算法运行速度减慢,消耗资源增多。建议大家不是跟踪人,而是跟踪小目标时可以使用SORT模型。

参考:
https://blog.csdn.net/qidailiming1994/article/details/108182932
https://zhuanlan.zhihu.com/p/108962781
https://zhuanlan.zhihu.com/p/133678626

你可能感兴趣的:(笔记,算法,神经网络)