Opencv 基于支持向量机的实时人脸表情分类

Opencv 基于支持向量机的实时人脸表情分类,opencv,machine-learning,classification,svm,libsvm,Opencv,Machine Learning,Classification,Svm,Libsvm,我目前正在做一个项目,我必须提取用户的面部表情(一次只能从网络摄像头中提取一个用户),比如悲伤或快乐 我的面部表情分类方法是: 使用opencv检测图像中的人脸 使用ASM和stasm获取面部特征点 现在我正在尝试面部表情分类 支持向量机是一个好的选择吗?如果是,我如何从SVM开始: 我将如何使用这些标志为每种情绪训练支持向量机?是的,支持向量机在这项任务中表现良好。已经有几十篇(如果不是几百篇)的论文描述了这样的程序 例如: 支持向量机本身的一些基本来源可以在上获得(如书籍标

我目前正在做一个项目,我必须提取用户的面部表情(一次只能从网络摄像头中提取一个用户),比如悲伤或快乐

我的面部表情分类方法是:

  • 使用opencv检测图像中的人脸
  • 使用ASM和stasm获取面部特征点

现在我正在尝试面部表情分类

支持向量机是一个好的选择吗?如果是,我如何从SVM开始:


我将如何使用这些标志为每种情绪训练支持向量机?

是的,支持向量机在这项任务中表现良好。已经有几十篇(如果不是几百篇)的论文描述了这样的程序

例如:

支持向量机本身的一些基本来源可以在上获得(如书籍标题、软件链接等)

如果您只是对使用它们感兴趣,而不是了解它们,您可以获得一个基本库:

  • libsvm
  • svmlight

如果您已经在使用opencv,我建议您使用内置的svm实现,python中的培训/保存/加载如下所示。C++有相应的API,在相同的代码量下也能做到这一点。它还具有“train_auto”功能,可以找到最佳参数

import numpy as np
import cv2

samples = np.array(np.random.random((4,5)), dtype = np.float32)
labels = np.array(np.random.randint(0,2,4), dtype = np.float32)

svm = cv2.SVM()
svmparams = dict( kernel_type = cv2.SVM_LINEAR, 
                       svm_type = cv2.SVM_C_SVC,
                       C = 1 )

svm.train(samples, labels, params = svmparams)

testresult = np.float32( [svm.predict(s) for s in samples])

print samples
print labels
print testresult

svm.save('model.xml')
loaded=svm.load('model.xml')
和输出

#print samples
[[ 0.24686454  0.07454421  0.90043277  0.37529686  0.34437731]
 [ 0.41088378  0.79261768  0.46119651  0.50203663  0.64999193]
 [ 0.11879266  0.6869216   0.4808321   0.6477254   0.16334397]
 [ 0.02145131  0.51843268  0.74307418  0.90667248  0.07163303]]
#print labels
[ 0.  1.  1.  0.]
#print testresult
[ 0.  1.  1.  0.]    
因此,您可以提供n个展平的形状模型作为示例和n个标签,这样就很好了。你甚至可能不需要asm部分,只需应用一些对方向敏感的过滤器,如sobel或gabor,将矩阵串联并展平,然后直接将它们输入svm。你可能会得到70-90%的准确率

正如有人所说,cnn是支持向量机的替代品。下面是一些实现lenet5的链接。到目前为止,我发现支持向量机更容易启动

-编辑-

地标只是n(x,y)个向量,对吗?那么,为什么不尝试将它们放入一个大小为2n的数组中,直接将它们输入到上面的代码中呢

例如,4个地标的3个训练样本
(0,0)、(10,10)、(50,50)、(70,70)

0=快乐

1=生气

2=厌恶

您可以检查代码,了解如何使用SVM实现这一点


你可以找到算法解释

深度神经网络总是比SVM好。由于时间关系,我必须使用SVM,有什么帮助吗@乌萨梅克,你的说法并不总是正确的。取决于“更好”的定义。@TIBOU:我正在做一些非常类似的事情,你是将点用作特征,还是先做一些预处理,例如点之间的距离?旧线程,但我必须指出,stasm是一个错误的工具,因为它只设计用于数字正面。你想要检测的表情超出了范围。我想训练支持向量机使用地标来分类面部表情(高兴、生气、厌恶等等),我怎么能做到呢?如果你不介意我问,“我在这里听起来像个傻瓜”,为什么要用支持向量机而不是逻辑回归?这基本上不是同一个概念吗?唯一的相似之处是它们都是线性模型,感知机、OMP、线性回归等等都是线性模型。支持向量机的真正优势在于一种特殊形式的正则化,这已被证明在许多任务中优于LR(经验和理论)。但是,仍然没有“更好的模型”这样的东西,总有一个任务是最好使用支持向量机的LR来完成的。无论哪种方式,它们都不一样。特别是,支持向量机可以很容易地以一种非常有效的方式“去线性化”(内核技巧)。LR不是。我想训练svm使用地标位置对面部表情(高兴、生气、厌恶等)进行分类。我该怎么做?在训练中,我有很多关于各种情绪的图像。我该如何训练svm!!对于每一种情绪,对不起,我不明白你将不得不开始写代码,一旦你有了一个工作的东西,下一步该做什么就变得显而易见了。如果我有更多的时间,我将在本周发布一个更完整的示例谢谢,先生,我正在尝试编写此代码,我将等待您的帮助
samples = [[0,0,10,10,50,50,70,70],
[0,0,10,10,50,50,70,70],
[0,0,10,10,50,50,70,70]]

labels=[0.,1.,2.]