赞
踩
MHT、JPDAF基于逐帧的数据关联,但是计算代价较大,复杂度高。
SORT算法在传统算法的基础上,使用卡尔曼滤波处理每帧的关联性,利用匈牙利算法进行关联度量,使得其检测性能提升了几十倍。然而SORT算法的Id频繁切换的问题比较明显,也就是说SORT算法只适用于遮挡情况少的、运动比较稳定的对象。
目标的状态:
x
=
[
u
,
v
,
s
,
r
,
u
′
,
v
′
,
s
′
]
x= [u,v,s,r,u^{'},v^{'},s^{'}]
x=[u,v,s,r,u′,v′,s′]
u , v u,v u,v表示目标物体在图像中的坐标;
s s s表示目标物体在图像中的面积;
r r r 表示目标物体框在图像中横纵比;
u ′ , v ′ , s ′ u^{'},v^{'},s^{'} u′,v′,s′表示上述参数的速度。
注意,目标的横纵比一般认为在较短的一段时间内保持稳定。
在为现有目标分配检测时,每个目标框的bbox几何框都是通过预测当前帧新的位置估计得到的。assignment cost matrix 分配代价矩阵通过每个检测结果和所有现有目标的预测框 间的IOU距离计算得到。分配方法通过使用匈牙利算法得到最佳优化。此外,到检测到的IOU与预测目标物间IOU小于IOUmin阈值时,检测的物体将被拒绝分配。
// Predict the estimated bounding box. StateType KalmanTracker::predict() { // predict Mat p = kf.predict(); m_age += 1; if (m_time_since_update > 0) m_hit_streak = 0; // m_hit_streak 表示连续更新次数 m_time_since_update += 1; StateType predictBox = get_rect_xysr(p.at<float>(0, 0), p.at<float>(1, 0), p.at<float>(2, 0), p.at<float>(3, 0)); m_history.push_back(predictBox); return m_history.back(); } // Update the state vector with observed bounding box. void KalmanTracker::update(StateType stateMat) { m_time_since_update = 0; m_history.clear(); m_hits += 1; m_hit_streak += 1; // measurement measurement.at<float>(0, 0) = stateMat.x + stateMat.width / 2; measurement.at<float>(1, 0) = stateMat.y + stateMat.height / 2; measurement.at<float>(2, 0) = stateMat.area(); measurement.at<float>(3, 0) = stateMat.width / stateMat.height; // update kf.correct(measurement); } for (auto it = trackers.begin(); it != trackers.end();) { // 至少被连续关联更新 min_hits 帧 // frame_count <= min_hits 前三帧都都输出 // m_time_since_update 为0 表示有更新 ,为1表示预测 if (((*it).m_time_since_update < 1) && ((*it).m_hit_streak >= min_hits || frame_count <= min_hits)) { TrackingBox res; res.box = (*it).get_state(); res.id = (*it).m_id + 1; res.frame = frame_count; frameTrackingResult.push_back(res); it++; } else it++; // remove dead tracklet // 连续丢失多少帧后将其删除 // 表示为更新(未关联上)即丢失次数 if (it != trackers.end() && (*it).m_time_since_update > max_age) it = trackers.erase(it); }
DeepSORT是SORT多目标跟踪算法的改进版本,设计了一种新的关联方式,提高了对长时间遮挡的对象追踪的准确率,减少了Id频繁切换的现象。
在SORT忽略了被检测物体的表面特征,因此只有在物体状态估计不确定性较低是才会准确
在Deep SORT中,我们使用更加可靠的度量来代替关联度量,并使用CNN网络在大规模行人数据集进行训练,并提取特征,已增加网络对遗失和障碍的鲁棒性。
由于每个新检测的对象都可能成为一条新的轨迹,但如果直接把他们归为一条轨迹,那么错检和误检的情况就会频繁出现。DeepSORT是这么做的:新的检测结果首先被标为’tentative’,然后观察接下来的若干帧(一般为3帧),如果接下来的连续3帧都成功匹配上,标记为’confirmed’,也就是确认是一条新的轨迹。否则标记为’deleted’,不再认为其可以构成轨迹。
x = [ u , v , γ , h , x ˙ , y ˙ , γ ˙ , h ˙ ] x= [u,v,\gamma,h,\dot x,\dot y, \dot \gamma ,\dot h] x=[u,v,γ,h,x˙,y˙,γ˙,h˙]
分别表示bounding box中心的位置 ( u , v ) (u,v) (u,v)、纵横比 γ \gamma γ、高度 h h h、以及在图像坐标中对应的速度信息。然后使用一个kalman滤波器预测更新轨迹,该卡尔曼滤波器采用匀速模型和线性观测模型。其观测变量为 ( u , v , γ , h ) (u,v,\gamma ,h) (u,v,γ,h)
马氏距离
使用马氏距离来评测预测的Kalman状态和新来的状态,当目标运动不确定性较低时,马氏距离是一个很好的关联度量,但在实际中,如相机运动时会造成马氏距离大量不能匹配,也就会使这个度量失效
其中用dj表示第j个检测框信息 (u, v,γ, h),Si是轨迹卡尔曼滤波器预测得到的在当前时刻观测空间的协方差矩阵。yi 是轨迹在当前时刻的预测观测量。上述整个式子表示,第j个预测结果与第i条轨迹的匹配度。
使用马氏距离的好处是,这种匹配方式考虑了状态估计的不确定度。可以利用卡方分布95%的分位作为阈值,用来排除不可能的关联。如果第i个轨迹和第j个预测之间的关联是可接受的,则其计算结果为1,如下所示。
使用余弦距离衡量差异
对每一个BBox检测框计算一个表面特征描述子
r
j
r_j
rj ,
∣
r
j
∣
|r_j|
∣rj∣ = 1 , 创建一个gallery(类似滑动窗口)用来存放最新的
L
k
=
100
L_k =100
Lk=100个轨迹的描述子,即
R
k
=
{
r
k
(
j
)
}
k
=
1
L
k
R_k = \{r_k^{(j)}\}_{k=1}^{L_k}
Rk={rk(j)}k=1Lk,然后我们使用第i个轨迹和第j个轨迹的最小余弦距离作为第二个衡量尺度
同样,作者也为该度量设置了一个限制,即如果第i个轨迹和第j个预测之间的关联是可接受的,则其计算结果为1。这里的阈值不同于马氏距离,需要在单独的训练数据集上找到合适的阈值。
总的匹配指标
马氏距离提供了目标的可能位置信息,对短期预测有用;余弦距离更多考虑的是预测信息和轨迹信息的外观特征,当跟踪对象位移较少时,对恢复长期遮挡后的id特别有用,因此作者的做法是把二者加权相加:
其中,阈值设置为:
通过控制超参λ可以控制二者的占比。作者通过实验发现,当λ=0时,可以有效应对相机拍摄时位移的情况。才该项设置下,相当于只使用了外观特征信息。
匹配级联
不同于传统的思路,作者没有把整个问题看作全局优化的问题,而是使用级联的策略优化一系列子问题。考虑到当一个物体被遮挡较长一段时间,卡尔曼滤波预测增加了与物体位置相关的不确定性,会导致连续预测的概率弥散,换句话说,当有连续的预测不更新时,分布的方差会变大,也就意味着离均值欧氏距离远的点可能和之前分布中离得较近的点获得同样的马氏距离值,这么做显然是有问题的。所以作者引入了级联匹配,优先考虑更常见的对象
如上图,输入轨迹T,检测指标D,和生命周期Amax。我们计算关联代价矩阵C和其阈值B。然后在生命周期内做n次迭代,解决轨迹的分配问题: 选择了在最近n帧中没有与检测相关的轨迹Tn,然后求解了Tn和未匹配的U轨迹之间的线性分配,然后我们更新匹配和未匹配的集合,循环以上步骤直至结束。需要注意的是,这种策略优先考虑生命周期较小的轨迹,即最近出现的轨迹。在最后阶段,作者使用之前SORT算法中的IOU关联去匹配n=1的unconfirmed和unmatched的轨迹。这可以增加因为外观突变或者部分遮挡情况下的鲁棒性。
深度外观描述符
作者使用了CNN网络在一个大规模的数据集上进行一个offline的训练,以用来提取目标的特征信息。作者采用了残差网络的结构,有两个卷积层,六个残差块,经全连接层得到维度128的特征。最后,使用l2标准化把特征投影到单位超球体,这样就可以兼容余弦度量。
目标关联
上一帧目标与当前帧目标的关联,采用的是匈牙利算法。与Sort算法不同的是,AB3DMOT在构建关联矩阵的时候,用到了
I
o
u
3
d
Iou3d
Iou3d 来表示两个目标的距离。
I
o
u
3
d
Iou3d
Iou3d 在计算复杂度上,要比2d的
I
o
u
Iou
Iou更加难算。所幸目标物体只相对地面旋转,所以只需要算出投影到地面的不规则重叠面积,在乘以重叠的高度,接着就能顺利算出
I
o
u
3
d
Iou3d
Iou3d
计算两个平面图形的重叠面积,可以先用萨瑟兰-霍奇曼算法计算出重叠多边形的顶点,再用鞋带公式计算出该多边形的面积。
如此一来,可以构造出关联矩阵:
利用匈牙利算法完成目标关联,在Sort算法的描述中已经提到,此处不再赘述。
状态估计
AB3DMOT算法采用的运动模型也是广为熟知的匀速运动模型。对目标的状态可以描述为
x = [ x , y , z , θ , l , w , h , x ′ , y ′ , z ′ ] x= [x,y,z,\theta,l,w,h,x^{'},y^{'},z^{'}] x=[x,y,z,θ,l,w,h,x′,y′,z′]
参考:https://zhuanlan.zhihu.com/p/372724583
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。