论文链接: link
2019年TCSVT的一篇文章,主要介绍了一种长时跟踪方法。
动机
- 长时跟踪中的主要问题在于,在当前帧跟踪结果不可靠时,如何重检测出一个更好地跟踪结果。
- 大部分长时跟踪算法没有检查重检测结果的可靠程度,会引起重检测器的污染。
- 如何确定跟踪结果可靠程度以防止更新造成模型污染,当跟踪结果不可靠时如何重检测目标是长时跟踪将要解决的问题。
方法
- 基于Staple,综合相关滤波和颜色响应两种响应判断跟踪结果可靠性
- 对跟踪结果进行可靠性检查(Reliability check)确定跟踪结果可靠程度来自适应更新模型
- 对跟踪结果进行不可靠性检查(Unreliability check)来确定是否需要开启重检测
- 在重检测中使用从粗到精的定位方式
可靠性估计
对于CF响应可靠性,选择使用PSR来衡量跟踪置信度。
S
h
(
i
)
=
m
a
x
(
f
h
(
i
)
)
−
μ
i
σ
i
S_h^{(i)} = \frac{max(f_h^{(i)})-\mu_i}{\sigma_i}
Sh(i)=σimax(fh(i))−μi
在跟踪过程中记录CF可靠性得分,放入集合
C
h
=
{
S
h
(
2
)
,
S
h
(
3
)
,
.
.
.
,
S
h
(
i
)
}
C_h=\{S_h^{(2)},S_h^{(3)},...,S_h^{(i)}\}
Ch={Sh(2),Sh(3),...,Sh(i)},计算均值
M
h
M_h
Mh,若新的一帧结果可靠性得分
S
h
(
i
)
<
o
h
⋅
M
h
S_h^{(i)}<o_h \cdot M_h
Sh(i)<oh⋅Mh,则认为结果不可靠,不计入集合,即不可靠性检查。
而若可靠性得分
S
h
(
i
)
>
τ
h
M
˙
h
S_h^{(i)}>\tau_h \dot M_h
Sh(i)>τhM˙h,则认为跟踪结果可靠,即可靠性检查。
对颜色响应可靠性,选择用目标内像素得分和与第一帧目标内像素得分和来衡量。
S
c
(
i
)
=
∑
u
m
T
ϕ
i
(
u
)
∑
u
m
T
ϕ
1
(
u
)
S_c^{(i)}=\frac{\sum_u m^T \phi_i(u)}{\sum_u m^T \phi_1(u)}
Sc(i)=∑umTϕ1(u)∑umTϕi(u)
同理将历史颜色响应可靠性得分放入集合
C
c
=
{
S
c
(
2
)
,
S
c
(
3
)
,
.
.
.
,
S
c
(
i
)
}
C_c=\{S_c^{(2)},S_c^{(3)},...,S_c^{(i)}\}
Cc={Sc(2),Sc(3),...,Sc(i)},计算均值
M
c
M_c
Mc,若新的一帧结果可靠性得分
S
c
(
i
)
<
o
c
⋅
M
c
S_c^{(i)}<o_c \cdot M_c
Sc(i)<oc⋅Mc,则认为跟踪结果不可靠,不计入集合,即不可靠性检查。
而若可靠性得分
S
c
(
i
)
>
τ
c
M
˙
c
S_c^{(i)}>\tau_c \dot M_c
Sc(i)>τcM˙c,则认为跟踪结果可靠,即可靠性检查。
τ
\tau
τ,
o
o
o均为预设阈值,
τ
>
c
\tau>c
τ>c。
重检测模块
从代码来看,采取了类似粒子滤波的稀疏跟踪方法对重检测位置粗定位,再使用CF和颜色模型对目标进行精定位。重检测模型为一个目标模板集
D
D
D,包含
N
p
N_p
Np个正样本组成的正样本集
D
+
D_+
D+和
N
n
N_n
Nn个负样本组成的负样本集
D
−
D_-
D−。
若当前跟踪结果的CF响应和颜色响应均满足“不可靠性检查”,则开启重检测,先用粒子滤波模型找到目标候选位置,对每个目标候选位置,解出稀疏重建系数
α
=
[
α
+
α
−
]
\alpha=[\alpha_+ \alpha_-]
α=[α+α−]。
min
α
∣
∣
x
−
D
α
∣
∣
2
2
+
λ
∣
∣
α
∣
∣
1
\min_\alpha ||x-D\alpha||^2_2+\lambda ||\alpha||_1
αmin∣∣x−Dα∣∣22+λ∣∣α∣∣1
则目标候选位置
x
i
x_i
xi的可靠性可用重建误差衡量
R
i
=
∣
∣
x
i
−
D
−
α
−
∣
∣
2
2
−
∣
∣
x
i
−
D
+
α
+
∣
∣
2
2
R_i=||x_i-D_-\alpha_-||^2_2-||x_i-D_+\alpha_+||^2_2
Ri=∣∣xi−D−α−∣∣22−∣∣xi−D+α+∣∣22
即对负样本重建误差越大,对正样本重建误差越小,可靠性越大。
通过对可靠性排名,去除掉90%的粒子目标候选。对剩下的目标候选位置用跟踪模型进行检测(即CF响应与颜色响应的融合),目标候选的最终置信度如下:
C
i
=
m
a
x
(
f
(
i
)
)
⋅
c
o
s
(
γ
W
t
+
H
t
∣
∣
L
c
(
i
)
−
L
t
∣
∣
)
C_i = max(f^{(i)}) \cdot cos(\frac {\gamma}{W_t+H_t}||L_c^{(i)}-L_t||)
Ci=max(f(i))⋅cos(Wt+Htγ∣∣Lc(i)−Lt∣∣)
f
(
i
)
f^{(i)}
f(i)为跟踪器响应, 后一项惩罚过大位移。
∣
∣
L
c
(
i
)
−
L
t
∣
∣
||L_c^{(i)}- L_t||
∣∣Lc(i)−Lt∣∣为目标候选位置相对上一帧位置位移。
若最大置信度的跟踪结果满足“可靠性检查”,则选择作为新的跟踪位置,否则保持原有跟踪结果,并且自适应更新模型。
自适应模型更新
如果跟踪结果不满足“可靠性检查”,则开启自适应模型更新,具体规则如下
算法整体流程图如下:
实验
扩大DCF搜索区域对跟踪效果的影响,可见扩大DCF搜索区域并不能提高跟踪效果,搜索区域在一个合适的范围达到最优值。
搜索区域中心从groundtruth中选取,以及从上一帧结果加随机扰动效果对比,证明从不同的搜索区域中选出最佳搜索区域确实能提高跟踪效果。
代码细节学习
如何获取重检测所用正负样本?
对每个变换初始化参数 [ x , y , s c a l e , θ , a r , ϕ ] T [x,y,scale,\theta,ar,\phi]^T [x,y,scale,θ,ar,ϕ]T,通过多视图几何工具affparam2mat可转换为仿射变换的矩阵,使用仿射变换对样本进行采集。
初始的变换参数可将在目标区域裁剪样本,并通过 s c a l e scale scale缩放到相应尺寸。
在采集正样本时,在位置上添加标准差为1的随机扰动,代码如下
n = num_p; % Sampling Number
param.param0 = zeros(6,n); % Affine Parameter Sampling
param.param = zeros(6,n);
param.param0 = repmat(affparam2geom(param.est(:)), [1,n]);
randMatrix = randn(6,n);%标准正态分布
sigma = [1, 1, .000, .000, .000, .000];
param.param = param.param0 + randMatrix.*repmat(sigma(:),[1,n]);
o = affparam2mat(param.param); % Extract or Warp Samples which are related to above affine parameters
wimgs = warpimg(img, o, sz);
m = prod(sz);
X_pos = zeros(m, n);
for i = 1: n
X_pos(:,i) = reshape(wimgs(:,:,i), m, 1);
end
在采集负样本时,在两个位置坐标上添加标准差为目标宽和高的随机扰动。
n = num_n; % Sampling Number
param.param0 = zeros(6,n); % Affine Parameter Sampling
param.param = zeros(6,n);
param.param0 = repmat(affparam2geom(param.est(:)), [1,n]);
randMatrix = randn(6,n);
sigma = [round(sz(2)*param.est(3)), round(sz(1)*param.est(3)*p0), .000, .000, .000, .000];
param.param = param.param0 + randMatrix.*repmat(sigma(:),[1,n]);
同时要去除目标区域内的样本,若样本中心在目标区域内,将样本中心赋值到目标区域边界。
%去除目标区域内的样本
back = round(sigma(1)/4);
center = param.param0(1,1);
left = center - back;
right = center + back;
nono = param.param(1,:)<=right¶m.param(1,:)>=center;
param.param(1,nono) = right;
nono = param.param(1,:)>=left¶m.param(1,:)<center;
param.param(1,nono) = left;
back = round(sigma(2)/4);
center = param.param0(2,1);
top = center - back;
bottom = center + back;
nono = param.param(2,:)<=bottom¶m.param(2,:)>=center;
param.param(2,nono) = bottom;
nono = param.param(2,:)>=top¶m.param(2,:)<center;
param.param(2,nono) = top;
最终得到的样本集中每一列是一个样本
o = affparam2mat(param.param); %Extract or Warp Samples which are related to above affine parameters
wimgs = warpimg(img, o, sz);
m = prod(opt.tmplsize);
X_neg = zeros(m, n);
for i = 1: n
X_neg(:,i) = reshape(wimgs(:,:,i), m, 1);
end
在重检测时,在目标区域周围随机采样,采样半径初始设为20
重检测模块的稀疏重建系数 α \alpha α是通过稀疏分解工具箱Sparse Decomposition Toolbox中的mexLasso函数求解的。
[~, Y, param] = affineSample(double(imggray), pos, sz, opt, param);%Y中每一列对应一个样本
YY = normVector(Y);%每一列用该列的范数归一化
AA_pos = normVector(A_pos);
AA_neg = normVector(A_neg);
% represent each candidate with training template set
% 稀疏重建工具箱mexLasso
paramSR.L = length(YY(:,1));
paramSR.lambda = 0.01;
beta = mexLasso(YY, [AA_pos AA_neg], paramSR);
beta = full(beta);
% the confidence value of each candidate
rec_p = sum((YY - AA_pos*beta(1:size(AA_pos,2),:)).^2);
rec_n = sum((YY - AA_neg*beta(size(AA_pos,2)+1:end,:)).^2);
con = rec_p-rec_n;
%con = exp(0.01*(rec_p-rec_n));
[~, I] = sort(con ,'descend');%I是con从大到小排序的下标
affParams = affparam2mat(param.param(:,I(1:1:opt.highest_num))); % score highest 90%
particle_pos(opt.highest_num, 2) = 0;
particle_pos(:,1) = affParams(2,:);
particle_pos(:,2) = affParams(1,:);
每5帧更新一次重检测正负样本,正样本只更新一般,负样本全部更新
function [A_pos] = updatePos(img, sz, param, num_p, A_pos)
if size(img,3)==3
img = double(rgb2gray(img));
else
img = double(img);
end
n = num_p; % Sampling Number
param.param0 = zeros(6,n); % Affine Parameter Sampling
param.param = zeros(6,n);
param.param0 = repmat(affparam2geom(param.est(:)), [1,n]);
randMatrix = randn(6,n);
sigma = [1, 1, .000, .000, .000, .000];
param.param = param.param0 + randMatrix.*repmat(sigma(:),[1,n]);
o = affparam2mat(param.param); % Extract or Warp Samples which are related to above affine parameters
wimgs = warpimg(img, o, sz);
m = prod(sz);
for i = 1: n/2
A_pos(:,i) = reshape(wimgs(:,:,i), m, 1);
end
end