对于face recognition的研究,我是认真的(认真expression,哈哈哈~~~~~~)许久没有写blog了,欢迎一起讨论。

SDM(Supvised Descent Method)方法主要是应用在人脸对齐上。SDM本是一种求函数逼近的方法,可以用于最小二乘求解。SDM并非一种人脸对齐方法,只是作者在提出新的人脸对齐方法中运用了自己的最小二乘方法。文章:Supervised Descent Method and its Applications to Face Alignment。这篇文章提出了一种基于机器学习来解决复杂最小二乘问题(least squares problem)的方法  (简称SDM方法)。,从训练数据中学习梯度下降的方向并建立相应的回归模型,然后利用得到的模型来进行梯度方向估计。

什么是人脸对齐?其实就是人脸特征点定位,需要先人工指定点的具有规律的位置,然后在输入的人脸上按照特征点分布规律把点标记出来。

 1、 Motivation(问题的由来)

最小二乘问题中,用牛顿法求解是常用的办法,但用在求解计算机视觉的问题的时候,会遇到一些问题,比如1)、Hessian矩阵最优在局部最优的时候才是正定的,其他地方可能就不是正定的了,这就意味着求解出来的梯度方向未必是下降的方向;2)、牛顿法要求目标函数是二次可微的,但实际中未必就一定能达到要求的了;3)、Hessian矩阵会特别的大,比如人脸对其中有66个特征点,每个特征点有128维度,那么展成的向量就能达到66x128=8448,从而Hessian矩阵就能达到8448x8448,如此大维度的逆矩阵求解,是计算量特别大的(O(p^3)次的操作和O(p^2)的存储空间)。因此避免掉Hessian矩阵的计算,Hessian不正定问题,大存储空间和计算量,寻找这样一种方法是上述论文要解决的问题。

2、解决方式

梯度下降法的关键是找到梯度方向和步长,对于计算机视觉问题,牛顿法求解未必能常常达到好的下降方向和步长,如下图所示:

  (a)为牛顿法的下降量,收敛不能达到最理想的步长和方向。而(b)本文的SDM算法,对于不同的正面侧面等情况都能得到很好的收敛方向和步长。

