第十九课.基于sklearn的SVM人脸识别
目录
- 数据集
- 确定人脸的类别标记
- 划分训练集和测试集与训练
实验为基于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人脸识别相关推荐
- NeHe OpenGL第三十九课:物理模拟
NeHe OpenGL第三十九课:物理模拟 物理模拟简介: 还记得高中的物理吧,直线运动,自由落体运动,弹簧.在这一课里,我们将创造这一切. 物理模拟介绍 如果你很熟悉物理规律,并且想实现它,这篇 ...
- 实践数据湖iceberg 第三十四课 基于数据湖icerberg的流批一体架构-流架构测试
系列文章目录 实践数据湖iceberg 第一课 入门 实践数据湖iceberg 第二课 iceberg基于hadoop的底层数据格式 实践数据湖iceberg 第三课 在sqlclient中,以sql ...
- python第二十九课——文件读写(复制文件)
自定义函数:实现文件复制操作有形参(2个) 没有返回值相似版(不用) def copyFile(src,dest):#1.打开两个文件:1个关联读操作,1个关联写操作fr=open(src,'rb') ...
- ML之SVM:基于sklearn的svm算法实现对支持向量的数据进行标注
ML之SVM:基于sklearn的svm算法实现对支持向量的数据进行标注 目录 输出结果 实现代码 输出结果 实现代码 import numpy as np import matplotlib.pyp ...
- NeHe OpenGL第十九课:粒子系统
NeHe OpenGL第十九课:粒子系统 粒子系统: 你是否希望创建爆炸,喷泉,流星之类的效果.这一课将告诉你如何创建一个简单的例子系统,并用它来创建一种喷射的效果. 欢迎来到第十九课.你已经学习了很 ...
- Python-opencv学习第二十九课:高斯双边模糊
Python-opencv学习第二十九课:高斯双边模糊 文章目录 Python-opencv学习第二十九课:高斯双边模糊 一.学习部分 二.代码部分 1.引入库 2.读入数据 3.完整代码 三.运行结 ...
- NeHe OpenGL第二十九课:Blt函数
NeHe OpenGL第二十九课:Blt函数 Blitter 函数: 类似于DirectDraw的blit函数,过时的技术,我们有实现了它.它非常的简单,就是把一块纹理贴到另一块纹理上. 这篇文章是有 ...
- NeHe OpenGL教程 第二十九课:Blt函数
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- C语言笔记 第三十九课 程序中的三国天下
第三十九课 程序中的三国天下 程序中的栈 栈是现代计算机程序里最为重要的概念之一 栈在程序中用于维护函数调用上下文 函数中的参数和局部变量存储在栈上 栈是一种行为,一种先进后出的行为 栈保存了一个函数 ...
最新文章
- 汇编: dosbox命令
- nginx常见面试题
- AV1生态系统更新:2019年6月
- sql实现自定义排序
- B和strong以及i和em的区别
- 将2010年的旧电脑升级为Win8.1遇到的问题及解决办法
- 小程序中text标签之坑
- 芝麻小客服怎么进后台?
- ios 中h5网页跳到第三方后回到项目字体变大
- 应届生 实习生 社招最常用招聘网站
- Python 中点法求积分
- pointnet语义分割_训练并预测自己的数据
- 鲁迅文章的语言特色浅谈
- 【SRE笔记 2022.8.16 Linux命令基础01】
- 文献科普|DNA甲基化通过CTCF和黏着蛋白复合物调节选择性聚腺苷酸化
- Linux—系统关机命令详解
- php实现选择不同字段查询,laravel 实现根据字段不同值做不同查询
- 汽车动力经济性开发工具,发动机最优燃油消耗曲线计算程序 发动机最优燃油消耗曲线matlb计算模型,MATLAB模型,发动机OOL
- electron-vue 制作悬浮球
- 橡胶轮楔的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告