事实上关键点在于几点要求,而且由于只需要实现数学原理,所以要求其实比较简单。
(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("识别失败")