Commit 7e35f76d authored by StevenPuttemans's avatar StevenPuttemans

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

parent 4e87deae
...@@ -135,7 +135,8 @@ bool CvCascadeClassifier::train( const string _cascadeDirName, ...@@ -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, ...@@ -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();
...@@ -207,13 +209,18 @@ bool CvCascadeClassifier::train( const string _cascadeDirName, ...@@ -207,13 +209,18 @@ bool CvCascadeClassifier::train( const string _cascadeDirName,
if ( !updateTrainingSet( tempLeafFARate ) ) if ( !updateTrainingSet( tempLeafFARate ) )
{ {
cout << "Train dataset for temp stage can not be filled. " cout << "Train dataset for temp stage can not be filled. "
"Branch training terminated." << endl; "Branch training terminated." << endl;
break; break;
} }
if( tempLeafFARate <= requiredLeafFARate ) if( tempLeafFARate <= requiredLeafFARate )
{ {
cout << "Required leaf false alarm rate achieved. " cout << "Required leaf false alarm rate achieved. "
"Branch training terminated." << endl; "Branch training terminated." << endl;
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; break;
} }
......
...@@ -94,7 +94,8 @@ public: ...@@ -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 );
......
...@@ -15,6 +15,7 @@ int main( int argc, char* argv[] ) ...@@ -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[] ) ...@@ -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[] ) ...@@ -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[] ) ...@@ -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;
} }
...@@ -256,6 +256,12 @@ Command line arguments of opencv_traincascade application grouped by purposes: ...@@ -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)\>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment