Reliable Re-Detection for Long-Term Tracking笔记

论文链接: link
2019年TCSVT的一篇文章,主要介绍了一种长时跟踪方法。

动机

  • 长时跟踪中的主要问题在于,在当前帧跟踪结果不可靠时,如何重检测出一个更好地跟踪结果。
  • 大部分长时跟踪算法没有检查重检测结果的可靠程度,会引起重检测器的污染。
  • 如何确定跟踪结果可靠程度以防止更新造成模型污染,当跟踪结果不可靠时如何重检测目标是长时跟踪将要解决的问题。

方法

  • 基于Staple,综合相关滤波和颜色响应两种响应判断跟踪结果可靠性
  • 对跟踪结果进行可靠性检查(Reliability check)确定跟踪结果可靠程度来自适应更新模型
  • 对跟踪结果进行不可靠性检查(Unreliability check)来确定是否需要开启重检测
  • 在重检测中使用从粗到精的定位方式

可靠性估计

对于CF响应可靠性,选择使用PSR来衡量跟踪置信度。
Sh(i)=max(fh(i))μiσi S_h^{(i)} = \frac{max(f_h^{(i)})-\mu_i}{\sigma_i}
在跟踪过程中记录CF可靠性得分,放入集合Ch={Sh(2),Sh(3),...,Sh(i)}C_h=\{S_h^{(2)},S_h^{(3)},...,S_h^{(i)}\}​,计算均值MhM_h​,若新的一帧结果可靠性得分Sh(i)<ohMhS_h^{(i)}<o_h \cdot M_h​,则认为结果不可靠,不计入集合,即不可靠性检查。
而若可靠性得分Sh(i)>τhM˙hS_h^{(i)}>\tau_h \dot M_h​,则认为跟踪结果可靠,即可靠性检查。
对颜色响应可靠性,选择用目标内像素得分和与第一帧目标内像素得分和来衡量。
Sc(i)=umTϕi(u)umTϕ1(u) S_c^{(i)}=\frac{\sum_u m^T \phi_i(u)}{\sum_u m^T \phi_1(u)}
同理将历史颜色响应可靠性得分放入集合Cc={Sc(2),Sc(3),...,Sc(i)}C_c=\{S_c^{(2)},S_c^{(3)},...,S_c^{(i)}\}​,计算均值McM_c​,若新的一帧结果可靠性得分Sc(i)<ocMcS_c^{(i)}<o_c \cdot M_c​,则认为跟踪结果不可靠,不计入集合,即不可靠性检查。
而若可靠性得分Sc(i)>τcM˙cS_c^{(i)}>\tau_c \dot M_c​,则认为跟踪结果可靠,即可靠性检查。
τ\tau​oo​均为预设阈值,τ>c\tau>c​

重检测模块

从代码来看,采取了类似粒子滤波的稀疏跟踪方法对重检测位置粗定位,再使用CF和颜色模型对目标进行精定位。重检测模型为一个目标模板集DD,包含NpN_p个正样本组成的正样本集D+D_+NnN_n个负样本组成的负样本集DD_-
若当前跟踪结果的CF响应和颜色响应均满足“不可靠性检查”,则开启重检测,先用粒子滤波模型找到目标候选位置,对每个目标候选位置,解出稀疏重建系数α=[α+α]\alpha=[\alpha_+ \alpha_-]
minαxDα22+λα1 \min_\alpha ||x-D\alpha||^2_2+\lambda ||\alpha||_1
则目标候选位置xix_i的可靠性可用重建误差衡量
Ri=xiDα22xiD+α+22 R_i=||x_i-D_-\alpha_-||^2_2-||x_i-D_+\alpha_+||^2_2
即对负样本重建误差越大,对正样本重建误差越小,可靠性越大。
通过对可靠性排名,去除掉90%的粒子目标候选。对剩下的目标候选位置用跟踪模型进行检测(即CF响应与颜色响应的融合),目标候选的最终置信度如下:
Ci=max(f(i))cos(γWt+HtLc(i)Lt) C_i = max(f^{(i)}) \cdot cos(\frac {\gamma}{W_t+H_t}||L_c^{(i)}-L_t||)
f(i)f^{(i)}为跟踪器响应, 后一项惩罚过大位移。Lc(i)Lt||L_c^{(i)}- L_t||为目标候选位置相对上一帧位置位移。
若最大置信度的跟踪结果满足“可靠性检查”,则选择作为新的跟踪位置,否则保持原有跟踪结果,并且自适应更新模型。

自适应模型更新

如果跟踪结果不满足“可靠性检查”,则开启自适应模型更新,具体规则如下
在这里插入图片描述
算法整体流程图如下:在这里插入图片描述

实验

扩大DCF搜索区域对跟踪效果的影响,可见扩大DCF搜索区域并不能提高跟踪效果,搜索区域在一个合适的范围达到最优值。
在这里插入图片描述
搜索区域中心从groundtruth中选取,以及从上一帧结果加随机扰动效果对比,证明从不同的搜索区域中选出最佳搜索区域确实能提高跟踪效果。
在这里插入图片描述

代码细节学习

如何获取重检测所用正负样本?

对每个变换初始化参数[x,y,scale,θ,ar,ϕ]T[x,y,scale,\theta,ar,\phi]^T,通过多视图几何工具affparam2mat可转换为仿射变换的矩阵,使用仿射变换对样本进行采集。

初始的变换参数可将在目标区域裁剪样本,并通过scalescale缩放到相应尺寸。

在采集正样本时,在位置上添加标准差为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&param.param(1,:)>=center;
param.param(1,nono) = right;
nono = param.param(1,:)>=left&param.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&param.param(2,:)>=center;
param.param(2,nono) = bottom;
nono = param.param(2,:)>=top&param.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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章