专利CN117576758A中说明了一种人脸识别算法的整体识别流程,本文将对这篇文章进行详细讲解,并说明有创造性的算法部分。
前置知识:人脸识别
人脸识别技术是一种通过计算机技术和模式识别算法来识别和验证人脸的技术。它能够用于识别人脸的身份、检测人脸的表情、年龄、性别等特征,以及进行人脸比对和活体检测等应用。
如图所示,人脸识别即对图片中的人脸识别,首先获得人脸的目标框,然后系统比对每个人脸与系统中人脸,进而识别得到每个人脸的身份ID,完成人脸识别。
1、引用文章链接:
专利汇 - 用户登录 - PatentHub专利检索|专利汇|专利查询网|发明专利查询分析
文章简介如下图所示,提出了一种人脸识别的具体流程,可以使得用户可以在现场环境变化都能快速、准确的通过人脸照片对身份进行识别,提高了人脸识别的效率及用户体验。
2、背景合理性分析
如上图所示, 背景为:通过摄像机对场景中的人脸进行识别时,识别程序首先识别画面中是否存在人脸,存在的话,就抓拍,获得抓拍图像,然后对抓拍图像通过人脸识别算法,识别得到人脸身份ID,这个是现有的人脸识别的流程。
文章中提出该流程中存在的问题为:抓拍图像受环境光照影响较大,容易导致抓拍图像中人脸质量不佳,进而即使人脸识别算法较好,但原数据质量不好,给识别带来困难和较大误差。
日常生活中,例如:当我们下班打卡时,打卡机面前的打卡人数较多,打卡机画面中存在多张人脸,与打卡机的距离不同,不同人的高矮不同,与打卡机的相对高度不同,进而造成不同人脸显示在打卡机上的光照情况不同。日常打卡过程中,经常能看到距离打卡机较近的半天打不上,而距离打卡机较远的一下子就打上卡了,这往往是由于摄像头有个初始焦距,当前焦距下,距离过近反而可能使得成像模糊。
因此抓拍图像受环境光影响的技术问题合理,但较为常规,容易想到,反而是不同距离的人在摄像机上的成像清晰度不同,进而影响识别,这个问题相较于环境光的问题而言较为新颖,从摄像机成像角度出发,问题合理的同时,新颖性也较强。
3、模块解析
1、运动监测模块
运动监测模块顾名思义,是对场景中的运动物品进行监测,因为人脸在借书、还书过程中,有一个进入摄像头拍摄范围的过程,该模块即对这个过程进行监测,首先监测到运动物体,之后再对运动物体是否为人脸进行监测,这是由于运动物体不一定是来借书还书的,也可能是路过摄像机区域的,偶然入境的人或者可能是一个人背着包通过该区域,被摄像头拍到了包等其它情况。
该文中对运动物体进行监测的流程为:前景提取 - 物体分割 - 运动分析 - 目标判断,
1、前景提取
前景提取是将相邻帧中变化的区域提取出来;该文中通过图像差分的方法提取前景区域,即计算相邻帧图像中相同位置灰度值的差值绝对值,得到灰度值变化的像素点,即差分图像上灰度值不为0的像素点。
例如:图1中的两幅图像有细微差别,但人眼较难直接观察得到,此时可以通过差分法得到差异区域。
图1
通过MATLAB获得两幅图像的差分图像,如下图所示:
图2
如图2所示,前两幅图为参与差分的两幅图像,最后一幅为差分图像,差分图像中的白色区域记为差异区域,即通过差分运算,可以将图像中的变化区域进行提取,即实现了对前景区域的提取。
2、物体分割
物体分割是由于场景中可能由于人的遮挡等造成的阴影的变化,因此变化区域不一定都是我们想要的,需要先分别得到变化区域,然后分析;
物体分割即将单个像素点区域通过邻近关系等形成连通区域,该文中对前景区域 进行形态学处理、连通区域分析、轮廓提取的方法,将前景中的个体物体分割出来,得到单独的物体区域。
图3
如图3所示,上图为差分图像连通域,下图为经过形态学处理后的差分图像连通域,明显的,连通域内部的空洞区域消除了,同时周围的一些离散的点都连接起来了,形成了一个整体,而差分图像上的是离散点的状态。
如图4所示,左图为处理后的差分图像,右图为轮廓标注区域,即在原始图像中将差分的连通区域的外轮廓边界进行了标注,如右图中的绿色线条。
图4
3、运动分析
运动分析是对变化区域的运动轨迹的分析,如果是人脸,会有一个逐渐入境的过程,如果是其它原因,例如:光照变化导致的变化区域,则不会有这种特征;
该文中通过对每个物体区域,计算其运动的特征,运动的特征包括但不限于运动的速度、方向、轨迹一种以上,该文中的运动分析写的较为概括,如下图所示,通过下面这个网页内容来说明运动分析,如下图所示:识别前为老鼠的运动,识别后对老鼠的运动轨迹进行了可视化的显示。
引用链接:用Matlab来识别视频中物体的运动轨迹!
4、目标判断
目标判断就是通过运动分析结果,判断是否有人或物经过,还是只是由于光照变化等原因导致的变化区域。
该文中的目标判断是通过阈值、机器学习模型对物体的运动特 征进行判断,确定是否有人物经过,较小的阈值可能是光照或有人经过时的阴影导致的变化区域,而当有人脸进入摄像机的识别范围内时,阈值变化较大,因此可以通过阈值来判断。
2、活体检测模块
活体检测即对人脸是一个真实的人,而不是照片等进行检测,例如:刷脸付款中,为了防止被盗用照片刷脸或者需要权限才能进入的会议中,为了防止没有权限的人通过有权限人的照片刷脸进入,造成他人财产损失等,需要进行活体检测。
活体检测算法包括预处理、特征提取、随机刺激、反馈机制和决策,所 述预处理是将输入的人脸图像进行灰度化、归一化、直方图均衡预处理操作。
所述特征提取 是从预处理后的图像中提取出人脸的特征;
所述随机刺激是使用一些随机刺激方法,来刺 激被检测者的脸部;所述反馈机制是通过监测被检测者对随机刺激的反应,来判断其是否 为真实活体; 所述决策是根据反馈的结果,通过设定的阈值和算法模型进行判断,确定被检测者是否为真实活体。
例如:有时候在登录一些银行app时,需要刷脸验证,并且需要根据要求:左右摇头、张嘴、眨眼等操作,证明操作的是真人,而不是一张相片或者AI模型制造的假脸等。这个过程中,通过对人脸关键点的追踪等来对是否为真人进行进一步识别。
活体检测如下图所示:
图片参考链接:应用随即动作指令人脸活体检测技术,避免人脸识别被破解-腾讯云开发者社区-腾讯云
3、反曝光模块
反曝光,顾名思义,就是强光照导致人脸的光照不均匀,进而影响人脸的识别,因此需要通过图像处理降低曝光的影响。
该文中的反曝光操作为:检测图像中的曝光区域,并估计该区域导致的过曝程度,根据估计的过曝程度,对曝光区域进行去除、补偿处理,以恢复图像的细节和色彩信息。
该文中说明了解决曝光的流程,先得到什么,后得到什么,但是没有具体说明每个过程怎么获得,在这里说一下每个过程的简单实现方法:
检测图像中的曝光区域,曝光区域即图像中较亮的区域,因此首先可以通过灰度直方图分析,得到灰度值较大的波峰处,该处的像素点为曝光像素点的概率大,然后通过这些像素点的空间分布,哪些像素点的曝光概率大的同时,空间分布上也相近,则可以得到曝光区域。
估计该区域的过曝程度,可以通过计算该处的灰度值与其它区域灰度值的众数灰度值的差异得到,差异越大,曝光程度越大;
对曝光区域进行处理,可以通过对曝光区域的像素值进行等比例减小等方法,去除曝光区域。
如下图所示,左图为曝光图像,灰度直方图中大部分像素点的灰度值偏大,波峰集中于灰度值偏大区域,右图为校正后图像,可见灰度较真后的灰度值的分布较为均匀,可以体现更多的图像细节,不像左图一样,看着感觉刺眼。
4、人脸照片特征排序模块
人脸照片特征排序是指对人脸图像中提取的特征进行排 序,以确定特征在人脸识别、人脸表情分析任务中的重要程度,该文中对人脸特征的排序过程如下:
-
准备数据:收集人脸图像数据集,并对每张图像提取特征。特征包括人脸的关键点坐标、人脸描述向量等。
-
计算数据集的初始信息熵:根据数据集中的标签信息,计算初始的信息熵。熵越高,表示数据集中样本的混乱程度越高。
-
按照每个特征对数据集进行划分:遍历每个特征,根据特征的取值将数据集划分为若干个子集。
-
计算特征对数据集的信息增益:对于每个特征,计算其对数据集的信息增益。信息增益的计算使用熵的减少量来衡量,即通过特征划分后数据集的熵减少的程度。
-
根据信息增益排序:将特征按照计算得到的信息增益进行排序。信息增益高的特征被认为是对识别任务贡献更大的特征,因此被排序为更优的人脸照片特征。
通过一个具体的例子来说明人脸特征排序的过程。假设我们有一个用于人脸识别的数据集,其中包含了多个人脸图像以及对应的标签信息。以下是人脸特征排序的具体步骤:
1. 准备数据
收集数据集:我们收集了1000张人脸图像,每张图像都标注了对应的人脸身份ID。
提取特征:对每张图像,我们使用人脸识别算法提取了人脸的关键点坐标(例如眼睛、鼻子、嘴巴的位置)和人脸描述向量(一组能够描述人脸特征的数值)。
2. 计算数据集的初始信息熵
计算熵:我们计算整个数据集的初始信息熵,发现熵值较高,意味着数据集中的人脸样本类别分布较为均匀。
其中信息熵的计算过程如下:
假设一个简单的数据集,包含3个人脸身份,每个身份有如下数量的图像
身份A:50张图像
身份B:30张图像
身份C:20张图像
总样本数N = 50 + 30 + 20 = 100N=50+30+20=100。
计算每个类别的概率:
P_A = 50/100=0.5
P_B = 30/100=0.3
P_C = 20/100=0.2
计算信息熵:
这个结果表示,平均来说,我们需要大约1.485位信息来标识这个数据集中的一个样本。
高信息熵:如果人脸识别数据集中的信息熵较高,这意味着各类别人脸样本数量分布较为均匀,没有某个类别的样本数量过多或过少。这有助于避免模型对某些类别过拟合,提高模型的泛化能力。
低信息熵:如果信息熵较低,可能意味着数据集中某些类别的样本数量远多于其他类别,导致模型在训练时对这些类别过拟合,而在面对样本数量较少的类别时性能下降。
3. 按照每个特征对数据集进行划分
特征划分:我们遍历每个特征(例如,眼睛间的距离、鼻子的宽度等),根据特征的取值将数据集划分为若干个子集。例如,如果一个特征是眼睛间的距离,我们可能根据这个特征的值将数据集分为“眼睛距离小”、“眼睛距离中等”和“眼睛距离大”三个子集。
4. 计算特征对数据集的信息增益
信息增益计算:对于每个特征,我们计算其对数据集的信息增益。例如,我们发现眼睛间的距离对于区分不同人脸的贡献很大,因此其信息增益较高。
5. 根据信息增益排序
-
将所有特征按照信息增益从高到低进行排序。排序结果可能如下:
-
眼睛间的距离
-
鼻子的宽度
-
嘴巴的宽度
-
脸部的长度
-
眼睛的大小
-
应用排序结果的说明:
(1)特征选择:根据排序结果,我们选择信息增 益最高的前三个特征(眼睛间的距离、鼻子的宽度、嘴巴的宽度)用于人脸识别模型的训练,因为这些特征对于区分不同人脸最为有效。
(2)模型训练:使用这些精选的特征训练人脸识别模型,期望模型能够更准确地识别和区分不同的人脸。
为了方便,这里以鸢尾花数据集为例,进行特征排序的说明:
如上图所示,为通过PCA方法(与上述中熵方法的作用相同)获得的不同主成分,即不同特征的方差的百分比,百分比越大,对应的熵值越大,应用到训练模型中可以起到越好的训练效果。
累计方差解释图展示了每个主成分对数据总方差的贡献,帮助我们理解在降维时保留了多少信息。以下是图的关键说明:
X轴:表示主成分的数量(通常是PC1, PC2, PC3, PC4等)。
Y轴:表示累计方差解释的百分比,范围通常为0%到100%。
(1)逐步增加:随着主成分的增加,累计方差解释会逐渐上升。这表明我们加入更多主成分后,模型能够解释的数据变异性也在增加。
(2)拐点:通常在某个点(比如前两个主成分)之后,增加更多主成分对累计方差解释的提升会逐渐减小。这意味着前几个主成分已经捕获了数据中大部分的信息。
(3)选择主成分的依据:通过观察这个图,我们可以决定保留多少个主成分以达到满意的信息保留水平。例如,如果前两个主成分的累计方差解释已经超过90%,我们可能只需保留这两个主成分进行后续分析。
前两个主成分的散点图展示了数据在主成分空间中的分布情况,有助于可视化不同类别之间的关系。以下是对图的关键说明:
X轴与Y轴:分别表示第一个主成分(PC1)和第二个主成分(PC2)。这两个主成分是通过PCA提取的,它们是数据中方差最大的两个方向。
点的分布:每个点代表一个样本,颜色或形状通常对应不同的类别(例如:鸢尾花的三种类型:setosa, versicolor, virginica)。通过观察这些点的分布,可以了解各类别样本在主成分空间中的聚集情况。
(1)类别分离:
集群:如果某个类别的点聚集在一起,说明该类别的样本在特征空间中具有相似的特征,不容易被区分。
重叠:如果不同类别的点有重叠,表明这几个类别在某些特征上相似,不容易区分。例如:图中的绿色点和蓝色点有重叠部分,说明这两个类别不容易区分。
(2)可视化效果:
类别识别:通过可视化,我们可以直观地看到模型是否能够通过这两个主成分有效地区分不同类别的样本。如图所示,红色点和另外两个颜色的点距离较远,说明红色点所属类别容易通过主成分1和主成分2形成的特征空间进行识别。
数据结构:散点图还可以揭示数据的分布特征,例如是否有明显的分层或趋势。
5、人脸特征优化处理模块
(1)目的
人脸特征优化处理旨在改善从人脸图像中提取的特征的质量,使其更加适合于人脸识别、人脸表情分析、人脸属性分析等任务。这一处理过程可以增强特征的判别能力,提高识别的准确性和鲁棒性。
(2)内容
人脸特征优化处理包括以下几个方面:
特征对齐:对齐是指将人脸图像中的特征点(如眼睛、鼻子、嘴巴等关键点)调整到一个标准的位置和尺度,以减少因人脸姿态、表情变化带来的影响。
特征选择:从提取的大量特征中选择最有代表性和区分度的特征,以减少特征空间的维度,提高计算效率。
特征降维:通过技术如主成分分析(PCA)或线性判别分析(LDA)等方法,降低特征空间的维度,去除冗余信息,同时保留最重要的信息。
特征扩展:通过生成额外的特征或使用数据增强技术,增加特征的多样性和覆盖范围,提高模型的泛化能力。
举例说明:
假设我们正在开发一个用于公司员工考勤系统的人脸识别技术。该系统需要处理在不同光照条件、不同角度和不同表情下的员工人脸图像。
步骤1:特征对齐
原始图像:员工在不同的时间以不同的姿态和表情进行打卡,导致收集到的人脸图像在位置和尺度上存在差异。
对齐操作:我们使用人脸关键点检测技术,如dlib的68个面部特征点,来定位眼睛、鼻子、嘴巴等关键部位。然后,我们通过仿射变换或相似变换将这些关键点映射到一个标准模板上,确保所有人脸图像的关键点位置一致。
步骤2:特征选择
特征提取:我们从对齐后的人脸图像中提取了数百个人脸特征,包括几何特征、纹理特征和深度特征。
选择操作:通过分析这些特征与识别准确率的相关性,我们选择最有区分力的特征子集。例如,我们可能发现眼睛间的距离、鼻子的宽度和嘴巴的轮廓是识别员工身份的关键特征。
步骤3:特征降维
降维需求:为了提高计算效率和减少模型复杂度,我们需要降低特征空间的维度。
降维操作:我们采用主成分分析(PCA)对特征进行降维,提取出最主要的几个主成分,这些主成分能够保留大部分的人脸差异信息。
步骤4:特征扩展
扩展需求:为了提高模型的泛化能力,我们希望增加特征的多样性。
扩展操作:我们通过数据增强技术,如人脸图像的旋转、缩放和光照调整,生成额外的训练样本。同时,我们可能还会结合深度学习技术,通过神经网络自动学习更复杂的特征表示。
以一张人脸图片为例,进行该过程的可视化说明:
如图所示,原始图像为我们需要进行分析的图像;
图中,特征对齐后的图像:通过简单裁剪将人脸的中心对齐到图像的中心,目的是增强后续分析的效果。特征对齐有助于减少因姿态变化、光照等因素导致的影响,使得后续的特征提取和分析更加可靠 。
图中,直方图显示了图像中各灰度级的像素数量,能够反映图像的亮度分布。通过观察直方图,可以了解图像的对比度和亮度信息。
图中,PCA降维结果中,每个点表示一个图像样本在前两个主成分上的投影,能够帮助识别样本间的结构和分布。PCA是特征降维的重要方法,有助于减少计算复杂性并提高后续分类或识别的效率。
如图所示,这一部分展示了经过简单数据增强(图像缩放处理)后的特征扩展结果,是提升模型泛化能力的有效手段,通过对训练数据进行变换(如缩放、旋转等),可以提高模型对不同场景和条件的适应性 。
4、创造性分析
模块中的运动检测模块、活体检测模块、反曝光模块,这三个模块都是较为现有的技术,且实现过程也没有什么新的逻辑或方法,这三个模块更多是为了人脸识别的完整性,而不是创造性的部分。
人脸照片特征排序模块的逻辑是比较新的,传统的人脸识别中是实际人脸的特征描述子与系统中人脸特征描述子的比对,但是该文中通过提取人脸表面的不同特征点的位置,进而根据位置信息产生了多种特征,且根据不同特征对人脸识别的重要程度不同,对不同特征对人脸的区分程度进行了量化,进而根据特征区分程度对人脸特征进行降序排序,有助于提高人脸识别的准确性。
人脸特征优化处理模块是对较新的人脸照片特征排序模块的内容的完善,即对较新的特征排序模块的进一步补充,相当于是锦上添加的一步。
综上,该文的创造性点集中于人脸照片特征排序模块,一方面对人脸照片特征进行排序较为少见,不容易想到,另一方面对人脸照片特征排序从逻辑上讲较为合理,实现过程也没有什么疑问的部分,是可以实现的。
模块解析部分的内容是我在自己的知识储备的基础上,对原文中的略过或者较为概括的部分进行了自己的理解和讲解,相当于给了一个可行的实现过程,有助于读者更好理解该文的内容,至于创造性解析部分纯属个人理解。
部分代码
%% 前景提取和物体分割部分的代码
% 读取两幅图像
img1 = imread('image1.jpg'); % 替换为你的第一幅图像文件名
img2 = imread('image2.jpg'); % 替换为你的第二幅图像文件名
% 确保两幅图像大小相同
if size(img1) ~= size(img2)
error('两幅图像的大小必须相同。');
end
% 将图像转换为双精度浮点数,以便进行减法运算
img1_double = double(img1);
img2_double = double(img2);
% 计算图像差分
difference = img1_double - img2_double;
% 将差分结果转换回uint8类型,并将非零灰度值设置为255
difference_uint8 = uint8(difference);
difference_uint8(difference_uint8 ~= 0) = 255;
% 二值化处理
bw = difference_uint8;
% 形态学处理 - 先膨胀后腐蚀,去除小的噪点
se = strel('disk', 2); % 创建一个半径为2的圆形结构元素
bw = imclose(bw, se); % 闭运算,先膨胀后腐蚀
% 连通域分析
cc = bwconncomp(bw); % 查找连通分量
labels = labelmatrix(cc); % 将连通分量标记为不同的标签
% 显示原始图像和差分后的图像
figure;
subplot(1,3,1);
imshow(img1);
title('第一幅图像');
subplot(1,3,2);
imshow(img2);
title('第二幅图像');
subplot(1,3,3);
imshow(bw);
title('形态学处理后的差分图像');
% 轮廓提取
boundaries = bwboundaries(bw, 'noholes');
figure;
imshow(img1);
hold on;
for k = 1:length(boundaries)
boundary = boundaries{k};
plot(boundary(:,2), boundary(:,1), 'g', 'LineWidth', 2);
end
title('提取的轮廓');
hold off;
%% 提取视频中运动物体轨迹的部分代码
% 读取视频文件
videoFile = 'cat_video.mp4'; % 替换为你的文件名
vidObj = VideoReader(videoFile);
numFrames = floor(vidObj.Duration * vidObj.FrameRate);
% 初始化轨迹数据
catPositions = []; % 存储猫的位置
% 创建视频播放器
videoPlayer = vision.VideoPlayer('Position', [100, 100, vidObj.Width, vidObj.Height]);
% 处理每一帧
for k = 1:numFrames
frame = read(vidObj, k);
grayFrame = rgb2gray(frame);
% 这里使用简单的阈值分割,实际中可能需要更复杂的算法
bwFrame = imbinarize(grayFrame);
bwFrame = imopen(bwFrame, strel('disk', 5)); % 形态学操作,去噪
% 查找猫的位置(假设猫是最大的连通区域)
[~, threshold] = edge(grayFrame, 'Canny');
edges = edge(grayFrame, 'Canny', threshold * 0.6);
stats = regionprops(edges, 'BoundingBox', 'Area');
% 选择最大的区域
if ~isempty(stats)
[~, idx] = max([stats.Area]);
catPosition = stats(idx).BoundingBox; % 获取猫的位置
catPositions = [catPositions; catPosition(1:2)]; % 只存储 (x, y) 坐标
end
% 可视化
frame = insertShape(frame, 'Circle', [catPosition(1) + catPosition(3)/2, catPosition(2) + catPosition(4)/2, 10], 'Color', 'red');
videoPlayer.step(frame);
end
% 绘制轨迹
figure;
imshow(frame);
hold on;
plot(catPositions(:, 1), catPositions(:, 2), 'r-', 'LineWidth', 2);
title('Cat Movement Trajectory');
xlabel('X Position');
ylabel('Y Position');
hold off;
% 释放资源
release(videoPlayer);
%% 主成分方差、累计方差图、PCA结果三幅图对应的代码
% 步骤 1: 加载鸢尾花数据集
load fisheriris; % 加载鸢尾花数据集
% 提取特征和标签
features = meas; % 特征数据
labels = species; % 类别标签
% 步骤 2: 特征标准化(可选)
features = (features - mean(features)) ./ std(features);
% 步骤 3: 使用PCA提取特征
[coeff, score, latent] = pca(features); % PCA分析
% 步骤 4: 特征的重要性排序
explained_variance = latent / sum(latent) * 100; % 计算每个主成分的方差百分比
cumulative_variance = cumsum(explained_variance); % 计算累计方差
% 步骤 5: 可视化特征重要性
figure;
subplot(2,1,1);
bar(explained_variance);
title('各主成分方差百分比');
xlabel('主成分');
ylabel('方差百分比 (%)');
xticks(1:length(explained_variance));
xticklabels({'PC1', 'PC2', 'PC3', 'PC4'});
grid on;
subplot(2,1,2);
plot(cumulative_variance, '-o');
title('累计方差解释');
xlabel('主成分');
ylabel('累计方差解释 (%)');
xticks(1:length(cumulative_variance));
grid on;
% 步骤 6: 可视化前两个主成分
figure;
gscatter(score(:,1), score(:,2), labels);
title('PCA结果:前两个主成分');
xlabel('主成分 1');
ylabel('主成分 2');
legend('setosa', 'versicolor', 'virginica');
grid on;
%% 人脸特征优化处理模块对应的代码
% 人脸特征优化处理
% 读取人脸图像
img = imread('face .tif'); % 替换为你的人脸图像
figure;
img= img(:, :, 1:3);
subplot(2, 2, 1);
imshow(img); %
title('原始图像');
% 特征对齐
% 假设使用预定义的特征点(这里为示例,真实应用中需要用检测器获取)
% 这里我们将人脸中心对齐到图像中心
img_gray = rgb2gray(img);
[rows, cols] = size(img_gray);
centered_img = imcrop(img_gray, [cols/4, rows/4, cols/2, rows/2]); % 简单裁剪模拟对齐
subplot(2, 2, 2);
imshow(centered_img);
title('特征对齐后的图像');
% 特征选择(示例使用简单的统计特征)
% 计算图像的直方图作为特征
histo = imhist(centered_img);
% 可视化直方图
subplot(2, 2, 3);
bar(histo);
title('特征选择:图像直方图');
% 特征降维(使用PCA)
% 先转换为列向量
data = double(centered_img(:));
% 计算PCA
[coeff, score, ~] = pca(data);
% 可视化前两个主成分
subplot(2, 2, 4);
if size(score, 2) == 1
% 如果只有一列,使用同一列作为 y 值
scatter(score(:, 1), score(:, 1)); % 或者选择其他合适的y值
else
scatter(score(:, 1), score(:, 2)); % 原有代码
end
title('PCA降维结果');
xlabel('主成分1');
ylabel('主成分2');
% 特征扩展(使用数据增强)
augmented_data = imresize(centered_img, 0.5); % 简单的数据增强
figure;
imshow(augmented_data);
title('特征扩展:缩放增强');
% 结束