matlab實現人臉識別(數學基礎原理)

初與久歌2020發表於2020-10-21

在這裡插入圖片描述
事實上關鍵點在於幾點要求,而且由於只需要實現數學原理,所以要求其實比較簡單。

(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語法還是有一些地方有差別的,尤其是矩陣的除法和矩陣的點除。

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("識別失敗")

相關文章