1. 程式人生 > 其它 >【人臉表情識別】基於matlab PCA+SVM人臉表情識別評分系統【含Matlab原始碼 593期】

【人臉表情識別】基於matlab PCA+SVM人臉表情識別評分系統【含Matlab原始碼 593期】

一、簡介

1 PCA
PCA(Principal Component Analysis)是常用的資料分析方法。PCA是通過線性變換,將原始資料變換為一組各維度線性無關的資料表示方法,可用於提取資料的主要特徵分量,常用於高維資料的降維。

1.1 降維問題
資料探勘和機器學習中,資料以向量表示。例如某個淘寶店2012年全年的流量及交易情況可以看成一組記錄的集合,其中每一天的資料是一條記錄,格式如下:
(日期, 瀏覽量, 訪客數, 下單數, 成交數, 成交金額)
其中“日期”是一個記錄標誌而非度量值,而資料探勘關心的大多是度量值,因此如果我們忽略日期這個欄位後,我們得到一組記錄,每條記錄可以被表示為一個五維向量,其中一條樣本如下所示:

一般習慣上使用列向量表示一條記錄,本文後面也會遵循這個準則。
機器學習的很多演算法複雜度和資料的維數有著密切關係,甚至與維數呈指數級關聯。這裡區區5維的資料,也許無所謂,但是實際機器學習中處理成千上萬甚至幾十萬維的資料也並不罕見,在這種情況下,機器學習的資源消耗是不可接受的,因此就會對資料採取降維的操作。降維就意味著資訊的丟失,不過鑑於實際資料本身常常存在相關性,所以在降維時想辦法降低資訊的損失。
例如上面淘寶店鋪的資料,從經驗可知,“瀏覽量”和“訪客數”往往具有較強的相關性,而“下單數”和“成交數”也具有較強的相關性。可以直觀理解為“當某一天這個店鋪的瀏覽量較高(或較低)時,我們應該很大程度上認為這天的訪客數也較高(或較低)”。因此,如果刪除瀏覽量或訪客數,最終並不會丟失太多資訊,從而降低資料的維度,也就是所謂的降維操作。如果把資料降維用數學來分析討論,用專業名詞表示就是PCA,這是一種具有嚴格數學基礎並且已被廣泛採用的降維方法。

1.2 向量與基變換
1.2.1 內積與投影
兩個大小相同向量的內積被定義如下:



1.2.2 基
在代數中,經常用線段終點的點座標表示向量。假設某個向量的座標為(3,2),這裡的3實際表示的是向量在x軸上的投影值是3,在y軸上的投影值是2。也就是說隱式引入了一個定義:以x軸和y軸上正方向長度為1的向量為標準。那麼一個向量(3,2)實際是在x軸投影為3而y軸的投影為2。注意投影是一個向量,可以為負。向量(x, y)實際上表示線性組合:

由上面的表示,可以得到所有二維向量都可以表示為這樣的線性組合。此處(1,0)和(0,1)叫做二維空間中的一組基。

之所以預設選擇(1,0)和(0,1)為基,當然是為了方便,因為它們分別是x和y軸正方向上的單位向量,因此就使得二維平面上點座標和向量一一對應。但實際上任何兩個線性無關的二維向量都可以成為一組基,所謂線性無關在二維平面內,從直觀上就是兩個不在一條直線的向量。

另外這裡的基是正交的(即內積為0,或直觀說相互垂直),可以成為一組基的唯一要求就是線性無關,非正交的基也是可以的。不過因為正交基有較好的性質,所以一般使用的基都是正交的。
1.2.3 基變換的矩陣
上述例子中的基變換,可以採用矩陣的乘法來表示,即

如果推廣一下,假設有M個N維向量,想將其變換為由R個N維向量表示的新空間中,那麼首先將R個基按行組成矩陣A,然後將向量按列組成矩陣B,那麼兩矩陣的乘積AB就是變換結果,其中AB的第m列為A中第m列變換後的結果,通過矩陣相乘表示為:


1.3 協方差矩陣及優化目標
在進行資料降維的時候,關鍵的問題是如何判定選擇的基是最優。也就是選擇最優基是最大程度的保證原始資料的特徵。這裡假設有5條資料為

計算每一行的平均值,然後再讓每一行減去得到的平均值,得到

