主函数
clc;clear;close all;warning off;
randn('state',0);
rand('state',0);
cd ./tldFile
mex -O distance.cpp
cd ..
initParam;
for frame = 2:nFrames
tic
fprintf('\n processing ## %d \n',frame);
% if frame==40
% fe=2;
% end
img = imread(img_dir(frame).name);
imgSr = img;% imgSr is used for showing tracking results.
% img = double(img(:,:,1));
img=im2double(img);
ImgHog = double(fhog(single(imgSr) / 255, cell_size, features.hog_orientations));
ImgHog(:,:,end) = []; %remove all-zeros channel ("truncation feature")
initstate0(1)=initstate(1);
initstate0(2)=initstate(2);
sampleImage = sampleImg(img,initstate,srchwinsz,0,1e5);
sampleImage0 = sampleImg(img,initstate0,srchwinsz,0,1e5);
[sample,response] = getFtrVal( img,sampleImage,sampleImage0,initFeatured , initFeatured0 ); %有p的代表相对坐标,后面两个是在整张图上的坐标
% size(sample,2)
res=zeros( size(sample,2) , 2*step+1 );
for ip=1 : size(sample,2)
left = sample(1,ip) ;
top = sample(2,ip) ;
right = left + sample(3,ip) - 1 ;
bottom = top + sample(4,ip) - 1 ;
xl = left-step : 1 : left+step; xl(xl<1) = 1;
xr = right+step : -1 : right-step; xr(xr>imgW) = imgW;
yt = top-step : 1 : top+step; yt(yt<1) = 1;
yb = bottom+step : -1 : bottom-step; yt(yt>imgH) = imgH;
for istate=1:2*step+1
candi_state{ip}(:,istate)=[xl(istate) yt(istate) xr(istate) yb(istate)]';
[ candi_fea_L( :,:,:,istate,ip ),candi_fea_G( :,:,istate,ip ) , ProDiv ]=compute_candi_fea(ImgHog,candi_state{ip}(:,istate),cell_size);
end
%% upate
if (~isempty(tmplL{1}.basis))
a = size(candi_fea_L,1);
b = size(candi_fea_L,2);
c = size(candi_fea_L,3);
d = 2*step+1;
e = size(sample,2);
difL=zeros(a,b,d,c);
cal=candi_fea_L(:,:,:,:,ip);
%local
for ic=1:c
meanl = tmplL{ic}.mean;
basisL = tmplL{ic}.basis;
cald=squeeze(cal(:,:,ic,:));
cald=reshape(cald,[a*b,d]);
difl=cald - repmat( meanl,[1,d]);
coef=basisL'*difl;
dif=difl-basisL*coef;
dif=reshape(dif,[a,b,d,1]);
difL(:,:,:,ic)=dif*ProDiv(ic);
end
diff_L=permute(difL,[1,2,4,3]) ;
%global
meanG=tmplG.mean;
basisG = tmplG.basis;
cag=candi_fea_G(:,:,:, ip);
cag=squeeze(cag);
cag=reshape(cag,[a*b,d]);
difg=cag - repmat( meanl,[1,d]);
coef=basisG'*difg;
dif=difg-basisG*coef;
diff_G=reshape(dif,[a,b,d,1]);
else
diff_L=candi_fea_L(:,:,:,:,ip)-repmat(fea_L0,[1,1,1,size(candi_fea_L,4)]);
diff_G=candi_fea_G(:,:,:, ip)-repmat(fea_G0,[1,1, size(candi_fea_G,3)]);
end
dL=squeeze( sum( sum(sum(abs(diff_L))) )); dL=dL(:);
dG=squeeze( sum(sum(abs(diff_G))) ); dG=dG(:);
co=dL.*dG;
res(ip,:)=response(ip)*co';
end
[rowp, colp] = find(res == min(res(:)), 1);
colp
% if colp>1
% colp=colp-1;
% end
fea_L=candi_fea_L(:,:,:,colp,rowp); fea_L=squeeze(fea_L);
fea_G=candi_fea_G(:,:,rowp); fea_G=squeeze(fea_G);
%% 用 fea_G 来更新 fea_G0
Gdata=[Gdata fea_G(:)];
if ( size( Gdata ,2 )>opt.batchsize )
[ Gdata , tmplG , paramG ]=update_cov( Gdata , tmplG , paramG ,opt );
end
%% 用 fea_L 来更新 fea_L0
for iLoc=1:9
loc_data=squeeze(fea_L(:,:,iLoc));
Ldata{iLoc}=[Ldata{iLoc} loc_data(:)];
if ( size( Ldata{iLoc},2 )>opt.batchsize )
[ Ldata{iLoc} , tmplL{iLoc} , paramL{iLoc} ]=update_cov( Ldata{iLoc} , tmplL{iLoc} , paramL{iLoc} , opt );
end
end
%%
state=candi_state{rowp}(:,colp);
state=state(:)'; %%[xl yt xr yb]
initstate=round(state);
initstate(1)=round( state(1) );
initstate(2)=round( state(2) );
initstate(3)=round( state(3) -state(1) + 1 );
initstate(4)=round( state(4) -state(2) + 1 ); %%[xl yt w h]
% %%
% if frame==2
% center(1)=round( initstate(2) + initstate(4)/2 );
% center(2)=round( initstate(1) + initstate(3)/2 );
% w_halfsize=round([ initstate(4)/2 initstate(3)/2]);
% else
% center(1)=round( stat(2) + stat(4)/2 );
% center(2)=round( stat(1) + stat(3)/2 );
% w_halfsize=round([ stat(4)/2 stat(3)/2]);
% end
% w_halfsize_bg=2*w_halfsize;
% [o_u,v_u]=rgbPDF_bg(double(imgSr),center,w_halfsize,w_halfsize_bg); % background model
% pir = cal_pidx(q_u,o_u);
% box=cal_use_logratio(double(imgSr),center,initstate(3),initstate(4),pir);
% initbox=box;
% initbox(3)=initbox(3)-initbox(1)+1;
% initbox(4)=initbox(4)-initbox(2)+1;
% sta=0.5*state+0.5*box';
% stat=round(sta);
% stat(3)=stat(3)-stat(1)+1;
% stat(4)=stat(4)-stat(2)+1;
%%
imshow(uint8(imgSr));
rectangle('Position',initstate,'LineWidth',4,'EdgeColor','r');
% rectangle('Position',initbox,'LineWidth',2,'EdgeColor','y');
% rectangle('Position',stat,'LineWidth',1,'EdgeColor','b');
hold on;
text(5, 18, strcat('#',num2str(frame)), 'Color','y', 'FontWeight','bold', 'FontSize',20);
set(gca,'position',[0 0 1 1]);
hold off;
% pos(1)=round( (initstate(1)+initstate(3))/2 );
% pos(2)=round( (initstate(2)+initstate(4))/2 );
pause(0.0001)
% unocc_func;
% patch=get_patch(img,initstate);
% initFeatured = dhash_feature_patch(patch);
[dx,dy]=gradient(img);
dhash_code=zeros(size(dx));
% dhash_code(dx>0)=1;
% maxd=max(max(dhash_code));
% mind=min(min(dhash_code));
% dhash_code( dx>=maxd/2 )=1;
% dhash_code( dx<maxd/2 & dx>mind/2 )=0;
% dhash_code( dx<=mind/2 )=-1;
% maxd=max(max(dhash_code)); maxd=squeeze(maxd);
% mind=min(min(dhash_code)); mind=squeeze(mind);
for i=1:size(dx,3)
img1=img(:,:,i);
dx1=dx(:,:,i);
dd=zeros(size(dx1)); dd=squeeze(dd);
% dd( dx1>=maxd(i)/4 )=1;
% dd( dx1<maxd(i)/4 & dx1>mind(i)/4 )=0;
% dd( dx1<=mind(i)/4 )=-1;
dd( dx1 >= 0 )=1;
dhash_code(:,:,i)=dd;
end
xx = initstate(1) : 1 : initstate(1)+initstate(3)-1;
yy = initstate(2) : 1 : initstate(2)+initstate(4)-1;
xx(xx<1) = 1;
xx(xx>imgW) = imgW;
yy(yy<1) = 1;
yy(yy>imgH) = imgH;
initFeatured = dhash_code( yy , xx , : );
% initFeatured = dhash_code( initstate(2) : initstate(2)+initstate(4)-1 , initstate(1) : initstate(1)+initstate(3)-1 , : );
t1=toc;
% hfigure = getframe(gca);
% imwrite(hfigure.cdata,[directory,sprintf('%03d',frame),'patch','.png']);
end
初始化函数
addpath('./tldFile')
% addpath('E:\MATLABcode\tracking\Kalman tracking\libsvm-3.18\libsvm-3.18\matlab')
% addpath('E:\MATLABcode\tracking\Kalman tracking\libsvm_complement\')
% addpath('E:\MATLABcode\tracking\Kalman tracking\libsvm_complement\implement[by faruto]\')
% addpath('E:\image set\benchmark\Lemming\img')
% addpath('E:\MATLABcode\tracking\Kalman tracking\car')
% addpath('E:\image set\TLD_DATASET\09_carchase')
% addpath('E:\MATLABcode\tracking\CMT\cmt_dataset\person crossing')
addpath('E:\image set\benchmark\Tiger2\img')
% addpath('E:\image set\girl\imgs')
% addpath('E:\image set\benchmark\Jogging\Jogging\img')
% addpath('E:\image set\Datasets_scm\dataset\animal')
% addpath('E:\image set\Datasets_scm\dataset\board')
% addpath('E:\image set\Datasets_scm\dataset\faceocc2')
% addpath('E:\image set\Datasets_scm\dataset\singer1')
% addpath('E:\image set\Datasets_scm\dataset\stone')
% addpath('E:\image set\Datasets_scm\dataset\woman_sequence')
%%
% img_dir = dir('E:\image set\benchmark\Lemming\img\*.jpg');
% img_dir = dir('E:\MATLABcode\tracking\Kalman tracking\car\*.jpg');
% img_dir=dir('E:\image set\TLD_DATASET\09_carchase\*.jpg');
% img_dir=dir('E:\MATLABcode\tracking\CMT\cmt_dataset\person crossing\*.png');
img_dir=dir('E:\image set\benchmark\Tiger2\img\*.jpg');
% img_dir=dir('E:\image set\girl\imgs\*.png');
% img_dir=dir('E:\image set\benchmark\Jogging\Jogging\img\*.jpg');
% img_dir=dir('E:\image set\Datasets_scm\dataset\animal\*.png');
% img_dir=dir('E:\image set\Datasets_scm\dataset\board\*.png');
% img_dir=dir('E:\image set\Datasets_scm\dataset\faceocc2\*.png');
% img_dir=dir('E:\image set\Datasets_scm\dataset\singer1\*.png');
% img_dir=dir('E:\image set\Datasets_scm\dataset\stone\*.png');
% img_dir=dir('E:\image set\Datasets_scm\dataset\woman_sequence\*.png');
%%
% load init.txt;
% initstate=init;
% initstate=[40,199,61,103]; % lemmingg
% initstate=[142,125,232-142,164-125]; %car
% initstate=[145,84,199-145,121-84]; %carchase
% initstate=round( [107.93,46.55,56.69,157.02] ); %personcross
initstate=[32,60,68,78]; %tiger2
% initstate=[128,46,104,127]; % E:\image set\girl
% initstate=[111 98 25 101]; % jogging1
% initstate=[180 79 37 114]; % jogging2
% initstate=round( [350-100/2, 40-70/2, 100, 70] ); % animal
% initstate=round( [154-195/2 ,243-153/2 ,195 ,153]); % board
% initstate=round( [156-74/2,107-100/2,74,100] ); % faceocc2
% initstate=round( [100-100/2, 200-300/2, 100, 300] ); % singer1
% initstate=round( [115-43/2 150-20/2 43 20] ); % stone
% initstate=round( [222-35/2 165-95/2 35 95] ); %woman
initstate0 = initstate;
init=initstate;
init(3)=init(1)+init(3)-1;
init(4)=init(2)+init(4)-1;
%%
% init=[xl yt xr yb]
% initstate=[xl yt w h]
%%
nFrames = length(img_dir);% number of frames 这个data文件中一共有462张图
fprintf('\n processing ## %d \n',1);
img = imread(img_dir(1).name);
imgSr = img;% imgSr is used for showing tracking results.
% img = double(img(:,:,1));
img=im2double(img);
imgH=size(img,1);
imgW=size(img,2);
%
% unocc=ones(initstate(4),initstate(3));
% unocc=repmat( unocc , [1,1,size(img,3)] );
% patch_update = get_patch(img,initstate);
% lRate=0.975;
srchwinsz = 20 ;% size of search window
step = 3 ;
% patch=get_patch(img,initstate);
[dx,dy]=gradient(img);
dhash_code=zeros(size(dx));
% dhash_code(dx>0)=1;
% maxd=max(max(dhash_code)); maxd=squeeze(maxd);
% mind=min(min(dhash_code)); mind=squeeze(mind);
for i=1:size(dx,3)
% img1=img(:,:,i);
% dx1=dx(:,:,i);
% dd=zeros(size(dx1)); dd=squeeze(dd);
% dd( dx1>=maxd(i)/4 )=1;
% dd( dx1<maxd(i)/4 & dx1>mind(i)/4 )=0;
% dd( dx1<=mind(i)/4 )=-1;
% dhash_code(:,:,i)=dd;
img1=img(:,:,i);
dx1=dx(:,:,i);
dd=zeros(size(dx1)); dd=squeeze(dd);
% dd( dx1>=maxd(i)/4 )=1;
% dd( dx1<maxd(i)/4 & dx1>mind(i)/4 )=0;
% dd( dx1<=mind(i)/4 )=-1;
dd( dx1 >= 0 )=1;
% dd( dx1 < 0 )=-1;
dhash_code(:,:,i)=dd;
end
initFeatured0 = dhash_code( init(2) : init(4) , init(1) : init(3) , : );
initFeatured = initFeatured0;
init=init(:);
features.hog = true;
features.hog_orientations = 9;
features.gray = false;
cell_size = 4;
ImgHog = double(fhog(single(imgSr) / 255, cell_size, features.hog_orientations));
ImgHog(:,:,end) = []; %remove all-zeros channel ("truncation feature")
[ fea_L0 , fea_G0 ,ProDiv ]=compute_candi_fea(ImgHog,init,cell_size);
%[31*31*9 , 31*31 ]
imshow(imgSr);
rectangle('Position',initstate,'LineWidth',4,'EdgeColor','r');
pause(0.0001)
% hfigure = getframe(gca);
% imwrite(hfigure.cdata,[directory,sprintf('%03d',1),'patch','.png']);
%% sklm
%% local
for i=1:9
datal=squeeze( fea_L0(:,:,i) );
tmplL{i}.mean = mean( datal(:),2 );
tmplL{i}.basis = [];
tmplL{i}.eigval = [];
tmplL{i}.numsample = 0;
Ldata{i}=[];
paramL{i}={};
end
%% global
tmplG.mean = mean(fea_G0(:),2);
tmplG.basis = [];
tmplG.eigval = [];
tmplG.numsample = 0;
Gdata=[];
paramG={};
%%
opt.ff = 1; %forgetting factor
opt.batchsize = 8;
opt.maxbasis = 16;
%% 颜色似然
w_halfsize=round( [initstate(4)/2 ,initstate(3)/2]);
w_halfsize_bg=2*w_halfsize;
center(1)=round( ( init(2)+init(4) )/2 );
center(2)=round( ( init(1)+init(3) )/2 );
q_u=rgbPDF( double(imgSr) ,center,w_halfsize);
[o_u,v_u]=rgbPDF_bg(double(imgSr),center,w_halfsize,w_halfsize_bg); % background model
pir = cal_pidx(q_u,o_u);
q_u=q_u.*v_u/(q_u*v_u');
dhash特征的函数
function [ oBB , oConf ] = getFtrVal( img,samples,samples0,initFeatured ,initFeatured0)
sx = samples.sx;
sy = samples.sy;
sw = samples.sw;
sh = samples.sh;
sx0 = samples0.sx;
sy0 = samples0.sy;
sw0 = samples0.sw;
sh0 = samples0.sh;
imgHeight = size(img,1);
imgWidth = size(img,2);
% BW = edge(img,'canny');
% maximg=max(max(img));
% img(BW==1)=maximg;
[dx,dy]=gradient(img);
dhash_code=zeros(size(dx));
%% 1 this is fine
% maxd=max(max(dhash_code));
% mind=min(min(dhash_code));
% dhash_code( dx>=maxd/2 )=1;
% dhash_code( dx<maxd/2 & dx>mind/2 )=0;
% dhash_code( dx<=mind/2 )=-1;
% maxd=max(max(dhash_code)); maxd=squeeze(maxd);
% mind=min(min(dhash_code)); mind=squeeze(mind);
for i=1:size(dx,3)
img1=img(:,:,i);
dx1=dx(:,:,i);
dd=zeros(size(dx1)); dd=squeeze(dd);
% dd( dx1>=maxd(i)/4 )=1;
% dd( dx1<maxd(i)/4 & dx1>mind(i)/4 )=0;
% dd( dx1<=mind(i)/4 )=-1;
dd( dx1 >= 0 )=1;
% dd( dx1 < 0 )=-1;
dhash_code(:,:,i)=dd;
end
% dhash_code(dx>0)=1;
kk=5;
for i=1:size(sx,2)
xs=sx(i):1:sx(i)+sw(i)-1;
ys=sy(i):1:sy(i)+sh(i)-1;
xs(xs < 1) = 1;
ys(ys < 1) = 1;
xs(xs > imgWidth) = imgWidth ;
ys(ys > imgHeight) = imgHeight ;
ys=ys(1,kk:end-kk);
xs=xs(1,kk:end-kk);
fea=dhash_code(ys, xs, :);
diff(i) = sum( sum(sum(abs( fea-initFeatured(kk:end-kk,kk:end-kk,:) ))) )/(sw(i)*sh(i)*3);
% diff(i) = sum( sum(sum(abs( unocc.*(fea-initFeatured) ))) )/(sw(i)*sh(i));
end
for i=1:size(sx0,2)
xs=sx0(i):1:sx0(i)+sw0(i)-1;
ys=sy0(i):1:sy0(i)+sh0(i)-1;
xs(xs < 1) = 1;
ys(ys < 1) = 1;
xs(xs > imgWidth) = imgWidth ;
ys(ys > imgHeight) = imgHeight ;
ys=ys(1,kk:end-kk);
xs=xs(1,kk:end-kk);
fea=dhash_code(ys, xs, :);
diff0(i)= sum( sum(sum(abs( fea-initFeatured0(kk:end-kk,kk:end-kk,:) ))) )/(sw0(i)*sh0(i)*3);
end
response=[diff(:) ;diff0(:)];
SampleReg=[sx,sx0;sy,sy0;sw,sw0;sh,sh0];
resTh=sort(response(:),'ascend');
index=find( response<=resTh(20) );
sample=SampleReg(:,index);
response=response(index,:);
SPACE_THR=0.05;
bb=sample;
bb(3:4,:)=bb(3:4,:)+bb(1:2,:)-1;
bbd = bb_distance(bb);
Z = linkagemex(bbd,'si');
T = cluster(Z,'cutoff', SPACE_THR,'criterion','distance');
idx_cluster = unique(T);
num_clusters = length(idx_cluster);
oBB = nan(4,num_clusters);
oConf = nan(1,num_clusters);
for i = 1:num_clusters
idx = T == idx_cluster(i);
oBB(:,i) = mean(bb(1:4,idx),2);
oConf(i) = mean(response(idx));
end
oBB(3:4,:)=oBB(3:4,:)-oBB(1:2,:)+1;
%
% for i=1:length(index)
% s=[sx(index(i)) sy(index(i)) sw(index(i)) sh(index(i))]';
% SampleReg=[SampleReg s];
% response=[response ; diff(index(i))];
% end
% for i=1:length(index0)
% s=[sx0(index0(i)) sy0(index0(i)) sw0(index0(i)) sh0(index0(i))]';
% SampleReg=[SampleReg s];
% response=[response ; diff(index0(i))];
% end