人脸的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. 【转载】Apache shutdown unexpectedly启动错误解决方法

    http://blog.csdn.net/dong123dddd/article/details/21372179 xampp启动时显示的错误为: 9:52:41  [Apache] Attempti ...

  2. opencv图像阈值设置的三种方法

    1.简单阈值设置   像素值高于阈值时,给这个像素赋予一个新值(可能是白色),否则我们给它赋予另外一种颜色(也许是黑色).这个函数就是 cv2.threshhold().这个函数的第一个参数就是原图像 ...

  3. SGC强制最低128位加密,公钥支持ECC加密算法的SSL证书

      Pro SSL证书,验证企业域名所有权和企业身份信息,采用SGC(服务器门控)技术强制128位以上至256位加密,属于企业OV验证级专业版(Pro) SSL证书:即使用户使用低版本浏览器(比如浏览 ...

  4. 重庆OI2017 老 C 的任务

    老 C 的任务 时间限制: 2 Sec  内存限制: 512 MB 题目描述 老 C 是个程序员. 最近老 C 从老板那里接到了一个任务——给城市中的手机基站写个管理系统.作为经验丰富的程序员,老 C ...

  5. noip模拟赛 三部曲

    分析:子树上操作,要用到线段树+dfs序,关键就是子树内k还要增加,这个就不是很好办.可以求出在根节点+0后每个点会加多少,记为d[i],如果要对点x进行A操作,实际上只需要对子树加k - d[i]再 ...

  6. Machine_learning--score

    辛苦了2个半月,终须学完了machine-learning watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2hyaXN0cHJpbmNlMDA3/font ...

  7. 小米红米1S 电信/联通版 专用TWRP2.8.1.1中文版 (全屏触摸/支持MTP挂载内外置存储)

    转载请注明出处和链接: http://blog.csdn.net/syhost/article/details/39340477 说说中文TWRP的简史:          中文TWRP是本人在201 ...

  8. Android自己定义组件系列【1】——自己定义View及ViewGroup

    View类是ViewGroup的父类,ViewGroup具有View的全部特性.ViewGroup主要用来充当View的容器.将当中的View作为自己孩子,并对其进行管理.当然孩子也能够是ViewGr ...

  9. luogu2278 [HNOI2003]操作系统

    题目大意 写一个程序来模拟操作系统的进程调度.假设该系统只有一个CPU,每一个进程的到达时间,执行时间和运行优先级都是已知的.其中运行优先级用自然数表示,数字越大,则优先级越高.如果一个进程到达的时候 ...

  10. nyoj--990--蚂蚁感冒(模拟)(思维题)

    蚂蚁感冒 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 长100厘米的细长直杆子上有n只蚂蚁.它们的头有的朝左,有的朝右. 每只蚂蚁都只能沿着杆子向前爬,速度是1厘米/ ...