基于稀疏表示的人脸识别 (SRC,LASRC,RASL,MRR)
FROM:http://blog.csdn.net/loadstar_kun/article/details/39453839
1. ?問題背景
? ? ? ? 信號的稀疏表示并不是新的東西。我們很早就一直在利用這一特性。例如,最簡單的JPEG圖像壓縮算法。原始的圖像信號經過DCT變換之后,只有極少數元素是非零的,而大部分元素都等于零或者說接近于零。這就是信號的稀疏性。
? ? ? ? 任何模型都有建模的假設條件。壓縮感知,正是利用的信號的稀疏性這個假設。對于我們處理的信號,時域上本身就具有稀疏性的信號是很少的。但是,我們總能找到某種變換,使得在某個變換域之后信號具有稀疏性。這種變換是很多的,最常見的就是DCT變換,小波變換,gabor變換等。
? ? ? ? 然而,這種正交變換是傳統視頻圖像處理采用的方法。目前所采用的一般不是正交變換。它是基于樣本采樣的。或者說是通過大量圖像數據學習得到的,其結果稱作字典,字典中的每一個元素稱作原子。相關的學習算法稱作字典學習。常見的算法例如K-SVD算法。學習的目標函數是找到所有樣本在這些原子的線性組合表示下是稀疏的,即同時估計字典和稀疏表示的系數這兩個目標。
 
 
? ? ? ?壓縮感知和稀疏表示其實是有些不同的。壓縮感知的字典是固定的,在壓縮感知的術語里面其字典叫做測量矩陣。但壓縮感知的恢復算法和稀疏表示是同一個問題。他們都可以歸結為帶約束條件的L1范數最小化問題。求解這類泛函的優化有很多種方法。早在80年代,統計學中Lasso問題,其實和稀疏分解的優化目標泛函是等價的。而求解統計學中lasso 問題的LARS算法很早就被提出了,故我們還可以通過統計學的LARS算法求解稀疏表示問題。目前很多統計學軟件包都自帶LARS算法的求解器。
 
 
2. 基于稀疏表示的分類 SRC
? ? ? 人臉的稀疏表示是基于光照模型。即一張人臉圖像,可以用數據庫中同一個人所有的人臉圖像的線性組合表示。而對于數據庫中其它人的臉,其線性組合的系數理論上為零。由于數據庫中一般有很多個不同的人臉的多張圖像,如果把數據庫中所有的圖像的線性組合來表示這張給定的測試人臉,其系數向量是稀疏的。因為除了這張和同一個人的人臉的圖像組合系數不為零外,其它的系數都為零。
? ? ? ?上述模型導出了基于稀疏表示的另外一個很強的假設條件:所有的人臉圖像必須是事先嚴格對齊的。否則,稀疏性很難滿足。換言之,對于表情變化,姿態角度變化的人臉都不滿足稀疏性這個假設。所以,經典的稀疏臉方法很難用于真實的應用場景。
? ? ? ?稀疏臉很強的地方在于對噪聲相當魯棒,相關文獻表明,即使人臉圖像被80%的隨機噪聲干擾,仍然能夠得到很高的識別率。稀疏臉另外一個很強的地方在于對于部分遮擋的情況,例如戴圍巾,戴眼鏡等,仍然能夠保持較高的識別性能。上述兩點,是其它任何傳統的人臉識別方法所不具有的。
 
 
3. 稀疏人臉識別的實現問題
? ? ? ? 一談到識別問題,大家都會想到要用機器學習的方法。先進行訓練,把訓練的結果以模板的形式存儲到數據庫上;真實應用環境的時候,把測試樣本經過特征提取之后,和數據庫中的模板進行比對,查詢得到一個最相似的類別作為識別結果。往往,機器訓練的時間都超級長,幾天,幾個禮拜乃至幾個月,那是常見的事情;識別的時間一般是很小的。典型的例如人臉檢測問題。這是可以接受的,因為訓練一般都是離線的。
 
 
? ? ? ? 然而,基于稀疏分解的人臉識別是不需要訓練的,或者說訓練及其簡單。基于稀疏表示的人臉識別,其稀疏表示用的字典直接由訓練所用的全部圖像構成,而不需要經過字典學習【也有一些改進算法,針對字典進行學習的】。當然,一般是經過簡單的特征提取。由于稀疏表示的方法對使用什么特征并不敏感。故而,其訓練過程只需要把原始圖像數據經過簡單的處理之后排列成一個很大的三維矩陣存儲到數據庫里面就可以了。
 
 
? ? ? ? 關鍵的問題在于,當實際環境中來了一張人臉圖像之后,去求解這張人臉圖像在數據庫所有圖像上的稀疏表示,這個求解算法,一般比較耗時。盡管有很多的方法被提出,但是對于實時應用問題,依然沒法滿足。所以,問題的關鍵還是歸結于L1范數最小化問題上來。
 
 
? ? ? ?L1范數最小化問題已經有很多種快速求解方法,這里主要包括有梯度投影?l1magic,l1homotopy,?gpsr,?增廣拉格朗日方法,這幾種方法都比正交匹配追蹤算法OMP要高效的多。上述幾種快速算法中,采用增廣拉格朗日的對偶實現相比其它的快速算法要更好。最近流行的Spit Bregman算法也是不錯的選擇。
? ? ??
? ? ??SRC算法
? ? ??
4. 稀疏表示人臉識別的改進算法
稀疏人臉識別算法要用于實際的系統,需要在兩方面加以改進。首先,要突破人臉圖像的對齊這一很強的假設。實際環境中的人臉往往是不對齊的,如何處理不對其的人臉是額待解決的問題。其實,是快速高效的優化算法。最后,也是最重要,實際環境中的應用往往訓練樣本很少。目前,研究人員已經取得了很多可喜的成果,下面分別予以介紹。
? ??4.1 LASRC算法?
?CVIU 2013?Face recognition for web-scale datasets?這篇論文的貢獻在于它不是用所有訓練圖像的矩陣去求解L1范數最小化問題,而是先用L2范數最小化方法近似求解,然后選取前K個最大系數所對應的Ai組成新的矩陣,然后用去求解L1最小范數,從而將SRC的運算速度提高了100–250倍,但運算結果并沒有下降很多。LASRC算法流程:
4.2 CRC-RLS算法?
CVPR2011 LeiZhang ?Sparse Representatiion or Callaborative Representation: Which helps Face Recognition? 稀疏表示和協同表示,哪一個有助于人臉識別。該文作 者提出了用L2范數代替L1范數求解原問題。這樣,能夠非常快速的求解問題,實時性沒有任何問題。但稀疏性不像原來的L1范數那樣強。但作者對分類準則進行了改進,使得其分類性能幾乎接近于原始L1范數最小化問題分類性能。為了對比,我把關鍵性算法列表如下:?
SRC算法求解的是方程1的解,而CRC-RLS算法則直接給出了表示系數的最小二乘解。二者另外一個主要的不同點在于計算殘差的方式不一樣,具體請注意上述方程2和方程10的不同點。后者的計算時間較前者最多情況下加速了1600倍。更多的實現細節可以參考原文。
? ? ? ?
? ?4.3 ?RSC算法?
? ? ? ? ? ? ??CVPR2011 Meng Yang,Robost ?Sparse Coding for Face Recognition.?魯棒的稀疏編碼算法。該文作者沒有直接求解稀疏編碼問題,而是求解Lasso問題,因為Lasso問題的解和稀疏編碼的解是等價的。在傳統的SRC框架下,編碼誤差使用L2范數來度量的,這也就意味著編碼誤差滿足高斯分布,然而,當人臉圖像出現遮擋和噪聲污染的情況下,并非如此。在字典學習框架下,這樣的字典是有噪聲的。該文作者對原始Lasso問題進行改進,求解加權L1范數約束的線性回歸問題。Lasso問題描述如下:
 
 
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
 
 
 ? ? ? ? ? ? ? ?加權Lasso問題的目標函數描述如下:
 
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? 此算法的關鍵還在于權重系數的確定,文中采用的是logistic函數,而具體的實現則是通過迭代估計學習得到。該方法基于這樣一個事實:被遮擋或噪聲干擾的像素點賦予較小的權重,而其它像素點的權重相對較大。具體迭代算法采用經典的迭代重加權算法框架,當然內部嵌入的稀疏編碼的求解過程。此算法在50%遮擋面積的情況下取得的更好更滿意的結果。但是文中沒有比較計算時間上的優略而直說和SRC框架差不多。
 
 
4.4 ?RASL算法
CVPR2010. Yigang Peng. ?Robust batch Alignment of Images by Sparse and Low-Rank Decomposition. 這篇文章的作者在這篇文章中討論的是用矩陣的低秩分解和稀疏表示來對齊人臉的問題。
4.5 ?RASR算法
? ? ? ?PAMI2011 Wagner.?Towards a Practical Face Recognition System:Robust Alignment and Illumination by Sparse Representation.該文的目的和RASL類似,此算法通過模型學習的方法,讓訓練圖像和測試圖像自動對齊。 如果訓練圖像和測試圖像已經嚴格對齊,那么對于測試圖像y0和訓練集A: 但一般的測試圖像 y 沒有經過嚴格對齊,我們可以認為它經過了的形變,因此,從而得到:
在求解上式的過程中,我們發現它存在對應于不同subjects的局部最小值。因此在求解時,我們分別對每一個subject ?i 求解: ? 算法整體流程如下:
4.6 ?MRR算法
ECCV2012,Meng Yang. Efficient Misalignment-Robust Representation for Real Time Face Recognition.這篇文章在充分分析RASR算法的基礎上提出了一個高效的快速算法。RASR需要將整個數據集進行對齊操作,時間復雜度比較高;MRR在RASR的基礎上,用Coarse-to- fine search 的兩次搜索策略,大大簡化了RASR的求解過程,將運算速度提高了c/2倍(c為subjects的個數)。下面是自己實現的LASRC算法: clc;clear;close all;
path(path, './Optimization');
path(path, './Data');
path(path, './GPSR');
load pf83lfw_hog_gabor_lbp;
A = fbgTrainImgs;
for i = 1:size(A,2)
? ? A(:,i) = A(:,i)/norm(A(:,i),2); ?% 歸一化
end
pseudoInvA = pinv(A);
% pseudoInvA = A'*A\A';
% pseudoInvA = inv(A'*A)*A';
% load pseudoInvA;
numPerson = 83;
fraction =O.5; %用多少比例的測試樣本進行測試
testNum = round(size(fbgTestImgs,2)*fraction);
resultIds=zeros(testNum,1);
K = 100; % 選取前K大的系數對應的Ai組成新的矩陣求解L1范數
tau =0.01;
startInd = zeros(numPerson,1);
endInd = zeros(numPerson,1);
for j=1:numPerson
? ? ?if j==1
? ? ? ?startInd(j) =1;
? ? ? ?endInd(j) = train_img_person(1);
? ? else
? ? ? ?startInd(j) = sum(train_img_person(1:j-1))+1;
? ? ? ?endInd(j) = sum(train_img_person(1:j));
? ? end
end
rightNum = 0;
maxDef = 10;
for i =1:testNum
% ? ? close all;
? ? y = fbgTestImgs(:,i);
? ? label = fbgTestIds(i);
? ? xNorm2 = pseudoInvA * y; %對應LASRC算法 step 3
? ? [val,ind] = sort(xNorm2,'descend');
? ? subA = A(:,ind(1:K)); ? %對應LASRC算法 step 4
? ??
? ? class =[];
? ? for j=1:K
? ? ? ? index = ind(j);
? ? ? ? for k=1:numPerson
? ? ? ? ? ? if index>=startInd(k)&index<=endInd(k)
? ? ? ? ? ? ? ? class = [class,k];
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? end
? ? ? ? end
? ? end
? ??
? ? uniqueClass = unique(class);
? ? numClass = length(uniqueClass);
? ? subSubA = cell(numClass,1);
? ??
? ?for j=1:length(class)?
? ? ? ? for k=1:numClass ? ? ? ??
? ? ? ? ? ? if class(j)==k
? ? ? ? ? ? ? ? subSubA{k}=[subSubA{k},j];
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? end
? ? ? ? end
? ? end
? ? xp = GPSR_BB(y,subA,tau); ?%對應LASRC算法 step 5
    r = zeros(numClass,1);
    for j = 1:numClass  
        if isempty(subSubA{j}) 
            r(j)=maxDef;
            continue;
        end;
        delta = xp(subSubA{j});
        deltaA = subA(:,subSubA{j});
        r(j) = norm(y-deltaA*delta);
    end
%     figure;bar(r);
    
    [~,pre] = min(r);
%     if (pre == label) rightNum = rightNum+1; end
    resultIds(i) = pre;
    fprintf('processing:%d/%d\n',i,testNum);
end
% accuracy = rightNum/testNum;
accuracy = sum(resultIds == fbgTestIds(1:testNum))/testNum;
fprintf('accuracy = %f',accuracy);
? ??
代碼中用到了GPSR優化包,可以到?http://download.csdn.net/detail/chlele0105/7522681下載
大牛主頁: Yi Ma:http://yima.csl.illinois.edu/
轉:http://blog.csdn.net/chlele0105/article/details/32336299#comments
總結
以上是生活随笔為你收集整理的基于稀疏表示的人脸识别 (SRC,LASRC,RASL,MRR)的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: Kmeans、Kmeans++和KNN算
- 下一篇: URL 收藏
