我目前正在开展一个项目,我必须从悲伤或快乐中提取用户的面部表情(一次只能从网络摄像头一个用户)。
我对面部表情进行分类的方法是:
现在我正在尝试进行面部表情分类
SVM是一个不错的选择吗?如果是我如何从SVM开始:
我将如何使用这些地标训练svm以获得每一种情感?
答案 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)