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

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

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

1、原始数据获取:

  • 0、数据准备(这一步的目的是直接将数据保存在本地,后面调用的时候如果本地有就不会下载了,因为下载有时候会因为网络问题报错)
    机器学习——图片处理应用(人脸补全)_第1张图片
    链接:https://pan.baidu.com/s/1c1ZlwCUF_eEzTl4vDOXstA
    提取码:1234

  • 1、数据下载

# 导入机器学习三剑客
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数据
      机器学习——图片处理应用(人脸补全)_第2张图片
      机器学习——图片处理应用(人脸补全)_第3张图片
      机器学习——图片处理应用(人脸补全)_第4张图片
  • 3、数据处理

# 显示一张图片
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')

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

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

  • 首先把左边人脸数据和右边人脸数据分开,然后左边人脸作为输入数据,右边人脸作为输出数据(预测数据)
  • 理解图片数据:如果图片数据构成了一个二维数据,如下图,构成其每个像素点的数据组成了二维数组被存在在了images中
    机器学习——图片处理应用(人脸补全)_第6张图片
  • 将数据拆分为为输入数据和输出数据
# 左半张人脸数据集
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)
  • 数据预测
# 导入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
    机器学习——图片处理应用(人脸补全)_第7张图片
  • 画图
# 获得了所有模型的预测数据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')
  • 结果展示
    机器学习——图片处理应用(人脸补全)_第8张图片

3、总结:

  • 在处理图片时会遇到数组的拆分与合并,一般数组拆分只需要将数组切片即可,数组合并有时候需要合并列,有时候需要合并行,这就要用到一个非常关键的numpy里面的方法concatenate()。这个方法使用介绍如下:
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]]
'''

你可能感兴趣的:(机器学习与深度学习,机器学习,人工智能)