前言

svm训练模型相当简单,难的是提取特征这一步,这里介绍了一个睁闭眼检测功能从提取特征到预测的全过程。

首先,需要准备数据,我这里有睁眼和闭眼的照片各3000张,传统的机器学习方法都需要提取特征,这里检测特征用到了三个,通过程序预先提取出来了;接下来是模型的训练和预测过程。

提取特征:左右开眼率(上下眼皮的特征点距离)、黑色眼球的圆弧度(霍夫变换检测园)、眼球长宽比(人脸特征点)

         

特征提取出来:文件名+三个特征+标签(0睁眼、1闭眼)

然后把三个特征进行归一化,更有利于训练,并去掉了文件名(不需要)

模型训练(python)

这一步主要是把txt文本中的特征读取进来,每一张图片用一行三个特征表示;因此,n张图片转化成一个n行3列的特征矩阵,以及一个n行1列的label矩阵,然后使用svm训练

from numpy import *
import numpy as np
import cv2
import matplotlib.pyplot as pltdef loadDataSet(fileName):dataMat = []labelMat = []with open(fileName) as fr:for line in fr.readlines():lineArr = line.strip().split('    ')dataline = list(map(float, lineArr))dataMat.append([float(dataline[0]), float(dataline[1]), float(dataline[2])])labelMat.append([int(dataline[3])])return dataMat, labelMat#加载训练集
train_data,train_label = loadDataSet('new/img/train-20/right.txt')   #1.加载一个txt数据集
train_data = mat(train_data)
train_data=np.array(train_data, dtype='float32')
train_label = mat(train_label)#加载测试集
test_data,test_label = loadDataSet('new/img/train-20/test-right.txt')   #1.加载一个txt数据集
test_data = mat(test_data)
test_data=np.array(test_data, dtype='float32')
test_label=mat(test_label)
# print(test_label.shape)# 创建分类器
svm = cv2.ml.SVM_create()
svm.setType(cv2.ml.SVM_C_SVC)  # SVM类型
svm.setKernel(cv2.ml.SVM_LINEAR) # 使用线性核
svm.setC(1e-5)# 训练
ret = svm.train(train_data, cv2.ml.ROW_SAMPLE, train_label)
# svm.save('img/left.xml')# 支持向量
vec = svm.getSupportVectors()
print("最终结果:",vec)# 测试
(ret, res) = svm.predict(test_data)
# print(res)# 准确率
n=0
lens=len(test_data)
for i in range(lens):if res[i]==test_label[i]:n=n+1Accuracy=n/lens
print("准确度为:",Accuracy)

最后得到结果如下:

保存的模型:

加载模型预测:

使用svm = cv2.ml.SVM_load()即可加载一个训练好的模型,并且进行预测

# 创建分类器
svm = cv2.ml.SVM_create()
svm.setType(cv2.ml.SVM_C_SVC)  # SVM类型
svm.setKernel(cv2.ml.SVM_LINEAR) # 使用线性核
svm.setC(1e-5)svm = cv2.ml.SVM_load("new/img/train-30/svm-right.xml")
svm2 = cv2.ml.SVM_load("new/c++/svm-left.xml")# 测试
(ret1, res1) = svm.predict(test_data)
(ret2, res2) = svm2.predict(test_data)

再贴个c++版本的svm代码:

#include<opencv2\opencv.hpp> using namespace std;
using namespace cv;
using namespace cv::ml;int main()
{float train_data[2850][3];  int train_label[2850][1];ifstream file1("D:/work/Test/Test2/test2--图像处理/svm--眼睛状态检测/c++/train_data.txt");ifstream file2("D:/work/Test/Test2/test2--图像处理/svm--眼睛状态检测/c++/train_label.txt");// 训练数据for (int i = 0; i < 2850; i++){for (int j = 0; j < 3; j++){file1 >> train_data[i][j];//cout << train_data[i][j] << " ";}//cout << endl;}// 训练标签for (int i = 0; i < 2850; i++){for (int j = 0; j < 1; j++){file2 >> train_label[i][j];//cout << train_label[i][j] << " ";}//cout << endl;}file1.close();file2.close();Mat dataMat(2850, 3, CV_32FC1, train_data);Mat labelMat(2850, 1, CV_32SC1, train_label);//训练的初始化Ptr<SVM> svm = SVM::create();svm->setType(SVM::C_SVC);svm->setKernel(SVM::LINEAR);svm->setTermCriteria(cv::TermCriteria(TermCriteria::MAX_ITER + TermCriteria::EPS, 1500, 1e-5));开始训练svm->train(dataMat, ROW_SAMPLE, labelMat);svm->save("D:/work/Test/Test2/test2--图像处理/svm--眼睛状态检测/c++/svm2.xml");svm->load("svm.xml");std::cout << "模型训练完毕!" << endl;//Mat result;   //返回结果//float testData[2][3] = {//    { 0.814973, 15.1147, 0.431797 },//    { 1.514973, 18.1147, 0.436597 }//};   //预测数据//Mat test(2, 3, CV_32FC1, testData);    //预测数据//svm->predict(test, result);   //进行预测//std::cout << "分类结果为:" << endl;//std::cout << result << endl;把预测结果提取出来//int len = test.rows;;//for (int i = 0; i < len; i++)//{//    int a = result.at<Point2f>(i, 0).x;   // 把预测结果提取出来//    std::cout << a << endl;//}return 0;}

睁闭眼状态检测——SVM模型训练相关推荐

  1. 人眼特征标定数据(睁闭眼+瞳孔位置)

    国庆节期间,博主一直在整理数据集,发现网上大多数关于人眼的数据集不完整,有的只有睁闭眼状态的,有的虽然又瞳孔位置的,但是这个瞳孔位置用人眼的中心点作为瞳孔位置,很不专业.于是,博主一狠心,花了三四天的 ...

  2. opencv C++ SVM模型训练与分类实现

    最近想学习一下分类算法的内容,恰好opencv有SVM的函数,故先从这个下手.找了许多资料,发现要么是opencv2.3的,要么就没有具体实现代码,学习还是把代码与原理一起结合来看比较好. 其中,我主 ...

  3. Python--简单的深度学习CNN睁闭眼分类

    Python–简单的深度学习CNN睁闭眼分类 数据集:闭眼(CEW)和睁眼(LFW)两个文件夹,闭眼数据共1189张图片,睁眼数据为LFW中George_W_Bush共530张图片.测试集从中随机复制 ...

  4. SVM学习(一)SVM模型训练与分类

    SVM模型训练与分类 支持向量机(SVM): 一个能够将不同类样本在样本空间分隔的超平面.换句话说,给定一些标记好的训练本(监督式学习),SVM算法输出一个最优化的超分隔平面.本次利用VS2015+O ...

  5. python sklearn svm 模型训练后的参数说明

    在调用sklearn的SVM时,如果设置verbose=True,模型训练结束后会显示一些训练过程的说明信息,如下(以下是OCSVM的返回结果): * optimization finished, # ...

  6. 轻松学Pytorch – 行人检测Mask-RCNN模型训练与使用

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 大家好,这个是轻松学Pytorch的第20篇的文章分享,主要是给大 ...

  7. PaddlePaddle飞桨OCR文本检测——识别模型训练(三)

    上一篇检测模型训练https://blog.csdn.net/weixin_42845306/article/details/112689152 飞桨的OCR模型分为检测.识别和分类,今天讨论识别. ...

  8. 基于yolov5的目标检测和模型训练(Miniconda3+PyTorch+Pycharm+实战项目——装甲板识别)

    目录 一.环境配置和源码获取 1.Miniconda 2.MIniconda虚拟环境配置PyTorch 3.yolov5项目源码 4.pycharm 二.目标检测 三.模型训练 1.数据集 1.ima ...

  9. 【机器学习】svm模型训练后的参数说明

    现简单对屏幕回显信息进行说明: #iter 为迭代次数, nu  与前面的操作参数 -n nu  相同, obj 为 SVM 文件转换为的二次规划求解得到的最小值, rho  为判决函数的常数项 b  ...

最新文章

  1. 百度ERNIE 2.0发布!16项中英文任务表现超越BERT和XLNet
  2. html5之通讯API
  3. php如何减缓gc_管理信息传播-使用数据科学减缓错误信息的传播
  4. DB2 V9 默认帐户信息和服务启动信息
  5. 计算机网络物理层之物理层的基本概念
  6. 剑三哪些插件是必备的_日常学习、办公必备的浏览器插件丨附安装教程(三)...
  7. Vue:vue将按需引入element抽成单独js文件
  8. hive下载安装与配置
  9. 联想笔记本电脑整机拆解
  10. python爬虫爬取圆通快递信息
  11. 加密WebSphere Application Server系统密码
  12. 梨都飞雪 2021-05-21
  13. Scrapy学习笔记(3)爬取知乎首页问题及答案
  14. 淘宝双十一自动化领喵币python脚本
  15. 西宁-青海--茶卡盐湖-敦煌自由行攻略
  16. MDK编译全过程及数据存储
  17. python的mag模块_Python Decimal max_mag()用法及代码示例
  18. MythType安装问题解决
  19. 在Java中声明一个unsigned int
  20. 服务器系统2003资源监视器在哪里,系统资源监视器在哪里

热门文章

  1. java 10阶乘_从1阶乘加到10的阶乘怎么用java写
  2. 浅谈Green公式和外微分形式
  3. 文件服务器单向传输数据,一种单向文件传输方法及实现该传输方法的服务器
  4. python控制excel能达到什么目的_你精通excel吗?不,我精通python操控excel!
  5. vscode 左下方状态栏不显示 python 环境信息
  6. Github 突然给 Trending 热榜判了「死刑」!倒计时 30 天
  7. python scrapy请求手机版QQ空间数据
  8. win10系统键盘正常但突然不能输入
  9. 基于Titanic数据集的二元分类
  10. vue--elementui中修改el-input样式