diff options
Diffstat (limited to 'src/plugins/lipi-toolkit/3rdparty/lipi-toolkit/src/reco/shaperec/nn/NNAdapt.cpp')
-rw-r--r-- | src/plugins/lipi-toolkit/3rdparty/lipi-toolkit/src/reco/shaperec/nn/NNAdapt.cpp | 370 |
1 files changed, 370 insertions, 0 deletions
diff --git a/src/plugins/lipi-toolkit/3rdparty/lipi-toolkit/src/reco/shaperec/nn/NNAdapt.cpp b/src/plugins/lipi-toolkit/3rdparty/lipi-toolkit/src/reco/shaperec/nn/NNAdapt.cpp new file mode 100644 index 00000000..7e57252b --- /dev/null +++ b/src/plugins/lipi-toolkit/3rdparty/lipi-toolkit/src/reco/shaperec/nn/NNAdapt.cpp @@ -0,0 +1,370 @@ +/***************************************************************************************** +* Copyright (c) 2006 Hewlett-Packard Development Company, L.P. +* Permission is hereby granted, free of charge, to any person obtaining a copy of +* this software and associated documentation files (the "Software"), to deal in +* the Software without restriction, including without limitation the rights to use, +* copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the +* Software, and to permit persons to whom the Software is furnished to do so, +* subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF +* CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE +* OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*****************************************************************************************/ + +/************************************************************************ + * SVN MACROS + * + * $LastChangedDate: 2007-06-01 11:16:10 +0530 (Fri, 01 Jun 2007) $ + * $Revision: 105 $ + * $Author: sharmnid $ + * + ************************************************************************/ + +#include "NNShapeRecognizer.h" +#include "NNAdapt.h" +#include "LTKLoggerUtil.h" +#include "LTKConfigFileReader.h" +#include "LTKErrors.h" +#include "LTKErrorsList.h" +#include "LTKPreprocDefaults.h" + +#define ALPHA_MORPH -0.1 + +LTKAdapt* LTKAdapt::adaptInstance = NULL; +int LTKAdapt::m_count = 0; + +/********************************************************************************** +* AUTHOR : Tarun Madan +* DATE : 30-Aug-2007 +* NAME : Constructor +* DESCRIPTION : +* ARGUMENTS : +* RETURNS : +* NOTES : +* CHANGE HISTROY +* Author Date Description +*************************************************************************************/ +LTKAdapt::LTKAdapt(NNShapeRecognizer* ptrNNShapeReco) +{ + m_nnShapeRecognizer = ptrNNShapeReco; + + LOG(LTKLogger::LTK_LOGLEVEL_DEBUG) + << "Exit LTKAdapt::LTKAdapt()"<<endl; + + //Assign Default Values + m_adaptSchemeName = NAME_ADD_LVQ_ADAPT_SCHEME; +} + +/********************************************************************************** +* AUTHOR : Tarun Madan +* DATE : 30-Aug-2007 +* NAME : Destructor +* DESCRIPTION : +* ARGUMENTS : +* RETURNS : +* NOTES : +* CHANGE HISTROY +* Author Date Description +*************************************************************************************/ +LTKAdapt::~LTKAdapt() +{ + +} + +/********************************************************************************** +* AUTHOR : Tarun Madan +* DATE : 8-Oct-2007 +* NAME : deleteInstance +* DESCRIPTION : delete AdaptInstance +* ARGUMENTS : +* RETURNS : None +* NOTES : +* CHANGE HISTROY +* Author Date Description +*************************************************************************************/ +void LTKAdapt::deleteInstance() +{ + m_count = 0; + if(adaptInstance) + { + delete adaptInstance; + adaptInstance = NULL; + } +} +/********************************************************************************** +* AUTHOR : Tarun Madan +* DATE : 30-Aug-2007 +* NAME : getInstance +* DESCRIPTION : +* ARGUMENTS : +* RETURNS : +* NOTES : +* CHANGE HISTROY +* Author Date Description +*************************************************************************************/ +LTKAdapt* LTKAdapt::getInstance(NNShapeRecognizer* ptrNNShapeReco) +{ + if(adaptInstance == NULL) + { + adaptInstance = new LTKAdapt(ptrNNShapeReco); + } + + return adaptInstance; + +} +/********************************************************************************** +* AUTHOR : Tarun Madan +* DATE : 30-Aug-2007 +* NAME : Process +* DESCRIPTION : Performs adaptation +* ARGUMENTS : +* RETURNS : Success : If completed successfully +* Failure : Error Code +* NOTES : +* CHANGE HISTROY +* Author Date Description +*************************************************************************************/ +int LTKAdapt::adapt(int shapeId) +{ + int iErrorCode; + if(m_count==0) + { + m_count = 1; + + iErrorCode = readAdaptConfig(); + if(iErrorCode !=0) + { + LOG(LTKLogger::LTK_LOGLEVEL_ERR) + << "Error during LTKAdapt::readAdaptConfig()"<<endl; + LTKReturnError(FAILURE); + } + } + + if(LTKSTRCMP(m_adaptSchemeName.c_str(),NAME_ADD_LVQ_ADAPT_SCHEME)==0) + { + iErrorCode = adaptAddLVQ(shapeId); + if(iErrorCode!=SUCCESS) + { + LTKReturnError(iErrorCode); + } + } + else + { + //Adapt Scheme not supported + LOG( LTKLogger::LTK_LOGLEVEL_ERR) + <<"AdaptScheme not supported: " <<m_adaptSchemeName + <<endl; + LTKReturnError(EADAPTSCHEME_NOT_SUPPORTED); + } + + return(SUCCESS); +} + +/****************************************************************************** +* AUTHOR : Tarun Madan +* DATE : 07-06-2007 +* NAME : AdaptADDLVQ +* DESCRIPTION : +* ARGUMENTS : +* RETURNS : Success +* NOTES : +* CHANGE HISTROY +* Author Date Description +******************************************************************************/ +int LTKAdapt::adaptAddLVQ(int shapeId) +{ + LOG(LTKLogger::LTK_LOGLEVEL_INFO) + <<"Enter NNShapeRecognizer::adaptAddLVQ" + <<endl; + int errorCode; + try + { + + //Check if Cached variables are valid + if(m_nnShapeRecognizer->m_neighborInfoVec.size()==0) + { + LOG(LTKLogger::LTK_LOGLEVEL_ERR) + <<"DistanceIndexPair is empty"<<endl; + + LTKReturnError(ENEIGHBOR_INFO_VECTOR_EMPTY ); + } + + //Check if Cached variables are valid + //Comment to allow addition/adaptation if Resultvec is empty as sample rejected + /*if(m_nnShapeRecognizer->m_vecRecoResult.size()==0) + { + LOG(LTKLogger::LTK_LOGLEVEL_ERR) + <<"Result Vector is empty"<<endl; + + LTKReturnError(ERECO_RESULT_EMPTY); + }*/ + + if(m_nnShapeRecognizer->m_cachedShapeSampleFeatures.getFeatureVector().size()>0) + { + m_nnShapeRecognizer->m_cachedShapeSampleFeatures.setClassID(shapeId); + } + else + { + LOG(LTKLogger::LTK_LOGLEVEL_ERR) + <<"Features of input TraceGroup is empty"<<endl; + + LTKReturnError(ESHAPE_SAMPLE_FEATURES_EMPTY); + } + + + //If mismatch,then add, else Morph with 0.1 + double alpha = ALPHA_MORPH; + if(m_nnShapeRecognizer->m_vecRecoResult.size()==0 || + m_nnShapeRecognizer->m_vecRecoResult.at(0).getShapeId() + != shapeId || + m_nnShapeRecognizer->m_shapeIDNumPrototypesMap[shapeId] + < m_minNumberSamplesPerClass) + { + m_nnShapeRecognizer->insertSampleToPrototypeSet( + m_nnShapeRecognizer->m_cachedShapeSampleFeatures + ); + //Update m_shapeIDNumPrototypesMap + m_nnShapeRecognizer->m_shapeIDNumPrototypesMap[shapeId]= + m_nnShapeRecognizer->m_shapeIDNumPrototypesMap[shapeId] + 1; + } + else + { + LTKShapeSample recognizedClassNearestSample; + int nearestSampleIndex = 0; + NNShapeRecognizer::NeighborInfo distindexPairObj; + + // Morph with Nearest Sample of Recognized Class + for(int index =0;index <m_nnShapeRecognizer->m_neighborInfoVec.size();index++) + { + distindexPairObj = m_nnShapeRecognizer->m_neighborInfoVec.at(index); + if(distindexPairObj.classId ==m_nnShapeRecognizer->m_vecRecoResult.at(0).getShapeId()) + { + nearestSampleIndex = distindexPairObj.prototypeSetIndex; + recognizedClassNearestSample = m_nnShapeRecognizer->m_prototypeSet.at(nearestSampleIndex); + break; + } + } + errorCode = m_nnShapeRecognizer->morphVector( + m_nnShapeRecognizer->m_cachedShapeSampleFeatures, + alpha, + recognizedClassNearestSample); + if(errorCode!=0) + { + return(errorCode); + } + + //Update PrototypeSet with Morph Vector + const vector<LTKShapeFeaturePtr>& tempFeatVec = recognizedClassNearestSample.getFeatureVector(); + m_nnShapeRecognizer->m_prototypeSet.at(nearestSampleIndex).setFeatureVector(tempFeatVec); + } + //Update MDT File + m_nnShapeRecognizer->writePrototypeSetToMDTFile(); + + } + catch(...) + { +// return FALSE; + return false; + } + + LOG(LTKLogger::LTK_LOGLEVEL_INFO) + <<"Exit NNShapeRecognizer::adaptAddLVQ" + <<endl; + + return SUCCESS; +} + +/****************************************************************************** +* AUTHOR : Tarun Madan +* DATE : 11-06-2007 +* NAME : readAdaptConfig +* DESCRIPTION : +* +* ARGUMENTS : +* RETURNS : +* NOTES : +* CHANGE HISTROY +* Author Date Description +******************************************************************************/ +int LTKAdapt::readAdaptConfig() +{ + LOG(LTKLogger::LTK_LOGLEVEL_DEBUG) + <<"Enter Adapt::readAdaptConfig" + <<endl; + + LTKConfigFileReader *adaptConfigReader = NULL; + + adaptConfigReader = new LTKConfigFileReader(m_nnShapeRecognizer->m_nnCfgFilePath); + + //Don't throw Error as ShapeRecognizer might not support ADAPT + string tempStringVar = ""; + + int errorCode = adaptConfigReader->getConfigValue(ADAPT_SCHEME,tempStringVar); + if(errorCode == SUCCESS) + m_adaptSchemeName = tempStringVar; + else + { + LOG(LTKLogger::LTK_LOGLEVEL_INFO) + << "AdaptScheme not specified. Assuming default(AddLVQ) " <<endl; + } + + int tempIntegerVar = 0; + + errorCode = + adaptConfigReader->getConfigValue(ADAPT_MIN_NUMBER_SAMPLES_PER_CLASS,tempStringVar); + if(errorCode == SUCCESS) + { + if ( LTKStringUtil::isInteger(tempStringVar) ) + { + tempIntegerVar = atoi((tempStringVar).c_str()); + if(tempIntegerVar > 0) + { + m_minNumberSamplesPerClass = tempIntegerVar; + } + else + { + LOG(LTKLogger::LTK_LOGLEVEL_ERR)<< "Error: " << ECONFIG_FILE_RANGE + <<ADAPT_MIN_NUMBER_SAMPLES_PER_CLASS << " is out of permitted range" + << " LTKAdapt::readAdaptConfig()"<<endl; + + delete adaptConfigReader; + + LTKReturnError(ECONFIG_FILE_RANGE); + } + } + else + { + LOG(LTKLogger::LTK_LOGLEVEL_ERR)<< "Error: " << ECONFIG_FILE_RANGE + << ADAPT_MIN_NUMBER_SAMPLES_PER_CLASS << " is out of permitted range" + << " LTKAdapt::readAdaptConfig()"<<endl; + + delete adaptConfigReader; + + LTKReturnError(ECONFIG_FILE_RANGE); + } + } + else + { + m_minNumberSamplesPerClass = ADAPT_DEF_MIN_NUMBER_SAMPLES_PER_CLASS; + LOG(LTKLogger::LTK_LOGLEVEL_INFO) << "Info: " << + "Using default value of MinimumNumerOfSamplesPerClass: "<< + m_minNumberSamplesPerClass << + " LTKAdapt::readAdaptConfig()"<<endl; + } + + if(adaptConfigReader) + delete adaptConfigReader; + + LOG(LTKLogger::LTK_LOGLEVEL_DEBUG) + <<"Exit Adapt::readAdaptConfig" + <<endl; + + return SUCCESS; +} + |