2014년 1월 29일 수요일

PCA LI-tracker의 함수

작성 중 ...


PCA L1 tracker의 메인 함수인 demo.m에서 호출하는 두 주요 함수는

estwarp_condens_PCAL1.m
sklm.m

이다.



function param = estwarp_condens_PCAL1(frm, tmpl, param, opt)
%% function param = estwarp_condens_PCAL1(frm, tmpl, param, opt)
%%      frm:                 Frame image;
%%      tmpl:                PCA model;
%%        -tmpl.mean:           PCA mean vector
%%        -tmpl.basis:          PCA basis vectors
%%        -tmpl.eigval:         The eigenvalues corresponding to basis vectors
%%        -tmpl.numsample:      The number of samples
%%      param:
%%        -param.est:           The estimation of the affine state of the tracked target 
%%        -param.wimg:          The collected sample for update
%%      opt:                 
%%        -opt.numsample:       The number of sampled candidates
%%        -opt.condenssig:      The variance of the Guassian likelihood function
%%        -opt.ff:              Forgotten factor;
%%        -opt.bacthsize:       The number of collected samples for update
%%        -opt.affsig:          The variance of affine parameters
%%        -opt.tmplsize:        The size of warpped image patch
%%        -opt.maxbasis:        The maximum number of basis vectors
%%        -opt.srParam:         The parameters of L1 minimization
%%        -opt.threshold:       The threshold for model update
%%DUT-IIAU-DongWang-2012-05-10
%%Dong Wang, Huchuan Lu, Minghsuan Yang, Online Object Tracking with Sparse
%%Prototypes, IEEE Transaction On Image Processing
%%http://ice.dlut.edu.cn/lu/index.html
%%wangdong.ice@gmail.com
%%

%%************************1.Candidate Sampling************************%%
%%Sampling Number
n = opt.numsample; % 600
%%Data Dimension
sz = size(tmpl.mean); % 32x32
N = sz(1)*sz(2); % 1024

%%Affine Parameter Sampling
% 600개의 affine 파라메터를 랜덤하게 생성
param.param = repmat(affparam2geom(param.est(:)), [1,n]);
% param.est를 600개 복사, size(param.param)=6x600 
% 여기서 주의할 점은 param.est를 그대로 사용안하고 
% affparam2geom으로 변환 후에 600개를 발생한다.
% affparam2geom의 출력은 [tx,ty,ramda1(수직길이),theta, ramda2/ramda1(길이비),phi]이다.
% 따라서 param.est는 [tx,ty,a11,a12,a21,a22]이다. 

randMatrix = randn(6,n); % 6x600, mean(randMatrix,2)=(0.023 0.042 ...-0.036)
param.param = param.param + randMatrix.*repmat(opt.affsig(:),[1,n]);

%%Extract or Warp Samples which are related to above affine parameters
wimgs = warpimg(frm, affparam2mat(param.param), sz);
% size(wimgs)=32x32x600, size(wimgs(:,:,600))=32x32->600개 중 하나의 영상


%%************************1.Candidate Sampling************************%%

%%*******************2.Calucate Likelihood Probablity*******************%%
%%Remove the average vector or Centralizing
diff = repmat(tmpl.mean(:),[1,n]) - reshape(wimgs,[N,n]);
% size(tmpl.mean(:))=1024x1, repmat(..,[1,600])은 이것을 600개의 열로 복사
% 따라서 repmat(...)의 크기는 1024x600, 같은 이미지를 600개의 열에 복사 
% size(reshape(wimgs,[N,n]))=1024x600
% size(diff)=1024x600, 변형에 따라 약간씩 평균과 다른 이미지 600개 

