项目名称
课题三 国家重点研发计划 连续目标跟踪
时间:2023.7.6——2023.8.17
具体内容
背景
现有的 s o r t sort sort 方法对运动预测都是基于线性运动假设,对非线性运动、遮挡、低帧率视频就没有好的处理效果
研究内容
该项目基于 b o x m o t boxmot boxmot 代码库,采用 y o l o v 8 yolov8 yolov8 目标检测模型, o c s o r t ocsort ocsort 跟踪器方法进行连续目标跟踪任务。
我承担的内容
- 尝试去做 c o s t _ m a t r i x cost\_matrix cost_matrix 数据关联在连续目标跟踪任务中的优化:匈牙利算法在连续目标追踪中起到数据关联的作用。它通过计算目标与检测结果之间的成本或相似性,找到最佳的数据关联方式。可以保证在给定一组检测结果时,找到最大化总体匹配的置信度。
- 尝试去做卡尔曼滤波在连续目标跟踪任务中的优化:
- 轨迹卡尔曼滤波预测
- 使用匈牙利算法将预测后的 t r a c k s tracks tracks和当前帧中的 d e t e c t i o n s detections detections进行级联匹配和 I O U IOU IOU匹配
- 卡尔曼滤波更新
我的工作:卡尔曼滤波优化: 在OCSort方法的基础上,实现了自适应卡尔曼滤波器的应用,通过动态调整噪声参数以适应不同运动特性的目标,从而提高了跟踪算法的适应性和准确性。
期间,我熟悉了匈牙利算法在实践中的应用
- 将成本矩阵作为输入,并进行初始化操作,包括复制成本矩阵、初始化行列未覆盖标记、初始路径和标记等属性。
- 检查成本矩阵,匈牙利算法要求二部图左侧元素数量大于右侧元素数量即成本矩阵的列数要≥行数
- 对于矩阵的每一行,找到最小元素并让该行的每个元素中减去它。
- 找到结果矩阵中的零元素,并判断是否需要进行标记。
- 覆盖包含加星号零的列,判断是否已经完成完整的唯一匹配。
- 在未覆盖的零元素中找到一个并进行准备操作,判断是否需要继续处理。
- 构造交替填色和加星号的零元素序列,并最终取消星号和填色,返回第5步。
- 根据第6步中找到的值,进行行列的加减操作,然后回到第6步进行下一轮处理。
ocsort背景
-
大多数现有的基于运动模型的算法都假设跟踪目标在时间间隔内具有恒定速度,即所谓的线性运动假设。尽管这一假设在很多实际场景中并不成立,但如果时间间隔足够小,目标的运动可以合理地近似为线性。然而,作者指出,当遮挡和非线性运动同时发生时,这些基于运动模型的跟踪方法会产生大量误差。
-
当物体的运动是非线性的(即物体的位置、速度等随时间非线性变化)时,直接使用卡尔曼滤波器可能不准确。
扩展卡尔曼滤波器(EKF)通过一阶泰勒展开来近似非线性运动,而无迹卡尔曼滤波器(UKF)则使用三阶泰勒展开或更高阶的近似。
然而,这两种方法仍然依赖于对高斯分布的近似,并且需要关于运动模式的假设。-
高斯分布近似:
- 卡尔曼滤波器及其扩展版本都是基于高斯分布假设的。它们假设目标的状态(如位置、速度等)及其不确定性可以用高斯分布来表示。这种假设在许多实际情况下是合理的,因为它能够简洁地描述状态的不确定性,并允许通过线性代数操作进行高效的更新。
- 在预测和更新步骤中,卡尔曼滤波器通过计算均值(代表状态估计)和协方差(代表不确定性)来更新高斯分布。这些计算基于线性系统模型(对于卡尔曼滤波器)或非线性系统模型的线性化近似(对于EKF和UKF)。
在EKF和UKF中,这个假设是继承自标准卡尔曼滤波器(Kalman Filter, KF)的。标准KF是基于高斯分布假设的,它假设目标的当前状态(以及未来的预测状态)是服从高斯分布的,并且这个分布可以用一个均值向量和一个协方差矩阵来完全描述。 当面对非线性系统时,EKF和UKF通过不同的方式来处理这种非线性。EKF通过对非线性函数进行线性化近似(通常使用一阶泰勒级数展开)来将非线性系统转化为近似的线性系统,然后应用标准KF的公式。而UKF则使用一组精心选择的样本点(称为sigma点)来捕获非线性函数对状态分布的影响,并通过这些sigma点来近似状态分布的非线性变换。
-
运动模式假设:
- 对于线性系统,卡尔曼滤波器使用线性运动模型,该模型假设状态转移是线性的,并且不受噪声的干扰(除了已知的协方差噪声)。
- 对于非线性系统,EKF和UKF使用非线性运动模型,并通过泰勒级数展开(对于EKF)或无迹变换(对于UKF)来近似这些非线性方程。然而,这些近似方法仍然需要关于运动模式的某些假设,以便能够进行有效的线性化或近似。
-
-
kalman_filter在SORT的局限性:
- 当没有观测数据可用于更新KF参数时,SORT算法会依赖于先前的估计,这在高帧率视频下会导致估计的噪声被放大。
- 当目标在一段时间内未被观测到时,KF的线性运动假设会导致误差迅速累积。
当目标被遮挡时,KF无法获取关于目标位置的新信息,因此只能依赖先前的估计进行预测。这可能导致目标在重新出现时位置估计不准确。同样地,当目标进行非线性运动时,KF的线性运动假设将不再适用,从而导致位置估计的误差。
ocsort工作流程
-
OC-SORT的核心思想:OC-SORT算法的核心是将追踪器设计为以观测为中心,而不是以估计为中心。这意味着算法更依赖于目标检测器提供的观测数据,而不是仅仅依赖于KF的预测状态。
-
Observation-centric Re-Update (ORU):OC-SORT引入了ORU机制,用于在目标轨迹在遮挡后重新激活时,减少在遮挡期间累积的误差。ORU通过在虚拟轨迹上运行预测和重新更新循环来修正KF参数。
-
Observation-Centric Momentum (OCM):OC-SORT还引入了OCM,这是一种新的方法,用于在关联阶段考虑目标的运动方向一致性。OCM利用观测数据而不是KF的状态估计来减少运动方向计算中的噪声。
OCSort(Observation-Centric Sort)的工作流程 主要围绕目标跟踪和状态估计进行。以下是其大致的工作流程:
- 在目标跟踪任务中,跟踪器是负责跟踪和维持目标状态(如位置、速度等)的组件。当目标检测算法(如YOLO、SSD等)在视频帧中识别出目标并生成bounding box时,跟踪器会利用这些bounding box信息以及之前的跟踪状态来更新和维持目标的轨迹。
- 具体来说,OCSort(或其他类似的跟踪算法)中的跟踪器可能会使用卡尔曼滤波器(Kalman Filter)或其他预测算法来预测目标在当前帧中的可能位置。然后,通过数据关联算法(如匈牙利算法)将检测到的bounding box与跟踪器进行匹配,以更新跟踪器的状态。
简而言之,跟踪器类似一个变量记录上一帧的状态(kalman_filter预测得到的)
-
初始化:
- 在视频的第一帧或初始帧中,通过目标检测算法(如YOLO、SSD等)识别出所有目标,并为每个目标创建一个跟踪器。
- 跟踪器初始化时,会记录目标的初始位置、速度等状态信息,并设置跟踪器的状态为“活动”。
-
预测:
- 对于每个活动的跟踪器,使用卡尔曼滤波器(或其他类似的预测算法)预测目标在当前帧中的可能位置。
- 预测基于跟踪器在上一帧中的状态(位置、速度等)和系统的动态模型(如匀速模型、匀加速模型等)。
-
数据关联:
- 在当前帧中,再次运行目标检测算法,识别出所有目标。
- 使用匈牙利算法(或其他关联算法)将检测到的目标与跟踪器进行关联。关联的依据可以是目标之间的相似度(如位置、大小、外观等)。
- 对于成功关联的目标,更新跟踪器的状态信息(如位置、速度等)。
- 对于未能成功关联的目标,将其标记为“丢失”或“潜在目标”,并保留一段时间以便后续可能的重新关联。
-
状态更新:
- 对于成功关联的目标,使用卡尔曼滤波器更新跟踪器的状态信息。这包括使用测量值(即检测到的目标位置)来修正预测值,并更新状态估计的协方差。
- 如果跟踪器长时间未能成功关联到任何目标(即“丢失”状态持续一定时间),则将其标记为“终止”,并从跟踪列表中移除。
-
重更新(可选):
- OCSort还包含一个“重更新”阶段,用于处理长时间未跟踪的目标。当某个跟踪器长时间未关联到任何目标时,它可能会进入“休眠”状态。
- 在某个时刻,如果新的检测与休眠的跟踪器具有足够的相似度,则触发重更新过程。这包括使用历史观测数据来重新初始化跟踪器的状态,并尝试重新建立跟踪。
-
输出:
- 在每一帧中,输出所有活动跟踪器的状态信息(如位置、速度、轨迹等)。这些信息可以用于后续的分析、可视化或决策制定。
指标
- HOTA(Higher Order Tracking Accuracy):研究者采用了HOTA作为主要评估指标。HOTA是一个结合了对象检测准确性和对象关联准确性的高阶指标。这个指标在保持对象检测和对象关联之间的平衡方面做得更好,因此可以更全面地评估多目标跟踪系统的性能。
- AssA(Association Accuracy):除了HOTA之外,研究者还强调了AssA(关联准确性)这一指标来专门评估跟踪系统中对象关联的性能。
- IDF1(Identity F1 Score):IDF1是另一个用于评估对象关联性能的指标。它结合了ID的精确率和召回率,可以给出关联性能的单一分数。
- MOTA(Multiple Object Tracking Accuracy):MOTA是另一个在多目标跟踪中常用的指标,但它与检测性能高度相关。MOTA主要考虑了错误匹配、丢失的目标和误报的目标,但它对检测性能很敏感。因此,只有当所有方法都使用相同的检测结果进行跟踪时(即所谓的“公共跟踪”),使用MOTA作为评估指标才是公平的。
- “public tracking”:这个术语指的是所有方法都使用相同的检测结果进行跟踪的情况。在这种情况下,由于检测结果是固定的,因此评估的重点在于跟踪算法的性能,而不是检测算法的性能。
计算
使用motmetrics库
读取两个文本文件:gt.txt和ts1.txt。这两个文件分别包含真实轨迹(ground truth)和算法预测的轨迹(tracking results)。
使用mm.utils.compare_to_groundtruth函数将预测轨迹与真实轨迹进行比较,并计算交并比(IOU)。
创建一个motmetrics的MetricsHost对象
计算一系列的性能指标,如num_frames(总帧数)、num_switches(轨迹切换次数)、idp(身份精确度)、idr(身份召回率)、idf1(身份F1分数)、mota(多目标跟踪准确度)、motp(多目标跟踪精度)、precision(精确度)和recall(召回率)。
卡尔曼滤波
理论
状态转移方程:(描述物体从t时刻到t+△t时刻的运动变化。因为状态向量x包含t时刻的速度,所以状态转移方程就要多带一个△t,与状态向量x相乘得到t+1时刻的状态向量)
在多维数据分析中,不同维度之间的相关程度就需要协方差矩阵来描述
在ocsort方法下,实现动态调整噪声参数
代码大致如下:
class OCSortKalmanFilterAdapter(KalmanFilter):
def __init__(self, dim_x, dim_z):
super().__init__(dim_x=dim_x, dim_z=dim_z)
self.Q_initial = np.eye(dim_x) * 0.1
self.R_initial = np.eye(dim_z) * 0.1
self.mean=[]
def update_Q(self, measurement_error):
adjustment_factor = measurement_error / self.Q.trace()
self.Q = self.Q * adjustment_factor
def update_R(self, process_error):
adjustment_factor = process_error / self.R.trace()
self.R = self.R * adjustment_factor
def update(self, z, R=None, H=None):
if R is None:
R = self.R
if H is None:
H = self.H
if z is not None:
z_diff = z - np.dot(H, self.x)
prediction_error = np.linalg.norm(z_diff)
self.update_Q(prediction_error)
self.update_R(prediction_error)
return super().update(z, R, H)
对于代码的解释:
np.linalg.norm
向量/矩阵中所有的数字的平方的和再开平方根
Q.trace()
对角线数字的和
Q = | a b |
| c d |
Q.trace() = a + d
self.Q_initial.trace()
Q矩阵代表了过程噪声的协方差,其迹(或对角线元素之和)可以看作是过程噪声“总强度”的一个度量。
通过除以Q_initial.trace(),将测量误差与初始估计的过程噪声“总强度”进行比较。这样做的目的是得到一个相对的、无量纲的调整因子,该因子可以被用来调整Q矩阵,以适应系统实际表现出的过程噪声水平。
实验设置
选用了MOT17-test数据集
根据文章要求对于MOT20,他们设置置信度阈值为0.4,而对于其他数据集,阈值被设置为0.6
即 d e t _ t h r e s h = 0.4 det\_thresh\ =\ 0.4 det_thresh = 0.4
yolo简单介绍
YOLO,即You Only Look Once,是一种深度学习中的对象检测算法,由Joseph Redmon等人在2015年首次提出。YOLO的核心优势在于它能够实现快速且准确的对象检测,特别适合实时应用场景。
以下是YOLO算法的一些关键特点:
-
单次检测:YOLO的名称来源于其检测过程中只需要对图像进行一次前向传播,与传统的多阶段检测方法相比,大大提高了检测速度。
-
区域分割:YOLO将输入图像划分为一个个格子(grid cell),每个格子负责预测该区域内的对象。
-
边界框和类别预测:每个格子会预测多个边界框(bounding boxes)和类别概率,边界框用于定位对象,类别概率用于识别对象的类别。
-
端到端训练:YOLO通过端到端的方式进行训练,即直接从图像到边界框和类别标签的映射,简化了训练流程。
在YOLO算法中,端到端训练意味着模型从原始图像像素开始,通过神经网络直接预测出对象的边界框和类别概率,而不需要依赖于传统的图像处理步骤,如边缘检测、特征提取等。
fgsm介绍
TODO
- yolo相关内容
- yolo新版本相比老版本怎么样
- fgsm内容
- 一个自我介绍