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 ...
随机推荐
- sping aop 源码分析(-)-- 代理对象的创建过程分析
测试项目已上传到码云,可以下载:https://gitee.com/yangxioahui/aopdemo.git 具体如下: public interface Calc { Integer add( ...
- 二维数组,column可以从后往前循环
- 提升GAN的技术 Tips for Improving GAN
Wasserstein GAN (WGAN) 在一些情况下,用 JS散度来衡量两个分布的远近并不适合: 1. 数据是高维空间中的低维流形(manifold),两个分布在高维空间中的 overlap 少 ...
- Python练习题 009:水仙花数
[Python练习题 009] 打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身.例如:153是一个"水仙花数& ...
- 给子元素设置margin-top无效果的一种解决方法
在写一个登陆界面的时候,设置登录按钮的margin-top时出了问题 先是这么写的 <div style="margin-top:30px"> <a style= ...
- STM32与CH455g通信测试(仅键盘)
1.概述 CH455是数码管显示驱动和键盘扫描控制芯片.CH455内置时钟振荡电路,可以动态驱动4位数码管或者32只LED:同时还可以进行28键的键盘扫描:CH455通过SCL和SDA组成的2线串行接 ...
- SPI应用 用SPI总线读取气压传感器SCP1000的数据
Using SPI to read a Barometric Pressure Sensor This example shows how to use the SPI (Serial Periphe ...
- JavaFX ImageView
例子1:显示4个狗头.正常显示左上角.右下角的狗头:右上角的狗头旋转180°,并设置了透明度:左下角的狗头旋转90°,也设置了透明度. 1 import javafx.application.Appl ...
- TP5本地运行正常,线上运行某页面出现【模板文件不存在】问题的解决办法
相信许多小伙伴和我一样,明明在本地运行页面一切正常,而到线上(本人是用的虚拟主机)出现了如下图的问题: 其实这个问题出现的原因很简单,就是我们开发是在windows 系统下,windows系统对大小写 ...
- client: c#+protobuf, server: golang+protobuf
前段时间看到一篇博文<可在广域网部署运行的即时通讯系统 -- GGTalk总览(附源码下载)>,他是用C#实现的即时通讯系统,功能强大,界面漂亮. 就想用golang重写服务端,把代码下载 ...