机器学习——图片处理应用(人脸补全)

0、前言:本文内容是机器学习算法回归预测的应用,其中数据集主要来自sklearn库自带的人脸数据,目的是通过KNN回归、线性回归、岭回归算法通过人物的左半张脸预测人物的右半张脸。

  • 意义1:通过该项目掌握图片数据在机器学习当中的处理方法
  • 意义2:通过该项目可以掌握多个机器学习算法模型对比实验的应用方法

1、原始数据获取:

  • 0、数据准备(这一步的目的是直接将数据保存在本地,后面调用的时候如果本地有就不会下载了,因为下载有时候会因为网络问题报错)

    链接:https://pan.baidu.com/s/1c1ZlwCUF_eEzTl4vDOXstA

    提取码:1234

  • 1、数据下载

python 复制代码
# 导入机器学习三剑客
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# 导入数据集
from sklearn.datasets import fetch_olivetti_faces

# fetch_olivetti_faces()函数首先会去用户根目录找,如果找不到,就会去下载,这个函数不光加载数据,也会将数据进行整合处理
# 但是国内经常下载失败,解决方案就是有下载好的文件,放到对应路径(C:\Users\"你的用户名")向下。
faces = fetch_olivetti_faces()
display(faces['data'].shape,faces['images'].shape,faces['target'].shape)
'''
(400, 4096)
(400, 64, 64)
(400,)
'''
  • 2、数据概览:数据导入后其实是一个字典,其中data键对应的值是人脸图片的二维数据,images对应的数据是人脸图片的三维数据,target代表图片属于第几个人(用来识别人物的),一共有400个人物。

    • data数据


  • 3、数据处理

python 复制代码
# 显示一张图片
data = faces['data']
# 通过data显示图片
plt.imshow(data[0].reshape(64,-1),cmap='gray') # cmap='gray' 是一个用于指定色彩映射(colormap)的关键字参数
# 通过images显示图片
images = faces['images']
plt.imshow(images[1],cmap='gray')

2、根据左边人脸补全右边人脸:

  • 首先把左边人脸数据和右边人脸数据分开,然后左边人脸作为输入数据,右边人脸作为输出数据(预测数据)
  • 理解图片数据:如果图片数据构成了一个二维数据,如下图,构成其每个像素点的数据组成了二维数组被存在在了images中
  • 将数据拆分为为输入数据和输出数据
python 复制代码
# 左半张人脸数据集
l_face = []
for i in range(400):
    a = data[0].reshape(64,64)
    l_face.append(a[:,:33].reshape(-1))
# plt.imshow(l_face[0].reshape(64,-1),cmap='gray') # 验证数据采集结果
# 右半张人脸数据集
r_face = []
for i in range(400):
    a = data[i].reshape(64,64)
    r_face.append(a[:,33:].reshape(-1))
# plt.imshow(r_face[0].reshape(64,-1),cmap='gray') # 验证数据采集结果  

# 左边作为输入,右边作为输出
from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test = train_test_split(l_face,r_face,test_size=0.1)
  • 数据预测
python 复制代码
# 导入KNN,线性回归,岭回归,获得每一种模型对应的预测值
from sklearn.neighbors import KNeighborsRegressor
from sklearn.linear_model import LinearRegression,Ridge

pred_dict = {}
model = {
    'knn':KNeighborsRegressor(),
    'line':LinearRegression(),
    'Ridge':Ridge()
}

for key,val in model.items():
    m = val.fit(x_train,y_train)
    y_pred = m.predict(x_test)
    pred_dict[key] = y_pred
  • 获得y_pred
  • 画图
python 复制代码
# 获得了所有模型的预测数据y_pred,下一步画图
# 画图要求:一行表示一个人,分别是真实图片,Ridge预测图、Linear regression预测图、K-nn预测图

# 画布设计为5行4列
plt.figure(figsize=(4*2,5*2))

for i in range(5):
    # 获得测试数据中第i个人真实人脸左半部分
    l_tface = x_test[i]
    # 获得测试数据中第i个人真实人脸右半部分
    r_tface = y_test[i]
    # 合并
    # np.concatenate((array1, array2,..), axis=1)是使用numpy库的concatenate函数将多个数组沿着指定的轴(axis)拼接,axis等于0是上下拼接,等于1是左右拼接。
    rall_face = np.concatenate((l_tface.reshape(64,-1),r_tface.reshape(64,-1)),axis=1)
#     plt.imshow(rall_face,cmap='gray') # 验证组合成功
    # 画每行第一个图
    displt = plt.subplot(5,4,i*4+1)
    displt.imshow(rall_face,cmap='gray')
    displt.axis('off')
    if i == 0:
        displt.set_title('real_image')
    for j,key in enumerate(pred_dict):
        # 获取三个模型预测结果的组合
        M_r_face = pred_dict[key][i].reshape(64,-1)
        M_all_face = np.concatenate((l_tface.reshape(64,-1),M_r_face),axis=1)
#         plt.imshow(M_all_face,cmap='gray') # 验证
        # 画一层的图像
        displt = plt.subplot(5,4,i*4+j+2)
        displt.imshow(M_all_face,cmap='gray')
        displt.axis('off')
        if i == 0:
            displt.set_title(f'{key}_image')
  • 结果展示

3、总结:

  • 在处理图片时会遇到数组的拆分与合并,一般数组拆分只需要将数组切片即可,数组合并有时候需要合并列,有时候需要合并行,这就要用到一个非常关键的numpy里面的方法concatenate()。这个方法使用介绍如下:
python 复制代码
import numpy as np  
  
a = np.array([[1, 2], [3, 4]])  
b = np.array([[5, 6], [7, 8]])  
  
# 沿着第二个维度(即轴=1)将两个数组堆叠在一起  
result = np.concatenate((a, b), axis=1)  
print(result)  
'''
[[1 2 5 6]
 [3 4 7 8]]
'''
# 沿着第二个维度(即轴=1)将两个数组堆叠在一起  
result = np.concatenate((a, b), axis=0)  
print(result)  
'''
[[1 2]
 [3 4]
 [5 6]
 [7 8]]
'''

相关推荐
后端小肥肠24 分钟前
Coze 一键生成 AI 星座漫画,从 0 到 1 拿捏 10w + 流量!,小白可学
人工智能·aigc·coze
canonical_entropy42 分钟前
AI的集体反思:我们为什么未能预见到"可逆计算"的演进方向?
人工智能·低代码·aigc
mortimer2 小时前
Python 文件上传:一个简单却易犯的错误及解决方案
人工智能·python
IT_陈寒2 小时前
Vue3性能优化实战:这5个技巧让我的应用加载速度提升了70%
前端·人工智能·后端
机器之心3 小时前
英伟达50亿美元入股英特尔,将发布CPU+GPU合体芯片,大结局来了?
人工智能·openai
新智元3 小时前
芯片大地震,黄仁勋355亿入股!英特尔要为老黄造CPU,股价狂飙30%
人工智能·openai
阿然1653 小时前
首次尝试,95% 的代码都是垃圾:一位工程师使用 Claude Code 六周的心得
人工智能·agent·ai编程
martinzh3 小时前
RAG系统优化大揭秘:让你的AI从学渣变学霸的进化之路
人工智能
汀丶人工智能4 小时前
想成为AI绘画高手?打造独一无二的视觉IP!Seedream 4.0 使用指南详解,创意无界,效率翻倍!
人工智能
蚝油菜花4 小时前
万字深度解析Claude Code的Hook系统:让AI编程更智能、更可控|下篇—实战篇
人工智能·ai编程·claude