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

matlab实现人脸识别(数学基础原理)_第1张图片
事实上关键点在于几点要求,而且由于只需要实现数学原理,所以要求其实比较简单。

(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("识别失败")

你可能感兴趣的:(matlab,人脸识别,python,matlab,1024程序员节)