0001 function [K Y vars] = make_sift_kernel(c_dir,base_dir,sift_type,mode)
0002
0003 if nargin < 4
0004 mode = 1;
0005 end;
0006
0007 for sift_count=1:length(sift_type)
0008 F = [];
0009 Finfo = [];
0010 clear nfeat npoints
0011 class_count = 0;
0012 sample_count = 0;
0013 for ii=1:length(c_dir)
0014 class_count = class_count + 1;
0015 dir = [base_dir c_dir{ii} '\*_' sift_type{sift_count} '.txt'];
0016 if ispc
0017 S=ls(dir);
0018 else
0019 S=ls(dir,'-1');
0020 end;
0021 for jj=1:20
0022 sample_count = sample_count + 1;
0023 [F1,Inf,nfeat(sample_count),npoints(sample_count)] = readdescriptor([base_dir c_dir{ii} '\' S(jj,:)]);
0024 Y(sample_count) = ii;
0025 F = [F;F1];
0026 Finfo = [Finfo;Inf];
0027 SampleInd(sample_count) = class_count;
0028 end;
0029 end;
0030
0031 num_center = 200;
0032 rind = randperm(size(F,1));
0033 [centers,mincenter,mindist,q2,quality] = kmeans2(F,F(rind(1:num_center),:));
0034
0035 L = 2;
0036 Ktmp = make_pyramid_kernel(mincenter,Finfo,npoints,L,@hist_intersection,mode);
0037 if sift_count==1
0038 K = Ktmp;
0039 kern_ind = 1:size(Ktmp,3);
0040 else
0041 K(:,:,end+1:end+size(Ktmp,3)) = Ktmp;
0042 kern_ind = [(kern_ind(end)+1):(kern_ind(end)+size(Ktmp,3))];
0043 end;
0044 vars(sift_count) = struct('mincenter',mincenter,'npoints',npoints,'Finfo',Finfo,'shift_type',sift_type{sift_count},...
0045 'kern_ind',kern_ind);
0046 end;
0047
0048 for ii=1:size(K,3)
0049 K(:,:,ii) = K(:,:,ii)/trace(K(:,:,ii));
0050 end;