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

132 阅读3分钟

1.算法仿真效果

matlab2022a仿真结果如下:

1.png

2.png

3.png

4.png

5.png

6.png

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

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

 

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

 

90b80c83c2ecabcf5c89fb17ea8aca12_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.jpg

 

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

 

d71d71bb51fcb9b348f887fc436d7ae9_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.jpg

 

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

09bedf301502b3171cedca30e93e1ede_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.jpg

,可得出:

 

1538d2e437501dc528a32b4847a3b5d6_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.jpg

 

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

 

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

c3e0387aba15f635338e083f7317cd53_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.jpg

 

 

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

 

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+lambdaeye(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`