目录

  • 数据集
  • 确定人脸的类别标记
  • 划分训练集和测试集与训练

实验为基于sklearn的SVM人脸识别,使用 SVM 算法对戴眼镜的人脸和不戴眼镜的人脸进行分类,从而完成 识别戴眼镜的人脸 的任务;实验涉及的支持向量机参数计算原理,回顾 第十八课

数据集

人脸图像数据集 olivetti_py3.pkz,保存在个人资源处,加载数据:

from sklearn.datasets import fetch_olivetti_faces# 从当前目录下加载人脸数据集,若没有则联网下载到当前目录下
faces = fetch_olivetti_faces(data_home='./')

该数据集一共有 400 张人脸图片,每张图片的大小是:64x64:

faces.images.shape
# (400, 64, 64)

每张图片作为一个样本,一共有 400 个样本,每个样本的特征维度是:64x64 = 4096:

faces.data.shape
# (400, 4096)

400 张图片一共包含 40 个不同的人,每个人有 10 张人脸图片:

from collections import Counter# 统计 target 中每个取值的数量
count=Counter(faces.target)
count
"""
Counter({0: 10,1: 10,2: 10,3: 10,4: 10,...39: 10})
"""

展示前 4 张人脸图片:

%matplotlib inline
import matplotlib.pyplot as plt# 设置子图数量和画布大小
plt.figure(num=4,figsize=(20,5))
# 遍历前 4 张图片和对应的索引(索引从零开始)
for i,face in enumerate(faces.images[:4]):# 1行4列的第i+1个子图plt.subplot(1,4,i+1)# 在对应位置显示子图plt.imshow(face)

确定人脸的类别标记

戴眼镜人脸的图片索引范围:

# 下面的每个元组代表索引的起始和结束(闭区间)
segments = [(10, 19), (30, 32), (37, 38), (50, 59), (63, 64),(69, 69), (120, 121), (124, 129),(130, 139), (160, 161),(164, 169), (180, 182),(185, 185), (189, 189), (190, 192),(194, 194), (196, 199), (260, 269), (270, 279), (300, 309),(330, 339), (358, 359), (360, 369)]

创建类别标记,戴眼镜的人脸为 1,没戴眼镜的人脸为 0:

import numpy as np# 先设置所有样本的标记值为 0
target = np.zeros(faces.target.shape[0])
# 再将戴眼镜人脸索引位置的标记值设置为 1
for seg in segments:target[seg[0]:seg[1]+1]=1
target

划分训练集和测试集与训练

划分数据集:

from sklearn.model_selection import train_test_split# 设置测试集的大小为 20%
X_train, X_test, y_train, y_test = train_test_split(faces.data, target, test_size=0.2, random_state=0)
X_train.shape, X_test.shape, y_train.shape, y_test.shape
# ((320, 4096), (80, 4096), (320,), (80,))

SVM 模型训练:

from sklearn.svm import SVC# 使用线性核函数进行模型训练
model = SVC(kernel='linear').fit(X_train,y_train)

模型准确率评估:

# 训练集的准确率
print('train_accuracy =',model.score(X_train,y_train))
# 测试集的准确率
print('test_accuracy =',model.score(X_test, y_test))
"""
train_accuracy = 1.0
test_accuracy = 0.9875
"""

识别结果可视化:

# 测试集的预测结果
y_pred = model.predict(X_test)
# 样本标记值对应的人脸类别
text = {1:'戴眼镜', 0:'没戴眼镜'}# 设置子图数量和画布大小
plt.figure(num=16,figsize=(20,20))
# 设置显示中文字体(黑体)
plt.rcParams['font.family'] = ['SimHei']# 遍历测试集的 16 张人脸图片对应的特征向量及其索引
for i,face in enumerate(X_test[:16]):# 4行4列的第i+1个子图 plt.subplot(4,4,i+1)# 将特征向量转为二维数组,shape=(64,64)face = face.reshape(64,64)# 将二维数组以图片的形式展现出来plt.imshow(face)# 取出当前人脸的类别标记预测值label = y_pred[i]# 在图片(35,60)的位置标出人脸类别(是否戴眼镜),字体大小为 24,字体颜色为棕色plt.text(x=35,y=60,s=text[label],fontdict={'fontsize':24 ,'color':'brown'})

