論文鏈接: link
2019年TCSVT的一篇文章,主要介紹了一種長時跟蹤方法。
動機
- 長時跟蹤中的主要問題在於,在當前幀跟蹤結果不可靠時,如何重檢測出一個更好地跟蹤結果。
- 大部分長時跟蹤算法沒有檢查重檢測結果的可靠程度,會引起重檢測器的污染。
- 如何確定跟蹤結果可靠程度以防止更新造成模型污染,當跟蹤結果不可靠時如何重檢測目標是長時跟蹤將要解決的問題。
方法
- 基於Staple,綜合相關濾波和顏色響應兩種響應判斷跟蹤結果可靠性
- 對跟蹤結果進行可靠性檢查(Reliability check)確定跟蹤結果可靠程度來自適應更新模型
- 對跟蹤結果進行不可靠性檢查(Unreliability check)來確定是否需要開啓重檢測
- 在重檢測中使用從粗到精的定位方式
可靠性估計
對於CF響應可靠性,選擇使用PSR來衡量跟蹤置信度。
在跟蹤過程中記錄CF可靠性得分,放入集合,計算均值,若新的一幀結果可靠性得分,則認爲結果不可靠,不計入集合,即不可靠性檢查。
而若可靠性得分,則認爲跟蹤結果可靠,即可靠性檢查。
對顏色響應可靠性,選擇用目標內像素得分和與第一幀目標內像素得分和來衡量。
同理將歷史顏色響應可靠性得分放入集合,計算均值,若新的一幀結果可靠性得分,則認爲跟蹤結果不可靠,不計入集合,即不可靠性檢查。
而若可靠性得分,則認爲跟蹤結果可靠,即可靠性檢查。
,均爲預設閾值,。
重檢測模塊
從代碼來看,採取了類似粒子濾波的稀疏跟蹤方法對重檢測位置粗定位,再使用CF和顏色模型對目標進行精定位。重檢測模型爲一個目標模板集,包含個正樣本組成的正樣本集和個負樣本組成的負樣本集。
若當前跟蹤結果的CF響應和顏色響應均滿足“不可靠性檢查”,則開啓重檢測,先用粒子濾波模型找到目標候選位置,對每個目標候選位置,解出稀疏重建係數。
則目標候選位置的可靠性可用重建誤差衡量
即對負樣本重建誤差越大,對正樣本重建誤差越小,可靠性越大。
通過對可靠性排名,去除掉90%的粒子目標候選。對剩下的目標候選位置用跟蹤模型進行檢測(即CF響應與顏色響應的融合),目標候選的最終置信度如下:
爲跟蹤器響應, 後一項懲罰過大位移。爲目標候選位置相對上一幀位置位移。
若最大置信度的跟蹤結果滿足“可靠性檢查”,則選擇作爲新的跟蹤位置,否則保持原有跟蹤結果,並且自適應更新模型。
自適應模型更新
如果跟蹤結果不滿足“可靠性檢查”,則開啓自適應模型更新,具體規則如下
算法整體流程圖如下:
實驗
擴大DCF搜索區域對跟蹤效果的影響,可見擴大DCF搜索區域並不能提高跟蹤效果,搜索區域在一個合適的範圍達到最優值。
搜索區域中心從groundtruth中選取,以及從上一幀結果加隨機擾動效果對比,證明從不同的搜索區域中選出最佳搜索區域確實能提高跟蹤效果。
代碼細節學習
如何獲取重檢測所用正負樣本?
對每個變換初始化參數,通過多視圖幾何工具affparam2mat可轉換爲仿射變換的矩陣,使用仿射變換對樣本進行採集。
初始的變換參數可將在目標區域裁剪樣本,並通過縮放到相應尺寸。
在採集正樣本時,在位置上添加標準差爲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
重檢測模塊的稀疏重建係數是通過稀疏分解工具箱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