python机器学习实现人脸图片自动补全
人脸自动补全
关注公众号“轻松学编程”了解更多。
1、导包
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import time
from pandas import DataFrame,Series
#导入knn模型包
from sklearn.neighbors import KNeighborsRegressor
from sklearn.linear_model import LinearRegression,Ridge,Lasso
%matplotlib inline
#绘图时可以显示中文
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
2、获取数据
#从模块自带的数据集中选取人脸数据
from sklearn.datasets import fetch_olivetti_faces
faces = fetch_olivetti_faces()
#images中存储了400张64*64像素的照片
faces.images.shape
3、数据建模
提取特征数据和目标数据
#data是images的样本特征形式数据
faces.data.shape
#目标数据分为了40类,每类分组10张照片(0-39)
np.unique(faces.target,return_counts=True)
#查看一张照片的数据维度
faces.images[0].shape
#显示一张照片
plt.imshow(faces.images[0])
#提取特征数据
train = faces.data
#提取目标数据
target = faces.target
4、拆分数据
拆分数据:将样本数据拆分成训练数据(80%)和测试数据(20%)。
- 训练数据:特征(左半张脸) 目标(右半张脸)
- 测试数据:特征(左半张脸) 目标(右半张脸)
X_train = []
X_test = []
y_train = []
y_test = []
for i in range(40):
#获取每种分类的10张照片数据
person_faces = train[target == i]
#将获取的每种分类中的每张照片切分成上、下半张脸两部分
for k in range(len(person_faces)):
face_data = person_faces[k]
#取照片左边
left_face = face_data.reshape(64,64)[:,:32].ravel()
#取照片右边
right_face = face_data.reshape(64,64)[:,32:].ravel()
#将每种分类中的前8张照片的左、右半张脸的数据分别添加到训练数据的集合中
if k < 8:
X_train.append(left_face)
y_train.append(right_face)
else:
#将每种分类中的后2张照片的左、右半张脸的数据分别添加到测试数据的集合中
X_test.append(left_face)
y_test.append(right_face)
6、模型评估
建一个DataFrame表格
df=DataFrame(data=None,
index=['k-近邻模型',
'普通线性回归(linear)',
'岭回归(Ridge)',
'lasso回归'],
columns=['评分','训练时间(s)','k值/alpha',])
knn模型
score = 0
k=0
for i in range(1,40):
knn = KNeighborsRegressor(n_neighbors=i)
start=time.time()
knn.fit(X_train,y_train)
end=time.time()
s=knn.score(X_test,y_test)
if score < s:
score = s
k=i
ktime = end-start
df.loc['k-近邻模型']=[score,ktime,k]
普通线性回归模型
score = 0
for i in range(1,10):
linear = LinearRegression()
start=time.time()
linear.fit(X_train,y_train)
end=time.time()
s=linear.score(X_test,y_test)
if score < s:
score = s
ktime = end-start
df.loc['普通线性回归(linear)']=[score,ktime,None]
岭回归模型
score = 0
alpha=0
for i in range(1,10):
ridge = Ridge(alpha=i)
start=time.time()
ridge.fit(X_train,y_train)
end=time.time()
s=ridge.score(X_test,y_test)
if score < s:
score = s
alpha=i
ktime = end-start
df.loc['岭回归(Ridge)']=[score,ktime,alpha]
lasso模型
score = 0
alpha=0
for i in range(1,10):
lasso = Lasso(alpha=i)
start=time.time()
lasso.fit(X_train,y_train)
end=time.time()
s=lasso.score(X_test,y_test)
if abs(score) < abs(s):
score = s
alpha=i
ktime = end-start
df.loc['lasso回归']=[score,ktime,alpha]
df
从表格可以看出knn模型和岭回归模型对预测结果较为精准。
7、绘图
#将预测的缺失部分和测试数据整合一起显示
plt.figure(figsize=(8,6))
#图片标题
title=['true_img','knn_img','linear_img','lasso_img','ridge_img']
#预测4张照片
for i in range(4):
#预测测试数据中照片缺失的部分
knn_y = knn.predict([X_test[i]])
linear_y = linear.predict([X_test[i]])
ridge_y = ridge.predict([X_test[i]])
lasso_y = lasso.predict([X_test[i]])
#合并原始照片
true_img=np.concatenate((X_test[i].reshape(64,32),
y_test[i].reshape(64,32)),axis=1)
#合并预测照片
knn_img=np.concatenate((X_test[i].reshape(64,32),
knn_y[0].reshape(64,32)),axis=1)
linear_img=np.concatenate((X_test[i].reshape(64,32),
linear_y[0].reshape(64,32)),axis=1)
lasso_img=np.concatenate((X_test[i].reshape(64,32),
lasso_y[0].reshape(64,32)),axis=1)
ridge_img=np.concatenate((X_test[i].reshape(64,32),
ridge_y[0].reshape(64,32)),axis=1)
index=[true_img,knn_img,linear_img,lasso_img,ridge_img]
#一行显示5张照片做对比
for j in range(5):
axes = plt.subplot(5,5,(j+1)+i*5)
axes.imshow(index[j])
if i < 1:
axes.set_title(title[j])
经过对比使用岭回归(ridge)模型对照片右半部分补全效果较好。
后记
【后记】为了让大家能够轻松学编程,我创建了一个公众号【轻松学编程】,里面有让你快速学会编程的文章,当然也有一些干货提高你的编程水平,也有一些编程项目适合做一些课程设计等课题。
也可加我微信【1257309054】,拉你进群,大家一起交流学习。
如果文章对您有帮助,请我喝杯咖啡吧!
公众号
关注我,我们一起成长~~
python机器学习实现人脸图片自动补全的更多相关文章
- Python 在 Terminal 中的自动补全
为了在 Terminal 中使用 Python 更加方便,在 home 目录下添加脚本 .pythonstartup,内容如下, 然后在 .bashrc 中添加 export PYTHONSTARTU ...
- Python交互模式下代码自动补全
这个功能是以lib的形式提供的,配置写到home下的.pythonrc文件中, 并设置好环境变量让python启动时执行初始化: # ~/.pythonrc # enable syntax compl ...
- 在Python命令行和VIM中自动补全
作者:gnuhpc 出处:http://www.cnblogs.com/gnuhpc/ 1. VIM下的配置: wget https://github.com/rkulla/pydiction/arc ...
- python环境下使用tab自动补全命令
# vim /usr/lib/python2.7/dist-packages/tab.py 加入如下内容: #!/usr/bin/env python # python startup file im ...
- python代码自动补全
牛逼了!Python代码补全利器,提高效率告别996! Python之禅 Python之禅 微信号 VTtalk 功能介绍 人生苦短,我用Python,这里是一名老程序员分享Python技术的地方,欢 ...
- 这个 Python 代码自动补全神器搞得我卧槽卧槽的
是时候跟你说说这个能让你撸代码撸得舒服得不要不要的神器了——kite. ! 简单来说,它是一款 IDE 的插件,能做到代码自动补全,可能你会说了,这有什么牛逼的?一般的编辑器不都有这个功能么 ...
- Python自动补全
转自:http://blog.linuxeye.com/324.html Python自动补全有vim编辑下和python交互模式下,下面分别介绍如何在这2种情况下实现Tab键自动补全. 一.vim ...
- Linux python <tab>自动补全
为Python添加交互模式下TAB自动补全以及命令历史功能. 1.获取python目录 [root@localhost ~]# python Python 2.6.6 (r266:84292, Jul ...
- python命令行添加Tab键自动补全
1.编写一个tab的自动补全脚本,名为tab.py #!/usr/bin/python # python tab complete import sys import readline import ...
随机推荐
- 从面向过程到面向对象再到MVC
/* * * title: 从面向过程到面向对象再到MVC * author: tanghao * date: 2020.9.30 * version: 1.0 * */ 前言 本文档通过一个显示20 ...
- 微信小程序 LBS 能力全面解析
分享之前我们先来看看地图能力在小程序架构体现中所处的位置. 小程序架构图解 如图标黄处为地图能力所处的一个位置,举个例子,比如调用定位能力获取用户当前位置的一个流程: 首先调用 JS API wx.g ...
- 094 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 02 static关键字 04 static关键字(续)
094 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 ...
- C语言&C++ 中External dependencies
参考:https://blog.csdn.net/yyyzlf/article/details/4419593 External Dependencies是说你没有把这个文件加入到这个工程中,但是 ...
- PADS Layout VX.2.3 将PCB中的元器件封装保存到库
工具1:PADS Layout VX.2.3 菜单File > Library...,打开Library Manager,点击Create New Lib...新建一个库. 使用快捷键Ctrl ...
- 在自己电脑上查看git远程分支列表比实际云端的远程分支要多一些
问题 最近打开一个很久没有打开过的项目,使用git branch -a查看了一下所以分支,其中有些远程分支没有什么用了 于是准备去gitlab上删除它,结果到gitlab上发现没有这些分支,猜测是自己 ...
- ansible-主机清单的配置
1. ansible主机清单的配置 以下是ansible安装完成后的源文件 1 [root@test-1 ~]# cat /etc/ansible/hosts 2 # This is the defa ...
- 安装mariadb/mysql 连接失败问题
在linux下安装mariadb会出现一系列问题 问题1->服务器端不需要用户名密码就可登陆数据库 问题2->php使用mysql不能连接数据库 访问受限 问题3->navicate ...
- golang API 请求队列
概要 实现思路 使用方法 启动队列服务 使用队列服务 概要 在调用第三方 API 的时候, 基本都有访问限速的限制条件. 第三方的 API 有多个的时候, 就不太好控制访问速度, 常常会导致 HTTP ...
- antd pro 路由
概要 antd pro 路由简介 路由, 菜单和面包屑 页面之间的路由 带参数的路由 总结 概要 路由配置是单页应用的核心之一, antd pro 将所有的路由配置集中在一个文件中, 可以更好的对应用 ...