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