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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章