Я работаю над определением лица, пола и возраста с использованием OpenCV. У меня есть куча изображений, которые я использую для обучения моделей, в настоящее время у меня есть следующее:
Ptr<cv::face::FaceRecognizer> model = cv::face::LBPHFaceRecognizer::create(9, 9);
std::vector<int> labels;
std::vector<std::string> imageFileNames;
for (int currImageIndex = 0; currImageIndex < imageFileNames.size(); currImageIndex++)
{
cv::Mat currMatrix;
std::string currentFileName = imageFileNames[currImageIndex];
std::string gender;
int currID = -1;
//Save the image and the corresponding ID to the list(s).
currMatrix = imread(currentFileName , CV_LOAD_IMAGE_GRAYSCALE);
if (currMatrix.data != NULL)
{
images.push_back(currMatrix);
labels.push_back(currID);
}
}
model->train(images, labels);
model->write("C:\\temp.xml");
Затем с помощью temp.xml
Эвристический, я предсказываю гендер как:
gendermodel->predict(currMat, predictedLabel, conf);
Однако наткнулся эта реализация с помощью detectMultiScale()
и "Cascade Classifier"
, Какая разница? Есть ли преимущество в производительности при использовании Cascade Classifier
против того, как я сейчас это делаю? Есть ли detectMultiScale()
работать лучше, чем predict()
?
CascadeClassifier::detectMultiScale
функция используется для объекта обнаружение. Возвращает переменную типа std::vector<cv::Rect>
который содержит ограничивающие прямоугольники обнаруженных объектов.
FaceRecognizer::predict
функция используется для объекта классификация. Он возвращает метку класса входного изображения и достоверность, с которой прогнозируется объект.
Других решений пока нет …