Source code for
vl_demo_dsift.m
This file is located in the toolbox/demo folder in VLFeat package.
% VL_DEMO_DSIFT Demo: DSIFT
randn('state',0) ;
rand('state',0) ;
% read a test image
I = imread(fullfile(vl_root,'data','roofs1.jpg')) ;
I = single(vl_imdown(rgb2gray(I))) ;
% --------------------------------------------------------------------
% Basic benchmark
% --------------------------------------------------------------------
binSize = 4 ; % bin size in pixels
magnif = 3 ; % bin size / keypoint scale
elaps_dsift = [] ;
elaps_dsift_fast = [] ;
err_dsift = [] ;
err_dsift_fast = [] ;
binSizeRange = [3 4 5 6] ;
for wi = 1:length(binSizeRange)
binSize = binSizeRange(wi) ;
scale = binSize / magnif ;
tic ;
[f, d] = vl_dsift(vl_imsmooth(I, sqrt(scale.^2 - .25)), ...
'size', binSize, ...
'step', 2, ...
'bounds', [20,20,210,140], ...
'floatdescriptors', ...
'verbose') ;
elaps_dsift(wi) = toc ;
tic ;
[f, dfast] = vl_dsift(vl_imsmooth(I, sqrt(scale.^2 - .25)), ...
'size', binSize, ...
'step', 2, ...
'bounds', [20,20,210,140], ...
'floatdescriptors', ...
'fast', ...
'verbose') ;
elaps_dsift_fast(wi) = toc ;
numKeys = size(f, 2) ;
f_ = [f ; ones(1, numKeys) * scale ; zeros(1, numKeys)] ;
tic ;
[f_, d_] = vl_sift(I, ...
'magnif', magnif, ...
'frames', f_, ...
'firstoctave', -1, ...
'levels', 5, ...
'floatdescriptors') ;
elaps_sift(wi) = toc ;
err_dsift(wi) = mean(mean(abs(d - d_)) ./ mean(d_)) * 100 ;
err_dsift_fast(wi) = mean(mean(abs(dfast - d_)) ./ mean(d_)) * 100 ;
end
figure(1) ; clf ; title('Descriptor SIFT') ;
plot(binSizeRange, [err_dsift ; err_dsift_fast]', 'linewidth', 3) ;
legend('DSIFT', 'DSIFT fast') ;
ylabel('Approx error (%)') ;
xlabel('binSize parameter') ;
grid on ;
axis square ;
figure(2) ; clf ; title('Speedup on regular SIFT') ;
plot(binSizeRange, ...
[elaps_sift ./ elaps_dsift ; ...
elaps_sift ./ elaps_dsift_fast ; ...
elaps_sift ./ elaps_sift], 'linewidth', 3) ;
legend('DSIFT', 'DSIFT fast', 'SIFT') ;
ylabel('Speedup') ;
xlabel('binSize parameter') ;
grid on ;
axis square ;
figure(1) ; vl_demo_print('dsift_accuracy') ;
figure(2) ; vl_demo_print('dsift_speedup') ;