人脸自动补全

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

1、导包

  1. import matplotlib.pyplot as plt
  2. import numpy as np
  3. import pandas as pd
  4. import time
  5. from pandas import DataFrame,Series
  6. #导入knn模型包
  7. from sklearn.neighbors import KNeighborsRegressor
  8. from sklearn.linear_model import LinearRegression,Ridge,Lasso
  9. %matplotlib inline
  10. #绘图时可以显示中文
  11. plt.rcParams['font.sans-serif']=['SimHei']
  12. plt.rcParams['axes.unicode_minus']=False

2、获取数据

  1. #从模块自带的数据集中选取人脸数据
  2. from sklearn.datasets import fetch_olivetti_faces
  3. faces = fetch_olivetti_faces()
  4. #images中存储了400张64*64像素的照片
  5. faces.images.shape

3、数据建模

提取特征数据和目标数据

  1. #data是images的样本特征形式数据
  2. faces.data.shape

  1. #目标数据分为了40类,每类分组10张照片(0-39)
  2. np.unique(faces.target,return_counts=True)

  1. #查看一张照片的数据维度
  2. faces.images[0].shape

  1. #显示一张照片
  2. plt.imshow(faces.images[0])

  1. #提取特征数据
  2. train = faces.data
  3. #提取目标数据
  4. target = faces.target

4、拆分数据

拆分数据:将样本数据拆分成训练数据(80%)和测试数据(20%)。

  • 训练数据:特征(左半张脸) 目标(右半张脸)
  • 测试数据:特征(左半张脸) 目标(右半张脸)
  1. X_train = []
  2. X_test = []
  3. y_train = []
  4. y_test = []
  5. for i in range(40):
  6. #获取每种分类的10张照片数据
  7. person_faces = train[target == i]
  8. #将获取的每种分类中的每张照片切分成上、下半张脸两部分
  9. for k in range(len(person_faces)):
  10. face_data = person_faces[k]
  11. #取照片左边
  12. left_face = face_data.reshape(64,64)[:,:32].ravel()
  13. #取照片右边
  14. right_face = face_data.reshape(64,64)[:,32:].ravel()
  15. #将每种分类中的前8张照片的左、右半张脸的数据分别添加到训练数据的集合中
  16. if k < 8:
  17. X_train.append(left_face)
  18. y_train.append(right_face)
  19. else:
  20. #将每种分类中的后2张照片的左、右半张脸的数据分别添加到测试数据的集合中
  21. X_test.append(left_face)
  22. y_test.append(right_face)

6、模型评估

建一个DataFrame表格

  1. df=DataFrame(data=None,
  2. index=['k-近邻模型',
  3. '普通线性回归(linear)',
  4. '岭回归(Ridge)',
  5. 'lasso回归'],
  6. columns=['评分','训练时间(s)','k值/alpha',])

knn模型

  1. score = 0
  2. k=0
  3. for i in range(1,40):
  4. knn = KNeighborsRegressor(n_neighbors=i)
  5. start=time.time()
  6. knn.fit(X_train,y_train)
  7. end=time.time()
  8. s=knn.score(X_test,y_test)
  9. if score < s:
  10. score = s
  11. k=i
  12. ktime = end-start
  13. df.loc['k-近邻模型']=[score,ktime,k]

普通线性回归模型

  1. score = 0
  2. for i in range(1,10):
  3. linear = LinearRegression()
  4. start=time.time()
  5. linear.fit(X_train,y_train)
  6. end=time.time()
  7. s=linear.score(X_test,y_test)
  8. if score < s:
  9. score = s
  10. ktime = end-start
  11. df.loc['普通线性回归(linear)']=[score,ktime,None]

岭回归模型

  1. score = 0
  2. alpha=0
  3. for i in range(1,10):
  4. ridge = Ridge(alpha=i)
  5. start=time.time()
  6. ridge.fit(X_train,y_train)
  7. end=time.time()
  8. s=ridge.score(X_test,y_test)
  9. if score < s:
  10. score = s
  11. alpha=i
  12. ktime = end-start
  13. df.loc['岭回归(Ridge)']=[score,ktime,alpha]

