点击下方卡片,关注「集智书童」公众号
作者丨matrix明仔@知乎 来源丨https://zhuanlan.zhihu.com/p/560173716 编辑丨小书童
什么是MOT(Mutil-Object-Tracking)
MOT英文全称叫Mutil-Object-Tracking,中文叫多目标跟踪,从字面意思来讲就是对多个目标对象进行跟踪。具体来说就是在一段视频当中我们要得到我们比较感兴趣的物体的运动轨迹。这里的运动轨迹包括检测框以及检测对象的类别还有检测对象的编号(ID))
类别:在行人的跟踪识别情况下只有一个类别就是行人,在一些多类别的场景中就会有行人、车辆
ID:基本是固定的,在场景中一般是不会变化的,如果发生了变化就证明出现了错误。
多目标跟踪任务里面大家用的比较多、比较实用的范式,是Tracking-by-detection(先检测后跟踪),这种范式分为两步,第一步是先用目标检测算法得到目标的检测框,第二步,使用Data association的方法将不同帧之间的监控框进行连接,得到ID。
Data association
先对视频内的第一帧进行检测,对不同的检测框赋上不同的id,图中不同颜色的框就代表了不同的id。从第二帧开始继续检测目标,但是检测过程是不赋上id的,我们通过data association的方式,将当前帧(第二帧)与前一帧有id标注的跟踪框(跟踪片段、跟踪轨迹)两两计算相似度,相似度高的进行连接,证明id是一致的,得到当前帧检测框的id,这一步就是Data association。
Data association是多目标跟踪任务的核心,也是和其他任务不一样的地方,也是这一任务的一大特色。
Similarity相似度的计算
当前帧的检测框和现在的跟踪轨迹的相似度
在相似度的计算中一般是包含着3类
运动相似度:代表方法是卡尔曼滤波
位置相似度:代表方法是计算框与框之间的IoU
外观相似度:代表方法是用ReID模型提取每个人的ReID特征计算特征之间的距离作为相似度。
大体的工作的过程
如上图所示,主要是红色实线框是上一帧的位置,虚线框是通过卡尔曼滤波预测的下一帧的框所在的位置。之后通过计算下一帧实际的框的位置与卡尔曼滤波预测的下一帧的预测框的位置的IoU,作为一个运动相似度和位置相似度。通过计算前后两帧ReID提取出来的特征的余弦相似度来评估外观相似度。在得到了相似度之后,需要进行一个Assignment的工作,其实本质上一个分配的工作,把跟踪片段和当前帧的检测框进行连接,把前一帧的信息移植到当前帧来。常用的Assignment算法有匈牙利算法,会根据跟踪片段和第二帧检测框整体相似度最高的方法完成连接。上图左下角也给出了一个例子,Tracklets会根据相似度最高原则和Detections进行配对。
这里有个小彩蛋:(当我们发现在上一帧出现的紫色框没有在当前帧出现,那么算法就会判断紫色目标已经消失,就会去掉这个框)
FairMOT方案(IJCV2021)
代码链接:FairMOT
文章链接:FairMOT: On the Fairness of Detection and Re-Identification in Multiple Object Tracking
工作的动机
从网络模型来分可以分为两种
2 step:通过目标检测模型把每个识别的对象给框起来,再把框住的目标从原图扣出来放到一个embeding model/ReID模型,把识别目标的ReID特征提取出来,因为用到了两个模型,所以也被称为是一个2 step的模型。
1 shot:通过一个1 shot模型提取检测框和ReID特征
目标检测和行人重识别都是目标跟踪的一个很重要的任务,1shot的方法会通常会比2 step快,因为在Backbone的过程中就可以共享大量的特征,来完成任务。但是在1 shot有个比较大的问题,就是ReID分支常常受制于检测分支,与其他方法相比较之下会更加的难学习到特征。所以需要重新审视检测分支和ReID分支的关系,并且公平的对待他们。主要是希望能够是ReID和检测都能学得比较好,取得一个不错的效果。
以往方法的不足
基于Anchors的方法会带来不公平性
1、ReID任务会被忽视掉,比如在FasterRCNN中是先通过RPN进行检测任务后再处理ReID的任务,这是明显是更偏向于检测的。
2、基于Anchors的方法中,通常识别的过程一个Anchors会包含多个物体,这无疑是会对ReID任务带来损害的。
3、同一个物体会有多个Anchors对应,导致对外观特征的学习比较困难。
比如上图,两个人距离很近的时候,Anchors很难去把人区分出来,也有可能是一个人有很多个Anchors与之对应。新的方法是只取每个人的中心点的特征,即使两个人的距离很近,也是可以把它们分开出来。
Features层面的不公平性
目标检测的工作往往需要利用到深层的特征,而ReID任务需要用到的是浅层的特征。一般而言目标检测会更关注目标之间的共性,寻找人的共同点。而ReID的任务是区分不同的人之间的区别。如果只用一个网络解决的话,就会带来一定的特征冲突。从实验角度出发,多层特征融合是可以缓解特征冲突的,可以让两个任务从各自需要的角度取他们需要的features信息。
高维的ReID的特征会损伤目标检测任务精度的,而MOT这个任务也不需要用到高维的ReID的特征。与正常的Tracking的任务相比,MOT是不需要高维的特征信息的,因为MOT的任务比Track任务更加简单,因为在不同帧中物体有一一对应的关系,低维的ReID可以提高推理的速度。
网络结构
整体网络结构如图所示
输入图像经过一个encoder-decoder之后得到了一个高分辨率的特征,size是原图的1/4。接下来接两个平行的分支,分别是检测分支和ReID分支。检测分支包含了两个小分支,一个是heatmap学习目标中心点,box size学习宽高,center offset主要学习四倍下采样之后,像素点的偏移。ReID分支主要工是把特征图中通过每个物体的中心点的定位,把特征图中的特征抽取出来作为物体的ReID特征。
相似度
先使用运动相似度:通过卡尔曼滤波得到预测框后计算预测框和检测框的马氏距离
外观相似度:计算ReID的特征之间的余弦距离
之后对运动相似度和外观相似度进行加权求和,公式如下
α x Motion + (1-α)x Appearance
在得到了相似度之后,进行匈牙利算法进行匹配。对于没有匹配上的对象进行Location相似度的计算,没有匹配上的原因是因为ReID信息因为场景遮挡的问题而变得不可靠了。第二次匹配我们会计算IoU,把遮挡的物体算回来。
实验效果对比
MOTA指标:多目标跟踪精度,通过FP、FN以及IDs得到的。
IDF1偏向于跟踪性能,主要计算一条轨迹上ID正确的F1的值
TPR:评价ReID的性能
Anchors vs points
多层特征融合,有多层特征融合比没有加特征融合好
多任务学习,多任务loss
GradNorm的方式会导致计算成本的升,是的训练时间边长,所以综合考虑会选择Uncentainty-task的方法去做
不同维度ReID特征对方法的影响,可以看到512特征对目标检测更加友善,使用64维度会使得FPS更快。
相似激活图,通过不同的Backbone的方法进行比较
在拥挤的环境下基于Center的方法效果更加优秀。
SOTA结果展示
ByteTrack方案(ECCV2022)
代码链接:ByteTrack
MMTracking上的代码链接:mmtracking/bytetrack
文章链接:ByteTrack: Multi-Object Tracking By Associating Every Detection Box.
在图中可以看到没有被遮挡的得分会高一些,被遮挡的对象就会低一些。
惊艳的结果
研究动机
我们发现几乎所有的以前几乎所有做法都是会滤除background,所以在检测的时候,我们就会保留大于一定阈值的检测框。如果是阈值为0.5,那么低于0.5的就会被丢弃。但是在这些被丢弃的框中,往往会包含着一些正确的特征信息,比如被遮挡的行人,如下图的11帧和21帧,0.4和0.1,这些情况都是由于遮挡导致的分数比较低。此时因为遮挡没有能有效识别出来的对象,后续如果没有被遮挡被识别出来,那么就会赋上新的ID,这会导致轨迹的中断或者ID的跳变。
a图是检测框完整展示的方法,b图是在经过了阈值之后保留下来的方法,可以看到经过阈值之后,基本都出现了漏跟踪。
方法贡献
1、通过跟踪片段和检测框之间的相似度,从低分检测框中把一些遮挡的物体找出来,并把背景有效的过滤掉。
2、通过在不同的Tracker上进行数据关联,在MOTA和IDF1上实现了1~10个点的提升。
3、设计了个简单且强大的框架,取得了非常不错的效果
模型的介绍
使用YOLOX作为检测器(Anchors free)值得注意的是,当框整体暴露在图像外面的时候,需要我们将框中心点移动回图像内。
相似度
与以往方法一致,通过卡尔曼滤波计算运动相似度
与此同时也支持多种相似度的计算,比如在BDD100k中使用了外观相似度
在BDD100k中由于视频的然后帧率比较低,单靠卡尔曼滤波没有办法做好,所以需要结合外观相似度辅助进行。
伪代码
先用检测器得到当前帧中所有的检测结果,根据阈值分为高分部分和低分部分,把所有检测结果进行保留。将跟踪片段和高分检测框计算相似度,根据相似度做一次匹配,第一次没有匹配上的片段保留下来,进行第二次的匹配,第二次匹配于低分的检测进行匹配,最后得到一个匹配的结果。如果跟踪轨迹在30帧里面都没有匹配到检测框将其删除,如果只是下一帧没有出现会将其保留,一共保留30帧。
为什么Work
在跟踪中,大部分的数据集中行人遮挡和交错的场景是比较多的。在第一次匹配的过程中,红框是没有匹配上的。但是在第二次匹配的时候就匹配上了。如果两轮都没有匹配上,就会被当成背景过滤掉。在右上角的图上,可以看到得分和遮挡之间的一个关系,当出现0.4或者0.2的得分时,如果卡0.5的阈值就基本时没有办法被检测到了,就大概率会出现ID的跳变。如果使用ByteTrack的方法就可以跟踪回来。但是这个方法也有一个局限性,当得分在一开始就很低的情况下是没有办法跟踪回来的。如果是一个先很高再很低的情况时可以有办法跟踪回来的,当一个人被遮挡之后再出现,这种情况下,也可以很好的跟踪到目标。
实验结果
如何选择相似度
IoU相似度+ReID相似度
在表可以发现,在第二次匹配的时候ReID的性能是远不如IoU的,因为低分的框是被遮挡的,这种情况下的ReID的特征是太可靠的。但是IoU是可靠的,因为当前的检测器都比较强,所有框当中的信息是值得被信任的。根据实验,在MOT17上两次用的IoU,在BBD100k上第一次用到ReID第二次用的IoU。第二张图是对于是否使用ReID进行了实验,发现BYIE相比于其他方法都有提升。
BYTE到底能找回多少FP多少TP呢?可以看到在图中TP找回来要比FP多的,因此可以判断在每个视频上都有涨点。
BYTE的应用
BYTE在9种不同的跟踪器上的使用,可以发现,MOTA还有IDF1都有明显的提升
可视化结果:
我们可以发现中间帧,大部分都是得分比检测得分较低的情况(遮挡、运动模糊、目标小),一般方法没有办法很好的做到中间帧的有效跟踪,但是BYTE方法可以比较好的跟踪到。这样的好处是可以利用中间帧的变化,让前后的轨迹变化更加的顺畅,降低了出现跟踪跳变的风险,保持轨迹的连贯性。
几个数据集的结果(自动驾驶、行人场景)
部署的Demo(200 fps可以说是相当的顺滑)
不同场景下的不同方法
固定相机场景
相对而言比较简单,一个IoU或者一个卡尔曼滤波就足够了
运动相机场景
受到相机运动的影响,只使用卡尔曼滤波是不足够的,一般来说会使用卡尔曼滤波+相机补偿(主要问题还是相机是怎么运动的,举个简单的例子,类似于相机的移动的x和y的信息变化)
补充信息的方法
ECC:基于local feature的方法,对变换矩阵的求解
ORB:提取关键点,根据前后两帧的关键点计算相机的偏移量
Super point:深度学习方法
最后把得到的相机的运动信息加到卡尔曼滤波当中来。
ReID的方法
FairMOT:利用其中的ReID的特征提取器完成外观提取的工作
UniTrack 利用imagenet上的预训练分类模型,结合ROI-的方法扣下来,直接得到外观特征,不用训练,还能有效的支持不同类别,非常方便!
低帧率
卡尔曼滤波在低帧率的场景下也是不适用的,可以选择一些可以学习的方法进行训练。
外观信息相似+剧烈运动
DanceTrack数据集(CVPR2022)
卡尔曼滤波+ReID效果很差
推荐一些方法深度学习和非线性的方法
Transformer的方法:MOTR(ECCV2022)
非线性运动模型:OC-SORT,更看重检测结果而不是线性卡尔曼进行预测
探索RGB-Thermal视角下的MOT
其实BYTE在工作中花了比较多精力去解决遮挡、模糊带来对整体跟踪效果带来的问题,在各种数据任务下总体效果也都非常的不错。BYTE其实主要的想法是希望重新利用被判低分的特征信息,进而优化了对于遮挡目标的检测。BYTE其实依旧会比较依赖于检测模型返回的效果,但是如果连检测模型都没有办法合理的获得信息,一开始这种得分就超级低的情况,我们是没有办法解决的。可能我们就要从数据本身出发,打破RGB的数据壁垒,通过Thermal的信息补充,来获取被遮挡的目标信息。所以就有了探索RGB-Thermal视角下的MOT这一个课题了。
RGB-T-MOT还有比较长的路要走
但是比较遗憾的是通常这种任务的文章解决的重点其实大部分都在讲述RGB和Thermal的信息要如何完成融合交互进行信息补充,对于如何更好的完成MOT,做到提速、提升质量都是花的笔墨不多。因为得益于Thermal模态的优势,对于夜晚环境、遮挡环境、甚至是运动模糊都不再是一个烦恼,其实更多的烦恼在于不知道RGB和Thermal模型应该再哪个channel进行交互会比较适合。也不知道RGB和Thermal怎么进行怎么互补会比较有效。我觉得在有效的解决这一系列问题之后,Tacking系列任务会有一个很大的突破。
扫码加入👉「集智书童」交流群
(备注: 方向+学校/公司+昵称 )
想要了解更多:
前沿AI视觉感知全栈知识👉「分类、检测、分割、关键点、车道线检测、3D视觉(分割、检测)、多模态、目标跟踪、NerF」
行业技术方案 👉「AI安防、AI医疗、AI自动驾驶」
AI模型部署落地实战 👉「CUDA、TensorRT、NCNN、OpenVINO、MNN、ONNXRuntime以及地平线框架」
欢迎扫描上方二维码,加入「 集智书童-知识星球 」,日常分享论文、学习笔记、问题解决方案、部署方案以及全栈式答疑,期待交流!
免责声明
凡本公众号注明“来源:XXX(非集智书童)”的作品,均转载自其它媒体,版权归原作者所有,如有侵权请联系我们删除,谢谢。
点击下方“ 阅读原文 ”,
了解更多AI学习路上的 「武功秘籍」
