mirror of
https://github.com/introlab/rtabmap.git
synced 2026-09-13 23:10:20 +08:00
Added script to reproduce results from loop closure detection paper. Added option to show Recall at 100% precision directly from rtabmap-console. Fixed retrieval not working on loop closure detection mode-only. Fixed showLogs.m error with Octave.
This commit is contained in:
@@ -0,0 +1,25 @@
|
||||
|
||||
To reproduce results (based on parameters of this [paper](https://introlab.3it.usherbrooke.ca/mediawiki-introlab/images/b/bc/TRO2013.pdf)):
|
||||
|
||||
```
|
||||
rtabmap-console \
|
||||
--Rtabmap/StatisticLogged true\
|
||||
--Rtabmap/StatisticLoggedHeaders false\
|
||||
--Kp/DetectorStrategy 0\
|
||||
--Rtabmap/MemoryThr 300\
|
||||
--Rtabmap/LoopRatio 0.9\
|
||||
--SURF/HessianThreshold 150\
|
||||
--Mem/STMSize 30\
|
||||
--Vis/MaxFeatures 400\
|
||||
--Kp/TfIdfLikelihoodUsed false\
|
||||
--Kp/MaxFeatures 400\
|
||||
--Kp/BadSignRatio 0.25\
|
||||
--Mem/BadSignaturesIgnored true\
|
||||
--Mem/RehearsalSimilarity 0.20\
|
||||
--Mem/RecentWmRatio 0.2\
|
||||
-gt "~/Downloads/UdeS_1Hz.png"\
|
||||
~/Downloads/UdeS_1Hz
|
||||
```
|
||||
Adding the ground truth file here is optional to show recall at 100% precision at the end of the process directly without using the octave/MATLAB script below. For NewCollege and CityCentre datasets, `rtabmap-imagesJoiner` can be used to assemble the left and right images together.
|
||||
|
||||
To analyze with Octave/MATLAB, drop `LogF.txt` and `LogI.txt` generated files from command above in ShowLogs directly, then execute `showLogs.m`.
|
||||
@@ -1,4 +0,0 @@
|
||||
This directory contains some basic concepts on Bayes filtering.
|
||||
Main scripts :
|
||||
RecursivesBayes.m
|
||||
RecursivesBayesAvpd.m
|
||||
@@ -32,8 +32,7 @@ if ~isempty(GroundTruth)
|
||||
if size(GroundTruth, 1) ~= length(LogF(:,1)) || size(GroundTruth, 1) ~= length(LogI(:,1))
|
||||
error(['The ground truth size doesn''t match the log files (LogI=' num2str(length(LogI(:,1))) ', LogF=' num2str(length(LogF(:,1))) ', GT=' num2str(size(GroundTruth, 1)) ')'])
|
||||
end
|
||||
|
||||
|
||||
|
||||
%[highestHypot, CorrespondingID, GT, Accepted, Good, Index, UnderLoopRatio] descending order
|
||||
if(sum(LogI(:,8) == 10) > 0)
|
||||
%OLD
|
||||
@@ -111,14 +110,14 @@ if ~isempty(GroundTruth)
|
||||
index = find(PR(:,1) == 1);
|
||||
if ~isempty(index)
|
||||
maxRecall = PR(index(end),2) * 100;
|
||||
display(['Recall max (Precision=100%) = ' num2str(maxRecall) '% (p=' num2str(lc(index(end),1)) '), accepted=' num2str(sum(lc(1:index(end),5) & ~lc(1:index(end),7) & lc(1:index(end),2)))])
|
||||
display(['Recall max (Precision=100%) = ' num2str(maxRecall) '% (p=' num2str(lc(index(end),1)) '), accepted=' num2str(sum(lc(1:index(end),5) & ~lc(1:index(end),7) & lc(1:index(end),2))) '/' num2str(GT_total_positives)])
|
||||
else
|
||||
display('Recall max (Precision=100%) = 0')
|
||||
end
|
||||
indexAccepted = find(PR(:,3) == 1);
|
||||
if ~isempty(indexAccepted)
|
||||
maxRecall = PR(indexAccepted(end),2) * 100;
|
||||
display(['Recall max accepted (Precision=100%) = ' num2str(maxRecall) '% (p=' num2str(lc(indexAccepted(end),1)) '), accepted=' num2str(sum(lc(1:indexAccepted(end),5) & ~lc(1:indexAccepted(end),7) & lc(1:indexAccepted(end),2)))])
|
||||
display(['Recall max accepted (Precision=100%) = ' num2str(maxRecall) '% (p=' num2str(lc(indexAccepted(end),1)) '), accepted=' num2str(sum(lc(1:indexAccepted(end),5) & ~lc(1:indexAccepted(end),7) & lc(1:indexAccepted(end),2))) '/' num2str(GT_total_positives)])
|
||||
else
|
||||
display('Recall max accepted (Precision=100%) = 0')
|
||||
end
|
||||
|
||||
@@ -22,6 +22,8 @@ function [LogF LogI] = showlogs(PathPrefix, GT_file)
|
||||
set(0,'defaultAxesFontName', 'Times')
|
||||
set(0,'defaultTextFontName', 'Times')
|
||||
|
||||
close all
|
||||
|
||||
if nargin < 2, GT_file = ''; end
|
||||
if nargin < 1, PathPrefix = '.'; end
|
||||
|
||||
@@ -325,7 +327,7 @@ y(LogI(:, 1) == 0) = [];
|
||||
x(LogI(:, 1) == 0) = [];
|
||||
plot(x,y, 'g.')
|
||||
|
||||
set(datacursormode,'UpdateFcn',@(Y,X){sprintf('X: %0.2f',X.Position(1)),sprintf('Y: %0.2f',X.Position(2))})
|
||||
%set(datacursormode,'UpdateFcn',@(Y,X){sprintf('X: %0.2f',X.Position(1)),sprintf('Y: %0.2f',X.Position(2))})
|
||||
% %matched sign words
|
||||
% y = LogI(:,2);
|
||||
% x = 1:length(y);
|
||||
|
||||
Executable
+8
@@ -0,0 +1,8 @@
|
||||
#!/bin/bash
|
||||
|
||||
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"
|
||||
|
||||
$SCRIPT_DIR/run_bow.sh ~/loop_closure_detection_datasets/NewCollege ~/loop_closure_detection_datasets/NewCollege.png
|
||||
$SCRIPT_DIR/run_bow.sh ~/loop_closure_detection_datasets/CityCentre ~/loop_closure_detection_datasets/CityCentre.png
|
||||
$SCRIPT_DIR/run_bow.sh ~/loop_closure_detection_datasets/UdeS_1Hz ~/loop_closure_detection_datasets/UdeS_1Hz.png
|
||||
|
||||
Executable
+32
@@ -0,0 +1,32 @@
|
||||
#!/bin/bash
|
||||
|
||||
DATASET_FOLDER=""
|
||||
GT_FILE=""
|
||||
if [ $# -eq 2 ]
|
||||
then
|
||||
DATASET_FOLDER=$1
|
||||
GT_FILE=$2
|
||||
else
|
||||
echo "Usage: run_bow.sh \"dataset folder\" \"ground truth file\""
|
||||
exit
|
||||
fi
|
||||
|
||||
rtabmap-console \
|
||||
-quiet \
|
||||
--Rtabmap/StatisticLogged true\
|
||||
--Rtabmap/StatisticLoggedHeaders false\
|
||||
--Kp/DetectorStrategy 0\
|
||||
--SURF/HessianThreshold 150\
|
||||
--Rtabmap/MemoryThr 300\
|
||||
--Rtabmap/LoopRatio 0.9\
|
||||
--Mem/STMSize 30\
|
||||
--Vis/MaxFeatures 400\
|
||||
--Kp/TfIdfLikelihoodUsed false\
|
||||
--Kp/MaxFeatures 400\
|
||||
--Kp/BadSignRatio 0.25\
|
||||
--Mem/BadSignaturesIgnored true\
|
||||
--Mem/RehearsalSimilarity 0.20\
|
||||
--Mem/RecentWmRatio 0.20\
|
||||
-gt "$GT_FILE"\
|
||||
"$DATASET_FOLDER"
|
||||
|
||||
Reference in New Issue
Block a user