Files
2025-07-14 11:34:38 +08:00

254 lines
6.8 KiB
Matlab

close all
clear all
pkg load signal
# Use with files generated by export_stats.sh
dataDir = 'SET_PATH_TO_RESULTS_DIR';
resultsToShow = 1; % 1=single loc, 2=merged loc, 3=consecutive
datasetPrefix = 'Stat';
datasets = [0 1 6 7 9 14 11 111]; % 0 1 6 7 8 9 11 12
datasetsName = {'SURF' 'SIFT' 'ORB' 'FAST/FREAK' 'FAST/BRIEF' 'GFTT/FREAK' 'GFTT/BRIEF' 'BRISK' 'GFTT/ORB' 'KAZE' 'ORB-OCTREE' 'SuperPoint' 'SURF/FREAK' 'GFTT/DAISY' 'SURF/DAISY'};
datasetsName{112} = 'SuperGlue'
sep = [0, 1000, 3000, 5000, 7000, 9000, 12000];
sepName = {'16:51', '17:31', '17:58', '18:30', '18:59', '19:42'};
if resultsToShow == 3
sep = [0, 1000, 3000, 5000, 7000, 9000];
sepName = {'17:27', '17:54', '18:27', '18:56', '19:35'};
datasetPrefix = 'Consecutive'
endif
percentResults = {};
totalResults = {};
locResults = {};
figure
colors = get(gca, 'ColorOrder');
tmp=colors(3,:);
colors(3,:) = colors(5,:);
colors(5,:) = tmp;
globalSeparators = [];
globalx = [];
globaly = [];
globalc = [];
for d=1:length(datasets)
data = dlmread([dataDir '/' datasetPrefix num2str(datasets(d)) '-Loop-Map_id-' '.txt'], '\t', 1, 0, "emptyvalue", NaN);
curvesBeg = 2;
curvesEnd = size(data,2)-5; % -4 for '0', -5 for '1'
if resultsToShow == 2
curvesBeg = 8; % 2 if only 4 merged_reduced in stats, 8 to skip first 6
curvesEnd = size(data,2);
elseif resultsToShow == 3
curvesEnd = size(data,2);
endif
curves = curvesEnd - curvesBeg + 1;
percentResultsTmp = zeros(curves, length(sep)-1);
totalResultsTmp = zeros(curves, length(sep)-1);
locResultsTmp = zeros(curves, length(sep)-1);
offset = 1;
for i = 1:curves
index = i + curvesBeg - 1;
separators = [];
x_all = [];
y_all = [];
m_all = [];
previousMax = 0;
for j = 1:length(sep)-1
x = data(:,1);
y = data(:,index);
y = y(x>=sep(j) & x<=sep(j+1), :);
x = x(x>=sep(j) & x<=sep(j+1), :);
minimum = x(1,1);
separators = [separators previousMax];
x = x - (minimum-previousMax);
previousMax = x(end,1);
y = y + 1;
m = y;
y(y>0) = 1;
y(isnan(y)) = 0;
percent = sum(y)/length(y);
percentResultsTmp(i,j) = percent;
locResultsTmp(i,j) = sum(y);
totalResultsTmp(i,j) = length(y);
y(y>0) = -(d-1)*curves -i - (d-1)*offset;
%x(y==0) = nan;
m(y==0) = nan;
y(y==0) = nan;
if resultsToShow == 2
if i==1 %% Merged 1, 6
m(m==1) = 1;
m(m==2) = 6;
elseif i==2 %% Merged 1,3(2 sessions),5
m(m==1) = 1;
m(m==2) = 3;
m(m==3) = 3;
m(m==4) = 5;
elseif i==3 %% Merged 2(2 sessions),4,6
m(m==1) = 2;
m(m==2) = 2;
m(m==4) = 6;
m(m==3) = 4;
elseif i>=4 %% Merged 1, 2(2 sessions), 3(2 sessions),4,5,6
m(m==1) = 1;
m(m==2) = 2;
m(m==3) = 2;
m(m==4) = 3;
m(m==5) = 3;
m(m==6) = 4;
m(m==7) = 5;
m(m==8) = 6;
endif
endif
x = upsample(x, 2);
y = upsample(y, 2);
m = upsample(m, 2);
x(2:2:end-1) = x(3:2:end);
y(2:2:end-1) = y(3:2:end);
m(2:2:end) = m(1:2:end);
x = x(1:end-1);
y = y(1:end-1);
m = m(1:end-1);
x_all = [x_all nan x'];
y_all = [y_all nan y'];
m_all = [m_all nan m'];
endfor
if resultsToShow == 2
globalx = [globalx x_all];
globaly = [globaly y_all];
globalc = [globalc m_all];
else
plot(x_all,y_all, 'linewidth', 3, 'color', colors(i,:))
hold on
endif
separators = [separators previousMax];
globalSeparators = separators;
endfor
percentResults{1,d} = percentResultsTmp;
totalResults{1,d} = totalResultsTmp;
locResults{1,d} = locResultsTmp;
endfor
if resultsToShow == 2
indColors = ones(length(globalc), 3);
for j=1:length(globalc)
if ~isnan(globalc(j))
indColors(j,:) = colors(globalc(j),:);
endif
endfor
for i=1:6
tmpx = globalx;
tmpy = globaly;
tmpx(globalc~=i) = nan;
tmpy(globalc~=i) = nan;
plot(tmpx, tmpy, 'linewidth', 3, 'color', colors(i,:));
if i==1
hold on
endif
endfor
endif
for j=1:length(globalSeparators)
x = globalSeparators(j);
plot([x,x],[(-length(datasets)*(curves+1)) ,0], 'k','linewidth', 2);
endfor
for d=1:length(datasets)
annotation ("textbox", [0, 0.96-((d-0.5)/length(datasets))*0.95, 0,0], 'string', datasetsName{datasets(d)+1})
endfor
for s=1:length(sep)-1
annotation ("textbox", [0.1 + ((separators(s+1)-separators(s))/2+separators(s))/separators(end)*0.75, 0.98, 0,0], 'string', sepName{s})
endfor
axis('tight')
set(gca, 'units', 'normalized');
Tight = get(gca, 'Position');
NewPos = [Tight(1) 0.01 0.77 0.95]; %New plot position [X Y W H]
set(gca, 'Position', NewPos);
if length(sep) == 7
legend('16:46', '17:27', '17:54', '18:27', '18:56', '19:35', "location", 'northeastoutside' )
else
legend('16:46', '17:27', '17:54', '18:27', '18:56', "location", 'northeastoutside' )
endif
box off
axis off
#disp(percentResults);
#disp(totalResults);
figure;
for d=1:length(datasets)
subplot(4,2,d)
data=percentResults{1,d}*100;
data(isnan(data)) = 0;
hAxes = gca;
% Upscaling the image to reduce anti-aliasing effect in pfd viewers
scale = 50;
tickXStep = zeros(1, size(data, 2));
tickYStep = zeros(1, size(data, 1));
dataUp = upsample(upsample(data',scale)',scale);
for x=0:size(data, 2)-1
for y=1:scale-1
dataUp(:,(x*scale+1)+y) = dataUp(:,x*scale+1);
endfor
tickXStep(1,x+1) = scale/2 + scale*x;
endfor
for x=0:size(data, 1)-1
for y=1:scale-1
dataUp((x*scale+1)+y,:) = dataUp(x*scale+1,:);
endfor
tickYStep(1,x+1) = scale/2 + scale*x;
endfor
imagesc( hAxes, dataUp, [0, 100])
%title({"",datasetsName{datasets(d)+1}})
colors = [ones(100,1) [1:100]'*0.01 [1:100]'*0];
colors(1,:) = 1;
colormap( hAxes , colors)
c = colorbar;
labels = {};
for v=get(c,'ytick'), labels{end+1} = sprintf('%d%%',v); end
set(c,'yticklabel',labels);
if mod(d,2) == 1
ylabel("Map")
endif
xlabel([datasetsName{datasets(d)+1} " Localization"])
set(gca, "xaxislocation", "top");
set(gca, 'XTick', tickXStep)
set(gca, 'XTickLabel', sepName, 'fontsize',7)
set(gca, 'YTick', tickYStep)
if resultsToShow == 3
set(gca, 'YTickLabel', {'16:46', '17:27', '17:54', '18:27', '18:56'}, 'fontsize',7)
elseif resultsToShow == 2
set(gca, 'YTickLabel', {'1+6', '1+3+5', '2+4+6', '1+2+3+4+5+6', '1-2-3-4-5-6', 'not set'}, 'fontsize',7)
else
set(gca, 'YTickLabel', {'16:46', '17:27', '17:54', '18:27', '18:56', '19:35'}, 'fontsize',7)
endif
endfor
% compute cumulative localizations
cumResults = zeros(curves+2, length(datasets)+1);
for d=1:length(datasets)
cumResults(1,d+1) = datasets(d);
cumResults(2:end-1,d+1) = round(sum(locResults{1,d}, 2) ./ sum(totalResults{1,d}, 2) * 100);
if resultsToShow == 1
cumResults(end,d+1) = round(sum(sum(locResults{1,d}.*eye(curves,curves))) / sum(totalResults{1,d},2)(1,1) * 100);
endif
end
cumResults(2:end-1,1) = 1:curves;
cumResults