基于python 的YOLOv5+DeepSORT 多目标追踪的实现与应用
2022-07-06杜晓啸翁庆龙朱增伟
杜晓啸,翁庆龙,朱增伟,张 坤
(江苏省泰州引江河管理处,江苏 泰州 225300)
多目标跟踪,是计算机视觉领域的热门话题。近年来多目标跟踪得到了相应的发展,以下描述了多目标检测中五个主要步骤:
(1)给定原始视频;
(2)运行目标检测器进行检测,获取目标检测框;
(3)对目标框中的对象进行特征提取;
(4)进行相似度计算,计算前后两帧目标之间的匹配度;
(5)执行数据关联,为每个对象分配ID;
DeepSORT 算 法 的 前 身 是SORT, 在 解 决多目标追踪问题上十分有效。SORT 算法是基于FasterR-CNN 的目标检测方法,并利用匈牙利算法和卡尔曼滤波,提高了多目标跟踪的速度,达到目前该领域算法中最高的准确率。与此同时,该算法基于前后两帧建立相似度矩阵,提升了计算速度。
1 DeepSORT 算法
在详细介绍DeepSORT 算法前, 首先介绍SORT 算法的核心:匈牙利算法和卡尔曼滤波。
1.1 匈牙利算法
匈牙利算法主要为分配问题的解决算法,问题的阐述如下:假设有N 个人和N 个任务,每个任务可以任意分配给不同的人,每个人完成每个任务花费的代价不相同,求分配方式使得总代价最小。该算法基于以下定理:如果代价矩阵的某一行或某一列同时加上或减去某个数,则这个新的代价矩阵的最优分配仍为原代价矩阵的最优分配。
算法流程:
(1)减去每一行列中的最小元素;
(2)以最少的水平或垂直线覆盖所有的0;
(3)若水平线或垂直线的数量为N,那么找到了最优分配,否则继续;
(4)找到矩阵中未被线覆盖的最小元素,对所有未覆盖的行减去该值,所有未覆盖的列加上该值,回第二步。
匈牙利算法在DeepSORT 算法中的作用,主要是将前一帧中的跟踪框与当前帧中的检测框进行关联,通过外观信息和马氏距离,或者IOU 匹配来计算代价矩阵。
1.2 卡尔曼滤波
1.2.1 介绍
卡尔曼滤波主要基于传感器的测量值对预测值进行更新,以获得更为准确的估计值。在目标跟踪时,需要估计跟踪框的两个状态:
(1)位置信息:用均值表示,由对象中心坐标、宽高比、高,以及速度变化值等构成。
(2)不确定性:用协方差表示,为8x8 的对角矩阵,矩阵中的数字越大说明越具有不确定性。
1.2.2 运作流程
卡尔曼滤波主要有两个阶段:
(1)基于前一时刻的状态预测当前时刻的状态以及跟踪框下一时刻的位置。基于以下公式:
x'=F(x):x 为跟踪框在前一时刻的均值,F为状态转移矩阵,该公式的结果x'为预测的当前时刻的值。这里的卡尔曼滤波是一个匀速模型。
P'=FPFT+Q:P 为跟踪对象位置在前一时刻的协方差,Q 是系统的噪声矩阵,衡量系统的可靠程度,初始化为极小值,此公式用来预测当前时刻的协方差矩阵。
(2)根据当前时刻的检测框,更新预测的位置,修正有关跟踪框的当前状态。基于以下公式:
y=z-Hx':z 为检测对象的均值向量,H 为测量矩阵,把跟踪对象的均值向量x'映射到检测空间。用于计算检测框和跟踪框之间的均值误差。
S=HP'HT+R:R 为 噪 声 矩 阵,该 矩 阵 为4x4 的对角矩阵,对角线上的值为中心点两个坐标以及宽高的噪声值。将协方差矩阵映射到检测空间,然后再加上噪声矩阵R。
k=P'HTS-1:得到卡尔曼增益,对误差的重要程度进行估计。
x=x'+ky、P=(I-KH)P':计算更新后的均值向量和协方差矩阵。
1.3 算法工作流程
1.3.1 流程图如下
1.3.2 名词解释
Detections:目标检测器得出的检测对象。
Tracks:跟踪流程中用于流转的跟踪对象,包括:
mean:八个方向和向量值的均值。
max_age:最大寿命,当一个跟踪目标出现超过这个次数,会被删除。
feature:特征向量,每次进行更新时会增加一个元素。
age:从对象第一次出现到当前时刻出现的总帧数。
state:暂定、确认、删除。
Unmatched DetectionsTracks: 未 匹 配 的 检测对象跟踪对象。
Matched Tracks:已经匹配的跟踪对象,包括两种状态,匹配次数三次以下的处于未确认状态,匹配次数超过三次更新已确认状态。
(Un)Confirmed:(未)确认匹配的对象。
1.3.3 整体流程(1)预测状态:上一轮产生的跟踪目标经过卡尔曼滤波的预测,计算出本轮的均值和协方差矩阵,状态保持不变。
(2)第一次匹配:将(1)中跟踪的目标和本轮目标检测器的检测结果一起进行匹配,产生三种状态的结果,分别为未匹配的跟踪对象、未匹配的检测对象以及已匹配的跟踪对象。
(3)第二次匹配:(2)的检测产生遗漏,将它们与(1)中未确认的目标合并,用IOU 匹配再进行一次匹配。产生和上步同样的三种状态的结果。
(4)处理失效对象: 未匹配的目标中未确认的和已确认但总帧数超过阈值的状态设为删除。
(5)输出结果并为下一轮准备数据,合并下面三个来源的对象:
①将(3)和(4)中的已匹配的目标合并,进行卡尔曼滤波的更新,同时将总帧数加1,输出跟踪框;②(3)中的未匹配的检测框新建跟踪框;③(4)中已确认而且未超过阈值的跟踪框。这三种跟踪框作为本轮的输出也迭代进入下一轮输入,继续进行(1)。
1.3.4 重要节点解释
(1)Cascade 匹配:进行循环迭代,直到没有未匹配的检测框;对每个特征向量计算cos 距离;匈牙利算法做匹配,会得到上文提到的三类结果。
(2)IOU 匹配:Cascade 匹配可能发生漏检,可能预测的轨迹存在,但检测器没有检测到对应的目标。对于这种情况,该算法的处理方法是对匹配失败的检测框和跟踪框进行IOU 匹配。若能匹配成功,再次进行更新,然后继续进行新的追踪流程。
(3)KF 更新:将特征向量保存,更新次数+1,并重置更新时间,若更新次数超过三次,将状态置为确认。
2 Yolov5
2.1 介绍
在官方发布的代码中,共有四个检测网络。其中,YOLOv5s 具有最小深度和特征图宽度,其他三种则是在该网络上进行了拓展。实际上,YOLOv4 与v5具有相似的结构,差异主要体现在如下两点。
(1)YOLOv5 新增的Focus 结构主要为对图片的切片。对输入图片,一部分区域,对它的宽和高,每隔两个步长,从0 开始取值;而对别的区域,从1开始取值;以此类推,该图片的三个通道均使用如上的操作。最后把三个通道的切片,按照通道连接。
(2)CSP 结 构 上 的 差 异YOLOv4 中,CSP 的使用只体现在Backbone,而YOLOv5 还在Neck 使用了CSP2_X。YOLOv5 将具有残差结构的CSP1_X应用在Backbone 中,因为该网络较深,让层间反向传播时,梯度值增强,这样防止了网络加深时导致的梯度消失。而在Neck 中,把主干网络的输出分成了两个分支,再通过concat 操作,这样让网络对特征的融合能力得到有效提升,也让更多的特征信息得到保留。
2.2 系列对比
在比较YOLO 算法网络模型中的骨干网络及它们在不同数据集上的检测速度和精度之后可以发现,在使用残差网络后的YOLOv3,精度得到很大提高,之后的版本由于要在速度上进行提升,检测精度难免下降。而实际上,最新的YOLOv5 可以在权衡精度和速度的同时,缩小模型尺寸,使其部署成本更低,让图像检测更加便捷,进一步说明使用该模型进行图像检测的可行性。
3 代码实现
代码来自于github.com/HowieMa/DeepSOR T_YOLOv5_Pytorch
3.1 环境要求
python>=3.8,cuda11.3, 其 他 依 赖 详 见requirements.txt
3.2 文件目录
deep_sort:有关算法的核心代码,deep 文件夹下存放模型训练的代码,sort 文件夹下存放算法相关内容,包括两种算法等内容。yolov5:识别算法以及模型训练的代码。main.py:程序入口。
3.3 代码运行和结果
进入到目录下,先将图像检测和跟踪的模型权重放到对应的文件夹中,然后运行主程序。该程序支持的指令功能包括但不限于:指定视频地址、从摄像头获取视频、设置保存地址、设置视频帧间隔等。
根据训练模型的不同,检测结果有所不同,也会使得算法的跟踪结果不同。文章针对目标视频提取了一定量的帧,利用YOLOv5 进行模型训练,并对视频进行了跟踪,输出结果保存在目录下outputs 文件夹中。
4 小结
上述代码通过结合YOLOv5 和DeepSORT 对目标视频进行对象识别和跟踪,兼顾了两者的优点,提高了识别与跟踪的效率。由于目标检测和跟踪的模型均可以在本地自行训练,可以有针对地对不同类型的视频对象进行训练,使得识别结果更理想。该算法具有其部署的合理性。