思考一下,能不能从别的角度来估计Hessian矩阵和梯度向量,或者,Hessian矩阵的逆与梯度向量的乘积呢?(使用牛顿法,梯度向量与Hessian逆矩阵的乘积直接决定了优化方向,所以如果可以直接估计他们的乘积,效果上是一样的。)
       如何实现,尝试使用大量的数据里面构造出这个关键的矩阵/向量。假设要求解的最小二乘问题是 || f(x) - y ||^2 ,其中f是一个非常复杂的函数,它的计算方法已知,但是梯度和Hessian矩阵均无法直接求解。只要给定一个足够大的最优解集合 {(x*, y*) }, 就可以通过模拟牛顿法的过程来逐步构造出Hessian矩阵和梯度向量。不过直接构造Hessian矩阵和梯度向量需要比较多的训练数据,因为自由度往往很大。既然牛顿法里面最后只需要Hessian的逆和梯度向量的乘积(,估计这个向量显然要直接得多,也容易一些。SDM方法假设这个乘积是x的一个复杂函数,并且假设这个函数可以被一组函数的线性组合近似。具体而言,SDM用以下迭代公式

x_{k+1} = x_k + R_k * f(x_k) + b_k

取代了牛顿法的迭代公式

x_{k+1} = x_k - H(x)^{-1} f'(x)

其中R_k 和 b_k 是学习得到的用于近似Hessian矩阵和梯度的模型参数。通过模拟牛顿法的过程,可以通过不断得修正一组初始估计来逼近最优解集合,每一步迭代都可以计算出一对R_k 和 b_k,它们一起构成了最后的模型。
      求解 R_k 和 b_k 的方法类似于贪心算法,即在每一步,最小化迭代后的值与最优值的差:

|| x* - x_k + R_k * f(x_k) + b_k ||^2

这个其实就是最简单的线性最小二乘问题,可以很容易的求解。
      当然啦,实际训练的时候,需要在所有训练样例计算上面的代价函数并求和,得到最终的代价函数,然后再求解R_k和b_k。

3、 实验结果

a、真实结果和拟合结果比较图:

SDM接近于真实的标记结果,拟合结果很好。(红色的为Ground True,绿色的为SDM拟合结果)

b、SDM 和 Netown的迭代收敛比较图:

牛顿迭代法出现迭代失败的情况,而SDM均可以迭代至收敛。

c、指定跟踪算法和SDM比较图:

指定跟踪器会出现过拟合的现象,而SDM表现则相当的稳定

参考:http://www.cnblogs.com/cv-pr/p/4797823.html

http://www.thinkface.cn/thread-2913-1-1.html

[1]  Supervised Descent Method and its Applications to Face Alignment

[2]  Cascaded Regressor based 3D Face Reconstruction from a Single Arbitrary View Image

codes:C++  :https://github.com/RoboPai/sdm

https://github.com/guozhongluo/SDM

MATLAB:https://github.com/tntrung/sdm_face_alignment

https://github.com/fagg/SDM-Face-Alignment

paper 142:SDM算法--Supervised Descent Method的更多相关文章

  1. 人脸对齐SDM原理----Supervised Descent Method and its Applications to Face Alignment

    最近组里研究了SDM算法在人脸对齐中的应用,是CMU的论文<Supervised Descent Method and its Applications to Face Alignment> ...

  2. SDM(Supervised Descent Method and its Applications to Face Alignment )

    sdm SDM 人脸对齐的核心内容很简单,就是特征到偏移量的映射:                                           Ix = R I 是特征,x是映射矩阵,R是偏移 ...

  3. 【Paper Reading】Deep Supervised Hashing for fast Image Retrieval

    what has been done: This paper proposed a novel Deep Supervised Hashing method to learn a compact si ...

  4. 坐标下降法(coordinate descent method)求解LASSO的推导

    坐标下降法(coordinate descent method)求解LASSO推导 LASSO在尖点是singular的,因此传统的梯度下降法.牛顿法等无法使用.常用的求解算法有最小角回归法.coor ...

  5. V-rep学习笔记:机器人逆运动学数值解法(Cyclic Coordinate Descent Method)

    When performing inverse kinematics (IK) on a complicated bone chain, it can become too complex for a ...

  6. 封装算法: 模板方法(Template Method)模式

    template method(模板方法)模式是一种行为型设计模式.它在一个方法中定义了算法的骨架(这种方法被称为template method.模板方法),并将算法的详细步骤放到子类中去实现.tem ...

  7. 三维网格补洞算法(Poisson Method)

    下面介绍一种基于Poisson方程的三角网格补洞方法.该算法首先需要根据孔洞边界生成一个初始化补洞网格,然后通过法向估算和Poisson方程来修正补洞网格中三角面片的几何形状,使其能够适应并与周围的原 ...

  8. paper 84:机器学习算法--随机森林

    http://www.cnblogs.com/wentingtu/archive/2011/12/13/2286212.html中一些内容 基础内容: 这里只是准备简单谈谈基础的内容,主要参考一下别人 ...

  9. 三维网格补洞算法(Poisson Method)(转载)

    转载:https://www.cnblogs.com/shushen/p/5864042.html 下面介绍一种基于Poisson方程的三角网格补洞方法.该算法首先需要根据孔洞边界生成一个初始化补洞网 ...

随机推荐

  1. php strtok()函数 语法

    php strtok()函数 语法 作用:逐一分割字符串大理石构件 语法:strtok(string,split) 参数: 参数 描述 string 必需.规定要分割的字符串. split 必需.规定 ...

  2. k-近邻算法(kNN)完整代码

    from numpy import *#科学计算包 from numpy import tile from numpy import zeros import operator #运算符模块 impo ...

  3. LOJ 2980 「THUSCH 2017」大魔法师——线段树

    题目:https://loj.ac/problem/2980 线段树维护矩阵. 然后是 30 分.似乎是被卡常了?…… #include<cstdio> #include<cstri ...

  4. python中chr()函数和ord()函数的用法

    一,chr()函数 格式:Chr(<数值表达式>)   说明:函数返回值类型为String,其数值表达式值取值范围为0~255.   例如:Print Chr(78),结果显示:N.   ...

  5. JSP 获取访问者真正的IP地址

    request.getRemoteAddr(),这种方法在大部分情况下都是有效的,但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了, 如果使用了反向代理软件,用re ...

  6. 前端工具-让浏览器兼容ES6特性

    babel:将ES6翻译为ES5 问题: 可以处理import和export么? 不能,还是用Rollup或者webpack打包一下吧 可以处理Promise么? 不能,还是使用babel-plugi ...

  7. springboot 应用程序的文件检索描述

    SpringApplication从application.properties以下位置的文件加载属性并将它们添加到Spring Environment: 一个/config当前目录下的子目录. 当前 ...

  8. 测开之路四十七:Django之请求静态资源与模板

    框架必要的配置 import sysfrom django.conf.urls import urlfrom django.conf import settingsfrom django.http i ...

  9. 关于之前提到的python开发restful风格的接口

    此处不做详细说明. https://gitee.com/alin2017/my-i-demo.git 附上git地址,有兴趣的可以去clone一下. 里面针对代码都有相应的注释, 对于每一个文件也有r ...

  10. Linux(Ubuntu)常用命令(二)

    归档管理: 打包: tar -cvf xxx.tar 打包对象 (一般来说就是 -cvf 一起用)但这种不压缩的打包通常不用,接下来会说. -options:-c    生成档案文件,创建打包文件. ...