gpt4 book ai didi

c - 如何使用具有面部特征的 openCV 训练支持 vector 机 (svm) 分类器?

转载 作者:太空狗 更新时间:2023-10-29 16:51:59 28 4
gpt4 key购买 nike

我想使用 svm 分类器进行面部表情检测。我知道 opencv 有一个 svm api,但我不知道训练分类器的输入应该是什么。到现在看了很多论文,都是说人脸特征检测后训练分类器。

到目前为止我做了什么,

  1. 人脸检测,
  2. 每帧计算 16 个面部点。下面是面部特征检测的输出![输入图像描述
  3. 一个包含特征点像素地址的 vector here

注意:我知道如何只用正面和负面图像训练 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com