Split RawDataKept parameter into Raw and Binary parameters to save RAM when keeping raw data in the core is not required

This commit is contained in:
Mathieu Labbe
2015-01-12 18:23:25 -05:00
parent cdb1e29d45
commit 6bd2a0926b
9 changed files with 49 additions and 21 deletions
+2 -1
View File
@@ -103,6 +103,7 @@ public:
std::map<int, Link> getLoopClosureLinks(int signatureId, std::map<int, Link> getLoopClosureLinks(int signatureId,
bool lookInDatabase = false) const; bool lookInDatabase = false) const;
bool isRawDataKept() const {return _rawDataKept;} bool isRawDataKept() const {return _rawDataKept;}
bool isBinDataKept() const {return _binDataKept;}
float getSimilarityThreshold() const {return _similarityThreshold;} float getSimilarityThreshold() const {return _similarityThreshold;}
std::map<int, int> getWeights() const; std::map<int, int> getWeights() const;
int getLastSignatureId() const; int getLastSignatureId() const;
@@ -183,7 +184,6 @@ private:
void copyData(const Signature * from, Signature * to); void copyData(const Signature * from, Signature * to);
Signature * createSignature( Signature * createSignature(
const SensorData & data, const SensorData & data,
bool keepRawData=false,
Statistics * stats = 0); Statistics * stats = 0);
//keypoint stuff //keypoint stuff
@@ -199,6 +199,7 @@ private:
// parameters // parameters
float _similarityThreshold; float _similarityThreshold;
bool _rawDataKept; bool _rawDataKept;
bool _binDataKept;
bool _keepRehearsedNodesInDb; bool _keepRehearsedNodesInDb;
bool _incrementalMemory; bool _incrementalMemory;
int _maxStMemSize; int _maxStMemSize;
+2 -1
View File
@@ -183,7 +183,8 @@ class RTABMAP_EXP Parameters
// Memory // Memory
RTABMAP_PARAM(Mem, RehearsalSimilarity, float, 0.6, "Rehearsal similarity."); RTABMAP_PARAM(Mem, RehearsalSimilarity, float, 0.6, "Rehearsal similarity.");
RTABMAP_PARAM(Mem, ImageKept, bool, true, "Keep images in db."); RTABMAP_PARAM(Mem, ImageKept, bool, false, "Keep raw images in RAM.");
RTABMAP_PARAM(Mem, BinDataKept, bool, true, "Keep binary data in db.");
RTABMAP_PARAM(Mem, RehearsedNodesKept, bool, true, "Keep rehearsed ndoes in db."); RTABMAP_PARAM(Mem, RehearsedNodesKept, bool, true, "Keep rehearsed ndoes in db.");
RTABMAP_PARAM(Mem, STMSize, unsigned int, 10, "Short-term memory size."); RTABMAP_PARAM(Mem, STMSize, unsigned int, 10, "Short-term memory size.");
RTABMAP_PARAM(Mem, IncrementalMemory, bool, true, "SLAM mode, othwersize it is Localization mode."); RTABMAP_PARAM(Mem, IncrementalMemory, bool, true, "SLAM mode, othwersize it is Localization mode.");
+12 -7
View File
@@ -57,6 +57,7 @@ Memory::Memory(const ParametersMap & parameters) :
_dbDriver(0), _dbDriver(0),
_similarityThreshold(Parameters::defaultMemRehearsalSimilarity()), _similarityThreshold(Parameters::defaultMemRehearsalSimilarity()),
_rawDataKept(Parameters::defaultMemImageKept()), _rawDataKept(Parameters::defaultMemImageKept()),
_binDataKept(Parameters::defaultMemBinDataKept()),
_keepRehearsedNodesInDb(Parameters::defaultMemRehearsedNodesKept()), _keepRehearsedNodesInDb(Parameters::defaultMemRehearsedNodesKept()),
_incrementalMemory(Parameters::defaultMemIncrementalMemory()), _incrementalMemory(Parameters::defaultMemIncrementalMemory()),
_maxStMemSize(Parameters::defaultMemSTMSize()), _maxStMemSize(Parameters::defaultMemSTMSize()),
@@ -363,6 +364,7 @@ void Memory::parseParameters(const ParametersMap & parameters)
ParametersMap::const_iterator iter; ParametersMap::const_iterator iter;
Parameters::parse(parameters, Parameters::kMemImageKept(), _rawDataKept); Parameters::parse(parameters, Parameters::kMemImageKept(), _rawDataKept);
Parameters::parse(parameters, Parameters::kMemBinDataKept(), _binDataKept);
Parameters::parse(parameters, Parameters::kMemRehearsedNodesKept(), _keepRehearsedNodesInDb); Parameters::parse(parameters, Parameters::kMemRehearsedNodesKept(), _keepRehearsedNodesInDb);
Parameters::parse(parameters, Parameters::kMemRehearsalIdUpdatedToNewOne(), _idUpdatedToNewOneRehearsal); Parameters::parse(parameters, Parameters::kMemRehearsalIdUpdatedToNewOne(), _idUpdatedToNewOneRehearsal);
Parameters::parse(parameters, Parameters::kMemGenerateIds(), _generateIds); Parameters::parse(parameters, Parameters::kMemGenerateIds(), _generateIds);
@@ -514,7 +516,7 @@ bool Memory::update(const SensorData & data, Statistics * stats)
//============================================================ //============================================================
// Create a signature with the image received. // Create a signature with the image received.
//============================================================ //============================================================
Signature * signature = this->createSignature(data, this->isRawDataKept(), stats); Signature * signature = this->createSignature(data, stats);
if (signature == 0) if (signature == 0)
{ {
UERROR("Failed to create a signature..."); UERROR("Failed to create a signature...");
@@ -2484,7 +2486,7 @@ cv::Mat Memory::getImageCompressed(int signatureId) const
{ {
image = s->getImageCompressed(); image = s->getImageCompressed();
} }
if(image.empty() && this->isRawDataKept() && _dbDriver) if(image.empty() && this->isBinDataKept() && _dbDriver)
{ {
_dbDriver->getNodeData(signatureId, image); _dbDriver->getNodeData(signatureId, image);
} }
@@ -2877,7 +2879,7 @@ private:
VWDictionary * _vwp; VWDictionary * _vwp;
}; };
Signature * Memory::createSignature(const SensorData & data, bool keepRawData, Statistics * stats) Signature * Memory::createSignature(const SensorData & data, Statistics * stats)
{ {
UASSERT(data.image().empty() || data.image().type() == CV_8UC1 || data.image().type() == CV_8UC3); UASSERT(data.image().empty() || data.image().type() == CV_8UC1 || data.image().type() == CV_8UC3);
UASSERT(data.depth().empty() || data.depth().type() == CV_16UC1 || data.depth().type() == CV_32FC1); UASSERT(data.depth().empty() || data.depth().type() == CV_16UC1 || data.depth().type() == CV_32FC1);
@@ -3283,7 +3285,7 @@ Signature * Memory::createSignature(const SensorData & data, bool keepRawData, S
} }
Signature * s; Signature * s;
if(keepRawData) if(this->isBinDataKept())
{ {
std::vector<unsigned char> imageBytes; std::vector<unsigned char> imageBytes;
std::vector<unsigned char> depthBytes; std::vector<unsigned char> depthBytes;
@@ -3323,9 +3325,6 @@ Signature * Memory::createSignature(const SensorData & data, bool keepRawData, S
data.cx(), data.cx(),
data.cy(), data.cy(),
data.localTransform()); data.localTransform());
s->setImageRaw(data.image());
s->setDepthRaw(depthOrRightImage);
s->setLaserScanRaw(data.laserScan());
} }
else else
{ {
@@ -3336,6 +3335,12 @@ Signature * Memory::createSignature(const SensorData & data, bool keepRawData, S
data.pose(), data.pose(),
util3d::compressData2(data.laserScan())); util3d::compressData2(data.laserScan()));
} }
if(this->isRawDataKept())
{
s->setImageRaw(data.image());
s->setDepthRaw(data.depth());
s->setLaserScanRaw(data.laserScan());
}
t = timer.ticks(); t = timer.ticks();
+1 -1
View File
@@ -158,7 +158,7 @@ OdometryBOW::OdometryBOW(const ParametersMap & parameters) :
customParameters.insert(ParametersPair(Parameters::kKpMaxDepth(), uNumber2Str(this->getMaxDepth()))); customParameters.insert(ParametersPair(Parameters::kKpMaxDepth(), uNumber2Str(this->getMaxDepth())));
customParameters.insert(ParametersPair(Parameters::kKpRoiRatios(), this->getRoiRatios())); customParameters.insert(ParametersPair(Parameters::kKpRoiRatios(), this->getRoiRatios()));
customParameters.insert(ParametersPair(Parameters::kMemRehearsalSimilarity(), "1.0")); // desactivate rehearsal customParameters.insert(ParametersPair(Parameters::kMemRehearsalSimilarity(), "1.0")); // desactivate rehearsal
customParameters.insert(ParametersPair(Parameters::kMemImageKept(), "false")); customParameters.insert(ParametersPair(Parameters::kMemBinDataKept(), "false"));
customParameters.insert(ParametersPair(Parameters::kMemSTMSize(), "0")); customParameters.insert(ParametersPair(Parameters::kMemSTMSize(), "0"));
int nn = Parameters::defaultOdomBowNNType(); int nn = Parameters::defaultOdomBowNNType();
float nndr = Parameters::defaultOdomBowNNDR(); float nndr = Parameters::defaultOdomBowNNDR();
+1 -1
View File
@@ -1256,7 +1256,7 @@ bool Rtabmap::process(const SensorData & data)
// override some parameters // override some parameters
uInsert(customParameters, ParametersPair(Parameters::kMemIncrementalMemory(), "true")); // make sure it is incremental uInsert(customParameters, ParametersPair(Parameters::kMemIncrementalMemory(), "true")); // make sure it is incremental
uInsert(customParameters, ParametersPair(Parameters::kMemRehearsalSimilarity(), "1.0")); // desactivate rehearsal uInsert(customParameters, ParametersPair(Parameters::kMemRehearsalSimilarity(), "1.0")); // desactivate rehearsal
uInsert(customParameters, ParametersPair(Parameters::kMemImageKept(), "false")); uInsert(customParameters, ParametersPair(Parameters::kMemBinDataKept(), "false"));
uInsert(customParameters, ParametersPair(Parameters::kMemSTMSize(), "0")); uInsert(customParameters, ParametersPair(Parameters::kMemSTMSize(), "0"));
uInsert(customParameters, ParametersPair(Parameters::kKpIncrementalDictionary(), "true")); // make sure it is incremental uInsert(customParameters, ParametersPair(Parameters::kKpIncrementalDictionary(), "true")); // make sure it is incremental
uInsert(customParameters, ParametersPair(Parameters::kKpNewWordsComparedTogether(), "false")); uInsert(customParameters, ParametersPair(Parameters::kKpNewWordsComparedTogether(), "false"));
+1 -1
View File
@@ -60,7 +60,7 @@ bool DataRecorder::init(const QString & path, bool recordInRAM)
ParametersMap customParameters; ParametersMap customParameters;
customParameters.insert(ParametersPair(Parameters::kMemRehearsalSimilarity(), "1.0")); // desactivate rehearsal customParameters.insert(ParametersPair(Parameters::kMemRehearsalSimilarity(), "1.0")); // desactivate rehearsal
customParameters.insert(ParametersPair(Parameters::kKpWordsPerImage(), "-1")); // desactivate keypoints extraction customParameters.insert(ParametersPair(Parameters::kKpWordsPerImage(), "-1")); // desactivate keypoints extraction
customParameters.insert(ParametersPair(Parameters::kMemImageKept(), "true")); // to keep images customParameters.insert(ParametersPair(Parameters::kMemBinDataKept(), "true")); // to keep images
if(!recordInRAM) if(!recordInRAM)
{ {
customParameters.insert(ParametersPair(Parameters::kDbSqlite3InMemory(), "false")); // to keep images customParameters.insert(ParametersPair(Parameters::kDbSqlite3InMemory(), "false")); // to keep images
+1 -1
View File
@@ -2839,7 +2839,7 @@ void MainWindow::postProcessing()
ParametersMap customParameters; ParametersMap customParameters;
// override some parameters // override some parameters
customParameters.insert(ParametersPair(Parameters::kMemRehearsalSimilarity(), "1.0")); // desactivate rehearsal customParameters.insert(ParametersPair(Parameters::kMemRehearsalSimilarity(), "1.0")); // desactivate rehearsal
customParameters.insert(ParametersPair(Parameters::kMemImageKept(), "false")); customParameters.insert(ParametersPair(Parameters::kMemBinDataKept(), "false"));
customParameters.insert(ParametersPair(Parameters::kMemSTMSize(), "0")); customParameters.insert(ParametersPair(Parameters::kMemSTMSize(), "0"));
customParameters.insert(ParametersPair(Parameters::kKpNewWordsComparedTogether(), "false")); customParameters.insert(ParametersPair(Parameters::kKpNewWordsComparedTogether(), "false"));
customParameters.insert(ParametersPair(Parameters::kKpNNStrategy(), parameters.at(Parameters::kLccReextractNNType()))); customParameters.insert(ParametersPair(Parameters::kKpNNStrategy(), parameters.at(Parameters::kLccReextractNNType())));
+1
View File
@@ -327,6 +327,7 @@ PreferencesDialog::PreferencesDialog(QWidget * parent) :
// Memory // Memory
_ui->general_checkBox_keepRawData->setObjectName(Parameters::kMemImageKept().c_str()); _ui->general_checkBox_keepRawData->setObjectName(Parameters::kMemImageKept().c_str());
_ui->general_checkBox_keepBinaryData->setObjectName(Parameters::kMemBinDataKept().c_str());
_ui->general_checkBox_keepRehearsedNodes->setObjectName(Parameters::kMemRehearsedNodesKept().c_str()); _ui->general_checkBox_keepRehearsedNodes->setObjectName(Parameters::kMemRehearsedNodesKept().c_str());
_ui->general_spinBox_maxStMemSize->setObjectName(Parameters::kMemSTMSize().c_str()); _ui->general_spinBox_maxStMemSize->setObjectName(Parameters::kMemSTMSize().c_str());
_ui->doubleSpinBox_similarityThreshold->setObjectName(Parameters::kMemRehearsalSimilarity().c_str()); _ui->doubleSpinBox_similarityThreshold->setObjectName(Parameters::kMemRehearsalSimilarity().c_str());
+28 -8
View File
@@ -64,8 +64,8 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>732</width> <width>744</width>
<height>1302</height> <height>1056</height>
</rect> </rect>
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout_16"> <layout class="QVBoxLayout" name="verticalLayout_16">
@@ -86,7 +86,7 @@
<enum>QFrame::Raised</enum> <enum>QFrame::Raised</enum>
</property> </property>
<property name="currentIndex"> <property name="currentIndex">
<number>0</number> <number>8</number>
</property> </property>
<widget class="QWidget" name="page_22"> <widget class="QWidget" name="page_22">
<layout class="QVBoxLayout" name="verticalLayout_29"> <layout class="QVBoxLayout" name="verticalLayout_29">
@@ -2811,6 +2811,16 @@ If set to false, classic RTAB-Map loop closure detection is done using only imag
<layout class="QVBoxLayout" name="verticalLayout_10"> <layout class="QVBoxLayout" name="verticalLayout_10">
<item> <item>
<layout class="QGridLayout" name="gridLayout_42" columnstretch="0,1"> <layout class="QGridLayout" name="gridLayout_42" columnstretch="0,1">
<item row="5" column="1">
<widget class="QLabel" name="label_retrieved_4">
<property name="text">
<string>Initialize the Woking Memory with all nodes from Long-Term memory, instead of only nodes of the last session. This may be useful in localization mode, where less processing time is required than in SLAM mode, so more nodes can be kept in Working Memory.</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item row="0" column="0"> <item row="0" column="0">
<widget class="QSpinBox" name="general_spinBox_maxStMemSize"> <widget class="QSpinBox" name="general_spinBox_maxStMemSize">
<property name="minimum"> <property name="minimum">
@@ -2936,16 +2946,26 @@ If set to false, classic RTAB-Map loop closure detection is done using only imag
</property> </property>
</widget> </widget>
</item> </item>
<item row="5" column="1"> <item row="6" column="1">
<widget class="QLabel" name="label_retrieved_4"> <widget class="QLabel" name="label_retrieved_5">
<property name="text"> <property name="text">
<string>Initialize the Woking Memory with all nodes from Long-Term memory, instead of only nodes of the last session. This may be useful in localization mode, where less processing time is required than in SLAM mode, so more nodes can be kept in Working Memory.</string> <string>Keep raw sensor data. Only useful to save loop closure computation time when features re-extraction is enabled. Disable to save RAM memory.</string>
</property> </property>
<property name="wordWrap"> <property name="wordWrap">
<bool>true</bool> <bool>true</bool>
</property> </property>
</widget> </widget>
</item> </item>
<item row="6" column="0">
<widget class="QCheckBox" name="general_checkBox_keepRawData">
<property name="text">
<string/>
</property>
<property name="checked">
<bool>false</bool>
</property>
</widget>
</item>
</layout> </layout>
</item> </item>
<item> <item>
@@ -3021,7 +3041,7 @@ If set to false, classic RTAB-Map loop closure detection is done using only imag
</property> </property>
<layout class="QGridLayout" name="gridLayout_11" columnstretch="0,1"> <layout class="QGridLayout" name="gridLayout_11" columnstretch="0,1">
<item row="0" column="0"> <item row="0" column="0">
<widget class="QCheckBox" name="general_checkBox_keepRawData"> <widget class="QCheckBox" name="general_checkBox_keepBinaryData">
<property name="text"> <property name="text">
<string/> <string/>
</property> </property>
@@ -3033,7 +3053,7 @@ If set to false, classic RTAB-Map loop closure detection is done using only imag
<item row="0" column="1"> <item row="0" column="1">
<widget class="QLabel" name="label_keepRawData"> <widget class="QLabel" name="label_keepRawData">
<property name="text"> <property name="text">
<string>Keep raw sensor data.</string> <string>Keep sensor compressed data.</string>
</property> </property>
<property name="wordWrap"> <property name="wordWrap">
<bool>true</bool> <bool>true</bool>