常用几种人脸对齐算法ASM/AAM/CLM/SDM
常用几种人脸对齐算法ASM/AAM/CLM/SDM
转载:http://blog.csdn.net/huneng1991/article/details/51901912 SDM原理
转载:http://blog.csdn.net/linolzhang/article/details/55271815 人脸对齐算法
一、ASM算法
ASM(Active Shape Model)是指主观形状模型,即通过形状模型 对 目标物体进行抽象。
ASM 是一种 基于点分布模型(Point Distribution Model, PDM)的算法。在PDM中,外形相似的物体,例如 人脸、人手、心脏等的几何形状可以通过若干关键特征点(landmarks)的坐标依次串联形成一个形状向量来表示。基于ASM的人脸 通常通过 标定好的68个关键特征点 来进行描述:
ASM算法 分为 训练过程 和 搜索过程
ASM的训练过程如下:
1.1 搜集 T 个训练样本,样本数量根据需要(假定 T=100)
注:样本只需要包含人脸图像即可,大小和方向不需要限定(后续可以归一化)。
1.2 手动标记n个脸部特征点(假定 n=68)
需要配合标定软件将结果坐标存到文本文档。
1.3 构建形状向量
将记录下来的坐标点,按照顺序连成向量,每一个样本 描述为一个向量:
1.4 进行归一化和对齐(采用Procrustes方法)
可以看作是通过简单的平移、旋转、缩放,在不改变点分布模型的基础上,将样本中多个人脸归一化到一个统一的标准。这个统一的标准即为平均脸。
*Procrusts归一化方法一般为使用一个四元数:旋转角度a, 缩放尺度s,水平位移x, 垂直位移y 。这里仅把他看作一个变化T,具体过程为:
(1)将训练集中的所有人脸模型对齐到第一个人脸模型(典型意义,可以自主选择);
(2)计算 平均人脸模型 X0;
(3)将所有样本模型对齐到平均人脸 X0,描述为: Xi = X0 + b (b为相对于平均脸的偏置);
任意的一个脸可以由平均脸和参数b来进行描述,参数b描述了平均脸到人脸的细微变化。
(4)重复(2)(3),直至X0收敛 或者到一定时间停止。*
1.5 PCA降维
PCA 降维主要作用是降低非关键维度的影响,减少数据量、提高效果,这个过程并不是必须的。
1.6 为每个特征点构建局部特征
局部特征用于在特征点附近进行搜索(可以在特征点附近的矩形框搜索,也可以沿法线方向搜索),以迭代的方式寻找新的特征点匹配位置。为防止光照变化,局部特征一般采用梯度特征描述(当然也可以通过颜色、纹理等,可以参考后续AAM算法)。
ASM的搜索过程如下:
1.1 初始化对齐人脸
根据HOG人脸检测结果的大致人脸位置,将前面计算得到的平均脸 X0 进行仿射变换,得到一个初始的特征点模型:
X = M ( X0 ) + b
1.2 搜索特征点
a)针对每个特征点:
在特征点邻域内进行 迭代搜索,通过局部特征点的特征匹配,获取新的特征点位置;
关于特征点搜索方式,有的方法沿着边缘的法线方向提取,有的方法在特征点附近的矩形区域提取,这里先不展开讨论。
通过特征点选择算法,选择多个 候选点,候选点 采用上面同样的方法进行特征提取,然后与样本特征点模型进行匹配,匹配采用前面提到的马氏距离,距离最小的候选点即作为新的特征点中心。
b)采用 平均人脸模型 对匹配结果进行修正;
反复执行 (a)(b),直到收敛。
用初始模型在新的图像中搜索目标形状,使搜索中的特征点和相对应的特征点最为接近,持续优化 b,计算最接近模型。
目前关于ASM 主要的工具包:
1. Asmlib-opencv
基于opencv2.0,比较老了,效果一般,起步学习用。
链接地址:https://github.com/cxcxcxcx/asmlib-opencv
2. stasm
准确度还可以,开源。
链接地址:https://github.com/juan-cardelino/stasm
二、AAM算法
AAM 称为 主动外观模型(Active Appearance Model),AAM是在ASM的基础上,进一步对纹理(将人脸图像变换到平均形状 而得到的形状无关图像)进行统计建模,并将形状和纹理两个统计模型进一步融合为 外观模型。可以理解为:
Appreance = Shape + Texture
AAM 在对形状和纹理特征统一量纲后,建模和搜索过程和ASM基本相同。
三、CLM算法
CLM 是有约束的局部模型(Constrained Local Model),它通过初始化平均脸的位置,然后让每个平均脸上的特征点在其邻域位置上进行搜索匹配来完成人脸点检测。前面讲到的ASM也属于CLM的一种。
CLM分别继承 ASM和AAM的优点,在ASM的效率 与 AAM的效果之间做了平衡。抛弃了AAM的全局纹理方法,在ASM的基础上,通过特征点周围的局部纹理Patch,提高了ASM仅仅依靠灰度 带来的匹配问题,引用一张老掉牙的图 说明原理:
CLM的关键在于约束(Constrains),有两个层面的意思:
1)我们的眼睛、鼻子、嘴巴 相对位置是明确的,你不需要到鼻子上面找嘴巴(这肯定是怪物对不对?),这些Patch的位置称为Shape Model;
2)对于每个Patch,对应一个Local Model,你只需要在限定的位置周围(Local Region)进行查找匹配即可;
详细算法解析见:
http://blog.csdn.net/qq_15807167/article/details/54605710 人脸识别之人脸对齐(四)–CLM算法及概率图模型改进
四、SDM算法
SDM(Supervised Descent Method)是一种监督下降方法,属于解决非线性最小化NLS(Non-linear Least Squares)问题的一种方法。
解决非线性最优化问题通常有2个难点,
(1)方程不可微,或者计算量太大
(2)Hessian矩阵太大,或者不是正定矩阵
SDM 人脸对齐的核心内容很简单,就是特征到偏移量的映射:
Ix = R
I 是特征,x是映射矩阵,R是偏移量。SDM人脸对齐方法训练的目的就是得到映射矩阵x。
步骤如下:
1)归一化样本,使样本的尺度统一;
2)计算均值人脸;
3)将均值人脸,作为估计人脸放在样本上,使均值中心和原始人脸形状中心对齐;
4)计算基于每一个均值人脸的标记点的特征,sift,surf或者hog,切记不要基于灰度值的相互特征;
5)将所有点的特征串在一起,形成样本特征,所有样本特征形成矩阵I;
6)计算估计人脸和真实人脸之间的偏移量,并形成矩阵R;
7)解线性方程Ix=R, matlab中可用x = I \ R,lapack中可用函数dgelsd。
估计形状加上预测偏移量就是结果,在实际情况中,共需要训练多层,二层以后需要使用上一层对齐的结果作为估计形状。
实际在运用过程中可能会遇到各种问题,总结下来有以下几点:
1)速度太慢,尤其是使用sift,surf特征;
2)无效,基于灰度值类的特征由于在标记点周围的小窗口内,灰度值基本一致,变化不大,这也是人脸的一个显著特征;
3)效果有待提高,hog特征有效的解决上述问题,但是始终不理想,尤其是,水平大角度偏转。
常用几种人脸对齐算法ASM/AAM/CLM/SDM相关教程