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去求特征点的方法。假设我们有一个初始的特征点x0x0,希望通过迭代,逐步求出准确地特征点xx∗。这就是大致的思路。

SDM方法(Supervised Descent Method )

Derivation of SDM

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

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

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

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

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

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

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

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

Learning for SDM

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

argR0minb0dip(xi0)||ΔxiR0Φi0b0||2dxi0argR0minb0∑di∫p(x0i)||Δxi−R0Φ0i−b0||2dx0i

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

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

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

Training for SDM

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/259272.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

导出Excel神器最终版

泛型列表导出Excel&#xff1a; 最近好多导出问题就整这么个玩意共享给大家public class Export{/// <summary>/// 泛型导出Excel/// </summary>/// <param name"strCaption">Excel文件中的标题</param>/// <param name"pList"…

国外计算机课程lab,计算机系统实验之bomblab

今天刚刚验收CSAPP实验3&#xff0c;趁着余温&#xff0c;记录一下这个实验&#xff0c;顺便回顾下CSAPP课程的相关知识。实验目的1.使用gdb工具反汇编出汇编代码&#xff0c;结合c语言文件找到每个关卡的入口函数。然后分析汇编代码&#xff0c;分析得到每一关的通关密码。2.熟…

批量实现ssh免交互认证

因为要部署一批服务器&#xff0c;为了以后管理方便&#xff0c;要进行免密认证。一台一台做很费时&#xff0c;脚本又得手动输密码。于是上网搜了搜&#xff0c;发现一个非常简单的免交互认证&#xff0c;不需要入密码即可完成&#xff01;环境&#xff1a;centos 6.8 虚拟机V…

CSS兼容IE6,IE7,FF的技巧(COPY来的,还没看)

一、CSS HACK 以下两种方法几乎能解决现今所有HACK.翻阅很多资料&#xff0c;已测试可以使用。 1, !important 随着IE7对!important的支持, !important 方法现在只针对IE6的HACK.(注意写法.记得该声明位置需要提前.) PLAIN TEXT CSS: #wrapper { width: 100px!important; /* IE…

计算机复制粘贴教案,信息技术《文本的复制与移动》教案

一、教学内容分析本课是小学信息技术教材四年级下册第十八课文本的复制与移动。是在学生掌握了文件夹的复制、移动&#xff0c;以及掌握了Word的启动、退出&#xff0c;在Word中输入文字并保存等内容之后的又一个知识点&#xff0c;学好这一课为学生以后学习文本的编辑与操作&a…

ajax基础知识

AJAX 指异步JavaScript及XML&#xff08;Asynchronous JavaScript And XML&#xff09;运用ajax步骤&#xff1a;创建对象&#xff08;注意IE6兼容问题&#xff09;、连接服务器、发送请求、接收返回ajax的readystate属性&#xff1a;0&#xff1a;表示未初始化1&#xff1a;表…

SDM For Face Alignment 流程介绍及Matlab代码实现之预处理篇

SDM全称为 Supervised Descent Method&#xff0c;是一种机器学习的方法&#xff0c;可以被用来做Face Alignment. 下面我们将通过matlab代码来梳理整个实现的过程。 预处理阶段 Input&#xff1a; ../data/lfpw/trainset &#xff08;811张图片&#xff09; Output: mean_…

Nginx初识

configure脚本&#xff1a;1、cat <EOF >>test.txtEOF多行追加2、uname用于打印当前操作系统的相关信息3、2>/dev/null/dev/null 代表空设备文件 1 表示stdout标准输出&#xff0c;系统默认值是1&#xff0c;所以">/dev/null"等同于"1>/dev/n…

linux中shell变量$#,$@,$0,$1,$2的含义解释

linux中shell变量$#,$,$0,$1,$2的含义解释: 变量说明: $$ Shell本身的PID&#xff08;ProcessID&#xff09; $! Shell最后运行的后台Process的PID $? 最后运行的命令的结束代码&#xff08;返回值&#xff09; $- 使用Set命令设定的Flag一览 $* 所有参数列表。如"$*&quo…

分享25个新鲜出炉的 Photoshop 高级教程

