实时使用SVM进行面部表情分类

7
我目前正在处理一个项目,需要从网络摄像头中提取用户的面部表情(仅限单个用户),例如悲伤或快乐。
我用以下方法对面部表情进行分类:
  • 使用opencv检测图像中的脸
  • 使用ASM和stasm获取面部特征点
现在我正在尝试进行面部表情分类。SVM是一个好选择吗?如果是,我该如何开始使用SVM?
我将如何使用这些特征点为每种情感训练SVM?

1
深度神经网络总是比支持向量机更好。 - usamec
由于时间紧迫,我必须使用 SVM 进行工作,有什么帮助吗!! - TIBOU
4
@usamec,你的说法并不总是正确的。首先这取决于“更好”的定义。 - Bull
1
@TIBOU:我正在做一件非常类似的事情,你是将点作为特征使用还是首先进行一些预处理,比如点之间的距离? - Moha the almighty camel
虽然这是一个旧帖子,但我必须指出stasm不适合此工作,因为它仅设计用于中性正面人脸。你要检测的表情超出了其范围。 - ibreznik
3个回答

7
是的,SVM已经被多次证明在这项任务中表现良好。已经有几十篇(如果不是上百篇)论文描述了这些过程。
例如:
- 简单论文 - 较长论文 - 海报 - 更复杂的例子 一些基本的SVM资源可以在http://www.support-vector-machines.org/上获得(如书籍标题、软件链接等)。
如果你只是想使用它们而不是理解它们,那么你可以获取其中一个基本库。

我想使用面部特征点位置训练SVM来分类面部表情(开心,愤怒,厌恶等),我该如何做? - TIBOU
1
http://stackoverflow.com/questions/18647405/train-svm-to-do-facial-expression-classification - TIBOU
如果您不介意我问一下,“我会听起来像个新手”,为什么要使用支持向量机而不是逻辑回归?这不是基本上相同的概念吗? - Nour
唯一的相似之处在于它们都是线性模型,因此包括感知机、OMP、线性回归和其他几十种模型。SVM真正的优势在于一种特定形式的正则化,已被证明在许多任务中(无论是经验上还是理论上)都优于LR。但是,没有所谓的“更好的模型”,总会有一些任务需要选择LR而不是SVM。无论如何,它们并不相同。特别是,SVM可以通过一种非常高效的方式进行“去线性化”(核技巧),而LR则不能。 - lejlot

3
如果你已经在使用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%的准确率。 正如有人说的那样,卷积神经网络是支持向量机的替代方案。以下链接实现了lenet5。到目前为止,我发现svms更容易入门。

https://github.com/lisa-lab/DeepLearningTutorials/

http://www.codeproject.com/Articles/16650/Neural-Network-for-Recognition-of-Handwritten-Digi

-编辑-

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

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

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.]

0=高兴

1=生气

2=厌恶


我想使用面部特征点位置训练SVM来分类面部表情(开心,愤怒,厌恶等),我该如何做? - TIBOU
http://stackoverflow.com/questions/18647405/train-svm-to-do-facial-expression-classification - TIBOU
在训练中,每种情绪都有许多图像,我该如何训练SVM呢?对于每种情绪,很抱歉我不太明白。 - TIBOU
1
当你开始编写代码时,下一步应该很明显。如果我有更多时间,我会尝试在这个周末发布一个更完整的示例。 - Zaw Lin
谢谢您先生,我正在尝试编写代码,我会等待您的帮助。 - TIBOU
@TIBOU - 请阅读这篇文章,它会为你节省很多麻烦:http://www.csie.ntu.edu.tw/~cjlin/papers/guide/guide.pdf - Bull

0
你可以查看这个代码this 来了解如何使用 SVM 来实现这个功能。
你可以在这里找到算法的解释here

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接