人脸自动补全

关注公众号“轻松学编程”了解更多。

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机器学习实现人脸图片自动补全的更多相关文章

  1. Python 在 Terminal 中的自动补全

    为了在 Terminal 中使用 Python 更加方便,在 home 目录下添加脚本 .pythonstartup,内容如下, 然后在 .bashrc 中添加 export PYTHONSTARTU ...

  2. Python交互模式下代码自动补全

    这个功能是以lib的形式提供的,配置写到home下的.pythonrc文件中, 并设置好环境变量让python启动时执行初始化: # ~/.pythonrc # enable syntax compl ...

  3. 在Python命令行和VIM中自动补全

    作者:gnuhpc 出处:http://www.cnblogs.com/gnuhpc/ 1. VIM下的配置: wget https://github.com/rkulla/pydiction/arc ...

  4. python环境下使用tab自动补全命令

    # vim /usr/lib/python2.7/dist-packages/tab.py 加入如下内容: #!/usr/bin/env python # python startup file im ...

  5. python代码自动补全

    牛逼了!Python代码补全利器,提高效率告别996! Python之禅 Python之禅 微信号 VTtalk 功能介绍 人生苦短,我用Python,这里是一名老程序员分享Python技术的地方,欢 ...

  6. 这个 Python 代码自动补全神器搞得我卧槽卧槽的

    是时候跟你说说这个能让你撸代码撸得舒服得不要不要的神器了——kite. ​!   ​ 简单来说,它是一款 IDE 的插件,能做到代码自动补全,可能你会说了,这有什么牛逼的?一般的编辑器不都有这个功能么 ...

  7. Python自动补全

    转自:http://blog.linuxeye.com/324.html Python自动补全有vim编辑下和python交互模式下,下面分别介绍如何在这2种情况下实现Tab键自动补全. 一.vim ...

  8. Linux python <tab>自动补全

    为Python添加交互模式下TAB自动补全以及命令历史功能. 1.获取python目录 [root@localhost ~]# python Python 2.6.6 (r266:84292, Jul ...

  9. python命令行添加Tab键自动补全

    1.编写一个tab的自动补全脚本,名为tab.py #!/usr/bin/python # python tab complete import sys import readline import ...

随机推荐

  1. Salesforce LWC学习(二十七) File Upload

    本篇参考: https://developer.salesforce.com/docs/component-library/bundle/lightning-file-upload/documenta ...

  2. Laravel Event的分析和使用

    Laravel Event的分析和使用 第一部分 概念解释 请自行查看观察者模式 第二部分 源码分析 (逻辑较长,不喜欢追代码可以直接看使用部分) 第三部分 使用 第一部分 解释 当一个用户阅读了一篇 ...

  3. 为 MaixPy 加入软 I2C 接口(移植 MicroPython 的 I2C)

    起因 本文的重心为讲解如何为一款芯片移植和实现 micropython 的通用组件,但会顺带解释不同芯片的工作方式和特性. 国际惯例,先有起因,再谈问题的解决,所以记得上次总结的 关于 K210 Ma ...

  4. Excel双击“单元格”后,自动跳转到相关“工作表

    Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)If Target.Column = ...

  5. C++中cstring.h和string.h的区别

    转载:https://blog.csdn.net/qian_chun_qiang/article/details/80648691 1.string与cstring有什么区别 <string&g ...

  6. 多测师讲解selenium_alert弹框定位_高级讲师肖sir

    from selenium import webdriverfrom time import sleepdrvier=webdriver.Chrome()url=r'F:\dcs\DCS课程安排\se ...

  7. 如何从0到1的构建一款Java数据生成器-第一章

    前提 某天晚上老夫在神游时,想起白天公司同事说起的问题,这老表抱怨使用mysql生成大批的随机测试数据太过麻烦,问大家有没有好的工具推荐,老夫对这种事情当然不关心,毕竟我也不知道. 秉承着不懂就要问, ...

  8. day48 Pyhton 数据库Mysql 05

    一内容回顾 insert insert into 表名 (字段名)  values (值) insert into 表名 values (有多少个字段写多少个值) insert into 表名 val ...

  9. 【自学编程】C语言编程简单的小程序,计算长方体体积!

    计算长方体体积 有朋友会说长方体体积还不好算吗?长X宽X高.没错用计算器一下就可以出结果,编程反而麻烦些,但是我们说的是这种思维,如果复杂的重复运算的话写好程序就非常简单了. 简单运算下一个固定高度的 ...

  10. composer 打印美化

    { "name": "brady_frmwork", "description":"php framwork", &qu ...