如何使用具有面部特征的openCV训练支持向量机(svm)分类器?

 日蕾文散Lotus 发布于 2022-12-19 16:12

我想使用svm分类器进行面部表情检测.我知道opencv有一个svm api,但我不知道应该用什么来训练分类器.到目前为止,我已经阅读了很多论文,所有这些都是在面部特征检测后训练分类器时说的.

到目前为止我做了什么,

    人脸检测,

    每帧中16个面部点计算.下面是面部特征检测的输出![输入图像说明

    保持特征的矢量指向像素地址这里

注意:我知道如何只用正片和负片训练SVM,我在这里看到了这段代码,但我不知道如何将面部特征信息与它结合起来.

有人可以帮我开始用svm进行分类.

一个.什么应该是训练分类器的样本输入?

湾 如何使用此面部特征点训练分类器?

问候,

1 个回答
  • opencv中的机器学习算法都带有类似的界面.为了训练它,你传递一个NxM Mat offeatures(N行,每个特征一行长度为M)和一个带有类标签的Nx1 Mat.像这样:

    //traindata      //trainlabels
    
    f e a t u r e    1 
    f e a t u r e    -1
    f e a t u r e    1
    f e a t u r e    1
    f e a t u r e    -1
    

    对于预测,您以相同的方式填充1行的Mat,它将返回预测的标签

    所以,比方说,你的16个面部点存储在一个矢量中,你会这样做:

    Mat trainData; // start empty
    Mat labels;
    
    for all facial_point_vecs:
    {
        for( size_t i=0; i<16; i++ )
        {
            trainData.push_back(point[i]);
        }
        labels.push_back(label); // 1 or -1
    }
    // now here comes the magic:
    // reshape it, so it has N rows, each being a flat float, x,y,x,y,x,y,x,y... 32 element array
    trainData = trainData.reshape(1, 16*2); // numpoints*2 for x,y
    
    // we have to convert to float:
    trainData.convertTo(trainData,CV_32F);
    
    SVM svm; // params omitted for simplicity (but that's where the *real* work starts..)
    svm.train( trainData, labels );
    
    
    //later predict:
    vector<Point> points;
    Mat testData = Mat(points).reshape(1,32); // flattened to 1 row
    testData.convertTo(testData ,CV_32F);
    float p = svm.predict( testData );
    

    2022-12-19 16:14 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有