人脸识别

方向与思索

基本的正脸识别率已经很高了,但是需要是各种复杂环境下的人脸识别,例如阴影以及遮挡环境下的人脸识别。

人脸的识别受光照,位置变换,以及面部表情变化的影响。

对于光照可以用图形学的光照模型来进反解进行尝试。 这个需要从根据照片来判断光照模型的类型了。例如平行光与点光,高光等等。

对于阴影变换,是同样可以借鉴图形学的阴影模形。

表情变换同样的,图形学上也是相关的研究。

人脸识别处理的特点是 特征的抽取与表述。然后就是根据先验知识来进行抽取。

特征抽取与表述是在于难以用数学的方式去描述。能把你的问题能用数学描述出来,剩下那就是计算问题了。

现在问题,特征的抽取是处于瞎似的阶段。 例如对于 图像按照像素直接当做矩阵进行SVD分解等等得出来的纯粹的是数学特征。 虽然能解决一定的问题,但是为什么,以及优化的方向并不知道。

一个思路是那是一个图像的纹理特征是不是可以用SVD描述出来。纹理特征是会有规律的重复。同样 在数学上表现那些数值有规律的变化。但是二者是关联起来。

只有你能把这些数学特征与物理特征能够mapping起来,其实也建模的过程。才是具有知识意义的。 就牛二定律一样

\[F = ma\]

这样一个数学上多么平淡无奇的式子,一旦与物理量有了对应关系,就开始变不平凡了。 开始具有真实的物理意义。

拿SVD分解的特征值,来强加的解释图像,就像用牛二定理来说,F的正负与ma的正负是相关的。 这是一个多么正确的废话,从数学上讲 f=ma, 与a=bc一样就是一个简单的乘法。积的正负性与乘数的 正负性是有规律的。 但是这个放在物理意义有什么用呢。

对于判决,怎么已经丰富的模型的,deep learning 来多层的模拟人的思维过程。

+`OpenCV 学习笔记(四十六)——FAST特征点检测features2D <http://blog.csdn.net/yang_xian521/article/details/7411438>`_

\[\]

N = sumlimits_{xforall left( {circleleft( p right)} right)} {|I\left( x \right) - I\left( p \right)|} > {varepsilon _d}

其中I(x)为圆周上任意一点的灰度,I (p)为圆心的灰度,Ed为灰度值差得阈值,如果N大于一定的阀值,则认为p是一个特征点。

+`人脸识别主要算法 <http://blog.csdn.net/liulina603/article/details/7925170>`_

  1. 早期的人脸识别:基于几何特征的识别方法

主要是基于几何特征,这些部件的形状、大小和结构上的差异才使得人脸千差万别(我想这是基于人脸的识别感性认识阶段),根据人脸侧面轮廓描述出若干点,由这些显著的特征点导出一组用于识别的特征,比如距离、角度等。 但是实验结果表明这种识别结果不容乐观(我想还是没有充分地表现数据的高维信息,参考:马毅与来自高维度的恩赐 ),另外我想这种方法不适合非刚体的人脸,因为在人的喜怒哀乐中,这种测量通常就会改变。

  1. 局部特征分析方法(Local Face Analysis): 。。。。。。

#. 稳定阶段:特征点方法(Eigenface或PCA) 特征脸方法是在90年代初期有Turk提出的目前最流行的算法之一,也就是主分量分析。特征脸反映了隐含在人脸样本内部的信息和人脸结构信息。

  1. 人脸识别中的八大难题,何时能解
  2. 人脸识别算法的新突破
  3. 人脸表情识别综述
  4. Emotient 的表情识别技术的门槛是什么,有哪些应用场景?
  5. 人脸识别算法个人见解 有空看一下吧
  6. 阿凡达是怎样炼成的?
  7. 3D打印已经应用于整容
  8. 计算机类代码 包含计算机视觉
  9. 转载]&#91;CODE]UIUC同学Jia-Bin Huang收集的计算机视觉代码合集

稀疏的事情是否要考虑?

– Main.GegeZhang - 13 May 2014

现在很多的改进?这些算法怎样做改进?这样的表情识别我觉得作用都不是很大,因为必须把首先必须识别是谁?但是现在已经很高了。表情识别,是不是可以聚类?面部表情识别是不是很重要,直达波人是在悲哀还是开心,这个其实很重要,以人为本。3D面部识别,但是建立模型,王瑞岩做的是大型场景三维重建。这个在场景中有很重要的意义。不能多做事情,对于一些未知的事情。对于一些三维重建,面部识别,遮挡,我想根据对称信息,重构,识别,是不是要使用稀疏性?特征点重建,是不是使用更多的信息,稀疏的事情是否要考虑?

