Face gesture recognition是一个广泛研究的问题,适当的特征需要通过对现有文献的深入研究来找到。一旦您拥有了您认为好的特征描述符,您就可以用它们来训练SVM。一旦您使用交叉验证找到了最优参数并训练了SVM,您就可以开始在未知数据上测试SVM模型并报告准确性。总的来说,这就是流程。
现在是关于SVM的部分:
SVM是一个二元分类器,它可以区分两个类(尽管也可以扩展到多个类)。OpenCV在ML库中内置了一个
SVM模块。SVM类有两个函数:
train(..)
和
predict(..)
。为了训练分类器,您需要输入大量的样本特征描述符以及它们的类标签(通常为-1和+1)。请记住OpenCV支持的格式:每个训练样本都必须是一个行向量。每行将在标签向量中有一个对应的类标签。因此,如果您具有长度为
n
的描述符,并且您有
m
个这样的样本描述符,则您的训练矩阵将是
m x n
(每个长度为
n
的
m
行),标签向量的长度将为
m
。还有一个
SVMParams
对象,其中包含SVM类型和参数值(如
C
)等属性,您需要指定。
一旦训练完成,您可以从图像中提取特征,将其转换为单行格式,并将其传递给predict()
,它会告诉您它属于哪个类别(+1或-1)。
还有一个train_auto()
,具有类似的参数和格式,可为您提供SVM参数的最佳值。
还可以查看此detailed SO answer以查看示例。
编辑:
假设您有一个返回特征向量的特征描述符,算法会像这样:
Mat trainingMat, labelsMat;
for each image in training database:
feature = extractFeatures( image[i] );
Mat feature_row = alignAsRow( feature );
trainingMat.push_back( feature_row );
labelsMat.push_back( -1 or 1 ); //depending upon class.
mySvmObject.train( trainingMat, labelsMat, Mat(), Mat(), mySvmParams );
我不认为
extractFeatures()
和
alignAsRow()
是现有的函数,你可能需要自己编写它们。