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

时间:2013-09-05 15:50:31

标签: opencv machine-learning classification svm libsvm

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

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

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

facial landmarks

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

SVM是一个不错的选择吗?如果是我如何从SVM开始:

我将如何使用这些地标训练svm以获得每一种情感?

3 个答案:

答案 0 :(得分:7)

是的,已经证明SVM在这项任务中表现良好。已有数十篇(如果不是hundreads)论文描述了这些程序。

例如:

可以在http://www.support-vector-machines.org/上获得SVM本身的一些基本来源(如书名,软件链接等)。

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

答案 1 :(得分: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%的准确度。

有人说cnn是svms的替代品。有些链接实现了lenet5。到目前为止,我发现svms更容易上手。

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

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

-edit -

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

例如,3个地标{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 =厌恶

答案 2 :(得分:0)

您可以查看this代码,了解如何使用SVM完成此操作。

您可以找到解释here

的算法