今天的主要目的还是快速上手目标跟踪,先前的话我是简单说了一下卡尔曼滤波,然后由于博客的问题,没有说完。本来是想做一个系列的,但是很难整理,而且说实话有些东西我也没搞清楚。当然这并不影响我们使用,抽象一下继续happy,就像你不懂SpringBoot 或者Django底层一样,还是阔以做出一个网站的。
首先我们这边的话其实整个项目呢,是两个部分,一个是目标的追踪部分,还有一个是目标的识别检测部分。我们要先检测出来一个物品,我们才能去跟踪,同时这个算法也是基于目标检测算法来的。
他们之间的关系就是这样的:
可以参考这几篇博文:
GitHub 水项目之 快速上手 YOLOV5
YOLOV5 参数设定与模型训练的坑点一二三
YOLOV1论文小整理
以及这篇博文:
手把手教你如何自制目标检测框架(从理论到实现)
所以我们这边主要就是咱们deepsort的一个情况。
说到这个玩意就还得得先说说sort算法。
前面在说到目表跟踪的时候,我们说到了卡尔曼滤波
但是这个只是解决了一个问题,就是我们预测改物体下一个框可能存在的位置,之后我们计算一些IOU确定一下这个下一个框确定是我们的目标物体的,从而确定他的轨迹完成目标跟踪。
但是我们先前假设的是单目标的一个情况,如果是多目标的话,还涉及到如何去分配一个跟踪的目标的问题。也就是给目标不同的标号,然后识别预测到他的轨迹之后,确定这个轨迹是哪个目标的。
所以这个sort算法其实有两个部分,也就是为了完成我们的一个目标跟踪。
一个是匈牙利算法,目的是为了确定谁是谁,一个是卡尔曼为了预测出物体的一个状态进行跟踪。
deepsort 是在sort算法基础上做了很多别的工作。
由于sort算法还是比较粗糙的追踪算法,当物体发生遮挡的时候,特别容易丢失自己的ID。而Deepsort算法在sort算法的基础上增加了级联匹配(MatchingCascade)和新轨迹的确认(confirmed)。Tracks分为确认态(confirmed),和不确认态(unconfirmed),新产生的Tracks是不确认态的:不确认态的Tracks必须要和Detections连续匹配一定的次数(默认是3)才可以转化成确认态。确认态的Tracks必须和Detectionsi连续失配一定次数(默认30次),才会被删除。
我们今天这里的话,还是先简单的去做一个介绍,之后的话咱们到像以前yolo一样如何训练自己的模型,然后完成自己的一个需求。
我们重点先看到这个deep_sort
这里我先对这些参数进行一个说明。
(1)里面有特征提取权重的目录路径;
(2)最大余弦距离,用于级联匹配,如果大于该阈值,则忽略。
(3)检测结果置信度阈值
(4)非极大抑制阈值,设置为1代表不进行抑制
(5)最大IOU阈值
(6)最大寿命,也就是经过MAX_AGE帧没有追踪到该物体,就将该轨迹变为删除态。
(7)最高击中次数,如果击中该次数,就由不确定态转为确定态。
(8)最大保存特征帧数,如果超过该帧数,将进行滚动保存。
那么之后的话我们打开deepsort文件夹,可以看到这些玩意:
ckpt.t7:这是一个特征提取网络的权重文件,特征提取网络训练好了以后会生成这个权重文件,方便在目标追踪的时候提取目标框中的特征,在目标追踪的时候避免ID交换。
evaluate.py:计算特征提取模型精确度。
feature_extractor.py:提取对应boundingbox中的特征, 得到一个固定维度的特征,作为该bounding box的代表,供计算相似度时使用。
model.py:特征提取网络模型,该模型用来提取训练特征提取网络权重。 train.py:训练特征提取网络的python文件
test.py:测试训练好的特征提取网络的性能
那么此外sort算法对应的是这个玩意
detection.py:保存通过目标检测的一个检测框框,以及该框的置信度和获取的特征;同时还提供了框框的各种格式的转化方法。
iou_matching.py:计算两个框框之间的IOU。
kalman_filter.py:卡尔曼滤波器的相关代码,主要是利用卡尔曼滤波来预测检测框的轨迹信息。
linear_assignment.py:利用匈牙利算法匹配预测的轨迹框和检测框最佳匹配效果。
nn_matching.py:通过计算欧氏距离、余弦距离等距离来计算最近领距离。
preprocessing.py:非极大抑制代码,利用非极大抑制算法将最优的检测框输出。
track.py:主要储存的是轨迹信息,其中包括轨迹框的位置和速度信息,轨迹框的ID和状态,其中状态包括三种,一种是确定态、不确定态、删除态三种状态。
tracker.py:保存了所有的轨迹信息,负责初始化第一帧,卡尔曼滤波的预测和更新,负责级联匹配,IOU匹配。
deep_sort/deep_sort/deep_sort.py:deepsort的整体封装,实现一个deepsort追踪的一个整体效果。
deep_sort/utils:这里最主要有一些各种各样的工具python代码,例如画框工具,日志保存工具等等。
fuck.py:针对读取的视频进行目标追踪
objdetector.py:封装的一个目标检测器,对视频中的物体进行检测
objtracker.py:封装了一个目标追踪器,对检测的物体进行追踪
最后来看看效果演示