aboutsummaryrefslogtreecommitdiffstats
path: root/src/virtualkeyboard/3rdparty
diff options
context:
space:
mode:
authorJarkko Koivikko <jarkko.koivikko@code-q.fi>2015-03-18 12:21:22 +0200
committerJarkko Koivikko <jarkko.koivikko@code-q.fi>2015-06-17 12:34:22 +0300
commit463d7f68c2619c36b1e2962df057467c5e0384b9 (patch)
tree85a035f2a6d295e0b8f90574dba51353ac9bec7c /src/virtualkeyboard/3rdparty
parenta744f5ac960215384f28d0fac57f87ba9c401ee9 (diff)
lipi-toolkit: Add optimization to model loading (nn)
This change approximately halves the time spent loading the model data. Change-Id: I50e5dc462dab409ce013a39dd2f11eac1d4051a4 Reviewed-by: Gatis Paeglis <gatis.paeglis@theqtcompany.com>
Diffstat (limited to 'src/virtualkeyboard/3rdparty')
-rw-r--r--src/virtualkeyboard/3rdparty/lipi-toolkit/src/reco/shaperec/common/LTKShapeSample.cpp22
-rw-r--r--src/virtualkeyboard/3rdparty/lipi-toolkit/src/reco/shaperec/common/LTKShapeSample.h8
-rw-r--r--src/virtualkeyboard/3rdparty/lipi-toolkit/src/reco/shaperec/nn/NNShapeRecognizer.cpp49
-rw-r--r--src/virtualkeyboard/3rdparty/lipi-toolkit/src/reco/shaperec/nn/nn.pro4
4 files changed, 83 insertions, 0 deletions
diff --git a/src/virtualkeyboard/3rdparty/lipi-toolkit/src/reco/shaperec/common/LTKShapeSample.cpp b/src/virtualkeyboard/3rdparty/lipi-toolkit/src/reco/shaperec/common/LTKShapeSample.cpp
index e5c52573..4044c86f 100644
--- a/src/virtualkeyboard/3rdparty/lipi-toolkit/src/reco/shaperec/common/LTKShapeSample.cpp
+++ b/src/virtualkeyboard/3rdparty/lipi-toolkit/src/reco/shaperec/common/LTKShapeSample.cpp
@@ -189,6 +189,28 @@ const vector<LTKShapeFeaturePtr>& LTKShapeSample::getFeatureVector() const
}
/**********************************************************************************
+ * AUTHOR : The Qt Company
+ * DATE : 17-Mar-2015
+ * NAME : getFeatureVectorRef
+ * DESCRIPTION :
+ * ARGUMENTS :
+ * RETURNS :
+ * NOTES :
+ * CHANGE HISTROY
+ * Author Date Description of change
+ * ************************************************************************************/
+vector<LTKShapeFeaturePtr>& LTKShapeSample::getFeatureVectorRef()
+{
+ LOG( LTKLogger::LTK_LOGLEVEL_DEBUG)<<
+ "Entering LTKShapeSample:getFeatureVectorRef()" <<endl;
+
+ LOG( LTKLogger::LTK_LOGLEVEL_DEBUG)<<
+ "Exiting LTKShapeSample:getFeatureVectorRef()" <<endl;
+
+ return m_featureVector;
+}
+
+/**********************************************************************************
* AUTHOR : Saravanan R.
* DATE : 22-Mar-2007
* NAME : getClassID
diff --git a/src/virtualkeyboard/3rdparty/lipi-toolkit/src/reco/shaperec/common/LTKShapeSample.h b/src/virtualkeyboard/3rdparty/lipi-toolkit/src/reco/shaperec/common/LTKShapeSample.h
index dc8fb9af..02ec1f7f 100644
--- a/src/virtualkeyboard/3rdparty/lipi-toolkit/src/reco/shaperec/common/LTKShapeSample.h
+++ b/src/virtualkeyboard/3rdparty/lipi-toolkit/src/reco/shaperec/common/LTKShapeSample.h
@@ -91,6 +91,14 @@ class LTKShapeSample
/**
+ * @brief getter method for feature vector
+ * @param none
+ * @return featureVec Type : LTKShapeFeaturePtrtor
+ */
+ vector<LTKShapeFeaturePtr>& getFeatureVectorRef();
+
+
+ /**
* @brief setter method for class ID
* @param none
* @return classID Type : int
diff --git a/src/virtualkeyboard/3rdparty/lipi-toolkit/src/reco/shaperec/nn/NNShapeRecognizer.cpp b/src/virtualkeyboard/3rdparty/lipi-toolkit/src/reco/shaperec/nn/NNShapeRecognizer.cpp
index f3b2d8a3..1b9191a9 100644
--- a/src/virtualkeyboard/3rdparty/lipi-toolkit/src/reco/shaperec/nn/NNShapeRecognizer.cpp
+++ b/src/virtualkeyboard/3rdparty/lipi-toolkit/src/reco/shaperec/nn/NNShapeRecognizer.cpp
@@ -1883,6 +1883,9 @@ int NNShapeRecognizer::loadModelData()
else
{
+#ifdef OPTIMIZE_LOAD_MODEL_DATA
+ floatVector floatFeatureVectorBuffer;
+#endif
while(!mdtFileHandle.eof())
{
@@ -1899,9 +1902,30 @@ int NNShapeRecognizer::loadModelData()
mdtFileHandle.read((char*) &numberOfFeatures, intSize);
mdtFileHandle.read((char*) &featureDimension, intSize);
+#ifdef OPTIMIZE_LOAD_MODEL_DATA
+ m_prototypeSet.push_back(shapeSampleFeatures);
+ LTKShapeSample &shapeSampleFeaturesRef = m_prototypeSet.back();
+ shapeSampleFeaturesRef.setClassID(classId);
+
+ // Read all features in one batch
+ size_t floatFeatureVectorElementCount = numberOfFeatures * featureDimension;
+ floatFeatureVectorBuffer.resize(floatFeatureVectorElementCount);
+ mdtFileHandle.read((char*) &floatFeatureVectorBuffer.front(), floatFeatureVectorElementCount * floatSize);
+ if ( mdtFileHandle.fail() )
+ {
+ break;
+ }
+#endif
+
int featureIndex = 0;
+#ifdef OPTIMIZE_LOAD_MODEL_DATA
+ vector<LTKShapeFeaturePtr>& shapeFeatureVector = shapeSampleFeaturesRef.getFeatureVectorRef();
+ shapeFeatureVector.reserve(numberOfFeatures);
+ floatVector::const_iterator floatFeatureVectorBufferIterator = floatFeatureVectorBuffer.begin();
+#else
vector<LTKShapeFeaturePtr> shapeFeatureVector;
+#endif
LTKShapeFeaturePtr shapeFeature;
for ( ; featureIndex < numberOfFeatures ; featureIndex++)
@@ -1911,8 +1935,16 @@ int NNShapeRecognizer::loadModelData()
shapeFeature = m_ptrFeatureExtractor->getShapeFeatureInstance();
+#ifdef OPTIMIZE_LOAD_MODEL_DATA
+ floatFeatureVector.reserve(featureDimension);
+#endif
for(; featureValueIndex < featureDimension ; featureValueIndex++)
{
+#ifdef OPTIMIZE_LOAD_MODEL_DATA
+ float featureValue = *floatFeatureVectorBufferIterator;
+ floatFeatureVectorBufferIterator++;
+ floatFeatureVector.push_back(featureValue);
+#else
float featureValue = 0.0f;
mdtFileHandle.read((char*) &featureValue, floatSize);
@@ -1923,6 +1955,7 @@ int NNShapeRecognizer::loadModelData()
{
break;
}
+#endif
}
if (shapeFeature->initialize(floatFeatureVector) != SUCCESS)
@@ -1938,6 +1971,19 @@ int NNShapeRecognizer::loadModelData()
shapeFeatureVector.push_back(shapeFeature);
}
+
+#ifdef OPTIMIZE_LOAD_MODEL_DATA
+ //Add to Map
+ intIntMap::iterator mapEntry;
+ if( (mapEntry = m_shapeIDNumPrototypesMap.find(classId))==m_shapeIDNumPrototypesMap.end())
+ {
+ m_shapeIDNumPrototypesMap[classId] = 1;
+ }
+ else
+ {
+ ++mapEntry->second;
+ }
+#else
//Set the feature vector and class id to the shape sample features
shapeSampleFeatures.setFeatureVector(shapeFeatureVector);
shapeSampleFeatures.setClassID(classId);
@@ -1954,13 +2000,16 @@ int NNShapeRecognizer::loadModelData()
{
++(m_shapeIDNumPrototypesMap[classId]);
}
+#endif
+#ifndef OPTIMIZE_LOAD_MODEL_DATA
//Clearing the vectors
shapeFeatureVector.clear();
tokens.clear();
classId = -1;
strFeatureVector = "";
+#endif
}
diff --git a/src/virtualkeyboard/3rdparty/lipi-toolkit/src/reco/shaperec/nn/nn.pro b/src/virtualkeyboard/3rdparty/lipi-toolkit/src/reco/shaperec/nn/nn.pro
index 6de2ce34..24474651 100644
--- a/src/virtualkeyboard/3rdparty/lipi-toolkit/src/reco/shaperec/nn/nn.pro
+++ b/src/virtualkeyboard/3rdparty/lipi-toolkit/src/reco/shaperec/nn/nn.pro
@@ -12,6 +12,10 @@ TARGET = nn
target.path = $$[QT_INSTALL_DATA]/qtvirtualkeyboard/lipi_toolkit/lib
INSTALLS += target
+# Applies series of optimizations to NNShapeRecognizer::loadModelData() function
+# Avarage performance gain: x2
+DEFINES += OPTIMIZE_LOAD_MODEL_DATA
+
INCLUDEPATH += \
../../../include \
../../../util/lib \