當前位置:
首頁 > 最新 > 基於Matlab的特徵臉演算法實例講解

基於Matlab的特徵臉演算法實例講解

這一個月來,我就是在研究特徵臉演算法,現在看來,效果還不錯,達到了74%的準確率,遠遠高於資料上的30%點幾。與程序的高效相對應的是演算法分析的難產。感覺有很多內容想表達,卻不知從何開始,最後,只好退而求其次,先向大家展示代碼和效果。

這篇文章,就是想彌補上一篇的缺憾,以上一篇中的實例為大家講解一下特徵臉演算法的梗概,讓大家看完之後,對演算法有一個基本的認識,能夠更好地理解代碼。

特徵臉(Eigenface)是指用於機器視覺領域中的人臉識別問題的一組特徵向量。注意:特徵臉是向量。在原始像素空間中,一幅人臉圖像的維數在幾百到幾萬之間。這麼多的維數,不管存儲還是計算都會消耗大量的計算機資源。而且,由於光照、角度和背景等因素的影響,即使是同一個目標,在視覺信息上也會有較大的差異,幾何解釋就是在空間中比較分散,不容易和其他目標區分開來。所以,我們需要一種方法,能夠降低圖像的維數,同時使同一目標的圖像聚類到一起,不同目標的圖像分散開來。這種方法已經被前輩們總結出來了,就是PCA(Principal Component Analysis),即主元分析法。

特徵臉演算法分為以下5個步驟:

1.讀取訓練集中的每一幅人臉圖像,並把圖像重新排成列向量,保存到一個大矩陣M中。假設圖像的維數是d = w * h,共有n幅圖像,那麼M的維數就是d * n。

2.將M中的n列數據相加並求平均值,求得列向量A。因為A在重新排列成w * h維數後,可以顯示成一幅模糊的人臉圖像。所以A也稱作「平均臉」。如下圖所示。

平均臉

3.將M中的n列數據依次減去A,求得差值矩陣D。2、3兩步將M中的數據的均值調整為,方便第4步中求取協方差矩陣。

4.計算協方差矩陣C = D * DT。求取C的特徵值和特徵向量並按照從大到小的順序排列。因為C的特徵向量在重新排列成w * h維數後,可以顯示成類似人臉的圖像,所以也稱作「特徵臉」。如下圖所示。

特徵臉

針對此步,可以進行優化。在實例中,圖像默認w = 92,h = 112,所以d = 10304,且共有40幅。按照上述步驟,得到的協方差矩陣C的維數為10304 * 10304。對這麼大的矩陣計算特徵值和特徵向量,是非常困難的。所以我們可以計算C』= DT* D的特徵值和特徵向量。大家一定會發現C』的維數是40 * 40,這可怎麼辦?沒關係,我們來推導一下。

設ei是C 的第i個特徵向量,λi是C 的第i個特徵值。所以有下式成立:

C』* ei=λi* ei

DT* D*ei=λi* ei

D * DT* D*ei=λi* D * ei

C * D*ei=λi* D * ei

設Vi= D * ei,所以上式

C * Vi=λi* Vi

由此可以看出,通過求解C』= DT* D的特徵值分解得到特徵向量e,再左乘D就得到C的特徵向量V了。也就是特徵臉。

大家一定又會質疑,特徵向量的個數不對!C的特徵向量應該有10304個,而C 的特徵向量只有40個。其實這是沒有問題的,實際中不需要那麼多的特徵向量。如果訓練圖像的數量小於圖像的維數(比如:n < d),那麼起作用的特徵臉只有n - 1個,因為其他的特徵向量對應的特徵值是。

因此在實例中,求出40個特徵向量後,我捨棄了最後一個,從代碼上看,

finalEigenVecMat = finalEigenVecMat(:,1 : find(sortedEigenValVec < 1) - 1);

是判斷特徵值小於1捨棄的。實際上最後一個特徵值很接近,特徵向量起的作用很小,從上圖可以看出來最後一幅特徵臉是全黑的,沒有人臉的輪廓,所以捨棄了。

此步,如果進行施密特正交化,後面的識別效果會更好。我最開始寫的程序沒有進行施密特正交化,準確率是66%,正交化後,準確率達到了74%。

5.將訓練集和測試集中的數據都變換到以特徵臉為基的空間中。在這個空間中,對測試集中的數據按照訓練集中的數據進行分類。空間變換其實就是矩陣相乘。兩個矩陣相乘的物理意義是將右邊矩陣中的每一列列向量變換到左邊矩陣中每一行行向量為基所表示的空間中去。

Limage在github上的鏈接:https://github.com/geekmlby/Limage。歡迎大家指點,您的批評,是我前進的燈塔。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Limage開發心得 的精彩文章:

TAG:Limage開發心得 |

您可能感興趣

實例講解False盲注基礎原理
詳解Linux命令-sed語法和實例講解
Priceline預定酒店中bid功能講解及實戰
緩衝區實例講解之protostar stack3挑戰篇
亞馬遜ASIN Localization是什麼?亞馬遜ASIN Localization講解&Listing合規精華
Spring IoC講解
Tensorflow實戰講解神經網路搭建詳細過程
Shell腳本編寫思路和實例講解
用一個實例講解rename命令中正則表達式的使用
關於webview最詳細講解(包含 h5 和android 交互)
如何設置Facebook主頁?Facebook主頁設置教程(附視頻講解)
The Weather Channel用MR講解颶風逃生指南
protobuf深入講解
IDE,AHCI,Compatible,Enhanced,PATA講解
Office—Excel真題十六講解
Magic Leap CEO專訪,講解為何ML1沒用光場技術
Imagination首次線上講解!如何為端側智能開發靈活高效的人工智慧解決方案|報名
亞馬遜新手開店 | FBA庫存管理& Prime Day備貨技巧講解
小優化卻有大效果,KOL深度講解TouchBoost
python裝飾器內容講解,告訴你python裝飾器是什麼