讀古今文學網 > 刷臉背後:人臉檢測 人臉識別 人臉檢索 > 7.7 PCA算法 >

7.7 PCA算法

PCA(Principal Component Analysis)是一種常用的數據分析方法。它利用線性代數中的線性變換將原始圖像變換成一組各維度線性無關的表示,可用於提取數據的主要特徵份量,也適用於圖像數據(高維數據)的降維。

在本節中,我們先將圖像調整到合適的尺寸,然後再對所有圖像進行PCA處理。這樣就解決了圖像間檢索速度慢的問題。我們使用的PCA算法是非監督式的,它能很好地挑選代表所有樣本的屬性。下面我們來具體闡述PCA算法的使用與具體實現。

7.7.1 PCA算法的使用

使用Windows 7操作系統,以及CodeBlocks+OpenCV2.4.9的軟件環境。

運行相關程序的步驟如下:

(1)使用CodeBlocks打開「PCA+Cosdistance」項目下的FaceResearch.cbp文件。

(2)打開Sources源文件中的main.cpp文件,修改圖像集所屬文件夾名稱及圖像的格式。代碼如下所示:

imgData = readImg(\"image30x40\",\"jpg\"); //讀入所有訓練集

(3)讀入測試圖像的完整路徑。代碼如下所示:

Mat singleImg = imread(filename,0); //讀入測試圖像

(4)運行Sources源文件中的main.cpp文件即可。

7.7.2 PCA算法原理

對於大量多維數據來說,變量之間相互關聯,多重共線性會導致解空間的不穩定,從而導致結果的不連貫;多維度數據具有稀疏性,過多的變量會阻礙我們查找數據中的內在規律。因此,為了更好、更快地計算兩個圖像之間的差異,我們需要對原始圖像進行PCA降維。其作用有三:(1)減少預測變量的個數;(2)確保這些變量之間是相互獨立的,去除了噪聲,發現數據中的模式,從而增加變量的代表性和變量間的區分度;(3)提供一個框架來解釋結果[4]。

PCA的算法思想如下[5]:假設有m個實例,n維數據。第一步,將原始數據按列組成n行m列矩陣X;第二步,將X的每一行進行零均值化,也就是減去這一行的均值;第三步,求出協方差矩陣,以及其特徵值及對應的特徵向量;第四步,將特徵向量按照對應特徵值的大小從上到下按行排列成矩陣,取前k行組成矩陣p;第五步,y=pX即為降維到k維後的數據。PCA的實質就是在盡可能好地代表原來特徵的情況下,將原來特徵進行變換、映射至低緯度空間中。

降維的實現[6]:PCA降維的目的就是「降噪」和「去冗余」。降噪的目的就是使保留下來的維度間的相關性盡可能小,也就是說讓協方差矩陣中非對角線元素都基本為零。這一步在線性代數中稱為矩陣對角化。對角化後的矩陣的對角線上是協方差矩陣的特徵值,它有兩層含義:第一層,它是各個維度上的新方差;第二層,它是各個維度本身應該擁有的能量。這就是我們為何一直將方差與能量等同的原因。而「去冗余」的目的就是使保留下來的維度含有的「能量」(方差)盡可能最大。首先我們需要知道,協方差矩陣度量的是維度與維度之間的關係,而非樣本與樣本之間。協方差矩陣的主對角線上的元素是各個維度上的方差(能量)。其他元素是兩兩維度間的協方差(相關性)。在除噪對角化後的協方差矩陣的對角線上較小的新方差對應的就是那些該捨掉的維度。因此,我們只取那些含有較大能量(特徵值)的維度,其餘的捨掉即可。PCA線性數學原理實質其實就是對角化協方差矩陣。

PCA的過程如下:

(1)特徵中心化,即每一維的數據都減去該維的均值。這裡的「維」指的就是一個特徵(或屬性),變換之後每一維的均值都變成了0。假如原始數據是一個矩陣A,我們將每一列減去該列均值後,得到矩陣B。

(2)計算矩陣B的協方差矩陣C。

(3)計算協方差矩陣C的特徵值和特徵向量。

(4)挑選出大的特徵值對應的特徵向量,得到新的數據集。

7.7.3 PCA算法實現

PCA算法的具體實現步驟如下。

1.前期處理

其中,readImg函數如下:把灰度圖像調整成大小為30×40像素的圖像,並對圖像進行reshape、pushback處理,存儲到一個Mat變量裡面。

2.在圖像集上進行PCA操作

構建PCA,其中第一個參數表示將矩陣形式表示的圖像數據以行向量形式表示,如尺寸為30×40像素的圖像,表示為1行×1200列。若有20張圖像,此時的imgData就是一個20行×1200列的Mat。第三個參數CV_PCA_DATA_AS_ROW表示的是矩陣的每一行代表一個樣本。第四個參數0.9表示選擇構成90%的能量的特徵值,調用OpenCV中PCA算法,將Mat imgData 投影到特徵空間生成pcaFeature。上面已經提到,PCA降維的目的是去除噪聲,發現數據中的模式;確保變量相互獨立;提高運行速度。

3.輸入測試圖像

輸入測試圖像,展開成1行×1200列,存儲於一個test-Mat 變量裡,並將測試圖像test-Mat也投影到特徵空間(測試圖像要經過上述兩個步驟相同的處理)。

4.求餘弦相似度

將兩個圖像的表示分別視為兩個行向量,求這兩個向量之間的內積(或稱為點積)。它們之間的相似值在0和1之間浮動,1表示和測試圖像相同,餘弦相似值越大,表示兩個圖像的相似度越大。在本實驗中,相似圖像(和輸入圖像為同一個人的圖像)的值大多都在0.90以上。

calculateCosEuDis函數參考本章7.2節相關內容。

7.7.4 PCA算法的實驗數據、實驗結果及分析

1.實驗數據

圖像庫中的圖像為「..PCA+Cosdistanceimage30×40」路徑下的所有(497張)圖像。

輸入的查詢圖像為「..PCA+Cosdistanceimage30×40」路徑下的S001-001.jpg圖像。

image30×40圖像集的說明:以其中一張圖像的名稱為例,「s001-001.jpg」就代表第一個人的第一張圖像,「s001-002.jpg」就表示第一個人的第二張圖像。類似地,「s002-001.jpg」代表第二個人的第一張圖像。

2.實驗結果

以下是部分測試結果。

查詢圖像如圖7-5所示。

圖7-5 查詢圖像(3)

檢索出的部分相似圖像如圖7-6所示。

圖7-6 檢索出的部分相似圖像(3)

實驗結果為「..PCA+Cosdistance」路徑下的similityPCAFeature.txt文件。其中每一行代表圖像的序號和相似度。圖像的順序包含在「..PCA+Cosdistance」路徑下的FileName.txt文件。

表7-3所示是我們整理出來的部分實驗結果。

表7-3 部分實驗結果(3)

續表

續表

3.實驗分析

本算法可用於相同或相似圖像的查找。本算法中相似圖像與查詢圖像之間的最小餘弦相似度的閾值為0.89。查准率為43/46×100%=93.5%,查全率為43/43×100%=100%。