Я пытаюсь использовать CvNormalBayesClassifier для обучения моей программы, чтобы узнать цвета пикселей кожи. У меня есть набор тренировочных образов и изображений ответов. Ответные изображения черно-белые, участки кожи отмечены белым. Вот мой код,
CvNormalBayesClassifier classifier;
for (int i = 0; i < numFiles; i++) {
string trainFile = "images/" + int2str(i) + ".jpg";
string responseFile = "images/" + int2str(i) + "_mask.jpg";
Mat trainData = imread(trainFile, 1);
Mat responseData = imread(responseFile, CV_LOAD_IMAGE_GRAYSCALE);
trainData = trainData.reshape(1, trainData.rows * trainData.cols);
responseData = responseData.reshape(0, responseData.rows * responseData.cols);
trainData.convertTo(trainData, CV_32FC1);
responseData.convertTo(responseData, CV_32FC1);
classifier.train(trainData, responseData, Mat(), Mat(), i != 0);
}
Тем не менее, это дает следующую ошибку,
The function/feature is not implemented (In the current implementation the new training data must have absolutely the same set of class labels as used in the original training data) in CvNormalBayesClassifier::train
Большое спасибо.
Как говорится в сообщении об ошибке, вы не можете «обновить» классификатор в свете новых меток классов. Нормальный байесовский классификатор изучает смесь гауссиан для представления данных обучения. Если вы вдруг начнете добавлять новые метки, эта модель смеси перестанет быть правильной, и новую модель нужно будет изучать с нуля.
Хорошо, я обнаружил, что проблема заключалась в том, что черно-белые изображения были сжаты и, следовательно, содержат значения в диапазоне от 0 до 255. Поэтому в других изображениях может быть новая метка класса.
Чтобы решить эту проблему, используйте пороговое значение, чтобы все значения стали 0 или 255.