www.gusucode.com > 低秩表示法对子空间结构的鲁棒恢复。图像复原低秩表示算法 > 低秩表示法对子空间结构的鲁棒恢复。图像复原低秩表示算法/code2/lrr_motion_seg.m

    function [] = lrr_motion_seg()
datadir = '../datas/hop155';
seqs = dir(datadir);
seq3 = seqs(3:end);
%% load the data
data = struct('X',{},'name',{},'ids',{});
for i=1:length(seq3)
    fname = seq3(i).name;
    fdir = [datadir '/' fname];
    if isdir(fdir)
        datai = load([fdir '/' fname '_truth.mat']);
        id = length(data)+1;
        data(id).ids = datai.s;
        data(id).name = lower(fname);
        X = reshape(permute(datai.x(1:2,:,:),[1 3 2]),2*datai.frames,datai.points);
        data(id).X = [X;ones(1,size(X,2))];
    end
end
clear seq3;
%% segmentation 
tic;
errs = zeros(length(data),1);
lambda = 4;
for i=1:length(data)
    X = data(i).X;
    gnd = data(i).ids; K = max(gnd);
    if abs(K-2)>0.1 && abs(K-3)>0.1
        id = i; % the discarded sequqnce
    end
    %run lrr
    Z = solve_lrr(X,lambda);
    %post processing
    [U,S,V] = svd(Z,'econ');
    S = diag(S);
    r = sum(S>1e-4*S(1));
    U = U(:,1:r);S = S(1:r);
    U = U*diag(sqrt(S));
    U = normr(U);
    L = (U*U').^4;
    % spectral clustering
    D = diag(1./sqrt(sum(L,2)));
    L = D*L*D;
    [U,S,V] = svd(L);
    V = U(:,1:K);
    V = D*V;
    idx = kmeans(V,K,'emptyaction','singleton','replicates',20,'display','off');
    err0 =  missclassGroups(idx,gnd,K)/length(idx);
    disp(['seq ' num2str(i) ',err=' num2str(err0)]);
    errs(i) = err0;
end
disp('results of all 156 sequences:');
disp(['max = ' num2str(max(errs)) ',min=' num2str(min(errs)) ...
    ',median=' num2str(median(errs)) ',mean=' num2str(mean(errs)) ',std=' num2str(std(errs))] );

errs = errs([1:id-1,id+1:end]);
disp('results of all 155 sequences:');
disp(['max = ' num2str(max(errs)) ',min=' num2str(min(errs)) ...
    ',median=' num2str(median(errs)) ',mean=' num2str(mean(errs)) ',std=' num2str(std(errs))] );

toc;