基于L2-RLS算法的目标跟踪算法matlab仿真,可处理小范围遮挡问题

发布时间 2023-04-14 21:17:45作者: 我爱C编程

1.算法仿真效果

matlab2022a仿真结果如下:

 

 

 

 

 

 

 

 

 

 

 

 

2.算法涉及理论知识概要

       目标表观模型是跟踪器的重要组成部分,用来描述目标表观的特征.基于判别式模型的表观模型用来区分目标和背景;基于生成式模型的表观模型用来描述目标本身,提取出目标的特征.本文合理地融合了判别式模型和生成式模型来对目标进行描述,并利用L2范数最小化对目标表观系数进行求解,取得了比较好的结果.

 

      训练集U=[U1,U2,,Um+n]Rd×(m+n),包括m个正模板U+Rd×,n个负模板U-Rd×n.在初始位置周围手动采集m个图像,归一化后按行堆成向量作为正模板;在离初始位置较远处采集n个图像,利用同样的方法得到负模板.其中初始位置是通过在第一帧中手动标注得到的.采集到的候选样本yRd可以通过训练集线性表示,

 

 

 

 

其中,b=[b1,b2,,bm+n]TR(m+n)×1,为线性表示的系数.b是弱稀疏的,利用这一特征通过L2范数最小化进行求解,其中λ为约束参数.

 

 

 

 

L2范数约束项的作用有2:①它使解b具有一定的稀疏度,但是L2范数的稀疏度远低于L1范数的稀疏度.②它使得最小化的解更加稳定.L2范数最小化很容易求解,||UTby||22+λ||b||22的导数为0,

 

 

 

 

,可得出:

 

 

 

 

其中IRd×d,是一个单位矩阵,用来确保UTU+λI的可逆性.

 

        假设一个候选样本在前景模板上有比较小的重构误差就代表该候选样本有可能是目标,在背景模板上有比较小的重构误差就代表这个候选样本有可能是背景,在此基础上根据候选样本在前景模板和背景模板上的重构误差的差异来构造候选样本的置信值:

 

 

 

 

其中ρ是一个很小的固定的常数,用来权衡判别分类器的重要性.

 

3.MATLAB核心程序

 

rand('state',0);  randn('state',0); 
temp = importdata([dataPath 'datainfo.txt']);
LoopNum = temp(3);%number of frames
frame = imread([dataPath '1.jpg']);
if  size(frame,3) == 3
    framegray = double(rgb2gray(frame))/255;
else
    framegray = double(frame)/255;
end
%%  p = [px, py, sx, sy, theta];  
param0 = [p(1), p(2), p(3) /opt.tmplsize(1), p(5), p(4)/p(3), 0];      
param0 = affparam2mat(param0);
..............................................................................
B=randblock(sz,opt.blockSizeSmall,opt.blockNumSmall);%% generate squre templates
for f = 1:LoopNum
    CurrentFrame=f
    frame = imread([dataPath int2str(f) '.jpg']);
    if  size(frame,3) == 3
        framegray = double(rgb2gray(frame))/255;
    else
        framegray = double(frame)/255;
    end
    
    %% do tracking
    opt.frameNum = f;
    [param,opt] = L2_Tracker(framegray, tmpl, param, opt,P,B);
    result = [ result; param.est' ];
    if param.wimg~=zeros(opt.tmplsize(1),opt.tmplsize(2));
       wimgs= [wimgs, param.wimg(:)];   
    end
  
    %%Update Model
    if  (size(wimgs,2) >= opt.batchsize)  
        %%(1)Incremental SVD
        [tmpl.basis, tmpl.eigval, tmpl.mean, tmpl.numsample] = ...
        sklm(wimgs, tmpl.basis, tmpl.eigval, tmpl.mean, tmpl.numsample, opt.ff);  
        %%(2)Clear Data Buffer
        wimgs = [];     
        %%(3)Keep "opt.maxbasis" Number Basis Vectors
        if  (size(tmpl.basis,2) > opt.maxbasis)          
            tmpl.basis  = tmpl.basis(:,1:opt.maxbasis);   
            tmpl.eigval = tmpl.eigval(1:opt.maxbasis);    
            W=tmpl.basis;
            Mu=tmpl.mean;
        end
        D=[tmpl.basis,B]; %dictionay 
        P=inv(D'*D+lambda*eye(size(D,2)))*D';% project matrix
    end
end
duration = duration + toc;
fps =f/duration;
%% 
TotalFrameNum=LoopNum;
L2RLSCenterAll  = cell(1,TotalFrameNum);      
L2RLSCornersAll = cell(1,TotalFrameNum);
for num = 1:TotalFrameNum
    if  num <= size(result,1)
        est = result(num,:);
        [ center corners ] = p_to_box([32 32], est);
    end
    L2RLSCenterAll{num}  = center;      
    L2RLSCornersAll{num} = corners;
end