diff options
author | Jarkko Koivikko <jarkko.koivikko@code-q.fi> | 2015-03-18 12:21:22 +0200 |
---|---|---|
committer | Jarkko Koivikko <jarkko.koivikko@code-q.fi> | 2015-06-17 12:34:22 +0300 |
commit | 463d7f68c2619c36b1e2962df057467c5e0384b9 (patch) | |
tree | 85a035f2a6d295e0b8f90574dba51353ac9bec7c /src/virtualkeyboard/3rdparty | |
parent | a744f5ac960215384f28d0fac57f87ba9c401ee9 (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')
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 \ |