OpenCV中利用EigenFace算法进行人脸识别
一、介绍
本次的实验目标是:
1.用4张已知身份的人脸图像训练一个EigenFace识别器,其中分别是明星黎明2张和安志杰的2张。
2.对一张新的测试图像进行预测,判断其身份并给出置信度。
3.在测试图像上绘制识别结果并显示。
二、核心代码讲解
2.1导入库与图像读取

cv2:OpenCV的python接口,提供图像处理和人脸识别功能。
numpy:用于数组操作,尤其训练时标签需转为numpy数组。
使用cv2.imread(path,0)以灰度模式读取图像(0表示灰度),因为EigenFace算法基于像素强度,无需颜色信息。
cv2.resize()将所有图像统一为120*180像素(宽*高)。统一尺寸是必须的,因为后续要将其拉成一维向量,所有样本必须维度一致。
读入4张图后追加到images列表。
2.2标签定义和测试图像预处理

标签对应每个人的ID:0代表“黎明”,1代表“安志杰”。前两张是黎明,后两张是安志杰。
下面同样以灰度读入并缩放到相同尺寸,保证与训练样本维度匹配。
2.3创建EigenFace识别器
![]()
cv2.face.EigenFaceRecognizer_create()是OpenCV提供的特征脸识别器工厂函数。
参数threshold=5000:预测时使用的距离阈值。当计算出的置信度大于该阈值时,认为测试样本不属于任何已训练的人,此时predict()返回的标签为-1。这里设为5000,是一个经验值,需要根据实际数据调整。
2.4训练模型

train()接受两个参数:图像列表和标签数组。
训练过程内部执行PCA(主成分分析),提取训练集的主成分,并将每张图像投影到特征脸空间。
2.5预测
![]()
predict()返回两个值:
label:预测的标签ID(0、1或-1)。
confidence:置信度,数值越小,匹配度越高;若大于阈值,则label为-1.
2.6输出结果和图像显示

将数字标签映射为人名,并打印预测结果和置信度。
重新用彩色方式读入测试图像,因为要绘制红色文字,需彩色模式,用cv2.putText()在左上角写上识别出的人名。
cv2.imshow()显示窗口,cv2.waitKey()等待按键后关闭。

三、EigenFace算法核心原理
核心思想:将人脸图像视为高维空间中的点(120*180=21600维)。通过PCA降维,找到一组“特征脸”(即主成分),它们能最大限度地保留训练数据中的方差。
训练阶段:
1.计算所有训练图像的平均脸;
2.每张图像减去平均脸,得到差值图像;
3.计算协方差矩阵,并求解其特征向量(特征脸)。
4.取前K个最大特征值对应的特征向量,构成投影矩阵。
5.将每张训练图像投影到特征脸子空间。得到低维特征向量,并存储对应标签。
预测阶段:
1.测试图像减去平均脸,投影到特征脸子空间。
2.计算投影向量与所有训练投影向量的欧式距离,找到最近邻。
3.若最小距离小于阈值,则返回对应标签,否则返回-1。
四、总结
本次完整展示了从数据准备、训练、预测到结果展示的流程。它适合初学者理解人脸识别的基本步骤,但离实际应用还有较大距离。关键在于理解 PCA 降维、特征脸空间、距离度量以及阈值的作用。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)