网络上众多优秀的 Photoshop 实例教程是提高 Photoshop 技能的最佳学习途径。今天&#xff0c;我向大家分享25个新鲜出炉的 Photoshop 高级教程&#xff0c;提高你的设计技巧&#xff0c;制作时尚的图片效果。这些教程可以帮助把你的想法变成现实&#xff0c;并创造新的东西。 …

北京林业大学计算机技术复试,北京林业大学计算机应用技术04年考研复试办法...

一、复试小组的组成原则和人数计算机应用技术学科硕士研究生复试小组由具有副教授以上(含副教授)职称的研究生导师和具有博士学位的副教授组成&#xff0c;人数为3~5人。组长有学科负责人担任&#xff0c;设秘书1名。二、专业课的考核形式和要求专业课的考核形式为笔试和口试。…

SDM For Face Alignment 流程介绍及Matlab代码实现之训练篇

SDM 训练阶段的任务如下&#xff1a; 载入标准化的数据&#xff08;包括400*400的正脸及特征点&#xff09;对每一张标准化的图片&#xff0c;模拟人脸检测仪&#xff0c;产生10个扰动的人脸框及相应的初始特征点x0。求解Δx,Φ,其中Δxx∗−x0,x∗表示true shape,Φ表示每个特…

Hibernate5-多对1(n:1)-fetch=join

1.创建项目,项目名称hibernatedemo26,目录结构如图所示2.在项目中创建lib目录存储jar文件,目录结构如图所示3.在src目录中创建实体类Forum,包名(com.mycompany.demo.bean),如图所示4.实体类Forum的内容如下package com.mycompany.demo.bean;import java.util.Set;public class …

如何使用固定二级子域名公网访问多个本地Windows Web网站

文章目录 1. 下载windows版Nginx2. 配置Nginx3. 测试局域网访问4. cpolar内网穿透5. 测试公网访问6. 配置固定二级子域名7. 测试访问公网固定二级子域名 1. 下载windows版Nginx 进入官方网站(http://nginx.org/en/download.html)下载windows版的nginx 下载好后解压进入nginx目…

部分和问题

0-1部分和 问题描述&#xff1a;有n个大小不同的数字a&#xff0c;判断是否能从中取出若干个数&#xff0c;使得这些数的和为k。解决思路&#xff1a;利用DFS(深度优先搜索)来解决&#xff0c;用dfs(i,j)表示前i个数字能否得到部分和j,则根据前i1个数的能否得到部分和j或ja[i1]…

实验 6 数组1

//输入n个整数&#xff0c;将它们存入数组a中。输出最大值和它所对应的下标。 #include<stdio.h> int main(void) {int n,i,x;int a[10];x0;printf("enter n:");scanf("%d",&n);for(i0;i<n;i){printf("enter :");scanf("%d&qu…

初中计算机职称答辩,晋升中学语文高级教师职称答辩内容举例

晋升中学语文高级教师职称答辩内容举例 晋升中学语文高级教师职称答辩秘籍 最重要的一点&#xff1a;你要对课本上的重点篇目非常熟悉&#xff01;对于现代文来说作者、题材、课文重点、重点句子词语、中心思想等你都要明了。对于文言文来说&#xff0c;要求学生掌握的&#xf…

SDM For Face Alignment流程介绍及Matlab代码实现之测试篇

测试很简单了&#xff0c;只需要载入数据&#xff0c;然后做正则化处理&#xff0c;使用训练模型产生的{Rk},就可以预测特征点了。 face_alignment.m:用来预测特征点 function shape face_alignment( ShapeModel, DataVariation,...LearnedCascadedModel, Data, img, shape,…

Flink – JobManager.submitJob

JobManager作为actor&#xff0c; case SubmitJob(jobGraph, listeningBehaviour) >val client sender()val jobInfo new JobInfo(client, listeningBehaviour, System.currentTimeMillis(),jobGraph.getSessionTimeout)submitJob(jobGraph, jobInfo) submitJob&#xff0…

window内容

window parent top location.href location.reload location.replace转载于:https://www.cnblogs.com/carlos-guo/p/3391784.html