人脸的Pose检测可以使用基于位置约束的特征点的方法。人脸特征点定位的目的是在人脸检测的基础上,进一步确定脸部特征点(眼睛、眉毛、鼻子、嘴巴、脸部外轮廓)的位置。定位算法的基本思路是:人脸的纹理特征和各个特征点之间的位置约束结合。经典算法是ASM和AAM。

一不小心听懂了ASM、AAM、CLM算法,还是记录下来......................


CLM/AAM/ASM/Snake模型:

参考文献:An Introduction to Active Shape Models.  Constrained Local Model for FaceAlignment. Xiaoguang Yan(2011).

Kass et al [15] introduced Active Contour Models (or ‘snakes’) which are energy minimising curves. In the original formulation the energy has an internal term which aims to impose smoothness on the curve, and an external term which encourages movement
toward image features. They are particularly useful for locating the outline of general amorphous objects, such as some cells (see Chapter 3, secion 3.1 for the application of a snake to microscope images). However, since no model (other than smoothness) is
imposed, they are not optimal for locating objects which have a known shape. As the constraints are weak, this can easily converge to incorrect solutions.

ASM模型起源于snake模型(作为动态边缘分割的snake模型),该方法用一条由n个控制点组成的连续闭合曲线作为snake模型,再用一个能量函数作为匹配度的评价函数,首先将模型设定在目标对象预估位置的周围,再通过不断迭代使能量函数最小化,当内外能量达到平衡时即得到目标对象的边界与特征。

1989年yuille等人此提出使用参数化的可变形模板来代替snake模型,可变形模板概念的提出为aam的产生奠定了理论基础。

1995年cootes等人提出的asm算法是aam的直接前身,asm采用参数化的采样形状来构成对象形状模型,并利用pca方法建立描述形状的控制点的运动模型,最后利用一组参数组来控制形状控制点的位置变化从而逼近当前对象的形状,该方法只单纯利用对象的形状,因此准确率不高.

1998年,cootes等人在asm算法的基础上首先提出aam,与asm的不同之处是他不仅利用了对象的形状信息而且利用了对象的纹理信息。

Snake模型:

参考文章:图像分割之(五)活动轮廓模型之Snake模型简介

自1987年Kass提出Snakes模型以来,各种基于主动轮廓线的图像分割理解和识别方法如雨后春笋般蓬勃发展起来。Snakes模型的基本思想很简单,它以构成一定形状的一些控制点为模板(轮廓线),通过模板自身的弹性形变,与图像局部特征相匹配达到调和,即某种能量函数极小化,完成对图像的分割。再通过对模板的进一步分析而实现图像的理解和识别。

简单的来讲,SNAKE模型就是一条可变形的参数曲线及相应的能量函数,以最小化能量目标函数为目标,控制参数曲线变形,具有最小能量的闭合曲线就是目标轮廓。

模型的形变受到同时作用在模型上的许多不同的力所控制,每一种力所产生一部分能量,这部分能量表示为活动轮廓模型的能量函数的一个独立的能量项。

Snake模型首先需要在感兴趣区域的附近给出一条初始曲线,接下来最小化能量泛函,让曲线在图像中发生变形并不断逼近目标轮廓。

Kass等提出的原始Snakes模型由一组控制点:v(s)=[x(s), y(s)]   s∈[0, 1]组成,这些点首尾以直线相连构成轮廓线。其中x(s)和y(s)分别表示每个控制点在图像中的坐标位置。 s是以傅立叶变换形式描述边界的自变量。在Snakes的控制点上定义能量函数(反映能量与轮廓之间的关系):

.................................................

此外由不同的参数不同的函数值,表示为轮廓能量表达式,通过最小化轮廓能量来控制轮廓的演化,完成图像分割。

效果:原始的snake模型倾向于生成光滑的边缘,对边缘变化剧烈的图像分割效果不明显....

其他方法:基于轮廓内外函数差值的图像分割方法

ASM模型:

参考文献:An Introduction to Active Shape Models

参考文献:ASM(Active Shape Model)算法介绍

算法理论查看论文即可,在此处只列出ASM算法其中的几个关键点,也是当初起疑的地方。

概述:

ASM是一种基于点分布模型(Point Distribution Model, PDM)的算法。在PDM中,外形相似的物体,例如人脸、人手、心脏、肺部等的几何形状可以通过若干关键特征点(landmarks)的坐标依次串联形成一个形状向量来表示。本文就以人脸为例来介绍该算法的基本原理和方法。首先给出一个个关键特征点(怎么标的??)的人脸面部图片,如下所示:

三维框显示了面部的位姿。ASM在实际应用中,包括了一般的ML训练和搜索两个部分。年级大了,就显得憔悴......................


ASM模型:训练/学习过程

1、建立形状模型

  搜集N个训练样本

搜集的图片只要有人脸的面部区域就可以了,暂时不需要考虑尺寸的归一化问题。以便完成人脸区域的ASM训练。

手动记录每个样本中的k个关键点

对于训练集中的一个图片而言,你需要手动标记下(68)个关键点的位置坐标信息,并且将它们保存在文本中。最好用程序实现半自动化标定。

