【问题标题】:facial expression classification in real time using SVM使用 SVM 实时进行面部表情分类
【发布时间】:2013-09-09 13:15:08
【问题描述】:

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

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

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

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

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

我将如何使用这个地标为每种情绪训练 svm?

【问题讨论】:

  • 深度神经网络总是优于 SVM。
  • 由于时间关系,我必须使用 SVM,任何帮助!!
  • @usamec,您的说法并不总是正确的。取决于“更好”的定义。
  • @TIBOU:我正在做一些非常相似的事情,您是使用点作为特征还是首先进行一些预处理,例如点之间的距离?
  • 旧线程,但我必须指出,stasm 对这项工作来说是一个错误的工具,因为它仅设计用于中性正面。您要检测的表达式不在范围内。

标签: opencv machine-learning classification svm libsvm


【解决方案1】:

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

你可以找到算法解释here

【讨论】:

    【解决方案2】:

    如果您已经在使用 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 的链接。到目前为止,我发现 svm 上手起来要简单得多。

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

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

    -编辑-

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

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

    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 使用地标位置对面部表情(快乐、愤怒、厌恶……)进行分类,我该怎么做?
    • 在训练中,我有很多图像来表达每种情绪,那么我该如何训练 svm !!对于每一种情绪,对不起,我不明白
    • 你将不得不开始编写代码,一旦你有一个工作的东西应该很明显下一步该做什么。如果我有更多的时间,我会在这个周末尝试发布一个更完整的例子
    • 谢谢您,先生,我正在尝试编写此代码,我将等待您的帮助
    【解决方案3】:

    是的,SVM 已被大量证明在此任务中表现良好。已有数十篇(如果不是数百篇)描述此类程序的论文。

    例如:

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

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

    【讨论】:

    • 我想训练 svm 使用地标位置对面部表情(快乐、愤怒、厌恶……)进行分类,我该怎么做?
    • 如果您不介意我问,“我在这里听起来像个菜鸟”,为什么要使用 SVM 而不是逻辑回归?这不是基本相同的概念吗?
    • 唯一的相似之处在于它们都是线性模型,因此:感知器、OMP、线性回归等等。 SVM 的真正优势在于一种特殊形式的正则化,它已被证明在许多任务(无论是经验上还是理论上)上都优于 LR。但是,仍然没有“更好的模型”这样的东西,总会有一个任务,最好用 LR 代替 SVM。无论哪种方式 - 它们相同。特别是,SVM 可以很容易地以一种非常有效的方式“去线性化”(内核技巧)。 LR 没有。
    猜你喜欢
    • 2013-08-28
    • 2013-09-08
    • 2016-12-01
    • 2013-07-16
    • 2013-02-04
    • 2016-09-13
    • 2014-05-12
    • 2012-04-02
    相关资源
    最近更新 更多