OpenCV 3 дает метки противоположного класса в модели гауссовой смеси

Я использую OpenCV 3.1.0, чтобы приспособить модель гауссовой смеси к данным двух классов, используя EM. Образцы помечены, поэтому я предоставляю классные средства и ковариации во время обучения, используя EM :: trainE. Когда я проверяю предсказанные метки, они кажутся хорошо подходящими для данных, но наоборот (выборки из класса 1 почти всегда предсказывают, чтобы быть в классе 0 и наоборот). Вот как тренируется модель:

// Run EM
Mat predicted_labels(samples.rows, 1, CV_64F);
Mat means0(EM_CLASS_COUNT, SAMPLE_DIMENSIONS, CV_64F);
const int sizes[]{ EM_CLASS_COUNT, SAMPLE_DIMENSIONS, SAMPLE_DIMENSIONS };
Mat covar0(3, sizes, CV_64F);
for (int i = 0; i < EM_CLASS_COUNT; ++i) {
calcCovarMatrix(class_samples[i], Mat(SAMPLE_DIMENSIONS, SAMPLE_DIMENSIONS, samples.type(), covar0.row(i).data), means0.row(i), COVAR_NORMAL | COVAR_ROWS);
}
Ptr<EM> model = EM::create();
model->setClustersNumber(EM_CLASS_COUNT);
model->trainE(samples, means0, covar0, noArray(), noArray(), predicted_labels);

// Print results
for (int i = 0; i < csv_data.size(); ++i) {
printf("(%f, %f, %f): %d -> %d\n", samples.at<double>(i, 0), samples.at<double>(i, 1), samples.at<double>(i, 2), sample_labels.at<int>(i), predicted_labels.at<int>(i));
}
Mat error = (sample_labels != predicted_labels) / 255;
printf("Error rate: %f\n", norm(error, NORM_L1) / error.rows);
Mat means = model->getMeans();
printf("Sample means: 0:(%f, %f, %f), 1:(%f, %f, %f)\n", means0.at<double>(0, 0), means0.at<double>(0, 1), means0.at<double>(0, 2), means0.at<double>(1, 0), means0.at<double>(1, 1), means0.at<double>(1, 2));
printf("Calculated means: 0:(%f, %f, %f), 1:(%f, %f, %f)\n", means.at<double>(0, 0), means.at<double>(0, 1), means.at<double>(0, 2), means.at<double>(1, 0), means.at<double>(1, 1), means.at<double>(1, 2));

При проверке данных, выводимых на консоль, рассчитанное среднее значение для каждого класса ближе всего к среднему значению выборки для противоположного класса.

Sample means: 0:(184.912913, 192.435435, 185.291291), 1:(149.543210, 150.604938, 129.833333)
Calculated means: 0:(147.953284, 153.951035, 139.721160), 1:(209.889542, 214.448519, 206.625586)

Вот визуализация данных образца и обученной модели, показывающая замененную классификацию. Красный — это класс 0, синий — это класс 1, а поиск ковариации содержит ошибки, поэтому контуры представляют собой круги, а не эллипсы:

участок образцов

Есть ли способ гарантировать, что каждый гауссиан в конечном итоге будет оптимизирован для выборок, с помощью которых он был создан, или есть ли другой метод определения того, какой метке класса принадлежит каждый гауссиан?

3

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]