目标跟踪 deepsort
DeepSORT(Deep Simple Online and Realtime Tracking)是SORT算法的核心改进版,核心突破是融合外观特征与运动模型,解决SORT中ID切换频繁的问题,在保持实时性(FPS≈30)的同时,大幅提升多目标跟踪的稳定性和鲁棒性,成为多目标跟踪领域的经典基准算法。
一、论文核心创新点
- 外观特征融合的数据关联:在SORT的IOU关联基础上,引入深度外观特征,通过余弦距离度量目标外观相似度,结合运动模型的马氏距离,构建加权关联度量,解决遮挡、姿态变化导致的IOU匹配失效问题。
- 改进的运动模型与状态估计:采用扩展卡尔曼滤波(EKF) 建模目标运动状态(位置、速度、尺寸),同时考虑目标尺度变化,优化状态预测精度,适配目标加速、减速等复杂运动。
- 轨迹管理机制:设计“未确认轨迹→确认轨迹→消失轨迹”的状态流转规则,通过连续匹配次数阈值(默认3次)确认轨迹,消失后保留轨迹一段时间(默认30帧)再删除,减少临时遮挡导致的ID切换。
- 深度特征提取网络:训练轻量级CNN提取128维外观特征,特征归一化后映射到单位球面,确保余弦距离的有效性,同时网络轻量化设计保证实时性。
- 分层数据关联策略:先通过匈牙利算法进行“轨迹-检测”的初始匹配,再对未匹配的检测和轨迹进行二次关联(基于外观特征的最近邻匹配),提升关联召回率。
二、核心模块详解
1. 目标检测模块
- 核心功能:为跟踪提供初始目标位置和候选区域,输入为视频帧,输出为目标检测框(x,y,w,h)和置信度。
- 关键细节:
- 采用预训练的目标检测器(如Faster R-CNN、YOLO),原论文使用Faster R-CNN在VOC数据集上的检测结果。
- 检测后处理:应用非极大值抑制(NMS,IOU阈值=0.7),过滤重复检测框,保留高置信度(默认置信度阈值=0.7)检测结果。
2. 外观特征提取模块
- 核心功能:从检测框对应的目标区域中提取深度外观特征,用于区分不同目标。
- 关键细节:
- 网络结构:轻量级CNN(基于AlexNet修改),输入为128×64的灰度目标图像(统一缩放+归一化),输出128维特征向量。
- 特征处理:特征向量L2归一化至单位球面(∥f∥2=1\|f\|_2=1∥f∥2=1),确保余弦距离可直接度量外观相似度。
- 训练数据:使用MARS数据集(多目标行人跟踪数据集)训练,优化特征的区分性(同类目标距离近,异类目标距离远)。
3. 运动模型与状态估计(EKF)
- 核心功能:预测目标下一帧的运动状态,修正检测结果,输出目标的最优状态估计。
- 关键细节:
- 状态向量:x=[u,v,s,r,u˙,v˙,s˙]Tx=[u, v, s, r, \dot{u}, \dot{v}, \dot{s}]^Tx=[u,v,s,r,u˙,v˙,s˙]T,其中(u,v)为目标中心坐标,s为目标面积,r为宽高比,u˙,v˙,s˙\dot{u},\dot{v},\dot{s}u˙,v˙,s˙为对应速度(宽高比r视为常数,不建模速度)。
- 预测阶段:基于恒定速度模型(CV模型)预测下一帧状态,加入过程噪声(高斯分布)。
- 更新阶段:用检测框(u’,v’,s’,r’)修正预测状态,r’用于更新宽高比(原论文中r仅通过检测更新,不预测)。
4. 数据关联模块
- 核心功能:将当前帧的检测结果与已有轨迹进行匹配,确定“检测-轨迹”的对应关系。
- 关键流程:
- 计算关联矩阵:每行对应轨迹,每列对应检测,元素为“马氏距离(运动匹配)+ 余弦距离(外观匹配)”的加权和。
- 匈牙利算法匹配:求解关联矩阵的最小权重匹配,得到初始匹配对。
- 阈值筛选:剔除权重超过阈值的匹配对(运动阈值基于卡方分布,外观阈值=0.2)。
- 二次关联:对未匹配的检测和消失时间较短的轨迹,基于外观特征的最近邻匹配,补充匹配。
5. 轨迹管理模块
- 核心功能:管理轨迹的生命周期(初始化、确认、更新、删除),抑制ID切换。
- 关键规则:
- 轨迹初始化:未匹配的检测初始化新轨迹,状态设为“未确认”。
- 轨迹确认:未确认轨迹连续匹配3次,转为“确认轨迹”,参与正式跟踪。
- 轨迹更新:匹配成功的轨迹,用EKF更新状态,同时更新外观特征库(存储最近100帧的外观特征)。
- 轨迹删除:确认轨迹连续30帧未匹配,或未确认轨迹连续1帧未匹配,直接删除。
三、算法公式解释
1. 扩展卡尔曼滤波(EKF)公式
EKF分为预测和更新两个阶段,核心是处理非线性状态转换(目标面积s的速度建模为线性,检测更新为非线性)。
-
预测阶段:
- 状态预测:x^k∣k−1=F⋅xk−1∣k−1\hat{x}_{k|k-1} = F \cdot x_{k-1|k-1}x^k∣k−1=F⋅xk−1∣k−1,其中FFF为状态转移矩阵:
F=[1000Δt0001000Δt0001000Δt0001000000010000000100000001] F = \begin{bmatrix} 1 & 0 & 0 & 0 & \Delta t & 0 & 0 \\ 0 & 1 & 0 & 0 & 0 & \Delta t & 0 \\ 0 & 0 & 1 & 0 & 0 & 0 & \Delta t \\ 0 & 0 & 0 & 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 1 \\ \end{bmatrix} F=1000000010000000100000001000Δt0001000Δt0001000Δt0001
Δt\Delta tΔt为帧间隔(默认1/30s)。 - 协方差预测:Pk∣k−1=F⋅Pk−1∣k−1⋅FT+QP_{k|k-1} = F \cdot P_{k-1|k-1} \cdot F^T + QPk∣k−1=F⋅Pk−1∣k−1⋅FT+Q,QQQ为过程噪声协方差矩阵(控制运动模型的不确定性)。
- 状态预测:x^k∣k−1=F⋅xk−1∣k−1\hat{x}_{k|k-1} = F \cdot x_{k-1|k-1}x^k∣k−1=F⋅xk−1∣k−1,其中FFF为状态转移矩阵:
-
更新阶段:
- 观测模型:zk=H⋅xk+vkz_k = H \cdot x_k + v_kzk=H⋅xk+vk,HHH为观测矩阵(提取状态中的u,v,s,r),vkv_kvk为观测噪声(高斯分布)。
- 卡尔曼增益:Kk=Pk∣k−1⋅HT⋅(H⋅Pk∣k−1⋅HT+R)−1K_k = P_{k|k-1} \cdot H^T \cdot (H \cdot P_{k|k-1} \cdot H^T + R)^{-1}Kk=Pk∣k−1⋅HT⋅(H⋅Pk∣k−1⋅HT+R)−1,RRR为观测噪声协方差矩阵。
- 状态更新:xk∣k=x^k∣k−1+Kk⋅(zk−H⋅x^k∣k−1)x_{k|k} = \hat{x}_{k|k-1} + K_k \cdot (z_k - H \cdot \hat{x}_{k|k-1})xk∣k=x^k∣k−1+Kk⋅(zk−H⋅x^k∣k−1)。
- 协方差更新:Pk∣k=(I−Kk⋅H)⋅Pk∣k−1P_{k|k} = (I - K_k \cdot H) \cdot P_{k|k-1}Pk∣k=(I−Kk⋅H)⋅Pk∣k−1,III为单位矩阵。
2. 关联度量公式(核心创新)
关联矩阵的元素为运动相似度和外观相似度的加权组合,公式为:
ci,j=λ⋅dmotion(i,j)+(1−λ)⋅dappearance(i,j)
c_{i,j} = \lambda \cdot d_{motion}(i,j) + (1-\lambda) \cdot d_{appearance}(i,j)
ci,j=λ⋅dmotion(i,j)+(1−λ)⋅dappearance(i,j)
- 参数解析:
- λ\lambdaλ:权重系数(默认λ=0.7\lambda=0.7λ=0.7),平衡运动和外观的重要性。
- dmotion(i,j)d_{motion}(i,j)dmotion(i,j):轨迹i与检测j的马氏距离,衡量运动状态的匹配程度:dmotion=(zj−z^i∣i−1)T⋅Si,j−1⋅(zj−z^i∣i−1)d_{motion} = (z_j - \hat{z}_{i|i-1})^T \cdot S_{i,j}^{-1} \cdot (z_j - \hat{z}_{i|i-1})dmotion=(zj−z^i∣i−1)T⋅Si,j−1⋅(zj−z^i∣i−1),Si,jS_{i,j}Si,j为残差协方差矩阵,dmotion<χ2(4,0.95)d_{motion} < \chi^2(4, 0.95)dmotion<χ2(4,0.95)(卡方分布阈值,约9.49)时认为运动匹配有效。
- dappearance(i,j)d_{appearance}(i,j)dappearance(i,j):轨迹i与检测j的外观距离,用余弦距离计算:dappearance=1−fjT⋅fˉid_{appearance} = 1 - f_j^T \cdot \bar{f}_idappearance=1−fjT⋅fˉi,其中fjf_jfj为检测j的外观特征,fˉi\bar{f}_ifˉi为轨迹i的平均外观特征(从特征库中计算均值),dappearance<0.2d_{appearance} < 0.2dappearance<0.2时认为外观匹配有效。
3. 外观特征更新公式
轨迹的外观特征库存储最近100帧的特征,平均特征更新公式为:
fˉi=1N∑t=k−N+1kfi,t
\bar{f}_i = \frac{1}{N} \sum_{t=k-N+1}^k f_{i,t}
fˉi=N1t=k−N+1∑kfi,t
其中N=100N=100N=100为特征库容量,fi,tf_{i,t}fi,t为轨迹i在第t帧的外观特征,确保平均特征能反映目标最新的外观状态。
四、数据处理细节
1. 检测数据预处理
- NMS过滤:对检测器输出的检测框,按IOU阈值=0.7执行非极大值抑制,删除重叠度高的重复检测。
- 置信度筛选:保留置信度≥0.7的检测框,过滤低置信度噪声检测。
- 坐标转换:将检测框的像素坐标(x1,y1,x2,y2)转换为状态向量所需的(u,v,s,r):u=(x1+x2)/2,v=(y1+y2)/2,s=(x2-x1)(y2-y1),r=(x2-x1)/(y2-y1)。
2. 外观特征提取预处理
- 目标区域裁剪:根据检测框裁剪目标区域,统一缩放至128×64像素(灰度图)。
- 归一化:像素值归一化至[0,1](除以255),减少光照变化对特征提取的影响。
- 特征归一化:提取的128维特征向量进行L2归一化(∥f∥2=1\|f\|_2=1∥f∥2=1),确保余弦距离的有效性。
3. 轨迹初始化与更新数据
- 初始化数据:未匹配的检测框,初始化状态向量xxx的位置(u,v,s,r)为检测值,速度(u˙,v˙,s˙\dot{u},\dot{v},\dot{s}u˙,v˙,s˙)设为0,协方差矩阵PPP初始化为对角矩阵(对角元素为较大值,体现初始不确定性)。
- 更新数据:匹配成功时,用EKF更新状态向量和协方差矩阵;同时将当前帧的外观特征加入轨迹的特征库,若特征库容量超过100,删除最早的特征。
4. 异常处理
- 遮挡处理:目标被遮挡时,轨迹未匹配但不立即删除(保留30帧),期间仍通过运动模型预测位置,待遮挡解除后可通过外观特征重新匹配。
- 尺度适配:通过检测框的s和r更新目标尺度,适配目标靠近/远离镜头导致的尺寸变化。
- 噪声抑制:通过置信度筛选、NMS、关联阈值筛选,过滤检测噪声和错误匹配,避免虚假轨迹生成。
