- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我想使用 svm 分类器进行面部表情检测。我知道 opencv 有一个 svm api,但我不知道训练分类器的输入应该是什么。到现在看了很多论文,都是说人脸特征检测后训练分类器。
到目前为止我做了什么,
注意:我知道如何只用正面和负面图像训练 SVM,我看到这段代码 here , 但我不知道如何将面部特征信息与它结合起来。
谁能帮我用 svm 开始分类。
一个。训练分类器的样本输入应该是什么?
如何用这个面部特征点训练分类器?
问候,
最佳答案
opencv 中的机器学习算法都带有相似的界面。为了训练它,你传递一个 NxM Mat of features(N 行,每个特征一行长度为 M)和一个 Nx1 Mat with the class-labels。像这样:
//traindata //trainlabels
f e a t u r e 1
f e a t u r e -1
f e a t u r e 1
f e a t u r e 1
f e a t u r e -1
对于预测,您以相同的方式用 1 行填充 Mat,它将返回预测的标签
所以,假设您的 16 个面部点存储在一个 vector 中,您会喜欢:
Mat trainData; // start empty
Mat labels;
for all facial_point_vecs:
{
for( size_t i=0; i<16; i++ )
{
trainData.push_back(point[i]);
}
labels.push_back(label); // 1 or -1
}
// now here comes the magic:
// reshape it, so it has N rows, each being a flat float, x,y,x,y,x,y,x,y... 32 element array
trainData = trainData.reshape(1, 16*2); // numpoints*2 for x,y
// we have to convert to float:
trainData.convertTo(trainData,CV_32F);
SVM svm; // params omitted for simplicity (but that's where the *real* work starts..)
svm.train( trainData, labels );
//later predict:
vector<Point> points;
Mat testData = Mat(points).reshape(1,32); // flattened to 1 row
testData.convertTo(testData ,CV_32F);
float p = svm.predict( testData );
关于c - 如何使用具有面部特征的 openCV 训练支持 vector 机 (svm) 分类器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26055749/
我正在寻找可以支持人脸检测、识别和聚类的SDK。我们试过了Pittpatt ,而且效果很好,但是被谷歌收购了,因此卡住了新契约(Contract)。所以我们不得不决定使用OpenCV,业务风险低,技术
我正在努力寻找正确的方法来调整大小、裁剪和图像,以及重点区域。在我的例子中,焦点区域是图像中检测到的人脸,我需要确保该区域在裁剪后的版本中可见。 我有例如给出的重点领域。 face_height、fa
我们的应用程序从钥匙串(keychain)中保存和检索项目,以便使用生物识别技术进行身份验证。 在第三次错误尝试时,我被重定向到设备 PIN 码。相反,想提示一条消息,指出 3 次错误尝试。 检索项目
我是一名优秀的程序员,十分优秀!