【精选】MATLAB 人脸识别矩阵(矩阵、相似度) | 您所在的位置:网站首页 › 人脸测试相似度 › 【精选】MATLAB 人脸识别矩阵(矩阵、相似度) |
目录 使用MATLAB矩阵运算进行有关人脸识别算法方案设计 1.运算过程: (1)变量注释 (2)计算结果及过程分析 2.源代码: 3.附加部分 (1)条件改变 (2)运行结果 (3)改变条件后的源代码 使用MATLAB矩阵运算进行有关人脸识别算法方案设计(人脸识别是一个复杂问题,涉及到多种技术和算法,机器学习算法是当前人脸识别的关键算法。本示例用简化方式,通过矩阵计算人脸比对过程,目的是练习图像处理命令和矩阵计算方式)。建模:在人脸识别中,把人脸划分为10个区域:脸部轮廓、眼睛、眉毛、鼻子、嘴巴、下巴、左脸、右脸、左耳、右耳(可以假设区域,通过图像矩阵定位判断)。每一个区域有22个特征,每一个特征数字化后的取值范围是1-100之间。按照下面过程给出方案设计,具体数据自己可以合理假设。 (1)通过采集给出人脸特征基准矩阵,给出具体的基准矩阵Ax(每一个人都 有一个基准矩阵,给出至少10人的基准矩阵)。提示:矩阵Ax中,每一行表 示一个人脸区域特征向量(10个区域),每一列表示一个区域特征(22个特 征),特征值范围1-100(可以随机生成)。(A1,A2,…,A10,…) • (2)随机采集到某一个人的人脸图像,提取该人的人脸特征(可以通过假设 给出),给出一个具体的需要判断的示例矩阵B,要求判断B与Ax中哪一个人 的人脸特征相似? • (3)关键计算1:计算和判断人脸特征的相似度,规则是:左耳、右耳的特 征的特征值误差范围是20%,左脸、右脸的误差范围是10%,其他特征的误差 范围是3%;如果特征值在误差范围内都认为是相似的。提示:运用矩阵减法 运算、矩阵逻辑比较运算,相似时为真true用1表示,不相似时为假false用0表 示。 • (4)关键计算2:计算和判断人脸区域的相似度,规则是每一个区域的22个 特征中,80%以上特征相似就认为区域相似。提示:运用向量计算、sum命令 。 • (5)关键技术3:计算和判断人脸相似度,规则是10个区域中,90%以上相似 ,就认为相似。提示:运用向量计算、sum命令。 1.运算过程: (1)变量注释A:通过随机数模拟生成人脸基准矩阵(通过100次迭代模拟100张人脸) B:用作判断标准的预设矩阵(通过随机数生成) C:A、B矩阵各元素的误差(|A-B|./A) line:存储第j个区域的特征向量判断结果的数组 a:存储所有区域判断结果的数组(若有区域满足相似条件,则向数组中添加一个“1”元素) flag:哨兵变量 i,j:迭代变量 工作区截图: (2)计算结果及过程分析计算结果如下图,显示识别失败。这个结果是合理的,因为从概率上来看,从随机生成的矩阵中找出一个与示例满足相似条件矩阵本来就是小概率事件。但可以通过查看变量来分析相似情况。
line截图如下: 可以看到只有两个特征符合相似条件。 并且a=[]为空数组,说明没有符合相似条件的区域。所以100张随机生成的人脸中没有与预设人脸相似的。识别失败。 计算结果全图如下: 2.源代码: B=randi(100,10,22); flag=0; for i=1:100 a=[]; A=randi(100,10,22); C=abs(A-B)./A; for j=1:6 line=C(j,:)=22*0.8 a=[a,1]; end end for j=7:8 line=C(j,:)=22*0.8 a=[a,1]; end end for j=9:10 line=C(j,:)=22*0.8 a=[a,1]; end end if sum(a,2)>=9 fprintf("第%d个矩阵识别成功\n",i); flag=1; end end if flag==0 fprintf("识别失败\n"); end至此,作业所要求的内容已经结束。 3.附加部分在本作业外,为了验证本程序的正确性,我们决定改变预设条件,充分执行该程序。 (1)条件改变现改变如下条件: 将左耳、右耳的特征的特征值误差范围由20%调到100%; 左脸、右脸的误差范围由10%调到100%; 其他特征的误差范围由3%调到100%; 并将随机生成的人脸特征矩阵数量由100调到10000个; (2)运行结果可以看到在新的判断标准下,最终有5个矩阵满足相似条件。 数组line截图如下: 可以看到在最后一次迭代的脸部区域有15个特征符合判断条件。 数组a截图如下: 在数组a中有4个“8”元素,所以在最后一次迭代中有8个区域符合条件。该矩阵(第10000个矩阵)识别不成功,从运算结果可以看到只有第119个、第1871个、第6152个、第7194个、第7328个识别成功。所以程序运行结果是符合预设要求的。 (3)改变条件后的源代码 B=randi(100,10,22); flag=0; for i=1:10000 a=[]; A=randi(100,10,22); C=abs(A-B)./A; for j=1:6 line=C(j,:)=22*0.8 a=[a,1]; end end for j=7:8 line=C(j,:)=22*0.8 a=[a,1]; end end for j=9:10 line=C(j,:)=22*0.8 a=[a,1]; end end if sum(a,2)>=9 fprintf("第%d个矩阵识别成功\n",i); flag=1; end end if flag==0 fprintf("识别失败\n"); end |
CopyRight 2018-2019 实验室设备网 版权所有 |