Supervised Descent Method and its Applications to Face Alignment

广播说明:
进入深度学习时代,如下的方法已经失去可比性,且我们的代码实现地很粗糙,如果坚持要用,推荐如下代码
https://github.com/wanglin193/SupervisedDescentMethod (看起来作者对sdm实现的不错)

另外一篇基于深度学习的基于回归的方法,也是使用的基于SDM的相同的思路,但是全部深度学习化,
更加鲁棒。 见:《Stacked Hourglass Network for Robust Facial Landmark Localisation》


本方法是当前人脸对齐最流行的算法,速度很快,很稳定。下面我将介绍一下这篇文章的整体思路和相关细节。
在介绍之前,先给出几个有用的链接:
1.)
本论文作者主页,形象地介绍了SDM的特点:
http://xiong828.github.io/sdm.html
2. )
superviseddescent C++11版本的实现:
http://patrikhuber.github.io/superviseddescent/
下面开始介绍:
人脸对齐就是要找人脸的特征点。如图

我们要找到眼睛、鼻子、嘴巴等特征点。那么如何去做呢?方法有很多。本文讲述了使用SDM去求特征点的方法。假设我们有一个初始的特征点 x0 x 0 ,希望通过迭代,逐步求出准确地特征点 x x ∗ 。这就是大致的思路。

SDM方法(Supervised Descent Method )

Derivation of SDM

给定一幅含有m个像素的图像 dRm×1 d ∈ R m × 1 , d(x)Rp×1 d ( x ) ∈ R p × 1 用来索引图像的p个特征点,x代表p个特征点。 h(d(x))R128p×1 h ( d ( x ) ) ∈ R 128 p × 1 代表SIFT特征向量。在训练阶段,我们假设准确的p个特征点已知,设为 x x ∗ 。我们另外选取训练集特征点的平均值 x0 x 0 作为初始值。如图:

这样,Face Alignment可以通过在 Δx Δ x 求解如下的最优化问题:

f(x0+Δx)=||h(d(x0+Δx))Φ||22 f ( x 0 + Δ x ) = | | h ( d ( x 0 + Δ x ) ) − Φ ∗ | | 2 2

这里 Φ=h(d(x)) Φ ∗ = h ( d ( x ∗ ) ) 代表手工标记的特征点的SIFT特征。在训练阶段, Φ Φ ∗ Δx Δ x 已知。
f(x0+Δx)f(x0)+Jf(x0)TΔx+12ΔxTH(x0)Δx f ( x 0 + Δ x ) ≈ f ( x 0 ) + J f ( x 0 ) T Δ x + 1 2 Δ x T H ( x 0 ) Δ x

对上面关于 Δx Δ x 求导,令 f(x0+Δx)=0 f ′ ( x 0 + Δ x ) = 0 ,可得
Δx1=H1Jf=2H1JTh(Φ0Φ) Δ x 1 = − H − 1 J f = − 2 H − 1 J h T ( Φ 0 − Φ ∗ )

,这里 Φ0=h(d(x0)) Φ 0 = h ( d ( x 0 ) ) .
R=2H1JThΔΦ0=Φ0Φ R = − 2 H − 1 J h T , Δ Φ 0 = Φ 0 − Φ ∗ ,于是R可看作 Δx1 Δ x 1 ΔΦ0 Δ Φ 0 的线性回归系数。但是,我们知道在测试阶段, Φ Φ ∗ 是未知的,但是固定的。因此我们不再使用 Φ Φ ∗ 做训练,而是改用下面的公式:
Δx1Δx1Δx1===2H1JTh(Φ0Φ)2H1JThΦ0+(2H1JTh)(Φ)RΦ0+b0 Δ x 1 = − 2 H − 1 J h T ( Φ 0 − Φ ∗ ) Δ x 1 = − 2 H − 1 J h T Φ 0 + ( − 2 H − 1 J h T ) ( − Φ ∗ ) Δ x 1 = R Φ 0 + b 0

使用训练样本,我们的方法可以学习 R0,b0 R 0 , b 0 .
通常这种方法不可能一步迭代完成,需要进行多步,除非f是二次的。为了处理这个非二次的方程,SDM将产生一系列的下降方向 {Rk} { R k } 和偏差 {bk} { b k } .

xk=xk1+Rk1Φk1+bk1(1)(1) (1) x k = x k − 1 + R k − 1 Φ k − 1 + b k − 1 ( 1 )
,使得对于训练图片集, xk x k 将收敛到 x x ∗ .

Learning for SDM

假定给定一系列人脸 {di} { d i } 与对应的特征点 {xi} { x ∗ i } .对于每张图片,从初始的特征点 xi0 x 0 i 出发, R0,b0 R 0 , b 0 可以通过求解最优化问题获得:

argR0minb0dip(xi0)||ΔxiR0Φi0b0||2dxi0 a r g R 0 m i n b 0 ∑ d i ∫ p ( x 0 i ) | | Δ x i − R 0 Φ 0 i − b 0 | | 2 d x 0 i

这里 Δxi=xixi0,Φi0=h(di(xi0)) Δ x i = x ∗ i − x 0 i , Φ 0 i = h ( d i ( x 0 i ) ) .
我们假定 xi0 x 0 i 可以从服从正态分布的人脸检测框对齐采样。于是上面的最优化问题化为:
argR0minb0dixi0||ΔxiR0Φi0b0||2 a r g R 0 m i n b 0 ∑ d i ∑ x 0 i | | Δ x i − R 0 Φ 0 i − b 0 | | 2

以上方程是个线性的最优化问题,可以直接求解。
当第一步求解完毕后,代入方程式(1),可以求出 x1 x 1 ,进而又可以计算特征向量 Φik=h(di(xik)) Φ k i = h ( d i ( x k i ) ) Δxki=xixik Δ x ∗ k i = x ∗ i − x k i .这样 Rk,bk R k , b k 可以通过一个新的线性回归得到。
argRkminbkdixik||ΔxkiRkΦikbk||2 a r g R k m i n b k ∑ d i ∑ x k i | | Δ x ∗ k i − R k Φ k i − b k | | 2

随着k的增大,误差逐渐减小,一般4到5次的迭代就可以达到比较好的效果。

Training for SDM

当我们计算出一系列的 {Rk},{bk} { R k } , { b k } ,我们就可以通过迭代式(1)通过迭代求解特征点。一般初始的特征点可以选取训练时的初始特征点。
后续我们还会给出SDM方法的Matlab代码及相关说明,你就会看到比较清楚的步骤和效果了。

  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值