– Main.GegeZhang - 13 May 2014

马毅与来自高维度的恩赐 这里表明和原来提取的特征点没有关系,这是为什么那?

– Main.GegeZhang - 13 May 2014

多少张人脸是足够的,是不是有冗余,还是无法获得的时候,使用所有的脸。这样说明人脸建模的时候,是不是可以用少量的脸就可以了,这就是一个计算量和性能的折中。

– Main.GegeZhang - 14 May 2014

我想在建模过程中,也是找到其不变特征点,这一点在识别和3D重构中都是一样的。建立模型。

当根据一个人脸变化的时候,我们是不是可以抽取出很多信息出来,

从一个脸变化到另一个脸的时候,使用这样的数据库,就可以建立人各种各样的模型了,不过这样可能需要很多的label工作。

– Main.GegeZhang - 14 May 2014

利用侧面的 信息得到正脸的信息,然后再使用modeling 的方法得到整体的人脸。不过这就是人脸识别了,和3D重构是不是还是有差别?相似点在哪里?

– Main.GegeZhang - 14 May 2014

在人脸识别中有哪些特征是稳定的?在这种非刚体变换中,我想这个还是需要看看的。

– Main.GegeZhang - 15 May 2014

大规模图像分割

– Main.GegeZhang - 15 May 2014

图像显著度(saliency detection)研究现状调研 图像显著度点是不是查找自己感兴趣的点?

– Main.GegeZhang - 15 May 2014

Newidea: 用机器学习其中的参数,多数据建模,最终使用少量的数据就能够识别物体。 但是这个模型主要适用于没有表情变化,当存在表情变化时,是不是应该使用高斯模型?

– Main.GegeZhang - 16 May 2014

面部力学建模 非刚体建模

– Main.GegeZhang - 17 May 2014

K-SVD

这是k-svd,直接使用原图像。

K_SVD算法模型

原始k-SVD模型同时估计稀疏字典和稀疏系数,也就是包含两个未知矩阵:

\[\min\limits_{D,X}{||Y-DX||_F^2}\; \;\;subject \;to \forall i, x_i =e_k for some k\]

其中 :math: e_k 是单位阵,这个模型中,每个test图像中向量,只有一个1,其它全为0。但是在实际中,这个约束过分苛刻,为了放松约束,只要求任意图像都可以表示为矩阵D的线性表示,并约束 \(x_i\) 满足稀疏性,得到:

\[\min\limits_{D,X}{||Y-DX||_F^2}\; \;\;subject \;to \forall i, ||x_i||_0\leq T_0\]

估计X

这里因为同时有两个位置矩阵,D 和 X.因此无法得到最优解,这里采用近似追踪方法(approximation pursuit method)。首先假设任意初始矩阵D,估计X. 比如使用OMP算法。

更新dictionary D

因为D是一个矩阵,需要求的元素很多,所以这里采用每次只估计一个 :math: D_j 原子,其他 \(j\neq k\) 不变, 这种被称为extreme sparse represention。用梯度迭代更新的方法表示为:

\[D^{(n+1)}=D^{(n)}-\eta\sum_{i=1}^N(D^{(n)}x_i-y_i)x_i^T\]
\[\begin{split}\begin{array}{l} ||Y-DX||_F^2=||Y-\sum_{j=1}^Kd_jx_T^j||_F^2\\ =||(Y-\sum_{j\neq k}d_jx_T^j)-d_kx_T^k||_F^2\\ =||E_k-d_kx_T^k||_F^2\\ \end{array}\end{split}\]

抛弃零项,减小SVD估计D和W的计算量,得到:

\[\begin{split}\begin{array}{l} E_k^R=E_k\Omega,\\ x_R^k=x_T^k\Omega \end{array}\end{split}\]

核心代码实现:

noIt = 200
[rows,cols]=size(y);
 r=randperm(cols);
A=y(:,r(1:codebook_size));
A=A./repmat(sqrt(sum(A.^2,1)),rows,1);
D=A;
X=y;
K = 50;

