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