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

Программы на C++. Форум разработчиков
Ответить
Anonymous
 OpenCV 3 дает метки противоположных классов в модели гауссовой смеси

Сообщение Anonymous »

Я использую 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 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(i, 0), samples.at(i, 1), samples.at(i, 2), sample_labels.at(i), predicted_labels.at(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(0, 0), means0.at(0, 1), means0.at(0, 2), means0.at(1, 0), means0.at(1, 1), means0.at(1, 2));
printf("Calculated means: 0:(%f, %f, %f), 1:(%f, %f, %f)\n", means.at(0, 0), means.at(0, 1), means.at(0, 2), means.at(1, 0), means.at(1, 1), means.at(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, а получение ковариации содержит ошибки, поэтому контуры представляют собой круги, а не эллипсы:

Изображение


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

Подробнее здесь: https://stackoverflow.com/questions/347 ... ture-model
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»