lasso模型

  1. score = 0
  2. alpha=0
  3. for i in range(1,10):
  4. lasso = Lasso(alpha=i)
  5. start=time.time()
  6. lasso.fit(X_train,y_train)
  7. end=time.time()
  8. s=lasso.score(X_test,y_test)
  9. if abs(score) < abs(s):
  10. score = s
  11. alpha=i
  12. ktime = end-start
  13. df.loc['lasso回归']=[score,ktime,alpha]
  14. df

从表格可以看出knn模型和岭回归模型对预测结果较为精准。

7、绘图

  1. #将预测的缺失部分和测试数据整合一起显示
  2. plt.figure(figsize=(8,6))
  3. #图片标题
  4. title=['true_img','knn_img','linear_img','lasso_img','ridge_img']
  5. #预测4张照片
  6. for i in range(4):
  7. #预测测试数据中照片缺失的部分
  8. knn_y = knn.predict([X_test[i]])
  9. linear_y = linear.predict([X_test[i]])
  10. ridge_y = ridge.predict([X_test[i]])
  11. lasso_y = lasso.predict([X_test[i]])
  12. #合并原始照片
  13. true_img=np.concatenate((X_test[i].reshape(64,32),
  14. y_test[i].reshape(64,32)),axis=1)
  15. #合并预测照片
  16. knn_img=np.concatenate((X_test[i].reshape(64,32),
  17. knn_y[0].reshape(64,32)),axis=1)
  18. linear_img=np.concatenate((X_test[i].reshape(64,32),
  19. linear_y[0].reshape(64,32)),axis=1)
  20. lasso_img=np.concatenate((X_test[i].reshape(64,32),
  21. lasso_y[0].reshape(64,32)),axis=1)
  22. ridge_img=np.concatenate((X_test[i].reshape(64,32),
  23. ridge_y[0].reshape(64,32)),axis=1)
  24. index=[true_img,knn_img,linear_img,lasso_img,ridge_img]
  25. #一行显示5张照片做对比
  26. for j in range(5):
  27. axes = plt.subplot(5,5,(j+1)+i*5)
  28. axes.imshow(index[j])
  29. if i < 1:
  30. 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. 从面向过程到面向对象再到MVC

    /* * * title: 从面向过程到面向对象再到MVC * author: tanghao * date: 2020.9.30 * version: 1.0 * */ 前言 本文档通过一个显示20 ...

  2. 微信小程序 LBS 能力全面解析

    分享之前我们先来看看地图能力在小程序架构体现中所处的位置. 小程序架构图解 如图标黄处为地图能力所处的一个位置,举个例子,比如调用定位能力获取用户当前位置的一个流程: 首先调用 JS API wx.g ...

  3. 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封装 ...

  4. C语言&C++ 中External dependencies

    参考:https://blog.csdn.net/yyyzlf/article/details/4419593 External   Dependencies是说你没有把这个文件加入到这个工程中,但是 ...

  5. PADS Layout VX.2.3 将PCB中的元器件封装保存到库

    工具1:PADS Layout VX.2.3 菜单File > Library...,打开Library Manager,点击Create New Lib...新建一个库. 使用快捷键Ctrl ...

  6. 在自己电脑上查看git远程分支列表比实际云端的远程分支要多一些

    问题 最近打开一个很久没有打开过的项目,使用git branch -a查看了一下所以分支,其中有些远程分支没有什么用了 于是准备去gitlab上删除它,结果到gitlab上发现没有这些分支,猜测是自己 ...

  7. ansible-主机清单的配置

    1. ansible主机清单的配置 以下是ansible安装完成后的源文件 1 [root@test-1 ~]# cat /etc/ansible/hosts 2 # This is the defa ...

  8. 安装mariadb/mysql 连接失败问题

    在linux下安装mariadb会出现一系列问题 问题1->服务器端不需要用户名密码就可登陆数据库 问题2->php使用mysql不能连接数据库 访问受限 问题3->navicate ...

  9. golang API 请求队列

    概要 实现思路 使用方法 启动队列服务 使用队列服务 概要 在调用第三方 API 的时候, 基本都有访问限速的限制条件. 第三方的 API 有多个的时候, 就不太好控制访问速度, 常常会导致 HTTP ...

  10. antd pro 路由

    概要 antd pro 路由简介 路由, 菜单和面包屑 页面之间的路由 带参数的路由 总结 概要 路由配置是单页应用的核心之一, antd pro 将所有的路由配置集中在一个文件中, 可以更好的对应用 ...