通過座標的形式表現矩陣,得到的圖如下:

那麼現在的問題是:用一維向量來表示這些資料,又希望儘量保留原有的資訊,該如何選擇呢?這個問題實際上是要在二維平面中選擇一個方向的向量,將所有資料點都投影到這條直線上,用投影的值表示原始記錄,即二維降到一維的問題。那麼如何選擇這個方向(或者說基)才能儘量保留最多的原始資訊呢?一種直觀的看法是:希望投影后的投影值儘可能分散。

1.3.1 方差
上述問題是希望投影后投影的值儘可能在一個方向上分散,而這種分散程度,可以採用數學上的方差來表述,即:

於是上面的問題被形式化表述為:尋找一個一維基,使得所有資料變換為這個基上的座標後,方差值最大。

2.3.2 協方差
數學上可以用兩個特徵的協方差表示其相關性,即:

當協方差為0時,表示兩個特徵完全獨立。為了讓協方差為0,選擇第二個基時只能在與第一個基正交的方向上選擇。因此最終選擇的兩個方向一定是正交的。

至此獲得降維問題的優化目標:將一組N維向量降為K維(K<N),其目標是選擇K個單位(模為1)正交基,使得原始資料變換到這組基上後,各欄位兩兩間協方差為0,而欄位的方差則儘可能大(在正交的約束下,取最大的K個方差)。

2.3.3 協方差矩陣
假設只有x和y兩個欄位,將它們按行組成矩陣,其中是通過中心化的矩陣,也就是每條欄位減去每條欄位的平均值得到的矩陣:


3.4 協方差矩陣對角化


1.4 演算法與例項
1.4.1 PCA演算法

1.4.2 例項


1.5. 討論
根據上面對PCA的數學原理的解釋,可以瞭解到一些PCA的能力和限制。PCA本質上是將方差最大的方向作為主要特徵,並且在各個正交方向上將資料“離相關”,也就是讓它們在不同正交方向上沒有相關性。

因此,PCA也存在一些限制,例如它可以很好的解除線性相關,但是對於高階相關性就沒有辦法了,對於存在高階相關性的資料,可以考慮Kernel PCA,通過Kernel函式將非線性相關轉為線性相關。另外,PCA假設資料各主特徵是分佈在正交方向上,如果在非正交方向上存在幾個方差較大的方向,PCA的效果就大打折扣了。

最後需要說明的是,PCA是一種無引數技術,也就是說面對同樣的資料,如果不考慮清洗,誰來做結果都一樣,沒有主觀引數的介入,所以PCA便於通用實現,但是本身無法個性化的優化。

2 SVM基本概念
支援向量機(Support Vector Machine, SVM)的基本模型是在特徵空間上找到最佳的分離超平面使得訓練集上正負樣本間隔最大。SVM是用來解決二分類問題的有監督學習演算法,在引入了核方法之後SVM也可以用來解決非線性問題。
一般SVM有下面三種:

硬間隔支援向量機(線性可分支援向量機):當訓練資料線性可分時,可通過硬間隔最大化學得一個線性可分支援向量機。
軟間隔支援向量機:當訓練資料近似線性可分時,可通過軟間隔最大化學得一個線性支援向量機。
非線性支援向量機:當訓練資料線性不可分時,可通過核方法以及軟間隔最大化學得一個非線性支援向量機。

2.2 硬間隔支援向量機


對於圖2的A、B、C三個超平面,應該選擇超平面C,因為使用超平面C進行劃分對訓練樣本區域性擾動的“容忍”度最好,分類的魯棒性最強。例如,由於訓練集的侷限性或噪聲的干擾,訓練集外的樣本可能比圖2中的訓練樣本更接近兩個類目前的分隔界,在分類決策的時候就會出現錯誤,而超平面C受影響最小,也就是說超平面C所產生的分類結果是最魯棒性的、是最可信的,對未見樣本的泛化能力最強。

下面以下圖中示例進行推導得出最佳超平面。



這就是SVM的基本型。

2.2.1 拉格朗日對偶問題


2.2.2 SVM問題的KKT條件

2.3 軟間隔支援向量機




2.4 非線性支援向量機




2.4.1 支援向量迴歸



2.4.2 常用核函式

