人脸对齐(九)--SDM算法

转自:http://blog.csdn.net/huneng1991/article/details/51901912

http://blog.csdn.net/qq_14845119/article/details/53520847

略删改。

 

SDM(Supervised Descent Method)是一种监督下降方法,属于解决非线性最小化NLS(Non-linear Least Squares)问题的一种方法。

 

解决非线性最优化问题通常有2个难点,

(1)方程不可微,或者计算量太大

(2)Hessian矩阵太大,或者不是正定矩阵

基于这样的难点,作者提出了自己的SDM方法,可以用于解决上述的问题,并成功的用次方法解决了人脸对齐中关键点的回归问题,取得了state-of-the-art的效果。

 

一个传统和奏效的解决最小化二乘问题的方法就是牛顿下山法,正如,上面左图所示,通过牛顿迭代,最终可以找到一个全局最小值。这样的迭代也肯定是效果最好的,但是在实际工程应用中,是不会有足够的计算资源来将所有样本一下都计算进去的,于是就有了上面右图的方法,更新每一个daerta(x),每次都会找到一个最小值,然后不断迭代,减少最小值之间的误差距离,最终就会找到全局最小值,类似深度学习里的Mini batch SGD,就像吴恩达视频中讲的,虽然没有理论的证明,局部最小值就是全局最小值,但是很多实际的经验告诉我们,最后,只能收敛到一个最小值,也就是说,很多现实实际问题是只有一个最小值的。

ps:还是很喜欢这个图中的牛顿,高斯和拉格朗日。

 

SDM推导:

 

SDM的过程就是最小化上面函数的过程,其中,

d为m*1维,表示有m个像素,

d(x)为p*1维,表示p个Landmarks,

h为非线性的特征提取函数,提取的sift特征h(d(x))为128p维

将上式子进行泰勒展开变为了下面的式子,

 

第一次初始化det(x1)按下式计算,

 

初始化时,第一次对于det(fai)的计算,可以看成det(fai)到R0的投影,因此,也可以近似的将R0看成是梯度方向。

 

由于将R0近似为梯度方向,所以det由上面的非线性问题转化为下面式子的线性问题,

 

整个的训练过程就是求一个最佳的R0和b0的过程,来保证det最小。最终也就将递推公式由下面的第一个式子转化为下面的第二个式子,也就不需要hession矩阵和Jacobian矩阵的计算了。实现了由2次问题到1次问题的转化,但是2次问题肯定会收敛,1次的则很难保证,因此,作者引入了fai(k)这个一系列的特征向量,而不是上式一样,只有一个fai(0),从而来保证收敛,实验过程中,迭代4-5次后就会收敛。

 

训练过程中,采用L2-loss,如下式子,

 

假设x服从正态分布,采用蒙特卡洛(Monte Carlo)方法采样,转化为求下式的最小值,

 

采用多个特征向量后就转化为下式,

 

实验效果:

在人脸对齐中,一个很重要的性能指标就是姿态估计,包括,yaw(左右旋转),roll(平面内旋转),pitch(上下旋转)

 

按作者论文中在Youtube上面的测试,姿态估计可以实现,yaw(-45到+45),roll(-90到+90),pitch(-30到+30),在i5-2400上达到了30fps的速度。

 

github上热心网友的程序:

https://github.com/patrikhuber/superviseddescent/

https://github.com/RoboPai/sdm

 

reference:

[1]Szabó Z. Supervised Descent Method and its Applications toFace Alignment[J]. 2015.

[2]www.humansensing.cs.cmu.edu/intraface

 方法介绍

       SDM 人脸对齐的核心内容很简单,就是特征到偏移量的映射:

                                          Ix = R

I 是特征,x是映射矩阵,R是偏移量。SDM人脸对齐方法训练的目的就是得到映射矩阵x,步骤如下:

      1)归一化样本,使样本的尺度统一;

      2)计算均值人脸;

      3)将均值人脸,作为估计人脸放在样本上,使均值中心和原始人脸形状中心对齐;

      4)计算基于每一个均值人脸的标记点的特征,sift,surf或者hog,切记不要基于灰度值的相互特征;

      5)将所有点的特征串在一起,形成样本特征,所有样本特征形成矩阵I;

      6)计算估计人脸和真实人脸之间的偏移量,并形成矩阵R;

      7)解线性方程Ix=R, matlab中可用x = I \ R,lapack中可用函数dgelsd。

估计形状加上预测偏移量就是结果,在实际情况中,共需要训练多层,二层以后需要使用上一层对齐的结果作为估计形状。

 

      实际在运用过程中可能会遇到各种问题,总结下来有以下几点:

      1)速度太慢,尤其是使用sift,surf特征;

      2)无效,基于灰度值类的特征由于在标记点周围的小窗口内,灰度值基本一致,变化不大,这也是人脸的一个显著特征;

      3)效果有待提高,hog特征有效的解决上述问题,但是始终不理想,尤其是,水平大角度偏转。

 

 结果介绍

       对齐效果见下面的图片。训练数据是手工标记的4000张图片,经过随机仿射变换扩展至60000(此方法提升效果有限)。一张人脸的对齐速度在3.5GHz CPU上单核是1.8ms,可多核提速,模型大小2.4M左右,并成功运用到人脸标记点追踪上,追踪可以解决大角度偏转,大部分90度偏转也是有效的

 

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页