【人脸】人脸关键点检测---ASM、CLM
ASM方法
论文:《Active Shape Models - Their Training and Application》
github链接:https://github.com/greatyao/asmlibrary
基于特征点分布模型(PDM):人工标定、构建形状模型,搜索匹配
Step1---训练:
- 构建形状模型
- 搜索N个训练样本(N=400)
- 手动标记脸部特征点,特征点的标注顺序要一致,如右图
- 将训练集中特征点坐标{(x1,y1),(x2,y2),...,(xN),yN)}串成特征向量,特征点看成是一个2N维的向量(x1,x2,...,xN,y1,y2,...,yN)
- 选定基准图像,通过缩放、平移、旋转(Procrusts方法)将其他图像与基准图像对齐
- 对对齐后的形状特征做PCA处理
2. 构建形状模型
- 为每一个特征点提取局部特征,目的是每一次迭代每个特征点都可以找到新位置,局部特征一般用梯度特征表示
Procrusts方法
使用一个四元数,即旋转角度a,缩放尺度s,水平位移x,垂直位移y
- 将训练集中的所有人脸模型对齐到一个人脸模型上
- 计算平均人脸模型X0
- 将所有人脸模型对齐到平均人脸X0
- 重复2、3两步,直到X0收敛或一定时间停止
PCA算法:
设有m条n维数据
1)将原始数据按列组成n行m列矩阵X
2)将X的每一行(代表一个属性字段)进行零均值化,即减去这一行的均值
3)求出协方差矩阵
4)求出协方差矩阵的特征值及对应的特征向量
5)将特征向量按对应特征值大小从上到下按行排列成矩阵,取前k行组成矩阵P
6)即为降维到k维后的数据
Step2---搜索:
- 计算眼睛(或者眼睛和嘴巴)的位置,做简单的尺度和旋转变化,对齐人脸
- 匹配每个局部特征点(马氏距离),计算新位置,得到仿射变换参数,迭代直到收敛
CLM方法
Patch模型构建
在构建好形状模型之后,我们就可以在检测到的人脸上初始化一个人脸形状模型,接下来的工作就是让每个点在其邻域范围内寻找最佳匹配点。传统的ASM模型就是沿着边缘的方向进行块匹配,点匹配等各种低级匹配,匹配高错误率导致ASM的性能不是很好。后续各种改进版本也就出来了,大部分做法都是对候选匹配特征点邻域内的块进行建模(patch模型),我们统称他们为有约束的局部模型:CLM。这里先以基于SVM的匹配作为例子来说,当我们初始化每个特征点后,用训练好的SVM对每个特征点周围进行打分,就像滤波器一样,得到一个打分响应图(response map),标识为R(X,Y)