日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人工智能 > pytorch >内容正文

pytorch

基于PCA的人脸特征抽取

發(fā)布時間:2024/7/23 pytorch 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于PCA的人脸特征抽取 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

我們將應用PCA技術來抽取人臉特征。一幅人臉照片往往由比較多的像素構成,如果以每個像素作為1維特征,將得到一個維數非常高的特征向量, 計算將十分困難;而且這些像素之間通常具有相關性。這樣,利用PCA技術在降低維數的同時在一定程度上去除原始特征各維之間的相關性自然成為了一個比較理想的方案。

數據集簡介
本案例采用的數據集來自著名的ORL人臉庫。首先對該人臉庫做一個簡單的介紹:

  • ORL數據庫共有400幅人臉圖像(40人, 每人1O幅, 大小為112像素x92像素)
  • 這個數據庫比較規(guī)范, 大多數圖像的光照方向和強度都差不多.
  • 但有少許表情、姿勢、伸縮的變化, 眼睛對得不是很準, 尺度差異在10%左右。
  • 并不是每個人都有所有的這些變化的圖像,即有些人姿勢變化多一點,有些人表情變化多一點, 有些還戴有眼鏡, 但這些變化都不大

正是基于ORL人臉庫圖像在光照, 以及關鍵點如眼睛、嘴巴的位置等方面比較統一的特點, 實驗可以在該圖片集上直接展開, 而不是必須要進行歸一化和校準等工作。

生成樣本矩陣
首先要做的是將這 200 幅人臉圖像轉換為向量形式,進而組成祥本矩陣。函數 ReadFaces()用于實現

function [imgRow,imgCol,FaceContainer,faceLabel]=ReadFaces(nFacesPerPerson, nPerson, bTest) % 讀入ORL人臉庫的指定數目的人臉前前五張(訓練) % % 輸入:nFacesPerPerson --- 每個人需要讀入的樣本數,默認值為 5 % nPerson --- 需要讀入的人數,默認為全部 40 個人 % bTest --- bool型的參數。默認為0,表示讀入訓練樣本(前5張);如果為1,表示讀入測試樣本(后5張) % % 輸出:FaceContainer --- 向量化人臉容器,nPerson * 10304 的 2 維矩陣,每行對應一個人臉向量if nargin==0 %default valuenFacesPerPerson=5;%前5張用于訓練nPerson=40;%要讀入的人數(每人共10張,前5張用于訓練)bTest = 0; elseif nargin < 3bTest = 0; endimg=imread('Data/ORL/S1/1.pgm');%為計算尺寸先讀入一張 [imgRow,imgCol]=size(img);FaceContainer = zeros(nFacesPerPerson*nPerson, imgRow*imgCol); faceLabel = zeros(nFacesPerPerson*nPerson, 1);% 讀入訓練數據 for i=1:nPersoni1=mod(i,10); % 個位i0=char(i/10);strPath='Data/ORL/S';if( i0~=0 )strPath=strcat(strPath,'0'+i0);endstrPath=strcat(strPath,'0'+i1);strPath=strcat(strPath,'/');tempStrPath=strPath;for j=1:nFacesPerPersonstrPath=tempStrPath;if bTest == 0 % 讀入訓練數據strPath = strcat(strPath, '0'+j);elsestrPath = strcat(strPath, num2str(5+j));endstrPath=strcat(strPath,'.pgm');img=imread(strPath);%把讀入的圖像按列存儲為行向量放入向量化人臉容器faceContainer的對應行中FaceContainer((i-1)*nFacesPerPerson+j, :) = img(:)';faceLabel((i-1)*nFacesPerPerson+j) = i;end % j end % i% 保存人臉樣本矩陣 save('Mat/FaceMat.mat', 'FaceContainer')

主成分分析
經過上面的處理,矩陣FaceContainter 每一行就成了一個代表某個人臉樣本的特征向量。通過主成份分析的方法可將這些10304維的樣本特征向量降至20維。這樣數據集中每個人臉樣本都可以由一個20維的特征向量來表示, 以作為后續(xù)分類所采用的特征。

我們將對樣本矩陣FaceContainer進行主成份分析的整個過程封裝在下面的main函數中,其參數k 是主分量的數目, 即降維至K 維。該函數首先調用ReadFaces函數得到了人臉樣本矩陣FaceContainer,而后利用10.3.4小節(jié)中的fastPCA算法計算出樣本矩陣的低維表示LowDimFaces 和主成分分量矩陣W, 并將LowDimFaces 保存至Mat 目錄下的LowDimFaces.m出文件中。

function main(k) % ORL 人臉數據集的主成分分析 % % 輸入:k --- 降至 k 維% 定義圖像高、寬的全局變量 imgRow 和 imgCol,它們在 ReadFaces 中被賦值 global imgRow; global imgCol;% 讀入每個人的前5副圖像 nPerson=40; nFacesPerPerson = 5; display('讀入人臉數據...'); [imgRow,imgCol,FaceContainer,faceLabel]=ReadFaces(nFacesPerPerson,nPerson); display('..............................');nFaces=size(FaceContainer,1);%樣本(人臉)數目 display('PCA降維...'); % LowDimFaces是200*20的矩陣, 每一行代表一張主成分臉(共40人,每人5張),每個臉20個維特征 % W是分離變換矩陣, 10304*20 的矩陣 [LowDimFaces, W] = fastPCA(FaceContainer, 20); % 主成分分析PCA visualize_pc(W);%顯示主成分臉 save('Mat/LowDimFaces.mat', 'LowDimFaces'); display('計算結束。');

上述命令運行后會在Mat目錄下生成LowDimFaces.mat文件,其中的200X20維矩陣LowDimFaces是經過PCA降維后,原樣本矩陣FaceContainer的低維表示。200個人臉樣本所對應的每一個特征向量由原來的10304維變成了20維,這就將后續(xù)的分類問題變成一個在 20維空間中的劃分問題,過程大大簡化。

