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

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]]
'''

相关推荐
sell-cloud2 小时前
Prompt Engineering要凉了?Fable 5.5能“猜“意图,但银行正在封杀AI Agent——企业AI的真正护城河是什么
人工智能·prompt
Navicat中国3 小时前
Navicat 18 内置 AI 助手让数据库开发从繁琐操作迈向智能协作
大数据·人工智能·数据库开发
4SAPI4 小时前
多模型请求路由怎么设计?成本、速度和能力如何平衡
人工智能·python·gateway·php
魔乐社区4 小时前
翼芯・智算测试与适配优化专区,让国产算力“选得准、跑得通、用得好“
人工智能·开源·大模型
XCDoris6 小时前
郴州logo设计机构
大数据·人工智能·python
Goboy6 小时前
一个人带三个Agent,我用全新TRAE从0到1搭了个资讯周刊站
人工智能·trae
俊哥V6 小时前
每日 AI 研究简报 · 2026-10-19
人工智能·ai
AI_AGENT_DEV_AI6 小时前
AI英语教培智能体的开发
人工智能
物联网软硬件开发-轨物科技6 小时前
【技术白皮书】光伏清检一体化机器人系统解决方案技术白皮书
大数据·运维·网络·人工智能·机器人
海宇数据6 小时前
零信任架构实战:基于海宇网上踪迹欺诈行为识别构建自动化信贷资信评估网关
运维·人工智能·架构·自动化