matlab实现人脸识别(数学基础原理)

it2025-06-01  11

事实上关键点在于几点要求,而且由于只需要实现数学原理,所以要求其实比较简单。

(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%以上特征相似就认为区域相似。提示∶运用向量计算

matlab:

B=randi(100,10,22); #需要判断的矩阵 B1=B; flag=1; for i=1:10 A=randi(100,10,22); #随机生成的基准矩阵 C=abs(A-B1)./A; disp(C) #检验程序正确性的输出 for j=1:10 #分行 for k=1:22 #分列 if i<7 if C(j,k)<=0.03 B(j,k)=1; else B(j,k)=0; end elseif (6<i)&&(i<9) if C(j,k)<=0.2 B(j,k)=1; else B(j,k)=0; end else if C(j,k)<=0.1 B(j,k)=1; else B(j,k)=0; end end end end disp(B) sp=sum(B,2); #按行相加,列不变 for n=1:10 if sp(n)>17 sp(n)=1; end end if sum(sp)>9 flag=0; #哨兵变量 fprintf("识别成功!B与第%d个矩阵相符\n", i) end end if flag==1 fprintf("识别失败") end

事实上由于刚开始接触matlab,不太熟悉,代码一开始使用python写的,之后改进成matlab代码。python的numpy和matlab语法还是有一些地方有差别的,尤其是矩阵的除法和矩阵的点除。 matlab: 代码其实还可以简略很多

B=randi(100,10,22); %需要判断的矩阵,完成要求2 B1=B; %保存原始的B,后续用来做比较 d=ones(10,22)*nan; %创建一个10*22的空矩阵 d(1:6,:)=0.03; %题目要求 d(7:8,:)=0.1; d(9:10,:)=0.2; flag=1; %标记是否成功的状态 for i=1:10 A=randi(100,10,22); %随机生成的基准矩阵,完成要求1 C=abs(A-B1)./A; %矩阵对应元素相除 disp(C); %检验程序正确性的输出 B=C<=d; %直接使用逻辑运算 disp(B); sp=sum(B,2); %按行相加,列不变 sp1=sp>22*0.8; %逻辑运算加一 disp(sp1); if sum(sp1)>9 %最终确认 flag=0; fprintf("识别成功!B与第%d个矩阵相符\n", i) break end end if flag==1 fprintf("识别失败") end

python:

import numpy as np B=np.random.randint(0,100,size=[10,22]) B1=np.copy(B) flag=1 for i in range(10): A=np.random.randint(0,100,size=[10,22]) C=np.around(abs(A-B1)/A,2) for j in range(10): for k in range(22): if i<6: if C[j,k]<=0.9: B[j,k]=1 else: B[j,k]=0 elif 5<i<8: if C[j,k]<=0.9: B[j,k]=1 else: B[j,k]=0 else: if C[j,k]<=0.9: B[j,k]=1 else: B[j,k]=0 print(B) cnt=0 D=np.sum(B,axis=1) for n in range(10): if D[n]>15: cnt+=1 if cnt>9: flag=0 print("识别成功!B与第%d个矩阵相符"%(i+1)) if flag==True: print("识别失败")
最新回复(0)