Path: blob/master/apps/traincascade/traincascade.cpp
16337 views
#include "opencv2/core.hpp"1#include "cascadeclassifier.h"23using namespace std;4using namespace cv;56/*7traincascade.cpp is the source file of the program used for cascade training.8User has to provide training input in form of positive and negative training images,9and other data related to training in form of command line argument.10*/11int main( int argc, char* argv[] )12{13CvCascadeClassifier classifier;14string cascadeDirName, vecName, bgName;15int numPos = 2000;16int numNeg = 1000;17int numStages = 20;18int numThreads = getNumThreads();19int precalcValBufSize = 1024,20precalcIdxBufSize = 1024;21bool baseFormatSave = false;22double acceptanceRatioBreakValue = -1.0;2324CvCascadeParams cascadeParams;25CvCascadeBoostParams stageParams;26Ptr<CvFeatureParams> featureParams[] = { makePtr<CvHaarFeatureParams>(),27makePtr<CvLBPFeatureParams>(),28makePtr<CvHOGFeatureParams>()29};30int fc = sizeof(featureParams)/sizeof(featureParams[0]);31if( argc == 1 )32{33cout << "Usage: " << argv[0] << endl;34cout << " -data <cascade_dir_name>" << endl;35cout << " -vec <vec_file_name>" << endl;36cout << " -bg <background_file_name>" << endl;37cout << " [-numPos <number_of_positive_samples = " << numPos << ">]" << endl;38cout << " [-numNeg <number_of_negative_samples = " << numNeg << ">]" << endl;39cout << " [-numStages <number_of_stages = " << numStages << ">]" << endl;40cout << " [-precalcValBufSize <precalculated_vals_buffer_size_in_Mb = " << precalcValBufSize << ">]" << endl;41cout << " [-precalcIdxBufSize <precalculated_idxs_buffer_size_in_Mb = " << precalcIdxBufSize << ">]" << endl;42cout << " [-baseFormatSave]" << endl;43cout << " [-numThreads <max_number_of_threads = " << numThreads << ">]" << endl;44cout << " [-acceptanceRatioBreakValue <value> = " << acceptanceRatioBreakValue << ">]" << endl;45cascadeParams.printDefaults();46stageParams.printDefaults();47for( int fi = 0; fi < fc; fi++ )48featureParams[fi]->printDefaults();49return 0;50}5152for( int i = 1; i < argc; i++ )53{54bool set = false;55if( !strcmp( argv[i], "-data" ) )56{57cascadeDirName = argv[++i];58}59else if( !strcmp( argv[i], "-vec" ) )60{61vecName = argv[++i];62}63else if( !strcmp( argv[i], "-bg" ) )64{65bgName = argv[++i];66}67else if( !strcmp( argv[i], "-numPos" ) )68{69numPos = atoi( argv[++i] );70}71else if( !strcmp( argv[i], "-numNeg" ) )72{73numNeg = atoi( argv[++i] );74}75else if( !strcmp( argv[i], "-numStages" ) )76{77numStages = atoi( argv[++i] );78}79else if( !strcmp( argv[i], "-precalcValBufSize" ) )80{81precalcValBufSize = atoi( argv[++i] );82}83else if( !strcmp( argv[i], "-precalcIdxBufSize" ) )84{85precalcIdxBufSize = atoi( argv[++i] );86}87else if( !strcmp( argv[i], "-baseFormatSave" ) )88{89baseFormatSave = true;90}91else if( !strcmp( argv[i], "-numThreads" ) )92{93numThreads = atoi(argv[++i]);94}95else if( !strcmp( argv[i], "-acceptanceRatioBreakValue" ) )96{97acceptanceRatioBreakValue = atof(argv[++i]);98}99else if ( cascadeParams.scanAttr( argv[i], argv[i+1] ) ) { i++; }100else if ( stageParams.scanAttr( argv[i], argv[i+1] ) ) { i++; }101else if ( !set )102{103for( int fi = 0; fi < fc; fi++ )104{105set = featureParams[fi]->scanAttr(argv[i], argv[i+1]);106if ( !set )107{108i++;109break;110}111}112}113}114115setNumThreads( numThreads );116classifier.train( cascadeDirName,117vecName,118bgName,119numPos, numNeg,120precalcValBufSize, precalcIdxBufSize,121numStages,122cascadeParams,123*featureParams[cascadeParams.featureType],124stageParams,125baseFormatSave,126acceptanceRatioBreakValue );127return 0;128}129130131