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


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

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

    1、原始数据获取:

    • 0、数据准备(这一步的目的是直接将数据保存在本地,后面调用的时候如果本地有就不会下载了,因为下载有时候会因为网络问题报错)
      在这里插入图片描述
      链接: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,)
    '''
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 2、数据概览:数据导入后其实是一个字典,其中data键对应的值是人脸图片的二维数据,images对应的数据是人脸图片的三维数据,target代表图片属于第几个人(用来识别人物的),一共有400个人物。

      • data数据
        在这里插入图片描述
        在这里插入图片描述
        在这里插入图片描述
    • 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')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述

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

    • 首先把左边人脸数据和右边人脸数据分开,然后左边人脸作为输入数据,右边人脸作为输出数据(预测数据)
    • 理解图片数据:如果图片数据构成了一个二维数据,如下图,构成其每个像素点的数据组成了二维数组被存在在了images中
      在这里插入图片描述
    • 将数据拆分为为输入数据和输出数据
    # 左半张人脸数据集
    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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 数据预测
    # 导入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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 获得y_pred
      在这里插入图片描述
    • 画图
    # 获得了所有模型的预测数据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')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 结果展示
      在这里插入图片描述

    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]]
    '''
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

  • 相关阅读:
    uniapp 表格组件,冻结首行首列
    工作不好找,普通打工人如何破局
    C goto 语句
    Redis常见基本类型(5)-List, Set
    DSP_TMS320F28335_优秀的串口通信框架
    基于Spring Boot使用Java调用http请求的6种方式
    web端生成pdf,前端生成pdf导出并自定义页眉页脚
    ffmpeg视频编解码 demo初探(一)(包含下载指定windows版本ffmpeg)分离视频文件中的视频流每一帧YUV图片
    关于git flow工作流的使用
    oracle学习20-ora-00604和ora-00018
  • 原文地址:https://blog.csdn.net/sz1125218970/article/details/132687919