SDM人脸对齐算法研究
人脸对齐的算法是我本科阶段的毕业设计课题,从最初的一脸迷茫到最后完成毕设,两个月的时光,恭喜自己顺利完成了毕业设计,在过程中,更是不能缺少指导老师以及学长们给予的帮助。衷心感谢!
- 人脸对齐的目的是对人脸进行归一化,工作核心是定位面部关键点。本博客中讨论的SDM是一种人脸对齐的优化算法。利用SIFT算法计算人脸关键点处的特征点描述子,在训练过程中学习多组特征点集的下降方向,使得初始化的特征点集向标记特征点集收敛。
宿佳宁老师的《人脸对齐算法研究》中提到:图像采集、人脸检测、人脸对齐、分类识别四个部分组成了人脸识别的工作过程。
其中人脸对齐作为人脸识别的一个组成部分,将会影响整个流程的工作效率和正确率,所以高效率的人脸对齐算法是研究的主要目的。
人脸对齐算法的研究工作存在很多难点,人脸图像易受外界因素影响,这些因素大致有以下几点:面部遮挡、光照变化、复杂的背景、采集图像时的拍摄角度、面部表情变化。
在研究过程中采集面部轮廓、眉毛、鼻子、眼睛、嘴唇的形状作为关键点集合,包含68个关键点,其中17个点代表人脸轮廓,10个点代表眉毛形状,9个点代表鼻子形状,12个点代表眼睛形状,20个点代表嘴唇形状,如下图所示:
- 过程中的数学建模的部分就不细写了,在很多老师的论文中都有数学建模的过程以及其原理。
- 在研究过程中,我将整个SDM算法分为了三个框架:图像预处理框架、训练框架、测试框架。
预处理
为了方便后期的工作,先将样本集归一化,这样可以大大的提高训练的效率。对载入的图像进行人脸检测,并对人脸进行裁剪,将人脸部分裁剪为200*200大小的图片;同时,也对图像对应的标记关键点集做变化,生成对应大小的关键点集。下图是原样本集的图像截图:
经过预处理后的截图为:
(在研究初期我并没有对样本集进行预处理,导致我在研究过程中一次次的绕弯,但是走不到终点。。。对此,感觉自己被自己蠢哭了。。hhhhhh)
训练
a.求偏差:进入训练框架后,首先需要计算当前特征点集(当前形状)与标记特征点集(目标形状)的偏差;
b.计算特征点描述子:载入当前样本图片和关键点集,通过SIFT计算关键点的描述子;
c.计算回归器并保存数据:将a和b的结果传入实现最小二乘法/梯度下降法的函数,求解出使得目标函数(损失函数)取最小值时的数据(回归器)并保存。
不过此处我建议使用梯度下降法,因为我在最初的时候是使用最小二乘法,也可能是我实现过程中的缺陷,每运行一次训练,就需要很大的时间成本,而且过程中出现了很多大大小小的bug。所以我建议采用matlab一起结合,用matlab实现梯度下降法,大大减小了时间成本
测试
下面直接放上测试的结果:
首先是简化的训练样本集和测试集(设置了一个卡通人脸样本集的训练,算法的原理和流程和SDM算法一模一样,唯一不同的是卡通人脸样本的特征点较少,证明SDM算法的可行性):
人脸样本集:在研究过程中,人脸样本集的测试我分了几种情况:1.遮挡测试;2.角度测试;3.表情测试;4.光照测试;5.图片质量测试。在本博客中就不一一展示,只放出几张测试图。
最后是为了测试算法的真实性,指导老师要求测试本人的一张照片,这个结果还存在偏差,并不是最优结果,还需要再进行迭代收敛。
好了,到这里就结束了这次人脸对齐算法的博客更新。很多具体的细节都没有写出来,如果有疑问的博友,可以留言;还有,因为只是自己的研究,所以过程中可能也有错误的观点,希望各位博友指出并给出建议,感谢!