天天看點

基于回歸模型的人臉識别(matlab實作)

基于回歸模型的人臉識别(matlab實作)

1、原理

識别系統不外乎以下幾個方面,通常前兩種在我們實際操作時不予考慮,我們都能在網上找到人臉的圖檔素材,他們通常都是預處理過的。例如,在1993 年,美國國防部進階研究項目署(Advanced Research Projects Agency)和 美國陸軍研究實驗室(Army Research Laboratory)成立了 Feret(Face RecognitionTechnology) 項目組,建立了 Feret 人臉資料庫,用于評價人臉識别算法的性能。我們這裡采用Yale University的資料庫。

基于回歸模型的人臉識别(matlab實作)
用于識别人臉的算法在近幾年來是研究熱點,許多的研究者也提出了許多的算法模型
  1. 基于幾何特征的方法,通過人臉拓撲結構幾何關系,提取面部器官特征來進行識别。
  2. 基于模闆的方法可以分為基于相關比對的方法、特征臉方法、線性判别分析方法、奇異值分解方法、神經網絡方法、動态連接配接比對方法等。
  3. 基于模型的方法則有基于隐馬爾柯夫模型,主動形狀模型和主動外觀模型的方法等。

2、算法

下面算法使用初學入門的簡單的基于回歸模型的方法進行人臉識别

Naseem等人提出的線性回歸分類器(Linear Regression Classification,LRC)本質上是一個最近子空間分類器(Nearest Space, NS)。LRC 假定人臉圖像位于一個線性空間之中,并認為待檢測圖像應當與訓練集中同一類圖像張成的子空間距離最小,即待檢測圖像應當能被訓練集中同一類圖像以最小誤差線性重構。于是 LRC 計算待測圖像y 到訓練集中每類圖像所張成的子空間距離,将其分類到距離最近的類中。

正規方程法

最小二乘法可以将誤差方程轉化為有确定解的代數方程組(其方程式數目正好等于未知數的個數),進而可求解出這些未知參數。這個有确定解的代數方程組稱為最小二乘法估計的正規方程(或稱為法方程)。

本文用正規方程法(Normal Equation)來求解其最優參數,具體數學推導可以略過,這一步就是想得到參數b的表達式,具體如下:

![在這裡插入圖檔描述](https://img-blog.csdnimg.cn/20190331170727386.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MDQ1NzgwMQ==,size_16,color_FFFFFF,t_70

基于回歸模型的人臉識别(matlab實作)

即其中,

基于回歸模型的人臉識别(matlab實作)

LRC算法

根據待檢測人臉圖像應當與訓練集中同一類圖像張成的子空間距離最小的原則進行識别

基于回歸模型的人臉識别(matlab實作)

3、代碼

matlab代碼就是按以上流程編寫的,本代碼由在借鑒的情況下自己碼的,請勿照搬,如有疑問歡迎留言。

%%%基于回歸模型的人臉識别算法LRC對txt檔案進行訓練及識别
tic
error=[];
right={};
error_num={};
for m=1:10 %%處理10份
test = dlmread([ 'StTestFile',num2str(m),'.txt']);
                   %最後一列是類别
c1=test(:,end); %%類别
t1=test(:,1:end-1);%%圖檔矩陣數值
train_data = dlmread(['StTrainFile',num2str(m),'.txt']);
                   
c2=train_data(:,end);
t2=train_data(:,1:end-1);

for num=1:size(c1,1) %%測試照片數量,num為測試的第某張照片
    y= reshape(test(num,1:end-1),size(t1',1),1);%%y存放測試圖檔

x={};
for n=1:max(c1)     %%即類别數,15
x{n}=[];                   
for k=((size(t2,1)/max(c1))*(n-1)+1):size(t2,1)*n/max(c1)
    %第k類人所有訓練圖檔
    A=train_data(k,1:end-1);
    x{n}=[x{n},reshape(A,size(t1',1),1)];%x存放第k人訓練圖檔
end
end

for n=1:max(c1)
b{n}=inv((x{n}')*x{n})*(x{n}')*y;%%計算b
yy{n}=x{n}*b{n};%%計算估算的y
end

d=[];
for n=1:max(c1)
d=[d,norm(yy{n}-y)];
end
[dd,i]=min(d);%%其中i為距離最小時的類别

if c1(num)~=i %%換成if d(c1(num))~=min(d)也行
    error=[error,num];
end
error_num{m}=error;%%将每一個測試檔案中的識别錯誤圖檔序号儲存
end%%每個測試檔案中所有測試圖檔結束
right{m}=(size(c1,1)-size(error',1))/size(c1,1);
error=[];
end%%10個測試檔案結束
s=0;
for k=1:10
    s=s+right{k};
end
ave_right=s/10  %%顯示準确率平均值
time=toc        %%顯示運作時間
right           %%顯示10個測試檔案準确率
error_num       %%顯示識别錯誤圖檔序号,其中每個元胞下标即為第幾個檔案

           

4、運作結果

将圖檔素材Yale_32x32導入matlab中,再執行上面代碼,可得運作結果:(ave_right:準确率平均值,time:運作時間,right:10個測試檔案準确率,error_num:識别錯誤圖檔序号,其中每個元胞下标即為第幾個檔案)

基于回歸模型的人臉識别(matlab實作)

平均準确率為0.7567,運作時間為1.7563s