主成分臉可視化分析
fastPCA函數的另一個輸出為主分量陣w. 它是一個10304X20的矩陣,每列是一個10304維的主分量(樣本協方差矩陣的本征向量),在人臉分析中,習慣稱之為主成份臉.事實上我們可以將這些列向量以112X92的分辨率來顯示,該工作由函數visualizepc完成,實現如下:

function visualize_pc(E) % 顯示主成分分量(主成分臉,即變換空間中的基向量) % % 輸入:E --- 矩陣,每一列是一個主成分分量[size1 size2] = size(E); global imgRow; global imgCol; row = imgRow; col = imgCol;if size2 ~= 20error('只用于顯示 20 個主成分'); end;figure img = zeros(row, col); for ii = 1:20img(:) = E(:, ii);subplot(4, 5, ii);imshow(img, []); end


結合主成份臉圖像的分析
首先,我們可以看到,圖中的所有20個主成分臉圖像的一個共同點是人臉區(qū)域之外的圖像背景相對較暗。比較典型的如第1行的第3副圖像,其背景幾乎為黑色,這是因為 ORL數據集中的人臉圖像背景較為均勻一致,在原始d維空間中樣本在對應背景的這些維上差異很小,從樣本分布云團上看,這些維上的云團的散布最小。因此ek對應于這些維的加權系數很小,在顯現出的圖像中就是灰度小,從而表現為主成分臉的暗背景。
繼續(xù)按照這種思路分析, 拿第1個主成份臉來說,眉毛、鼻子和上嘴唇是圖像中灰度相對較高的區(qū)域,這說明實驗數據集中的200個人臉之間在這些位置存在較大的差異;再比如第1行的第5個主成分臉, 面部區(qū)域整體亮度較高,這可能是由數據集人臉之間的膚色差異
導致;其他典型如第2行的第3個以及第3行的第2個主成分臉中的眼睛,第2行第1個以及第4行第2個主成份臉的嘴,這些高亮度區(qū)域反映了實驗數據集中人臉之間的五官差異。此外,我們還注意到同為五官之一的鼻子似乎井不“ 搶眼”,僅第3行的第1幅圖像的鼻梁區(qū)
域亮度相對高一些。這說明正面為主的人臉圖像中鼻子之間差異不大,這正好和學術界普遍認可的鼻子在正面圖像為主的人臉識別中的作用不大的結論一致。

降維對分類性能的影響
人類能夠識別人臉,正是由于不同的人在眼睛、嘴和眉毛等一些重要器官上的差別較大。經線性變換后,原始d維空間中那些差別較大的維在變換至低維空間的過程中被較大的加權而保留;而那些每幅人臉圖像都類似(缺乏區(qū)分力)的特征,如背景、鼻子和額頭等被賦予了較低的權值, 從而在d’維空間中幾乎沒有得到體現。這樣經PCA處理后,在特征向量維數大大降低的同時,原圖像中那些差異最大的特征被最大程度的保留(以一種線性組合的形式),而那些相對一致、區(qū)分力較差的特征則被丟棄。這就是為什么在很多
情況下降維后,分類的識別率并不會明顯下降的原因。PCA降維丟棄某些特征所損失的信息通過在低維空間中更加精確地映射可以得到補償, 從而可以在低維空間中得到和高維空間中相當的識別率。

PCA能夠很好工作的前提
細心的讀者可能會發(fā)現,在某些主成分臉圖像的人臉邊緣處也出現了較高的灰度,這是由數據集圖像中人臉姿態(tài)和位置的差異造成的, 幸好這種差異不大(10%左右)。實際上在我們的系統中,經過PCA降維后的20維樣本矩陣能夠很好地用于入臉識別的另一個關鍵點在
于ORL人臉數據庫中的大部分人臉在圖像中占據著大致相同的區(qū)域,姿態(tài)差異度不大,井且眼睛、鼻子、發(fā)跡和嘴的位置也大體相同。否則, 200個人臉圖像之間的差異就不再是人長相本身的差異, 而是這些人的臉部區(qū)域在圖像中位置的差異,姿態(tài)的差異、以及器官位置的差異。當然,此時PCA可以照常計算,但將降維后的樣本矩陣用于人臉識別就不會取得理想的識別率,而可能更適合于姿態(tài)分類

基于主分量的人臉重建
下面利用式(10-19)來實現對個體人臉圖像的重建。我們提供的的函數approx可以勝任這一工作。其中參數x是需要重建的個體人臉樣本, K是重建使用的主分量數目, 輸出xApprox為對于原樣本向量x的重建(近似)。具體實現如:

function [ xApprox ] = approx( x, k ) % 用 k 個主成分分量來近似(重建)樣本 x % % 輸入:x --- 原特征空間中的樣本,被近似的對象 % k --- 近似(重建)使用的主分量數目 % % 輸出:xApprox --- 樣本的近似(重建)% 讀入 PCA 變換矩陣 V 和 平均臉 meanVec load Mat/PCA.matnLen = length(x);xApprox = meanVec;for ii = 1:kxApprox=xApprox+((x-meanVec)*V(:,ii))*V(:,ii)'; endload Mat/FaceMat.mat x = FaceContainer(1,:); [pcaA V]= fastPCA(FaceContainer,200); xApprox = approx(x,50); displayImage(xApprox,112,92); xApprox = approx(x,100); displayImage(xApprox,112,92); xApprox = approx(x,200); displayImage(xApprox,112,92);

當使用200個主分量進行重建時,幾乎沒有差異。

總結

以上是生活随笔為你收集整理的基于PCA的人脸特征抽取的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。