%
if  (size(tmpl.basis,2) > 0)
 
    %%(1)PCA_L1
    if  (size(tmpl.basis,2) == opt.maxbasis) % maxbasis=16
        %(1.1)Calucate representation coefficients of all candidates
        alpha = zeros(N+opt.maxbasis,n); % N(1024), opt.maxbasis(16), n(600)
        % alpha=1040x600
        for num = 1:n
            alpha(:,num) = pca_L1(diff(:,num), tmpl.basis, opt.srParam);
            % size(diff(:,1))=1024x1, tmpl.basis=1024x16,
            % opt.srParam(lambda(0.05), L0(0.05), maxLoopNum(20), tol(10e-3))
        end
        coeff = alpha(1:size(tmpl.basis,2),:);    %%The coefficients of PCA basis vectors
        % size(coeff)=16x600
        err = alpha(size(tmpl.basis,2)+1:end,:);  %%The coefficients of trivial templates
        % size(err) = 1024x600
        %%(1.2)Calucate observation likelihood via Eq.12
        diff = diff-tmpl.basis*coeff-err;         %%Reconstruction, diff=1024x600
        diff = diff.*(abs(err)<opt.srParam.L0);   % abs(err)<opt.srParam.L0 = 1024x600                          
        param.conf = exp(-(sum(diff.^2)
           +opt.srParam.L0*sum(abs(err)>=opt.srParam.L0))./opt.condenssig)';
        % sum(diff.^2)=1x600, sum은 각 열의 합. 
        % 두 항이 다 작아야 되는데, 앞의 항은 err가 작은 항들의 합이므로 가림이 없는 부분
        % 뒤 항은 err가 큰 항들의 합이니 가림 부분
        % 즉, 비 가림부분은 잔차가 작아야 하고, 가림 부분은 err의 합이 작아야(sparse) 해야 함.
    %%(2)Traditional PCA
    % diff는 이미 평균과 임의로 발생된 600개 이미지와의 차이 이미지이다.
    % 그런데 basis를 이용해서 diff를 변환한다. 
    %    
    % basis가 16개가 안되면 현재의 basis로 각 600개의 차 이미지를 표현하고
    % 600개 각각에서 pca로 표현된 이미지를 뺀다. 
    else % basis가 16개가 안될 때 수행
        coef = tmpl.basis'*diff;
        % coff=""5x600"", basis=1024x5, diff=1024x600
        % coff(:,1)->5차원의 축에서 1번째 영상의 좌표 (값 5개로 1번째 영상 표현) 
        % coff(:,2)->5차원의 축에서 2번째 "          (값 5개로 2번째 영상 표현)
        % size(tmpl.basis)=1024x5 (basis축에서 좌표 값으로 diff를 projection)
        % basis는 하나하나가 좌표축의 방향이다. 
        diff = diff - tmpl.basis*coef;
        % tmpl.basis*coef(:,1): 5개의 계수로 1번째 영상을 복원 
        % tmpl.basis*coef(:,2): 5개의 계수로 2번째 영상을 복원
        param.conf = exp(-sum(diff.^2)./opt.condenssig)';
    end
 
else % wimgs가 5개 이상이 되면 basis추출 연산이 수행되므로 wimgs가 5개가 되기 전 단계에서 수행
    %%(3)Square Error
    param.conf = exp(-sum(diff.^2)./opt.condenssig)'; %condenssig=0.25
    % size(diff.^2)=1024x600, size(sum(diff.^2))=1x600 
    % param.conf=600개, 비슷한 것이 큰 값임. 
end
%%*******************2.Calucate Likelihood Probablity*******************%%

%%*****3.Obtain the optimal candidate by MAP (maximum a posteriori)*****%%
param.conf = param.conf ./ sum(param.conf); % pdf를 위한 정규화 
[maxprob,maxidx] = max(param.conf); % maxprob=0.2233(130번째)
param.est = affparam2mat(param.param(:,maxidx));
% param.est에 저장은 [tx,ty,a11,a12,a21,a22]형태로 한다. 

%%*****3.Obtain the optimal candidate by MAP (maximum a posteriori)*****%%

%%************4.Collect samples for model update(Section III.C)***********%%
wimg = wimgs(:,:,maxidx);
if  (size(tmpl.basis,2) == opt.maxbasis)
    err = abs(alpha(size(tmpl.basis,2)+1:end,maxidx)); % err=1024x1
    %Compute the ratio
    errRatio = sum(err>opt.srParam.L0)/length(err); % 7/1024
    %Full update: occlusion이나 background clutter부분이 아주 작아 전체 영역을 갱신
    if  (errRatio < opt.threshold.low) % 0.1
        param.wimg = wimg; % 600개중의 최적의 이미지를 현 단계의 추적 이미지로 할당
        return;
    end
    %No update:
    %Occlusion이나 background clutter부분이 너무 많아 갱신을 하지 않음
    if  (errRatio > opt.threshold.high) % 0.6
        param.wimg = [];
        return;
    end
    %Partial update: 패치 내의 일부분의 영역만 occlusion이나 clutter임
    %이 경우는 가림 영역과 가려지지 않은 영역으로 분리하여
    %가려진 영역은 기존 mean영상의 부분에서 가져오고,
    %가려지지 않은 부분은 현재 프레임의 최적 데이터에서 가져와 합함.
    if  ((errRatio>opt.threshold.low) && (errRatio<opt.threshold.high))
        param.wimg = (1-(err>opt.srParam.L0)).*wimg(:) +
                                      (err>opt.srParam.L0).*tmpl.mean(:);
        % 식의 앞 부분 (1-(err>opt.srParam.L0)): occlusion이 있는 부분은 모두 0으로 
        % 만들고, 0이 아닌 부분만 wimg(:)의 데이터를 취함  
        % 뒷 부분 (err>opt.srParam.L0): 가림이 있는 부분만 취함. 이 부분은 모두 1이므로
        % tmpl.mean에서 데이터를 가져옴
        % 가림이 없는 부분은 현 프레임의 데이터, 있는 부분은 누적 평균 데이터에서 취함
        %  
        % 이 함수의 호출후 메인(demo.m)으로 리턴되면 param.wimg는 누적 됨.
        % 5 프레임까지는 누적 프레임의 평균을 구해 tmpl.mean에 저장(sklm.m에서 mu).
        % 누적 프레임이 5개가 되면 리셋됨. 
        param.wimg = reshape(param.wimg,size(wimg));
        return;
    end
else
    param.wimg = wimgs(:,:,maxidx);
end
%%************4.Collect samples for model update(Section III.C)***********%%




























댓글 없음:

댓글 쓰기