人脸自动补全

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

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. python3 结束进程

    为什么会去结束进程呢?因为在做appium中遇到H5跳转了多个页面的时候,出现了获取的pagesource是上一个页面的情况,这时候就需要先退出webview,然后杀掉chromedriver的进程, ...

  2. Emgu.CV怎么加载Bitmap

    EmguCV 在4.0.1版本之后没办法用Bitmap创建Image了. 我给大家说下 EmguCV怎么加载Bitmap 下边是 EmguCV 官方文档写的,意思是从4.0.1以后的版本不能直接Bit ...

  3. 023 01 Android 零基础入门 01 Java基础语法 03 Java运算符 03 算术运算符之——自增自减运算符

    023 01 Android 零基础入门 01 Java基础语法 03 Java运算符 03 算术运算符之--自增自减运算符 本文知识点:Java算术运算符中的自增自减运算符 自增自减运算符 之前我们 ...

  4. MFC 简介

    参考:https://baike.baidu.com/item/MFC/2236974 MFC (微软基础类库) 编辑 锁定 讨论999   MFC(Microsoft Foundation Clas ...

  5. IDEA中,已经被加到版本库的文件如何在提交的时候忽略它们

    因为某些资源共享的原因,我在本地调试的时候需要修改Java启动程序类上的一些配置,禁用掉Kafka等等.然后我就想 把这些本地调试需要修改的但是线上服务不需要修改的给忽略掉,于是加入到了.gitign ...

  6. 安装redis,phpstudy

    第一步: 先下载一下我分享自己的百度网盘里面的资料,网友们下载即可 链接:https://pan.baidu.com/s/1SVO-yAEqbFuvhiiI6Dm3VQ 提取码:u8t0 复制这段内容 ...

  7. python`最简单的爬虫`实现

    不管怎么样,一天一更的好习惯一定要保持,现在一天不写点东西都感觉不踏实,总会感觉少了点什么,废话少说,记录一下今天初学的spider(甚至说不上是spider,I'm so vagetable [/认 ...

  8. 线程基本使用--Thread内部方法调用start

    一个问题,下面的代码会如何运行 public class TraditionalThread { public static void main(String[] args) { System.out ...

  9. 6.Android-五大布局

    Android 五大布局如下所示: LinearLayout 线性布局 只能指定一个方向(垂直/水平)来布局 RelativeLayout 相对布局 通过某个控件为参照物,来定位其它控件的位置的布局方 ...

  10. day27 Pyhton 面向对象02 组合

    # 组合 # 什么是组合 : 一个类对象的属性是另外一个类的对象 class Person: def __init__(self,name,sex,hp,mp,ad): self.name = nam ...