本文为稀土掘金技术社区首发签约文章,30天内禁止转载,30天后未获授权禁止转载,侵权必究!
beginning
今儿给小伙伴带来一项在计算机视觉中相对较新的技术——目标追踪。说起目标追踪,大家应该都不陌生叭,它可用于跟踪监控摄像头中的人、车辆、行李或其他物体,这在大型商场、机场、银行、交通枢纽和街头巷尾的cctv摄像头中广泛使用。那大家有没有想过它背后蕴藏的原理腻?别急,下面就给盆友们用大白话详细讲讲目标追踪中的经典算法——DeepSort。废话不多说啦,如果你也对目标追踪感兴趣,想一睹它的风采,让我们一起愉快的学习叭🎈🎈🎈
1.目标追踪简介
- DeepSort论文:arxiv.org/pdf/1703.07…
- DeepSort官方代码:github.com/nwojke/deep…
目标追踪(Object Tracking)是计算机视觉领域的一个重要任务,它的目标是在视频序列中识别和跟踪特定目标物体的位置,以了解目标物体的运动轨迹和变化。它的基本原理是通过在连续帧之间寻找目标的位置,并利用目标的外观、运动等信息来跟踪目标。通常包括以下步骤🌻🌻🌻:
- 目标检测color{blue}{目标检测}:在每一帧中使用目标检测算法来定位目标的位置;
- 特征表示color{blue}{特征表示}:提取目标的视觉特征描述,如颜色、纹理、形状等;
- 目标匹配color{blue}{目标匹配}:使用匹配算法将当前帧的目标与前一帧或多帧中的目标进行关联匹配;
- 位置更新color{blue}{位置更新}:根据匹配结果,更新目标的位置信息;
- 运动估计color{blue}{运动估计}:根据目标的位置变化来估计目标的运动状态。
其实也很好理解目标追踪——想象一下,你是一名特工,接到了一个任务:在拥挤的街道上追踪一个间谍。你开始观察周围的人群,试图找到与描述中相符的目标。这就好像是在图像或视频中进行目标追踪🧸🧸🧸
1)首先,你要仔细观察那些可能是目标的人。你会留意他们的外貌特征、衣着、行为举止等,以便与目标进行对比。对于计算机来说,它会使用图像处理与模式识别的技术,提取目标的特征,并构建目标的模型;
2)在你的眼中,你注意到一个人穿着与描述相似的红色外套,这就像计算机通过对比图像中的特征,找到与目标相匹配的候选区域;
3)然后,你必须保持目标的视线,确保不会失去目标。这就好像在视频中进行实时目标追踪,你需要追踪目标的位置和运动。对于计算机来说,它需要不断地更新目标的位置,以确保目标仍然在视野中;
4)随着街道人群的变化和目标可能的突然移动,追踪目标变得有些困难。就像是在处理实际场景中的噪声、遮挡和目标突然消失的情况下,计算机需要应对各种情况,保持目标的可靠追踪;
5)当你成功地追踪住目标并将其引导至安全地点时,就完成了目标追踪任务!计算机在目标追踪中的工作也是如此,通过准确的算法和技术,它可以实现对目标的高效追踪。
目标追踪常见算法有基于滤波的方法(卡尔曼滤波、粒子滤波器)、基于相关性的方法(CAMShift、均值漂移)、基于特征匹配的方法(特征点跟踪、光流法)和基于深度学习的方法(单目标追踪和多目标追踪)。咱们主要介绍多目标追踪算法中最最经典的DeepSort算法⛳⛳⛳
2.Sort算法讲解
DeepSORT(Deep Learning + SORT)是一种基于深度学习和轨迹排序的多目标追踪算法。它在SORT(Simple Online and Realtime Tracking)算法的基础上引入了卷积神经网络(CNN)来提取目标特征并实现更精确的目标关联。
所以DeepSort的前身是Sort算法,而Sort的核心是基于卡尔曼滤波和匈牙利算法,通过预测和关联匹配来跟踪目标。
那什么是卡尔曼滤波腻?它的作用是什么腻?🧐🧐🧐这里在不涉及数学公式的基础上简单说一下:咱们在目标追踪的第一步使用目标检测算法来定位目标的位置,得到了检测的框框,下一步就使用卡尔曼滤波利用当前的目标状态估计(位置、速度等),结合系统动态模型,预测目标下一个时刻的状态,并同时给出状态的不确定性;当有新的观测数据(比如目标在图像中的位置)到达时,利用预测的状态和观测模型,通过计算卡尔曼增益,将观测数据融合进状态估计中,得到更准确的状态估计,并更新状态的不确定性;通过不断地进行预测和观测更新,实现对目标状态的连续跟踪。通俗讲,就是根据目前的定位框来预测下一个定位框的位置。
而匈牙利算法呢用于将当前帧中检测到的目标与上一帧或者目标数据库中的已知目标进行关联。通俗讲,匈牙利算法是进行分配的。比如说一个视频里有18个检测框,我们要对它进行预测,下一帧的时候可能又会有12个预测框,这时候就需要用到匈牙利算法对18个检测框和12个预测框进行匹配,让卡尔曼预测的框找到和自己最匹配的检测框,达到追踪的效果🌈🌈🌈
下面是Sort算法的工作流程。
首先,Detections检测到的框会变为轨迹Tracks,使用卡尔曼滤波对其进行预测,看看下一步框会出现在哪里。这时候又来了第二帧并检测到了一些物体,将第二帧与预测框进行IOU计算,并使用匈牙利算法进行匹配。匹配之后会出现三个结果:若预测的框没有和检测到的框匹配到,就对其删除;若检测框和我们预测的框没有匹配到,就对其分配一个新的轨迹(其实经常出现这种情况,前一帧的物体检测到了,后一帧又出现了新的检测到的物体,那我们就得使用卡尔曼滤波对它进行一个新的预测);若预测的框和检测框匹配上了,就使用卡尔曼滤波对它进行一个新的更新。通过这样不断的反复更迭,完成追踪🍭🍭🍭
其实我们在做实验的时候会发现,Sort算法在没有遮挡的情况下,追踪是有效果的,但是一旦目标出现遮挡,就会丢失自己的ID,追踪效果就会大打折扣。于是后面的DeepSort算法应运而生。
3.DeepSort算法讲解
DeepSort算法的主要贡献是引入了在行人重识别数据集上离线训练的深度学习模型,并在实时目标追踪过程中,提取的目标特征进行最近邻匹配。换句话说,就是把大量的计算复杂度放在离线的预训练阶段,然后在大规模的行人重识别数据集上学习深度学习模型;在应用的时候呢,使用外观特征来进行最近邻查询。这里的外观特征会保留一定的时间,即使目标丢失了,它也能保存下来,使得ID切换变少,这不就解决了Sort算法存在的问题了嘛✌✌✌
DeepSort的外观特征是靠CNN提取的,网络结构如下所示。它的CNN是受到ResNet启发的,结构非常的简洁,是由卷积、最大池化、残差网络构成,最后输出一个128维的向量来表示它的特征🌞🌞🌞
DeepSort算法还在Sort算法的基础上加入了一个级联匹配(Matching Cascade)和新轨迹确认(confirmed)。新轨迹确认是什么意思腻🧐🧐🧐?我们把轨迹分为两种状态——确认态和不确认态。不确认态的轨迹是可以转化成确认态的,转化方式就是和detections检测框连续匹配3次(默认是3),就能转化成确认态。当然,确认态的轨迹也可能转化成不确认态——和detections检测框连续失配30次(默认30次),转化成不确认态之后就会被删除🎶🎶🎶
下图是DeepSort算法的工作流程。
这样一眼看上去可能会感觉DeepSort算法比Sort算法复杂很多,其实只要把Sort算法弄明白之后,DeepSort算法也是很容易搞定滴🌈🌈🌈
- 根据第一帧detections的检测结果创建相应的Tracks,并对卡尔曼滤波的运动变量进行初始化,通过卡尔曼滤波预测相应的框框。此时,由于是第一帧,所以所有的Tracks都处于unconfirmed状态。
- 逐一比较该帧目标检测的框框和上一帧通过Tracks预测的框框,计算它们之间的IOU匹配度,并根据匹配度(1-IOU)计算代价矩阵。
- 将(2)中得到的所有代价矩阵作为匈牙利算法的输入,得出线性匹配的结果。根据匹配情况,可能有三种结果:第一种是Tracks失配(Unmatched Tracks),直接删除这些失配的Tracks(如果Tracks是确认态,则需要连续达到一定次数(默认30次)才能删除);第二种是Detections失配(Unmatched Detections),将这些失配的Detections初始化为新的Tracks;第三种是检测框和预测的框框成功配对,表示前一帧和后一帧的追踪成功,通过卡尔曼滤波更新相应的Tracks变量。
- 循环执行(2)-(3)步骤,直到出现确认态(confirmed)的Tracks或者视频帧结束。
- 利用卡尔曼滤波预测确认态(confirmed)的Tracks和不确定态的Tracks对应的框框。将确认态的Tracks的框框与Detections进行级联匹配(之前每次只要Tracks匹配上都会保存Detections的外观特征和运动信息,默认保存前100帧),利用外观特征和运动信息与Detections进行级联匹配,这样做是因为确认态(confirmed)的Tracks和Detections的匹配可能性更大。
- 级联匹配后有三种可能的结果:第一种是Tracks匹配,通过卡尔曼滤波更新相应的Tracks变量;第二种和第三种是Detections和Tracks失配,将之前的不确定态的Tracks和失配的Tracks与Unmatched Detections逐一进行IOU匹配,再根据匹配度计算代价矩阵。
- 将(6)中得到的所有代价矩阵作为匈牙利算法的输入,得到线性匹配的结果,此时又有三种情况:第一种是Tracks失配(Unmatched Tracks),直接删除这些失配的Tracks(如果Tracks是确认态,则需要连续达到一定次数(默认30次)才能删除);第二种是Detections失配(Unmatched Detections),将这些失配的Detections初始化为新的Tracks;第三种是检测框和预测的框框成功配对,表示前一帧和后一帧的追踪成功,通过卡尔曼滤波更新相应的Tracks变量。
- 循环执行(5)-(7)步骤,直到视频帧结束。
4.参考资料
ending
看到这里相信盆友们都对多目标追踪算法DeepSort有了一个全面深入的了解啦!原理明白了之后,下一期将开启DeepSort的代码篇,并手把手教你训练自己的特征提取网络用于目标追踪。请多多关注我叭🌴🌴🌴很开心能把学到的知识以文章的形式分享给大家。如果你也觉得我的分享对你有所帮助,please一键三连嗷!!!下期见