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