第十九课.基于sklearn的SVM人脸识别相关推荐

  1. NeHe OpenGL第三十九课:物理模拟

    NeHe OpenGL第三十九课:物理模拟 物理模拟简介: 还记得高中的物理吧,直线运动,自由落体运动,弹簧.在这一课里,我们将创造这一切.   物理模拟介绍 如果你很熟悉物理规律,并且想实现它,这篇 ...

  2. 实践数据湖iceberg 第三十四课 基于数据湖icerberg的流批一体架构-流架构测试

    系列文章目录 实践数据湖iceberg 第一课 入门 实践数据湖iceberg 第二课 iceberg基于hadoop的底层数据格式 实践数据湖iceberg 第三课 在sqlclient中,以sql ...

  3. python第二十九课——文件读写(复制文件)

    自定义函数:实现文件复制操作有形参(2个) 没有返回值相似版(不用) def copyFile(src,dest):#1.打开两个文件:1个关联读操作,1个关联写操作fr=open(src,'rb') ...

  4. ML之SVM:基于sklearn的svm算法实现对支持向量的数据进行标注

    ML之SVM:基于sklearn的svm算法实现对支持向量的数据进行标注 目录 输出结果 实现代码 输出结果 实现代码 import numpy as np import matplotlib.pyp ...

  5. NeHe OpenGL第十九课:粒子系统

    NeHe OpenGL第十九课:粒子系统 粒子系统: 你是否希望创建爆炸,喷泉,流星之类的效果.这一课将告诉你如何创建一个简单的例子系统,并用它来创建一种喷射的效果. 欢迎来到第十九课.你已经学习了很 ...

  6. Python-opencv学习第二十九课:高斯双边模糊

    Python-opencv学习第二十九课:高斯双边模糊 文章目录 Python-opencv学习第二十九课:高斯双边模糊 一.学习部分 二.代码部分 1.引入库 2.读入数据 3.完整代码 三.运行结 ...

  7. NeHe OpenGL第二十九课:Blt函数

    NeHe OpenGL第二十九课:Blt函数 Blitter 函数: 类似于DirectDraw的blit函数,过时的技术,我们有实现了它.它非常的简单,就是把一块纹理贴到另一块纹理上. 这篇文章是有 ...

  8. NeHe OpenGL教程 第二十九课:Blt函数

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  9. C语言笔记 第三十九课 程序中的三国天下

    第三十九课 程序中的三国天下 程序中的栈 栈是现代计算机程序里最为重要的概念之一 栈在程序中用于维护函数调用上下文 函数中的参数和局部变量存储在栈上 栈是一种行为,一种先进后出的行为 栈保存了一个函数 ...

最新文章

  1. 汇编: dosbox命令
  2. nginx常见面试题
  3. AV1生态系统更新:2019年6月
  4. sql实现自定义排序
  5. B和strong以及i和em的区别
  6. 将2010年的旧电脑升级为Win8.1遇到的问题及解决办法
  7. 小程序中text标签之坑
  8. 芝麻小客服怎么进后台?
  9. ios 中h5网页跳到第三方后回到项目字体变大
  10. 应届生 实习生 社招最常用招聘网站
  11. Python 中点法求积分
  12. pointnet语义分割_训练并预测自己的数据
  13. 鲁迅文章的语言特色浅谈
  14. 【SRE笔记 2022.8.16 Linux命令基础01】
  15. 文献科普|DNA甲基化通过CTCF和黏着蛋白复合物调节选择性聚腺苷酸化
  16. Linux—系统关机命令详解
  17. php实现选择不同字段查询,laravel 实现根据字段不同值做不同查询
  18. 汽车动力经济性开发工具,发动机最优燃油消耗曲线计算程序 发动机最优燃油消耗曲线matlb计算模型,MATLAB模型,发动机OOL
  19. electron-vue 制作悬浮球
  20. 橡胶轮楔的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告

热门文章

  1. 美团外卖分布式系统架构设计
  2. 【万字长文】吃透负载均衡
  3. 1.5w字,30图带你彻底掌握 AQS!
  4. 他是阿里中台之父,从一线员工做到CTO:有商业意识的技术人,才有未来!
  5. 掌握Redis分布式锁的正确姿势
  6. 网易MySQL中间件的负载均衡策略及性能优化
  7. 三分钟基础:什么是拥塞控制?
  8. jenkins漏洞导致服务器中了挖矿病毒!cpu飙高351%!看我如何消灭它!
  9. Windows系统如何使用宝塔面板一键快速搭建本地服务器环境(LNMP/LAMP)
  10. Windows 10安装Tensorflow