1. 机器学习之PCA降维概念
1.1 机器学习
传统编程要求开发者明晰规定计算机执行任务的逻辑和条条框框的规则。然而,在机器学习的魔法领域,我们向计算机系统灌输了海量数据,让它在数据的奔流中领悟模式与法则,自主演绎未来,不再需要手把手的指点迷津。
机器学习,犹如三千世界的奇幻之旅,分为监督学习、无监督学习和强化学习等多种类型,各具神奇魅力。监督学习如大师传道授业,算法接收标签的训练数据,探索输入与输出的神秘奥秘,以精准预测未知之境。无监督学习则是数据丛林的探险者,勇闯没有标签的领域,寻找隐藏在数据深处的秘密花园。强化学习则是一场与环境的心灵对话,智能体通过交互掌握决策之术,追求最大化的累积奖赏。
机器学习,如涓涓细流,渗透各行各业。在图像和语音识别、自然语言处理、医疗诊断、金融预测等领域,它在智慧的浪潮中焕发生机,将未来的可能性绘制得更加丰富多彩。
1.2 PCA降维
PCA(Principal Component Analysis),主成分分析,是一种常用的降维技术。其主要目的是通过线性变换,将原始数据投影到一个新的坐标系中,使得数据在新坐标系中的方差尽可能大,从而减少数据的维度。
PCA的工作原理是找到数据中方差最大的方向,将数据映射到这个方向上,形成第一个主成分。然后,在与第一个主成分正交的方向上找到第二大方差的方向,形成第二个主成分,依此类推。通过选择最大方差的前几个主成分,就可以实现对数据维度的降低。
降维的好处在于可以减少数据的冗余性,提高计算效率,去除噪声,同时保留数据中的主要结构和特征。在实际应用中,PCA常被用于处理高维数据,例如图像处理、模式识别和数据压缩等领域。通过选择合适数量的主成分,可以在保持数据信息的同时显著减少数据的维度。
资源获取:关注文末公众号回复 机器学习实验
2. PCA降维
2.1 实验目的
(1)理解和掌握PCA原理;
(2)利用PCA降维,辅助完成一项实战内容。
2.2 实验准备
(1)安装机器学习必要库,如NumPy、Pandas、Scikit-learn等;
(2)配置环境用来运行 Python、Jupyter Notebook和相关库等内容。
2.3 实验原理
矩阵的主成分就是其协方差矩阵对应的特征向量,按照对应的特征值大小进行排序,最大的特征值就是第一主成分,其次是第二主成分,以此类推。
算法流程:
图4-1
2.4 实验内容
人脸识别步骤
1.利用给定的数据集,执行上述算法,得到投影矩阵W;
2.计算训练集的投影后的矩阵:P=WX;
3.加载一个测试图片T,测试图片投影后的矩阵为:TestT=WT;
4.计算TestT和P中每个样本距离,选出最近的那个即可。
5.做成可视化界面 显示投影前后的两张图片。
具体内容:
使用PCA降维人脸代码如下:
import matplotlib import numpy as np from sklearn.decomposition import PCA from sklearn.datasets import fetch_olivetti_faces import matplotlib.pyplot as plt import cv2 matplotlib.use('TkAgg') # 指定交互式框架为TkAgg # 加载人脸数据集 faces = fetch_olivetti_faces() X = faces.data # 将人脸数据进行PCA降维 pca = PCA(n_components=50) X_pca = pca.fit_transform(X) # 将降维后的数据进行逆转换 X_restored = pca.inverse_transform(X_pca) # 随机选择一张人脸图片 face = X[20].reshape(64, 64) face_restored = X_restored[20].reshape(64, 64) # 使用均值滤波器模糊图像 face_blur = cv2.blur(face_restored, (20, 20)) # 显示结果 fig, axs = plt.subplots(1, 3, figsize=(10, 5)) axs[0].imshow(face, cmap='gray') axs[0].set_title('Original Face') axs[1].imshow(face_restored, cmap='gray') axs[1].set_title('Restored Face') axs[2].imshow(face_blur, cmap='gray') axs[2].set_title('Blurred Face') plt.show()
PCA降维后运行结果:
图4-2
源码分析:
我实现加载Olivetti人脸数据集,使用PCA对人脸数据进行降维,并通过逆转换恢复了部分原始数据。然后,选择其中一张人脸图像进行处理,包括模糊处理,并使用Matplotlib库在图形界面中展示了原始人脸图像、恢复的人脸图像和模糊的人脸图像。这样可以直观地比较PCA降维对人脸图像的影响以及图像处理的效果。
1.导入必要的库:
- matplotlib:用于图像展示。
- numpy:用于数据处理和数组操作。
- sklearn.decomposition.PCA:用于进行主成分分析(PCA)降维。
- sklearn.datasets.fetch_olivetti_faces:用于获取Olivetti人脸数据集。
- cv2:OpenCV库,用于图像处理。
2.设置交互式框架:
- matplotlib.use('TkAgg'):指定使用TkAgg作为交互式框架,这是一种用于在图形用户界面中显示图形的后端。
3.加载人脸数据集:
- fetch_olivetti_faces():从Olivetti人脸数据集中加载人脸图像数据。
- faces.data:获取加载的人脸数据。
4.进行PCA降维:
- PCA(n_components=50):创建一个PCA对象,将数据降维到50个主成分。
- pca.fit_transform(X):对人脸数据进行PCA降维,返回降维后的数据集X_pca。
5.进行逆转换:
- pca.inverse_transform(X_pca):将降维后的数据X_pca进行逆转换,返回重建的人脸数据X_restored。
6.随机选择一张人脸图片:
- X[20]:选择人脸数据集中的第21个样本(索引从0开始)。
- X[20].reshape(64, 64):将一维的人脸数据转换为64x64的二维图像表示,得到原始人脸图像。
7.使用均值滤波器模糊图像:
- cv2.blur(face_restored, (20, 20)):使用20x20的均值滤波器对face_restored进行图像模糊处理,得到模糊的人脸图像face_blur。
8.显示结果:
- 创建一个1行3列的子图布局,用于在同一画布上显示原始人脸图像、重建的人脸图像和模糊的人脸图像。
- axs[0].imshow(face, cmap='gray'):在第一个子图上显示原始人脸图像,使用灰度颜色映射。
- axs[1].imshow(face_restored, cmap='gray'):在第二个子图上显示重建的人脸图像,使用灰度颜色映射。
- `axs[2].imshow(face_blur, cmap 'gray')`:在第三个子图上显示模糊的人脸图像,使用灰度颜色映射。
- axs[0].set_title('Original Face'):设置第一个子图的标题为"Original Face"。
- axs[1].set_title('Restored Face'):设置第二个子图的标题为"Restored Face"。
- axs[2].set_title('Blurred Face'):设置第三个子图的标题为"Blurred Face"。
- plt.show():显示图像结果。
除了实现上述的基本要求,我额外实现了读取本地的图片识别人脸和调用本地电脑摄像头实时识别人脸。
1. 读取本地的图片识别人脸
代码如下:
# 导入所需要使用的包 import cv2 import paddlehub as hub from matplotlib import pyplot as plt # 加载Paddlehub人脸检测模型 face_detector = hub.Module(name="pyramidbox_lite_mobile") # 使用模型进行图片预测 result = face_detector.face_detection(paths=['./img/1.jpg'], # 图片路径列表 use_gpu=False, # 是否使用GPU进行推理 visualization=True, # 是否可视化结果 output_dir='./output', # 输出目录路径 confs_threshold=0.5) # 置信度阈值 # 打印检测结果 print(result) # 显示可视化图片 output = cv2.imread('./output/555.jpg') # 读取可视化结果图片 output = output[:, :, ::-1] # 将图片通道顺序由BGR转换为RGB plt.imshow(output) # 显示图片
运行结果:
图4-2 (a)为输入,(b)为输出
2. 调用本地电脑摄像头实时识别人脸
代码如下:
# 导入必要的库 import cv2 # 导入OpenCV库,用于图像处理和显示 import paddlehub as hub # 导入Paddlehub库,用于加载和使用Paddlehub模型 # 加载Paddlehub人脸检测模型 face_detector = hub.Module(name="pyramidbox_lite_mobile") # 使用Paddlehub的pyramidbox_lite_mobile模型进行人脸检测 # 调用摄像头,参数为0时,即调用系统默认摄像头,如果有其他的摄像头可以调整参数为1,2等 cap = cv2.VideoCapture(0) # 创建一个VideoCapture对象,用于读取摄像头的视频流 while True: # 从摄像头读取图片 sucess, img = cap.read() # 读取摄像头的视频流,并将每一帧存储为图像 # 从图片中检测人脸位置,默认开启GPU推理,若无GPU环境,请将use_gpu设置为False result = face_detector.face_detection(images=[img], use_gpu=False) # 使用加载的人脸检测模型对图像进行人脸检测 # 遍历结果并绘制矩形框 if result[0]['data'] != []: for face in result[0]['data']: # 将Dict形式的key-value对转换成变量形式 locals().update(face) # 将人脸检测结果中的每个人脸信息存储为变量 print('bbox:', [left, top, right, bottom]) # 打印人脸边界框的坐标信息 # 绘制矩形框 cv2.rectangle(img, tuple([left, top]), tuple([right, bottom]), (255, 0, 0), 2) # 在图像上绘制人脸边界框 # 显示图像 cv2.imshow("img", img) # 在窗口中显示处理后的图像 # 保持画面的持续。 k = cv2.waitKey(1) # 等待用户按键输入,等待时间为1毫秒 if k == 27: # 通过esc键退出摄像 cv2.destroyAllWindows() # 关闭所有窗口 break # 关闭摄像头 cap.release() # 释放摄像头资源
运行结果:
图4-3 实时输出结果
2.5 实验心得
通过本次实验,我成功实现了人脸识别的关键步骤,运用机器学习算法进行学习和应用。实验主要包括以下几个步骤:
- 利用
fetch_olivetti_faces
函数加载人脸数据集,将数据存储在变量X
中。通过PCA算法将数据进行降维,将维度减少到50。- 进行降维后数据的逆转换,使用
PCA.inverse_transform()
得到重建后的人脸数据,实现维度还原。- 随机选择一张人脸图片,展示原始、重建以及模糊后的人脸图像。
- 利用PaddleHub库加载人脸检测模型,对测试图片进行人脸检测和可视化。
- 使用OpenCV和PaddleHub库进行实时人脸检测,并将检测结果嵌入摄像头的视频流中,实现实时人脸识别。
这些步骤涵盖了从数据加载、降维处理到模型应用和实时检测的全面流程。通过详细的代码说明,展现了人脸识别算法的实际应用和实验成果。
致读者
风自火出,家人;君子以言有物而行有恒