基于matlab特征脸Eigenface算法的实现
基于matlab特征臉Eigenface算法的實現
- 1.特征臉算法簡介
- 2.PCA
- 2.1 什么是PCA
- 2.2 PCA實現步驟(附matlab代碼)
- 2.2.1 前期準備
- 2.2.2 具體步驟
1.特征臉算法簡介
特征臉算法是將人臉從像素空間變換到另外一個空間,在另外一個空間做相似性的計算。特征量不能再像素空間直接進行相似性計算在于原像素空間中不同類別的圖像在分布上很難用個簡單的線或者面把他們切分開,然后如果變換到另一個空間,就可以很好的把他們分開了。這里我們用到的PAC(Principal Component Analysis)從而得到特征臉。
2.PCA
2.1 什么是PCA
PCA(principal components analysis)即主成分分析技術,又稱主分量分析。主成分分析也稱主分量分析,旨在利用降維的思想,把多指標轉化為少數幾個綜合指標。
在統計學中,主成分分析PCA是一種簡化數據集的技術。它是一個線性變換。這個變換把數據變換到一個新的坐標系統中,使得任何數據投影的第一大方差在第一個坐標(稱為第一主成分)上,第二大方差在第二個坐標(第二主成分)上,依次類推。主成分分析經常用于減少數據集的維數,同時保持數據集的對方差貢獻最大的特征。這是通過保留低階主成分,忽略高階主成分做到的。這樣低階成分往往能夠保留住數據的最重要方面。但是,這也不是一定的,要視具體應用而定。
2.2 PCA實現步驟(附matlab代碼)
2.2.1 前期準備
接下來我們需要使用ORL Faces人臉數據庫實現特征臉的提取,對于人臉數據庫,大家可自行選擇。
2.2.2 具體步驟
(1)獲取數據,將圖像的進行列拼接,然后合成一個大矩陣,該矩陣中每一列都是一個圖像的列拼接。可以通過matlab實現如下:
humanNum=40; %人數 trainNum=9; %每個人的訓練級人數 eigenFaceNum=20 %取特征向量數量 imgL=112; %圖像長寬 imgW=92; faceData=zeros(imgL*imgW,trainNum*humanNum);%臉矩陣分配空間對于圖像的長寬獲得,可以通過在matlab中導入圖像后,點擊查看圖像的長寬。
我們需要將圖像進行列拼接,每個圖像將占據(imgW*imgL)*1,訓練集圖像為9,于是我們聲明以上空間的數組。
for j=1:humanNumfor i=1:trainNumpath = ['F:\orl_faces\s',num2str(j),'\',num2str(i),'.pgm'];tempFace = imread(path);faceData(:,(j-1)*trainNum+i)=reshape(tempFace, [], 1); %進行列向拼接end end(2)計算求每行圖像的平均值,然后每一行減去該平均值,由于平均值是共同分量,減去可以將數據值減小,同時并不影響數據間的差值,對于后期的求特征值特征向量會更加簡便。
%求平均臉 avgface=mean(faceData,2);%平均臉(一列) %減去平均臉 A=faceData; for i=1:humanNum*trainNumA(:,i)=A(:,i)-avgface; end(3)求特征值和特征向量
convT=A'*A; %求協方差矩陣的轉置 10304*10304 [Vs,Ds]= eig(convT); %求特征向量,特征值 D=Ds;V=Vs; Dtemp=abs(diag(D)); %轉化成列向量 ind=find(Dtemp<1e-6); %尋找0特征值Dtemp(ind)=[]; %去除相應的特征值 V(:,ind)=[]; %去除相應的特征向量[DD,ind]=sort(Dtemp,'descend');%將特征值從大到小排列V=V(:,ind); %將特征向量按特征值從大到小排列(4)取特征向量,按理說特征向量越多,在后面的人臉識別中會更加準確。
%取前eigenFaceNum個特征向量 for i=1:eigenFaceNumVG(:,i)=V(:,i); end以上為PCA的主要步驟,接下來我們進行特征臉的顯示。
EigenVectors=A*VG; %將A向特征空間映射%轉化成特征臉 for j=1:eigenFaceNumtempA=reshape(EigenVectors(:,j),112, 92); %將平均臉數據構成平均臉圖象if(j==1)eigenVectorsImg=tempA;elseeigenVectorsImg=[eigenVectorsImg,tempA]; %將特征臉拼接成一個圖片end end測試集進行匹配,將數據分為測試集和訓練集,大家可根據自己的人臉數據庫中每個人物的圖片數來分。識別率較低,就增加訓練集,減少測試集。
% 一個圖片進行匹配 s=5; number=10; path = ['F:\orl_faces\s',num2str(s),'\',num2str(number),'.pgm']; comimg=imread(path); comFaceData=reshape(comimg, [], 1); comFaceData=double(comFaceData); comFaceData=comFaceData-avgface; W1=(comFaceData')*EigenVectors; %計算特征區域的投影坐標distance=zeros(rows,1); for i=1:rowstempW=W(i,:);distance(i)=pdist2(W1,tempW); end [m,index]=min(distance); %在特征區域找最小距離 matchImg=reshape(faceData(:,index),112, 92);%匹配圖片 matchNum=ceil(index/trainNum);figure(3) subplot(1,2,1) imshow(comimg,[]); title(['被識別圖片,來自第',num2str(s),"組人像"]) subplot(1,2,2) imshow(matchImg,[]); if(s==matchNum)title(['匹配圖片成功,匹配第',num2str(matchNum),"組人像"]) elsetitle(['匹配圖片失敗,匹配第',num2str(matchNum),"組人像"]) end總結
以上是生活随笔為你收集整理的基于matlab特征脸Eigenface算法的实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 20多年老码农的IT学习之路
- 下一篇: 《开源安全运维平台--OSSIM最佳实践