allowing people to manually define how sharp a cascade classifier model should be trained

This commit is contained in:
StevenPuttemans 2015-03-06 11:52:26 +01:00
parent 4e87deae28
commit 7e35f76d06
4 changed files with 26 additions and 5 deletions

View File

@ -135,7 +135,8 @@ bool CvCascadeClassifier::train( const string _cascadeDirName,
const CvCascadeParams& _cascadeParams, const CvCascadeParams& _cascadeParams,
const CvFeatureParams& _featureParams, const CvFeatureParams& _featureParams,
const CvCascadeBoostParams& _stageParams, const CvCascadeBoostParams& _stageParams,
bool baseFormatSave ) bool baseFormatSave,
double acceptanceRatioBreakValue )
{ {
// Start recording clock ticks for training time output // Start recording clock ticks for training time output
const clock_t begin_time = clock(); const clock_t begin_time = clock();
@ -185,6 +186,7 @@ bool CvCascadeClassifier::train( const string _cascadeDirName,
cout << "numStages: " << numStages << endl; cout << "numStages: " << numStages << endl;
cout << "precalcValBufSize[Mb] : " << _precalcValBufSize << endl; cout << "precalcValBufSize[Mb] : " << _precalcValBufSize << endl;
cout << "precalcIdxBufSize[Mb] : " << _precalcIdxBufSize << endl; cout << "precalcIdxBufSize[Mb] : " << _precalcIdxBufSize << endl;
cout << "acceptanceRatioBreakValue : " << acceptanceRatioBreakValue << endl;
cascadeParams.printAttrs(); cascadeParams.printAttrs();
stageParams->printAttrs(); stageParams->printAttrs();
featureParams->printAttrs(); featureParams->printAttrs();
@ -216,6 +218,11 @@ bool CvCascadeClassifier::train( const string _cascadeDirName,
"Branch training terminated." << endl; "Branch training terminated." << endl;
break; break;
} }
if( (tempLeafFARate <= acceptanceRatioBreakValue) && (acceptanceRatioBreakValue < 0) ){
cout << "The required acceptanceRatio for the model has been reached to avoid overfitting of trainingdata. "
"Branch training terminated." << endl;
break;
}
Ptr<CvCascadeBoost> tempStage = makePtr<CvCascadeBoost>(); Ptr<CvCascadeBoost> tempStage = makePtr<CvCascadeBoost>();
bool isStageTrained = tempStage->train( featureEvaluator, bool isStageTrained = tempStage->train( featureEvaluator,

View File

@ -94,7 +94,8 @@ public:
const CvCascadeParams& _cascadeParams, const CvCascadeParams& _cascadeParams,
const CvFeatureParams& _featureParams, const CvFeatureParams& _featureParams,
const CvCascadeBoostParams& _stageParams, const CvCascadeBoostParams& _stageParams,
bool baseFormatSave = false ); bool baseFormatSave = false,
double acceptanceRatioBreakValue = -1.0 );
private: private:
int predict( int sampleIdx ); int predict( int sampleIdx );
void save( const std::string cascadeDirName, bool baseFormat = false ); void save( const std::string cascadeDirName, bool baseFormat = false );

View File

@ -15,6 +15,7 @@ int main( int argc, char* argv[] )
int precalcValBufSize = 256, int precalcValBufSize = 256,
precalcIdxBufSize = 256; precalcIdxBufSize = 256;
bool baseFormatSave = false; bool baseFormatSave = false;
double acceptanceRatioBreakValue = -1.0;
CvCascadeParams cascadeParams; CvCascadeParams cascadeParams;
CvCascadeBoostParams stageParams; CvCascadeBoostParams stageParams;
@ -36,6 +37,7 @@ int main( int argc, char* argv[] )
cout << " [-precalcIdxBufSize <precalculated_idxs_buffer_size_in_Mb = " << precalcIdxBufSize << ">]" << endl; cout << " [-precalcIdxBufSize <precalculated_idxs_buffer_size_in_Mb = " << precalcIdxBufSize << ">]" << endl;
cout << " [-baseFormatSave]" << endl; cout << " [-baseFormatSave]" << endl;
cout << " [-numThreads <max_number_of_threads = " << numThreads << ">]" << endl; cout << " [-numThreads <max_number_of_threads = " << numThreads << ">]" << endl;
cout << " [-acceptanceRatioBreakValue <value> = " << acceptanceRatioBreakValue << ">]" << endl;
cascadeParams.printDefaults(); cascadeParams.printDefaults();
stageParams.printDefaults(); stageParams.printDefaults();
for( int fi = 0; fi < fc; fi++ ) for( int fi = 0; fi < fc; fi++ )
@ -86,6 +88,10 @@ int main( int argc, char* argv[] )
{ {
numThreads = atoi(argv[++i]); numThreads = atoi(argv[++i]);
} }
else if( !strcmp( argv[i], "-acceptanceRatioBreakValue" ) )
{
acceptanceRatioBreakValue = atof(argv[++i]);
}
else if ( cascadeParams.scanAttr( argv[i], argv[i+1] ) ) { i++; } else if ( cascadeParams.scanAttr( argv[i], argv[i+1] ) ) { i++; }
else if ( stageParams.scanAttr( argv[i], argv[i+1] ) ) { i++; } else if ( stageParams.scanAttr( argv[i], argv[i+1] ) ) { i++; }
else if ( !set ) else if ( !set )
@ -112,6 +118,7 @@ int main( int argc, char* argv[] )
cascadeParams, cascadeParams,
*featureParams[cascadeParams.featureType], *featureParams[cascadeParams.featureType],
stageParams, stageParams,
baseFormatSave ); baseFormatSave,
acceptanceRatioBreakValue );
return 0; return 0;
} }

View File

@ -256,6 +256,12 @@ Command line arguments of opencv_traincascade application grouped by purposes:
Maximum number of threads to use during training. Notice that the actual number of used Maximum number of threads to use during training. Notice that the actual number of used
threads may be lower, depending on your machine and compilation options. threads may be lower, depending on your machine and compilation options.
- -acceptanceRatioBreakValue \<break_value\>
This argument is used to determine how precise your model should keep learning and when to stop.
A good guideline is to train not further than 10e-5, to ensure the model does not overtrain on your training data.
By default this value is set to -1 to disable this feature.
-# Cascade parameters: -# Cascade parameters:
- -stageType \<BOOST(default)\> - -stageType \<BOOST(default)\>