您的位置:首页 > 移动开发

Supervised Descent Method and its Applications to Face Alignment

2015-08-06 00:09 483 查看
本方法是当前人脸对齐最流行的算法,速度很快,很稳定。下面我将介绍一下这篇文章的整体思路和相关细节。

在介绍之前,先给出几个有用的链接:

1.)

本论文作者主页,形象地介绍了SDM的特点:

http://xiong828.github.io/sdm.html

2. )

superviseddescent C++11版本的实现:

http://patrikhuber.github.io/superviseddescent/

下面开始介绍:

人脸对齐就是要找人脸的特征点。如图




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

SDM方法(Supervised Descent Method )

Derivation of SDM

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



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

f(x0+Δx)=||h(d(x0+Δx))−Φ∗||22 f(x_0+\Delta x)=||h(d(x_0+\Delta x))-\Phi_*||_2^2

这里Φ∗=h(d(x∗))\Phi_*=h(d(x_*))代表手工标记的特征点的SIFT特征。在训练阶段,Φ∗\Phi_*和Δx\Delta x已知。

f(x0+Δx)≈f(x0)+Jf(x0)TΔx+12ΔxTH(x0)Δxf(x_0+\Delta x)\approx f(x_0)+J_f(x_0)^T\Delta x+\frac{1}{2}\Delta x^TH(x_0)\Delta x

对上面关于Δx\Delta x求导,令f′(x0+Δx)=0f'(x_0+\Delta x)=0,可得

Δx1=−H−1Jf=−2H−1JTh(Φ0−Φ∗)\Delta x_1=-H^{-1}J_f=-2H^{-1}J_h^T(\Phi_0-\Phi_*)

,这里Φ0=h(d(x0))\Phi_0=h(d(x_0)).

令R=−2H−1JTh,ΔΦ0=Φ0−Φ∗R=-2H^{-1}J_h^T,\Delta \Phi_0=\Phi_0-\Phi_*,于是R可看作Δx1\Delta x_1到ΔΦ0\Delta \Phi_0的线性回归系数。但是,我们知道在测试阶段,Φ∗\Phi_*是未知的,但是固定的。因此我们不再使用Φ∗\Phi_*做训练,而是改用下面的公式:

Δx1Δx1Δx1===−2H−1JTh(Φ0−Φ∗)−2H−1JThΦ0+(−2H−1JTh)(−Φ∗)RΦ0+b0\begin{equation*}
\begin{aligned}
\Delta x_1&=&-2H^{-1}J_h^T(\Phi_0-\Phi_*)\\
\Delta x_1&=&-2H^{-1}J_h^T\Phi_0+(-2H^{-1}J_h^T)(-\Phi_*)\\
\Delta x_1&=&R\Phi_0+b_0
\end{aligned}
\end{equation*}

使用训练样本,我们的方法可以学习R0,b0R_0,b_0.

通常这种方法不可能一步迭代完成,需要进行多步,除非f是二次的。为了处理这个非二次的方程,SDM将产生一系列的下降方向{Rk}\{R_k\}和偏差{bk}\{b_k\}.



xk=xk−1+Rk−1Φk−1+bk−1(1)\begin{equation}
x_k=x_{k-1}+R_{k-1}\Phi_{k-1}+b_{k-1} \quad (1)\end{equation},使得对于训练图片集,xkx_k将收敛到x∗x_*.

Learning for SDM

假定给定一系列人脸{di}\{d^i\}与对应的特征点{xi∗}\{x_*^i\}.对于每张图片,从初始的特征点xi0x_0^i出发,R0,b0R_0,b_0可以通过求解最优化问题获得:

argR0minb0∑di∫p(xi0)||Δxi−R0Φi0−b0||2dxi0\begin{matrix}
arg\\R_0
\end{matrix}\begin{matrix}
min\\b_0
\end{matrix}\sum_{d^i}\int p(x_0^i)||\Delta x^i-R_0\Phi_0^i-b_0||^2dx_0^i

这里Δxi=xi∗−xi0,Φi0=h(di(xi0))\Delta x^i=x_*^i-x_0^i,\Phi_0^i=h(d^i(x_0^i)).

我们假定xi0x_0^i可以从服从正态分布的人脸检测框对齐采样。于是上面的最优化问题化为:

argR0minb0∑di∑xi0||Δxi−R0Φi0−b0||2\begin{matrix}
arg\\R_0
\end{matrix}\begin{matrix}
min\\b_0
\end{matrix}\sum_{d^i}\sum_{x_0^i}||\Delta x^i-R_0\Phi_0^i-b_0||^2

以上方程是个线性的最优化问题,可以直接求解。

当第一步求解完毕后,代入方程式(1),可以求出x1x_1,进而又可以计算特征向量Φik=h(di(xik))\Phi_k^i=h(d^i(x_k^i))和Δxki∗=xi∗−xik\Delta x_*^{ki}=x_*^i-x_k^i.这样Rk,bkR_k,b_k可以通过一个新的线性回归得到。

argRkminbk∑di∑xik||Δxki∗−RkΦik−bk||2\begin{matrix}
arg\\R_k
\end{matrix}\begin{matrix}
min\\b_k
\end{matrix}\sum_{d^i}\sum_{x_k^i}||\Delta x_*^{ki}-R_k\Phi_k^i-b_k||^2

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

Training for SDM

当我们计算出一系列的{Rk},{bk}\{R_k\},\{b_k\},我们就可以通过迭代式(1)通过迭代求解特征点。一般初始的特征点可以选取训练时的初始特征点。

后续我们还会给出SDM方法的Matlab代码及相关说明,你就会看到比较清楚的步骤和效果了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: