mirror of
https://github.com/opencv/opencv.git
synced 2026-07-30 07:43:03 +04:00
initial commit; ml has been refactored; it compiles and the tests run well; some other modules, apps and samples do not compile; to be fixed
This commit is contained in:
@@ -43,6 +43,9 @@
|
||||
|
||||
using namespace std;
|
||||
using namespace cv;
|
||||
using cv::ml::TrainData;
|
||||
using cv::ml::EM;
|
||||
using cv::ml::KNearest;
|
||||
|
||||
static
|
||||
void defaultDistribs( Mat& means, vector<Mat>& covs, int type=CV_32FC1 )
|
||||
@@ -309,9 +312,9 @@ void CV_KNearestTest::run( int /*start_from*/ )
|
||||
generateData( testData, testLabels, sizes, means, covs, CV_32FC1, CV_32FC1 );
|
||||
|
||||
int code = cvtest::TS::OK;
|
||||
KNearest knearest;
|
||||
knearest.train( trainData, trainLabels );
|
||||
knearest.find_nearest( testData, 4, &bestLabels );
|
||||
Ptr<KNearest> knearest = KNearest::create(true);
|
||||
knearest->train(TrainData::create(trainData, cv::ml::ROW_SAMPLE, trainLabels), 0);;
|
||||
knearest->findNearest( testData, 4, bestLabels);
|
||||
float err;
|
||||
if( !calcErr( bestLabels, testLabels, sizes, err, true ) )
|
||||
{
|
||||
@@ -373,13 +376,16 @@ int CV_EMTest::runCase( int caseIndex, const EM_Params& params,
|
||||
cv::Mat labels;
|
||||
float err;
|
||||
|
||||
cv::EM em(params.nclusters, params.covMatType, params.termCrit);
|
||||
Ptr<EM> em;
|
||||
EM::Params emp(params.nclusters, params.covMatType, params.termCrit);
|
||||
if( params.startStep == EM::START_AUTO_STEP )
|
||||
em.train( trainData, noArray(), labels );
|
||||
em = EM::train( trainData, noArray(), labels, noArray(), emp );
|
||||
else if( params.startStep == EM::START_E_STEP )
|
||||
em.trainE( trainData, *params.means, *params.covs, *params.weights, noArray(), labels );
|
||||
em = EM::train_startWithE( trainData, *params.means, *params.covs,
|
||||
*params.weights, noArray(), labels, noArray(), emp );
|
||||
else if( params.startStep == EM::START_M_STEP )
|
||||
em.trainM( trainData, *params.probs, noArray(), labels );
|
||||
em = EM::train_startWithM( trainData, *params.probs,
|
||||
noArray(), labels, noArray(), emp );
|
||||
|
||||
// check train error
|
||||
if( !calcErr( labels, trainLabels, sizes, err , false, false ) )
|
||||
@@ -399,7 +405,7 @@ int CV_EMTest::runCase( int caseIndex, const EM_Params& params,
|
||||
{
|
||||
Mat sample = testData.row(i);
|
||||
Mat probs;
|
||||
labels.at<int>(i) = static_cast<int>(em.predict( sample, probs )[1]);
|
||||
labels.at<int>(i) = static_cast<int>(em->predict2( sample, probs )[1]);
|
||||
}
|
||||
if( !calcErr( labels, testLabels, sizes, err, false, false ) )
|
||||
{
|
||||
@@ -446,56 +452,56 @@ void CV_EMTest::run( int /*start_from*/ )
|
||||
int code = cvtest::TS::OK;
|
||||
int caseIndex = 0;
|
||||
{
|
||||
params.startStep = cv::EM::START_AUTO_STEP;
|
||||
params.covMatType = cv::EM::COV_MAT_GENERIC;
|
||||
params.startStep = EM::START_AUTO_STEP;
|
||||
params.covMatType = EM::COV_MAT_GENERIC;
|
||||
int currCode = runCase(caseIndex++, params, trainData, trainLabels, testData, testLabels, sizes);
|
||||
code = currCode == cvtest::TS::OK ? code : currCode;
|
||||
}
|
||||
{
|
||||
params.startStep = cv::EM::START_AUTO_STEP;
|
||||
params.covMatType = cv::EM::COV_MAT_DIAGONAL;
|
||||
params.startStep = EM::START_AUTO_STEP;
|
||||
params.covMatType = EM::COV_MAT_DIAGONAL;
|
||||
int currCode = runCase(caseIndex++, params, trainData, trainLabels, testData, testLabels, sizes);
|
||||
code = currCode == cvtest::TS::OK ? code : currCode;
|
||||
}
|
||||
{
|
||||
params.startStep = cv::EM::START_AUTO_STEP;
|
||||
params.covMatType = cv::EM::COV_MAT_SPHERICAL;
|
||||
params.startStep = EM::START_AUTO_STEP;
|
||||
params.covMatType = EM::COV_MAT_SPHERICAL;
|
||||
int currCode = runCase(caseIndex++, params, trainData, trainLabels, testData, testLabels, sizes);
|
||||
code = currCode == cvtest::TS::OK ? code : currCode;
|
||||
}
|
||||
{
|
||||
params.startStep = cv::EM::START_M_STEP;
|
||||
params.covMatType = cv::EM::COV_MAT_GENERIC;
|
||||
params.startStep = EM::START_M_STEP;
|
||||
params.covMatType = EM::COV_MAT_GENERIC;
|
||||
int currCode = runCase(caseIndex++, params, trainData, trainLabels, testData, testLabels, sizes);
|
||||
code = currCode == cvtest::TS::OK ? code : currCode;
|
||||
}
|
||||
{
|
||||
params.startStep = cv::EM::START_M_STEP;
|
||||
params.covMatType = cv::EM::COV_MAT_DIAGONAL;
|
||||
params.startStep = EM::START_M_STEP;
|
||||
params.covMatType = EM::COV_MAT_DIAGONAL;
|
||||
int currCode = runCase(caseIndex++, params, trainData, trainLabels, testData, testLabels, sizes);
|
||||
code = currCode == cvtest::TS::OK ? code : currCode;
|
||||
}
|
||||
{
|
||||
params.startStep = cv::EM::START_M_STEP;
|
||||
params.covMatType = cv::EM::COV_MAT_SPHERICAL;
|
||||
params.startStep = EM::START_M_STEP;
|
||||
params.covMatType = EM::COV_MAT_SPHERICAL;
|
||||
int currCode = runCase(caseIndex++, params, trainData, trainLabels, testData, testLabels, sizes);
|
||||
code = currCode == cvtest::TS::OK ? code : currCode;
|
||||
}
|
||||
{
|
||||
params.startStep = cv::EM::START_E_STEP;
|
||||
params.covMatType = cv::EM::COV_MAT_GENERIC;
|
||||
params.startStep = EM::START_E_STEP;
|
||||
params.covMatType = EM::COV_MAT_GENERIC;
|
||||
int currCode = runCase(caseIndex++, params, trainData, trainLabels, testData, testLabels, sizes);
|
||||
code = currCode == cvtest::TS::OK ? code : currCode;
|
||||
}
|
||||
{
|
||||
params.startStep = cv::EM::START_E_STEP;
|
||||
params.covMatType = cv::EM::COV_MAT_DIAGONAL;
|
||||
params.startStep = EM::START_E_STEP;
|
||||
params.covMatType = EM::COV_MAT_DIAGONAL;
|
||||
int currCode = runCase(caseIndex++, params, trainData, trainLabels, testData, testLabels, sizes);
|
||||
code = currCode == cvtest::TS::OK ? code : currCode;
|
||||
}
|
||||
{
|
||||
params.startStep = cv::EM::START_E_STEP;
|
||||
params.covMatType = cv::EM::COV_MAT_SPHERICAL;
|
||||
params.startStep = EM::START_E_STEP;
|
||||
params.covMatType = EM::COV_MAT_SPHERICAL;
|
||||
int currCode = runCase(caseIndex++, params, trainData, trainLabels, testData, testLabels, sizes);
|
||||
code = currCode == cvtest::TS::OK ? code : currCode;
|
||||
}
|
||||
@@ -511,7 +517,6 @@ protected:
|
||||
{
|
||||
int code = cvtest::TS::OK;
|
||||
const int nclusters = 2;
|
||||
cv::EM em(nclusters);
|
||||
|
||||
Mat samples = Mat(3,1,CV_64FC1);
|
||||
samples.at<double>(0,0) = 1;
|
||||
@@ -520,11 +525,11 @@ protected:
|
||||
|
||||
Mat labels;
|
||||
|
||||
em.train(samples, labels);
|
||||
Ptr<EM> em = EM::train(samples, noArray(), labels, noArray(), EM::Params(nclusters));
|
||||
|
||||
Mat firstResult(samples.rows, 1, CV_32SC1);
|
||||
for( int i = 0; i < samples.rows; i++)
|
||||
firstResult.at<int>(i) = static_cast<int>(em.predict(samples.row(i))[1]);
|
||||
firstResult.at<int>(i) = static_cast<int>(em->predict2(samples.row(i), noArray())[1]);
|
||||
|
||||
// Write out
|
||||
string filename = cv::tempfile(".xml");
|
||||
@@ -533,7 +538,7 @@ protected:
|
||||
try
|
||||
{
|
||||
fs << "em" << "{";
|
||||
em.write(fs);
|
||||
em->write(fs);
|
||||
fs << "}";
|
||||
}
|
||||
catch(...)
|
||||
@@ -543,29 +548,24 @@ protected:
|
||||
}
|
||||
}
|
||||
|
||||
em.clear();
|
||||
em.release();
|
||||
|
||||
// Read in
|
||||
try
|
||||
{
|
||||
FileStorage fs = FileStorage(filename, FileStorage::READ);
|
||||
CV_Assert(fs.isOpened());
|
||||
FileNode fn = fs["em"];
|
||||
try
|
||||
{
|
||||
em.read(fn);
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
ts->printf( cvtest::TS::LOG, "Crash in read method.\n" );
|
||||
ts->set_failed_test_info( cvtest::TS::FAIL_EXCEPTION );
|
||||
}
|
||||
em = StatModel::load<EM>(filename);
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
ts->printf( cvtest::TS::LOG, "Crash in read method.\n" );
|
||||
ts->set_failed_test_info( cvtest::TS::FAIL_EXCEPTION );
|
||||
}
|
||||
|
||||
remove( filename.c_str() );
|
||||
|
||||
int errCaseCount = 0;
|
||||
for( int i = 0; i < samples.rows; i++)
|
||||
errCaseCount = std::abs(em.predict(samples.row(i))[1] - firstResult.at<int>(i)) < FLT_EPSILON ? 0 : 1;
|
||||
errCaseCount = std::abs(em->predict2(samples.row(i), noArray())[1] - firstResult.at<int>(i)) < FLT_EPSILON ? 0 : 1;
|
||||
|
||||
if( errCaseCount > 0 )
|
||||
{
|
||||
@@ -588,21 +588,18 @@ protected:
|
||||
// 1. estimates distributions of "spam" / "not spam"
|
||||
// 2. predict classID using Bayes classifier for estimated distributions.
|
||||
|
||||
CvMLData data;
|
||||
string dataFilename = string(ts->get_data_path()) + "spambase.data";
|
||||
Ptr<TrainData> data = TrainData::loadFromCSV(dataFilename, 0);
|
||||
|
||||
if(data.read_csv(dataFilename.c_str()) != 0)
|
||||
if( data.empty() )
|
||||
{
|
||||
ts->printf(cvtest::TS::LOG, "File with spambase dataset cann't be read.\n");
|
||||
ts->set_failed_test_info(cvtest::TS::FAIL_INVALID_TEST_DATA);
|
||||
}
|
||||
|
||||
Mat values = cv::cvarrToMat(data.get_values());
|
||||
CV_Assert(values.cols == 58);
|
||||
int responseIndex = 57;
|
||||
|
||||
Mat samples = values.colRange(0, responseIndex);
|
||||
Mat responses = values.col(responseIndex);
|
||||
Mat samples = data->getSamples();
|
||||
CV_Assert(samples.cols == 57);
|
||||
Mat responses = data->getResponses();
|
||||
|
||||
vector<int> trainSamplesMask(samples.rows, 0);
|
||||
int trainSamplesCount = (int)(0.5f * samples.rows);
|
||||
@@ -616,7 +613,6 @@ protected:
|
||||
std::swap(trainSamplesMask[i1], trainSamplesMask[i2]);
|
||||
}
|
||||
|
||||
EM model0(3), model1(3);
|
||||
Mat samples0, samples1;
|
||||
for(int i = 0; i < samples.rows; i++)
|
||||
{
|
||||
@@ -630,8 +626,8 @@ protected:
|
||||
samples1.push_back(sample);
|
||||
}
|
||||
}
|
||||
model0.train(samples0);
|
||||
model1.train(samples1);
|
||||
Ptr<EM> model0 = EM::train(samples0, noArray(), noArray(), noArray(), EM::Params(3));
|
||||
Ptr<EM> model1 = EM::train(samples1, noArray(), noArray(), noArray(), EM::Params(3));
|
||||
|
||||
Mat trainConfusionMat(2, 2, CV_32SC1, Scalar(0)),
|
||||
testConfusionMat(2, 2, CV_32SC1, Scalar(0));
|
||||
@@ -639,8 +635,8 @@ protected:
|
||||
for(int i = 0; i < samples.rows; i++)
|
||||
{
|
||||
Mat sample = samples.row(i);
|
||||
double sampleLogLikelihoods0 = model0.predict(sample)[0];
|
||||
double sampleLogLikelihoods1 = model1.predict(sample)[0];
|
||||
double sampleLogLikelihoods0 = model0->predict2(sample, noArray())[0];
|
||||
double sampleLogLikelihoods1 = model1->predict2(sample, noArray())[0];
|
||||
|
||||
int classID = sampleLogLikelihoods0 >= lambda * sampleLogLikelihoods1 ? 0 : 1;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user