构建训练集的形状向量

将一幅图片中的K个关键点组成一个形状向量 X( Xi,Y ), 其中,Xi 为 i 个位置坐标组成的向量,这样所有N个图像便生成N个训练样本,构成了N个形状向量组成的集合S(X |X(Xi,Y ) ,N )。

形状归一化

改步骤的目的在于对前面手动标定的人脸形状进行归一化或者对齐操作,从而消除图片中人脸由于不同角度、距离远近、姿态变换等外界因素造成的非形状干扰,从而使点分布模型更加有效。 一般,使用Procrusts方法进行归一化:把一系列的点分布模型通过适当的平移、旋转和缩放变换,在不改变点分布模型的基础上对齐到一个点分布模型,从而改变原始的 非形状干扰。

Procrusts归一化方法一般为使用一个四元数:旋转角度a, 缩放尺度s,水平位移x, 垂直位移y 。可以用一个 4X4 的矩阵来完成转换过程。

在ASM模型中,利用Procrusts转换 完成 点分布模型的对齐操作,具体过程为:

(1)、将训练集中的所有人脸模型对齐到第一个人脸模型(典型意义,可以自主选择);

(2)、计算平均人脸模型 X0,

(3)、将所有人脸模型对齐到平均人脸 X0,

(4)、重复(2)(3),直至X0收敛或者到一定时间停止。

  灰度模型:

方法请参考原始论文

选择是否PCA:

若考虑到某些特征的影响可以忽略,可以考虑PCA。

示意图:

模型描述:

X 为平均脸,b表示一个脸与平均脸的差的参数化,可以描述为图像到参数空间的变化。任意的一个脸可以由平均脸和参数b来进行描述,参数b描述了平均脸到人脸的细微变化。


ASM模型:搜索/使用过程

通过训练样本集得到ASM模型之后即可进行ASM搜索,首先对平均形状进行仿射变换得到一个初始模型:

X = M( Tp ) + Xc

用初始模型在新的图像中搜索目标形状,使搜索中的特征点和相对应的特征点最为接近,搜索过程可以通过仿射变换Tp和参数b变化(Xc)完成。

进行迭代搜索,持续优化Xc,计算最接近模型。

初始化过程:

依据上述描述,目标向量的初始化是由 初始模型在图像中搜索得到,这是个得到近似结果的过程。也可以借由其他的人脸检测算法检测出人脸,再由初始模型按照固定参数起始点进行搜索,得到目标形状向量。

迭代匹配过程:

原始过程描述:

通过模型由平均脸 y0 寻找 目标向量 Y,  来获得仿射转换参数Tp;

---------由 Y 经 Tp的逆 得到 平均脸的接近值 y;

通过向y 的 切平面 投影得到原始尺度 y1;

得到模型描述的残差b = y1 - y0 ;再由 b 更新 Y------------

反复迭代,直到 残差b 小到一定范围...

结果:得到形状和Pose(x,y,z,旋转)最匹配 平均脸 的结果Y,完成对齐过程,和得到一个收敛的 b来描述结果。

ASM的搜索过程:

持续更新Y:根据灰度模型来更新Y;

由更新的 Y 获得 y, y1, 更新b 。

AAM模型:

参考文献:Active Appearance Models

ASM是基于统计形状模型的基础上进行的,而AAM则是在ASM的基础上,进一步对纹理(将人脸图像变形到平均形状而得到的形状无关图像g)进行统计建模,并将形状和纹理两个统计模型进一步融合为表观模型。

AAM模型相对于ASM模型的改进为:使用两个统计模型融合 取代 ASM的灰度模型。主要对特征点的特征描述子进行了改进,增加了描述子的复杂度和鲁棒性。

CLM模型:

参考链接:机器学习理论与实战(十六)概率图模型04                
机器学习理论与实战(十六)概率图模型04

Patch模型/Local模型:

在ASM构建好形状模型之后,我们就可以在检测到的人脸上初始化一个人脸形状模型,接下来的工作就是让每个点在其邻域范围内寻找最佳匹配点。ASM使用灰度来更新Y,是沿着边缘的方向进行块匹配。匹配高错误率导致ASM的性能不是很好。后续各种改进版本大部分做法都是对候选匹配特征点邻域内的块--局部 进行建模,我们统称他们为有约束的局部模型:CLM。

局部特征提取:

建议提取laws特征,比较有普遍适用性

                             

CLM模型                                                                                     特征点(左)其邻域响应图(右)

优化过程:

寻找最小残差b 最后为可以转化为一个二次凸优化问题,作者在论文里有详细的解释。

...........................................

人脸的Pose检测:

人脸的Pose检测需要一个 SolvePNP 的过程,对于固定三维点集模型,找出二维点集对应的位姿。此外,在track时使用点集寻找一个最优的位姿起始,应该给出一个好的起始点。