2.5 SVM的優缺點
優點:
SVM在中小量樣本規模的時候容易得到資料和特徵之間的非線性關係,可以避免使用神經網路結構選擇和區域性極小值問題,可解釋性強,可以解決高維問題。
缺點:
SVM對缺失資料敏感,對非線性問題沒有通用的解決方案,核函式的正確選擇不容易,計算複雜度高,主流的演算法可以達到O(n2)O(n2)的複雜度,這對大規模的資料是吃不消的。

二、原始碼

clear;
clc;
close all;
%獲取原始圖片

m=1;
%選擇樣本影象庫裡面的圖片
n=num2str(m);
k=strcat(n,'.jpg');
i=imread(k);
I=rgb2gray(i);        
BW=im2bw(I);             %利用閾值值變換法將灰度影象轉換成二進位制影象
figure(1);
imshow(BW);
%最小化背景
[n1 n2]=size(BW);
r=floor(n1/10);
c=floor(n2/10);
x1=1;x2=r;
s=r*c;
switch m
    case 1 
        yan=80; biao=60;
    case 2  
        yan=40; biao=30;
    case 3 
        yan=70; biao=100;
    case 4  
        yan=60; biao=50;
    case 5 
        yan=90; biao=60;
    case 6  
        yan=50; biao=70;
    case 7 
        yan=90; biao=40;
    case 8  
        yan=70; biao=80;
    case 9 
         yan=70; biao=50;
    case 10  
         yan=70; biao=90;  
end
zongfen=yan+biao;
zongfen=zongfen*0.55;
for i=1:10
    y1=1;y2=c;
    for j=1:10
        if(y2<=c || y2>=9*c) || (x1==1 || x2==r*10)
            loc=find(BW(x1:x2,y1:y2)==0);
            [o p]=size(loc);
            pr=o*100/s;
            if pr<=100
                BW(x1:x2,y1:y2)=0;
                r1=x1;r2=x2;s1=y1;s2=y2;
                pr1=0;
            end
            imshow(BW);
            title('影象識別分析中 ... ...');
            set(gcf,'unit','centimeters','position',[10 5 17 15])
        end
        y1=y1+c;
        y2=y2+c;
    end
    x1=x1+r;
    x2=x2+c;
end
figure(2)
imshow(BW)
title('影象識別分析完畢');
set(gcf,'unit','centimeters','position',[10 5 17 15])
%人臉識別
L=bwlabel(BW,8);
BB=regionprops(L,'BoundingBox');
BB1=struct2cell(BB);
BB2=cell2mat(BB1);

[s1 s2]=size(BB2);
mx=0;
for k=3:4:s2-1
    p=BB2(1,k)*BB2(1,k+1);
    if p>mx && (BB2(1,k)/BB2(1,k+1))<1.8
        mx=p;
        j=k;
    end
end
%-----人臉匹配  
%-----輸入:細胞結構體資料Cell_all(包括樣本集合,特徵值與特徵向量)  
%           想要識別的人臉(彩色影象)  
%-----輸出:匹配的結果  
%-----------------------------------    
function FaceFind = facefind(Cell_all,img2find)  
%細胞結構體的呼叫  
img_all = Cell_all{1};  
[m1,n1] = size(img_all);  
V = Cell_all{2};  
D = Cell_all{3};  
namud = 0.5;  %圖片縮小的倍數  
%對需要識別的影象進行灰度等的處理  
pic = rgb2gray(img2find);  %灰度處理  
pic = imresize(pic,namud);  %變換大小  
[m2,n2] = size(pic);   
pic = reshape(pic,1,m2*n2);  %重新排列  
pic = double(pic)/255;         
pic_done = pic*V*D;  %處理完的資料  
%% 歸一化  --》避免運算出現特別大的資料  
Ma = max(max(pic_done));  
Mi = min(min(pic_done));  
pic_done = pic_done/(Ma - Mi);  
%%  
for i=1:m1  
    % 歸一化  --》避免運算出現特別大的資料  
    Ma1 = max(img_all(i,:));  
    Mi1 = min(img_all(i,:));  
    img_all(i,:) = img_all(i,:)/(Ma1 - Mi1);  
    %求範數--》把他們之間的幾何距離作為評判與哪一個人臉最近的標準  
    error(i) = norm(img_all(i,:)-pic_done);  
end  

三、執行結果

四、備註

版本:2014a
完整程式碼或代寫加1564658423