mirror of
https://github.com/opencv/opencv.git
synced 2026-07-31 08:13:04 +04:00
Updated ml module interfaces and documentation
This commit is contained in:
@@ -330,7 +330,8 @@ void CV_KNearestTest::run( int /*start_from*/ )
|
||||
}
|
||||
|
||||
// KNearest KDTree implementation
|
||||
Ptr<KNearest> knearestKdt = KNearest::create(ml::KNearest::Params(10, true, INT_MAX, ml::KNearest::KDTREE));
|
||||
Ptr<KNearest> knearestKdt = KNearest::create();
|
||||
knearestKdt->setAlgorithmType(KNearest::KDTREE);
|
||||
knearestKdt->train(trainData, ml::ROW_SAMPLE, trainLabels);
|
||||
knearestKdt->findNearest(testData, 4, bestLabels);
|
||||
if( !calcErr( bestLabels, testLabels, sizes, err, true ) )
|
||||
@@ -394,16 +395,18 @@ int CV_EMTest::runCase( int caseIndex, const EM_Params& params,
|
||||
cv::Mat labels;
|
||||
float err;
|
||||
|
||||
Ptr<EM> em;
|
||||
EM::Params emp(params.nclusters, params.covMatType, params.termCrit);
|
||||
Ptr<EM> em = EM::create();
|
||||
em->setClustersNumber(params.nclusters);
|
||||
em->setCovarianceMatrixType(params.covMatType);
|
||||
em->setTermCriteria(params.termCrit);
|
||||
if( params.startStep == EM::START_AUTO_STEP )
|
||||
em = EM::train( trainData, noArray(), labels, noArray(), emp );
|
||||
em->trainEM( trainData, noArray(), labels, noArray() );
|
||||
else if( params.startStep == EM::START_E_STEP )
|
||||
em = EM::train_startWithE( trainData, *params.means, *params.covs,
|
||||
*params.weights, noArray(), labels, noArray(), emp );
|
||||
em->trainE( trainData, *params.means, *params.covs,
|
||||
*params.weights, noArray(), labels, noArray() );
|
||||
else if( params.startStep == EM::START_M_STEP )
|
||||
em = EM::train_startWithM( trainData, *params.probs,
|
||||
noArray(), labels, noArray(), emp );
|
||||
em->trainM( trainData, *params.probs,
|
||||
noArray(), labels, noArray() );
|
||||
|
||||
// check train error
|
||||
if( !calcErr( labels, trainLabels, sizes, err , false, false ) )
|
||||
@@ -543,7 +546,9 @@ protected:
|
||||
|
||||
Mat labels;
|
||||
|
||||
Ptr<EM> em = EM::train(samples, noArray(), labels, noArray(), EM::Params(nclusters));
|
||||
Ptr<EM> em = EM::create();
|
||||
em->setClustersNumber(nclusters);
|
||||
em->trainEM(samples, noArray(), labels, noArray());
|
||||
|
||||
Mat firstResult(samples.rows, 1, CV_32SC1);
|
||||
for( int i = 0; i < samples.rows; i++)
|
||||
@@ -644,8 +649,13 @@ protected:
|
||||
samples1.push_back(sample);
|
||||
}
|
||||
}
|
||||
Ptr<EM> model0 = EM::train(samples0, noArray(), noArray(), noArray(), EM::Params(3));
|
||||
Ptr<EM> model1 = EM::train(samples1, noArray(), noArray(), noArray(), EM::Params(3));
|
||||
Ptr<EM> model0 = EM::create();
|
||||
model0->setClustersNumber(3);
|
||||
model0->trainEM(samples0, noArray(), noArray(), noArray());
|
||||
|
||||
Ptr<EM> model1 = EM::create();
|
||||
model1->setClustersNumber(3);
|
||||
model1->trainEM(samples1, noArray(), noArray(), noArray());
|
||||
|
||||
Mat trainConfusionMat(2, 2, CV_32SC1, Scalar(0)),
|
||||
testConfusionMat(2, 2, CV_32SC1, Scalar(0));
|
||||
|
||||
+12
-18
@@ -95,16 +95,13 @@ void CV_LRTest::run( int /*start_from*/ )
|
||||
string dataFileName = ts->get_data_path() + "iris.data";
|
||||
Ptr<TrainData> tdata = TrainData::loadFromCSV(dataFileName, 0);
|
||||
|
||||
LogisticRegression::Params params = LogisticRegression::Params();
|
||||
params.alpha = 1.0;
|
||||
params.num_iters = 10001;
|
||||
params.norm = LogisticRegression::REG_L2;
|
||||
params.regularized = 1;
|
||||
params.train_method = LogisticRegression::BATCH;
|
||||
params.mini_batch_size = 10;
|
||||
|
||||
// run LR classifier train classifier
|
||||
Ptr<LogisticRegression> p = LogisticRegression::create(params);
|
||||
Ptr<LogisticRegression> p = LogisticRegression::create();
|
||||
p->setLearningRate(1.0);
|
||||
p->setIterations(10001);
|
||||
p->setRegularization(LogisticRegression::REG_L2);
|
||||
p->setTrainMethod(LogisticRegression::BATCH);
|
||||
p->setMiniBatchSize(10);
|
||||
p->train(tdata);
|
||||
|
||||
// predict using the same data
|
||||
@@ -157,20 +154,17 @@ void CV_LRTest_SaveLoad::run( int /*start_from*/ )
|
||||
Mat responses1, responses2;
|
||||
Mat learnt_mat1, learnt_mat2;
|
||||
|
||||
LogisticRegression::Params params1 = LogisticRegression::Params();
|
||||
params1.alpha = 1.0;
|
||||
params1.num_iters = 10001;
|
||||
params1.norm = LogisticRegression::REG_L2;
|
||||
params1.regularized = 1;
|
||||
params1.train_method = LogisticRegression::BATCH;
|
||||
params1.mini_batch_size = 10;
|
||||
|
||||
// train and save the classifier
|
||||
String filename = tempfile(".xml");
|
||||
try
|
||||
{
|
||||
// run LR classifier train classifier
|
||||
Ptr<LogisticRegression> lr1 = LogisticRegression::create(params1);
|
||||
Ptr<LogisticRegression> lr1 = LogisticRegression::create();
|
||||
lr1->setLearningRate(1.0);
|
||||
lr1->setIterations(10001);
|
||||
lr1->setRegularization(LogisticRegression::REG_L2);
|
||||
lr1->setTrainMethod(LogisticRegression::BATCH);
|
||||
lr1->setMiniBatchSize(10);
|
||||
lr1->train(tdata);
|
||||
lr1->predict(tdata->getSamples(), responses1);
|
||||
learnt_mat1 = lr1->get_learnt_thetas();
|
||||
|
||||
@@ -73,30 +73,14 @@ int str_to_svm_kernel_type( String& str )
|
||||
return -1;
|
||||
}
|
||||
|
||||
Ptr<SVM> svm_train_auto( Ptr<TrainData> _data, SVM::Params _params,
|
||||
int k_fold, ParamGrid C_grid, ParamGrid gamma_grid,
|
||||
ParamGrid p_grid, ParamGrid nu_grid, ParamGrid coef_grid,
|
||||
ParamGrid degree_grid )
|
||||
{
|
||||
Mat _train_data = _data->getSamples();
|
||||
Mat _responses = _data->getResponses();
|
||||
Mat _var_idx = _data->getVarIdx();
|
||||
Mat _sample_idx = _data->getTrainSampleIdx();
|
||||
|
||||
Ptr<SVM> svm = SVM::create(_params);
|
||||
if( svm->trainAuto( _data, k_fold, C_grid, gamma_grid, p_grid, nu_grid, coef_grid, degree_grid ) )
|
||||
return svm;
|
||||
return Ptr<SVM>();
|
||||
}
|
||||
|
||||
// 4. em
|
||||
// 5. ann
|
||||
int str_to_ann_train_method( String& str )
|
||||
{
|
||||
if( !str.compare("BACKPROP") )
|
||||
return ANN_MLP::Params::BACKPROP;
|
||||
return ANN_MLP::BACKPROP;
|
||||
if( !str.compare("RPROP") )
|
||||
return ANN_MLP::Params::RPROP;
|
||||
return ANN_MLP::RPROP;
|
||||
CV_Error( CV_StsBadArg, "incorrect ann train method string" );
|
||||
return -1;
|
||||
}
|
||||
@@ -343,16 +327,16 @@ int CV_MLBaseTest::train( int testCaseIdx )
|
||||
String svm_type_str, kernel_type_str;
|
||||
modelParamsNode["svm_type"] >> svm_type_str;
|
||||
modelParamsNode["kernel_type"] >> kernel_type_str;
|
||||
SVM::Params params;
|
||||
params.svmType = str_to_svm_type( svm_type_str );
|
||||
params.kernelType = str_to_svm_kernel_type( kernel_type_str );
|
||||
modelParamsNode["degree"] >> params.degree;
|
||||
modelParamsNode["gamma"] >> params.gamma;
|
||||
modelParamsNode["coef0"] >> params.coef0;
|
||||
modelParamsNode["C"] >> params.C;
|
||||
modelParamsNode["nu"] >> params.nu;
|
||||
modelParamsNode["p"] >> params.p;
|
||||
model = SVM::create(params);
|
||||
Ptr<SVM> m = SVM::create();
|
||||
m->setType(str_to_svm_type( svm_type_str ));
|
||||
m->setKernel(str_to_svm_kernel_type( kernel_type_str ));
|
||||
m->setDegree(modelParamsNode["degree"]);
|
||||
m->setGamma(modelParamsNode["gamma"]);
|
||||
m->setCoef0(modelParamsNode["coef0"]);
|
||||
m->setC(modelParamsNode["C"]);
|
||||
m->setNu(modelParamsNode["nu"]);
|
||||
m->setP(modelParamsNode["p"]);
|
||||
model = m;
|
||||
}
|
||||
else if( modelName == CV_EM )
|
||||
{
|
||||
@@ -371,9 +355,13 @@ int CV_MLBaseTest::train( int testCaseIdx )
|
||||
data->getVarIdx(), data->getTrainSampleIdx());
|
||||
int layer_sz[] = { data->getNAllVars(), 100, 100, (int)cls_map.size() };
|
||||
Mat layer_sizes( 1, (int)(sizeof(layer_sz)/sizeof(layer_sz[0])), CV_32S, layer_sz );
|
||||
model = ANN_MLP::create(ANN_MLP::Params(layer_sizes, ANN_MLP::SIGMOID_SYM, 0, 0,
|
||||
TermCriteria(TermCriteria::COUNT,300,0.01),
|
||||
str_to_ann_train_method(train_method_str), param1, param2));
|
||||
Ptr<ANN_MLP> m = ANN_MLP::create();
|
||||
m->setLayerSizes(layer_sizes);
|
||||
m->setActivationFunction(ANN_MLP::SIGMOID_SYM, 0, 0);
|
||||
m->setTermCriteria(TermCriteria(TermCriteria::COUNT,300,0.01));
|
||||
m->setTrainMethod(str_to_ann_train_method(train_method_str), param1, param2);
|
||||
model = m;
|
||||
|
||||
}
|
||||
else if( modelName == CV_DTREE )
|
||||
{
|
||||
@@ -386,8 +374,18 @@ int CV_MLBaseTest::train( int testCaseIdx )
|
||||
modelParamsNode["max_categories"] >> MAX_CATEGORIES;
|
||||
modelParamsNode["cv_folds"] >> CV_FOLDS;
|
||||
modelParamsNode["is_pruned"] >> IS_PRUNED;
|
||||
model = DTrees::create(DTrees::Params(MAX_DEPTH, MIN_SAMPLE_COUNT, REG_ACCURACY, USE_SURROGATE,
|
||||
MAX_CATEGORIES, CV_FOLDS, false, IS_PRUNED, Mat() ));
|
||||
|
||||
Ptr<DTrees> m = DTrees::create();
|
||||
m->setMaxDepth(MAX_DEPTH);
|
||||
m->setMinSampleCount(MIN_SAMPLE_COUNT);
|
||||
m->setRegressionAccuracy(REG_ACCURACY);
|
||||
m->setUseSurrogates(USE_SURROGATE);
|
||||
m->setMaxCategories(MAX_CATEGORIES);
|
||||
m->setCVFolds(CV_FOLDS);
|
||||
m->setUse1SERule(false);
|
||||
m->setTruncatePrunedTree(IS_PRUNED);
|
||||
m->setPriors(Mat());
|
||||
model = m;
|
||||
}
|
||||
else if( modelName == CV_BOOST )
|
||||
{
|
||||
@@ -401,7 +399,15 @@ int CV_MLBaseTest::train( int testCaseIdx )
|
||||
modelParamsNode["weight_trim_rate"] >> WEIGHT_TRIM_RATE;
|
||||
modelParamsNode["max_depth"] >> MAX_DEPTH;
|
||||
//modelParamsNode["use_surrogate"] >> USE_SURROGATE;
|
||||
model = Boost::create( Boost::Params(BOOST_TYPE, WEAK_COUNT, WEIGHT_TRIM_RATE, MAX_DEPTH, USE_SURROGATE, Mat()) );
|
||||
|
||||
Ptr<Boost> m = Boost::create();
|
||||
m->setBoostType(BOOST_TYPE);
|
||||
m->setWeakCount(WEAK_COUNT);
|
||||
m->setWeightTrimRate(WEIGHT_TRIM_RATE);
|
||||
m->setMaxDepth(MAX_DEPTH);
|
||||
m->setUseSurrogates(USE_SURROGATE);
|
||||
m->setPriors(Mat());
|
||||
model = m;
|
||||
}
|
||||
else if( modelName == CV_RTREES )
|
||||
{
|
||||
@@ -416,9 +422,18 @@ int CV_MLBaseTest::train( int testCaseIdx )
|
||||
modelParamsNode["is_pruned"] >> IS_PRUNED;
|
||||
modelParamsNode["nactive_vars"] >> NACTIVE_VARS;
|
||||
modelParamsNode["max_trees_num"] >> MAX_TREES_NUM;
|
||||
model = RTrees::create(RTrees::Params( MAX_DEPTH, MIN_SAMPLE_COUNT, REG_ACCURACY,
|
||||
USE_SURROGATE, MAX_CATEGORIES, Mat(), true, // (calc_var_importance == true) <=> RF processes variable importance
|
||||
NACTIVE_VARS, TermCriteria(TermCriteria::COUNT, MAX_TREES_NUM, OOB_EPS)));
|
||||
|
||||
Ptr<RTrees> m = RTrees::create();
|
||||
m->setMaxDepth(MAX_DEPTH);
|
||||
m->setMinSampleCount(MIN_SAMPLE_COUNT);
|
||||
m->setRegressionAccuracy(REG_ACCURACY);
|
||||
m->setUseSurrogates(USE_SURROGATE);
|
||||
m->setMaxCategories(MAX_CATEGORIES);
|
||||
m->setPriors(Mat());
|
||||
m->setCalculateVarImportance(true);
|
||||
m->setActiveVarCount(NACTIVE_VARS);
|
||||
m->setTermCriteria(TermCriteria(TermCriteria::COUNT, MAX_TREES_NUM, OOB_EPS));
|
||||
model = m;
|
||||
}
|
||||
|
||||
if( !model.empty() )
|
||||
|
||||
@@ -149,9 +149,8 @@ int CV_SLMLTest::validate_test_results( int testCaseIdx )
|
||||
}
|
||||
|
||||
TEST(ML_NaiveBayes, save_load) { CV_SLMLTest test( CV_NBAYES ); test.safe_run(); }
|
||||
//CV_SLMLTest lsmlknearest( CV_KNEAREST, "slknearest" ); // does not support save!
|
||||
TEST(ML_KNearest, save_load) { CV_SLMLTest test( CV_KNEAREST ); test.safe_run(); }
|
||||
TEST(ML_SVM, save_load) { CV_SLMLTest test( CV_SVM ); test.safe_run(); }
|
||||
//CV_SLMLTest lsmlem( CV_EM, "slem" ); // does not support save!
|
||||
TEST(ML_ANN, save_load) { CV_SLMLTest test( CV_ANN ); test.safe_run(); }
|
||||
TEST(ML_DTree, save_load) { CV_SLMLTest test( CV_DTREE ); test.safe_run(); }
|
||||
TEST(ML_Boost, save_load) { CV_SLMLTest test( CV_BOOST ); test.safe_run(); }
|
||||
|
||||
Reference in New Issue
Block a user