diff options
author | Jarkko Koivikko <jarkko.koivikko@code-q.fi> | 2015-08-18 11:52:32 +0300 |
---|---|---|
committer | Jarkko Koivikko <jarkko.koivikko@code-q.fi> | 2015-08-27 06:57:03 +0000 |
commit | 724c5fd14d6dc397e07c791e990543cea227864f (patch) | |
tree | 0e771b1e94ff8ad5f2f16454a68b3d30c0668b96 /src/virtualkeyboard/3rdparty | |
parent | 478ad59bd91a277f45224ba4d33dd36b66535c2c (diff) |
lipi-toolkit: Optimize model loading
Avoid unnecessary use of std::vector during model loading. Instead,
load the data directly from the input buffer. This change improves
the performance of model loading, since it eliminates construction
and destruction of std::vector in a hot code path.
Change-Id: Ib886386a68979f1717896674ed525242f90d806c
Reviewed-by: Mitch Curtis <mitch.curtis@theqtcompany.com>
Diffstat (limited to 'src/virtualkeyboard/3rdparty')
4 files changed, 20 insertions, 23 deletions
diff --git a/src/virtualkeyboard/3rdparty/lipi-toolkit/src/reco/shaperec/featureextractor/common/LTKShapeFeature.h b/src/virtualkeyboard/3rdparty/lipi-toolkit/src/reco/shaperec/featureextractor/common/LTKShapeFeature.h index cf2018dc..c233d3c5 100644 --- a/src/virtualkeyboard/3rdparty/lipi-toolkit/src/reco/shaperec/featureextractor/common/LTKShapeFeature.h +++ b/src/virtualkeyboard/3rdparty/lipi-toolkit/src/reco/shaperec/featureextractor/common/LTKShapeFeature.h @@ -103,6 +103,8 @@ public: virtual int initialize(const floatVector& initFloatVector)=0; + virtual int initialize(floatVector::const_pointer initFloatData, size_t dataSize) { (void)initFloatData; (void)dataSize; return SUCCESS; } + /** * <b>Responsibility</b><br> * This function returns the character (char*) representation for the instance of type LTKShapeFeature. diff --git a/src/virtualkeyboard/3rdparty/lipi-toolkit/src/reco/shaperec/featureextractor/pointfloat/PointFloatShapeFeature.cpp b/src/virtualkeyboard/3rdparty/lipi-toolkit/src/reco/shaperec/featureextractor/pointfloat/PointFloatShapeFeature.cpp index 2248e1ec..ca66cc5b 100644 --- a/src/virtualkeyboard/3rdparty/lipi-toolkit/src/reco/shaperec/featureextractor/pointfloat/PointFloatShapeFeature.cpp +++ b/src/virtualkeyboard/3rdparty/lipi-toolkit/src/reco/shaperec/featureextractor/pointfloat/PointFloatShapeFeature.cpp @@ -479,25 +479,21 @@ int PointFloatShapeFeature::toFloatVector(floatVector& floatVec) *****************************************************************************/ int PointFloatShapeFeature::initialize(const floatVector& initFloatVector) { + return initialize(initFloatVector.data(), initFloatVector.size()); +} - if (initFloatVector.size() == 0) +int PointFloatShapeFeature::initialize(floatVector::const_pointer initFloatData, size_t dataSize) +{ + if (dataSize < 5) { return FAILURE; } - m_x = initFloatVector[0]; - m_y = initFloatVector[1]; - m_sinTheta = initFloatVector[2]; - m_cosTheta = initFloatVector[3]; - - if(initFloatVector[4] == 1) - { - m_penUp = true; - } - else - { - m_penUp = false; - } + m_x = *(initFloatData++); + m_y = *(initFloatData++); + m_sinTheta = *(initFloatData++); + m_cosTheta = *(initFloatData++); + m_penUp = *(initFloatData++) != 0; return SUCCESS; } diff --git a/src/virtualkeyboard/3rdparty/lipi-toolkit/src/reco/shaperec/featureextractor/pointfloat/PointFloatShapeFeature.h b/src/virtualkeyboard/3rdparty/lipi-toolkit/src/reco/shaperec/featureextractor/pointfloat/PointFloatShapeFeature.h index 0bdc97a0..fde704fc 100644 --- a/src/virtualkeyboard/3rdparty/lipi-toolkit/src/reco/shaperec/featureextractor/pointfloat/PointFloatShapeFeature.h +++ b/src/virtualkeyboard/3rdparty/lipi-toolkit/src/reco/shaperec/featureextractor/pointfloat/PointFloatShapeFeature.h @@ -151,6 +151,8 @@ public: int initialize(const floatVector& initFloatVector); + int initialize(floatVector::const_pointer initFloatData, size_t dataSize); + int toFloatVector(vector<float>& floatVec); /** 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 8da7e807..89207b85 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 @@ -1912,7 +1912,7 @@ int NNShapeRecognizer::loadModelData() #ifdef OPTIMIZE_LOAD_MODEL_DATA vector<LTKShapeFeaturePtr>& shapeFeatureVector = shapeSampleFeaturesRef.getFeatureVectorRef(); shapeFeatureVector.reserve(numberOfFeatures); - floatVector::const_iterator floatFeatureVectorBufferIterator = floatFeatureVectorBuffer.begin(); + floatVector::const_pointer floatFeatureVectorData = floatFeatureVectorBuffer.data(); #else vector<LTKShapeFeaturePtr> shapeFeatureVector; #endif @@ -1920,21 +1920,18 @@ int NNShapeRecognizer::loadModelData() for ( ; featureIndex < numberOfFeatures ; featureIndex++) { +#ifndef OPTIMIZE_LOAD_MODEL_DATA floatVector floatFeatureVector; int featureValueIndex = 0; +#endif shapeFeature = m_ptrFeatureExtractor->getShapeFeatureInstance(); #ifdef OPTIMIZE_LOAD_MODEL_DATA - floatFeatureVector.reserve(featureDimension); -#endif + if (shapeFeature->initialize(floatFeatureVectorData + featureIndex * featureDimension, featureDimension) != SUCCESS) +#else 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); @@ -1945,10 +1942,10 @@ int NNShapeRecognizer::loadModelData() { break; } -#endif } if (shapeFeature->initialize(floatFeatureVector) != SUCCESS) +#endif { LOG(LTKLogger::LTK_LOGLEVEL_ERR)<<"Error: "<< EINVALID_INPUT_FORMAT << " " << |