人脸Pose检测:ASM、AAM、CLM总结的更多相关文章

  1. 机器学习----人脸对齐的算法-ASM.AAM..CLM.SDM

    引自:http://blog.csdn.net/linolzhang/article/details/55271815 人脸检测 早已比较成熟,传统的基于HOG+线性分类器 的方案检测效果已经相当不错 ...

  2. OpenCV实战:人脸关键点检测(FaceMark)

    Summary:利用OpenCV中的LBF算法进行人脸关键点检测(Facial Landmark Detection) Author:    Amusi Date:       2018-03-20 ...

  3. OpenCV Facial Landmark Detection 人脸关键点检测

    Opencv-Facial-Landmark-Detection 利用OpenCV中的LBF算法进行人脸关键点检测(Facial Landmark Detection) Note: OpenCV3.4 ...

  4. dlib人脸关键点检测的模型分析与压缩

    本文系原创,转载请注明出处~ 小喵的博客:https://www.miaoerduo.com 博客原文(排版更精美):https://www.miaoerduo.com/c/dlib人脸关键点检测的模 ...

  5. Python 3 利用 Dlib 19.7 和 sklearn机器学习模型 实现人脸微笑检测

    0.引言  利用机器学习的方法训练微笑检测模型,给一张人脸照片,判断是否微笑:   使用的数据集中69张没笑脸,65张有笑脸,训练结果识别精度在95%附近: 效果: 图1 示例效果 工程利用pytho ...

  6. SmileyFace——基于OpenCV的人脸人眼检测、面部识别程序

    项目地址 https://github.com/guoyaohua/SmileyFace 开发环境 Visual Studio 2010 MFC + OpenCV 功能描述 静态图像人脸检测 视频人脸 ...

  7. 用keras实现人脸关键点检测(2)

    上一个代码只能实现小数据的读取与训练,在大数据训练的情况下.会造内存紧张,于是我根据keras的官方文档,对上一个代码进行了改进. 用keras实现人脸关键点检测 数据集:https://pan.ba ...

  8. keras实现简单CNN人脸关键点检测

    用keras实现人脸关键点检测 改良版:http://www.cnblogs.com/ansang/p/8583122.html 第一步:准备好需要的库 tensorflow  1.4.0 h5py ...

  9. 机器学习进阶-人脸关键点检测 1.dlib.get_frontal_face_detector(构建人脸框位置检测器) 2.dlib.shape_predictor(绘制人脸关键点检测器) 3.cv2.convexHull(获得凸包位置信息)

    1.dlib.get_frontal_face_detector()  # 获得人脸框位置的检测器, detector(gray, 1) gray表示灰度图, 2.dlib.shape_predict ...

随机推荐

  1. Codeforces Hello 2018 C - Party Lemonade

    传送门:http://codeforces.com/contest/913/problem/C 有n类物品,第i(i=0,1,2,...,n-1)类物品的价值为2i,花费为ci.任意选择物品,使得总价 ...

  2. hdu2001 计算两点间的距离【C++】

    计算两点间的距离 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Su ...

  3. 【codeforces 508C】Anya and Ghosts

    [题目链接]:http://codeforces.com/contest/508/problem/C [题意] 每秒钟可以点一根蜡烛; 这根蜡烛会燃烧t秒; 然后会有m只鬼来拜访你; 要求在鬼来拜访你 ...

  4. 敏捷开发系列学习总结(5)——这几招搞定团队协同Coding

    一个团队在一起Coding时,就怕发生这样的事情:同1个文件你改了,我也改了,他也改了,最后怎么同步呢?以前用clearcase时,A把文件checkout了,其他人就不能提交,保证了代码的唯一性.但 ...

  5. http-runtime属性

    配置httpRuntime也可以让FileUpload上传更大的文件,不过设置太大了会因用户将大量文件传递到该服务器而导致的拒绝服务攻击(属性有说明) 属性 属性 选项 说明 appRequestQu ...

  6. JDK工具jstatd用法详解(转)

    jstatd,即虚拟机的jstat守护进程,主要用于监控JVM的创建与终止,并提供一个接口允许远程监控工具依附到在本地主机上运行的JVM. 用法摘要 jstatd [ options ] option ...

  7. mongodb之监控

    监控方式 命令行工具 mongostat命令 用途 用于mongod或者mongos操作类型统计,网络流量统计,当前并发数等统计 用法 mongostat options <sleeptime& ...

  8. eclipse 执行MapReduce程序错误异常汇总(解决Map not fount)

    错误一: Error: java.lang.RuntimeException: java.lang.ClassNotFoundException: Class wordCount.wordCount$ ...

  9. Unable to instantiate Action, xxxAction, defined for &#39;xxx&#39; in namespace &#39;/&#39;xxxAction解决方式

    出现这个问题的解决办法主要有两个 1.假设项目没有使用Spring,则struts.xml配置文件里,这个action的class属性的路径没有写完整,应该是包名.类名 2.假设项目使用了Spring ...

  10. 1+2+3+...+n不能用while、for、if else等实现

    问题描写叙述 求 1+2+ - +n ,要求不能使用乘除法. for . while . if . else . switch . case 等keyword以及条件推断语句. 实际意义不大,题目涉及 ...