for it = 1:noIt
    W=OMP(D,X,4.0/5*rows);
   % As finding the truly optimal X is impossible, we use an approximation pursuit method.
    R = X - D*W;
    %这里包含的应该是误差。  如果是真的,还是应该差不多,如果不是真的,下一次应该包含些。
    %%  这里采用分向量估计的方法.
    for k=1:K
        I = find(W(k,:));
        Ri = R(:,I) + D(:,k)*W(k,I);  % 构成一个虚的向量。
        [U,S,V] = svds(Ri,1,'L');
        %重新更新D和W.
        % U is normalized
        D(:,k) = U;
        W(k,I) = S*V';
        R(:,I) = Ri - D(:,k)*W(k,I);
    end
end

假设他对的,然后更新每一个原子D。因为D,W是相互依赖的,在后续更新中,要同时更新。

算法总结:

  1. 和k-means比较近似,首先假设随机矩阵D,估计x,然后由x又开始估计D。
  2. 首先估计稀疏表示,然后估计字典,在字典估计的时候,采用每次只估计一个Dj,其他不变,交替迭代的方法。

算法存在的可改进空间:

  1. 这里使用的原图像,如果y使用特征,应该能够减少计算量,能获得更好的结果。

算法缺点:

  1. 这个算法无法得到全局最优点,只能得到局部最优点。但是实际操作中,这个效果还不错。
  2. 这个KSVD用在哪那?我想可以用在识别上。把所有每一副图像都拉成向量,但是这里是基于图像任意排列的情况,只是一些抽象的结果,没有实质性意义,比如无法得到人脑识别到的轮廓信息。这些是算法本身的一些缺点,我想怎样也无法克服。

参考:

  1. http://en.wikipedia.org/wiki/K-SVD
  2. 浅谈K-SVD http://www.cnblogs.com/salan668/p/3555871.html
  3. K-SVD: An Algorithm for Designing Overcomplete Dictionaries for Sparse Representation
\[(a + b)^2 = a^2 + b^2 (a + b)^3 = a^3 + b^3\]

级联算法

随机森林

下述方法都是基于Bootstraping方法的计算,得到有放回的抽取:

训练样本集

\[S = {(X_1,Y_1),(X_2,Y_2),...,(X_n,Y_n)}\]

得到第i轮的训练函数

\[H(X)=f(\sum_{i=1^TH_i(X)})\]

得到最终预测函数

首先对N个训练样本的学习得到一个弱分类器 将分错的样本和其他数据一起构成新的N个的训练样本,得到第二个弱分类器。 继续进行。。。 将所有的分类器融合为一个强分类器。

这个算法思想就是每一次分类都是弱分类器,然后通过多次分类,最终形成一个强分类器。

算法具体步骤是:

  1. 给定一定的训练集合,
\[(x_1,y_1),...,(x_m,y_m)$%,其中 %$x_i \in X, y_i\in Y=\{-1,1\}\]
  1. 首先初始化分类器:
\[D_1(i)=1/m\]
  1. 训练弱分类器使用D_t分布。
  2. 得到弱分布假设
\[h_t:X\rightarrow \{-1,1\},\]

得到误差:

\[\varepsilon=Pr_{i\sim D_t}[h_t(x_i)\neq y_i\]
  1. 选择: \(\;{\alpha _t}{\rm{ = }}\frac{1}{2}ln(\frac{{1 - {\varepsilon _t}}}{{{\varepsilon _t}}})\)
  2. 更新:
\[\begin{split}\begin{array}{c} {D_{t + 1}}\left( i \right) = \frac{{{D_t}\left( i \right)}}{{{Z_t}}} \times \left\{ \begin{array}{l} {e^{ - {a_t}}} {\rm{if}} {{\rm{h}}_t}\left( {{x_i}} \right){\rm{ = }}{y_i}\\ {e^{{a_t}}} {\rm{if}} {{\rm{h}}_t}\left( {{x_i}} \right) \ne {y_i} \end{array} \right.\\ = \frac{{{D_t}\left( i \right)\exp \left( { - \;{\alpha _t}{y_i}{h_t}\left( {{x_i}} \right)} \right)}}{{{Z_t}}} \end{array}\end{split}\]
  1. 输出最后的假设:

进一步的在人脸中的应用参考`Adaboost原理、算法以及应用 <http://www.zhizhihu.com/html/y2009/565.html>`_

Adaboost 算法

我想是利用信号和图像的先验信息首先对信号进行分类,这样吧dictionary 维度降下来,

– Main.GegeZhang - 15 Dec 2013