面部关键点识别的理论基础 - ShawnZhang31/opencv3-for-faces-with-dlib GitHub Wiki
面部关键的的识别在计算机视觉领域是一个很早就提出的课题,但是快速、精确的算法开发出来缺没有几年时间。我使用过的第一种关键点检测器就是**主动外观模型(AAM)**检测器。
AAM是由一些参数控制的可变形的模型。通过改变这些参数可以创建一个全新的脸。如果参数设置的合适可以获得非常好脸部模型,可以通过生成的脸部模型的形状和外观使其看起来和输入的图片一模一样。由于我们知道生成的模型的所有的点的数据,所有我们也就知道了输入图像的面部关键点的数据。
在AAM中,输入一张图片,修改参数点来优化生成的模型与输出的图像中的脸部的误差。生成整个脸部是一个非常耗时的操作,很多AAM的算法处理一张图片需要1秒钟甚至更多。但是现在很多的面部关键点追踪器,类似Dlib的,可以做到1000FPS的处理速度。
Dlib的面部关键点检测器是基于Vahid Kazemi和Josephine Sullivan的One Millisecond Face Alignment with an Ensemble of Regression Trees设计开发的。尽管这个论文的题目听起来非常复杂,但是说白这局就是一种Gradient Boosting。
数据是由几千张手工标定好面部关键特征点的图片组成的。用专业术语来说,这组数据叫做“Ground Truth Data”.
这组数据中取80%最为训练集,剩下的20%作为测试集。训练集用来训练机器学习模型,而测试机用来测试模型的精确度。一个机器学习的模型只有在新的数据上表现良好才是有用的,因此测试机和训练集不能重合。
为此我们可以做如下假设:
n = 测试集的数量,假设测试集的数量为3000. 也就是n=3000
p = 标记点的数量。Dlib的标准模型是68个标记点,也就是说p=68
li = 表示测试集中第 l 张图片
Si = [X1,Y1,X2,Y2,...,Xp,Yp]T是图片 li 的关联shape。其中(Xk,Yk)是特征点K的坐标。转置符号T仅仅是把行向量表示为列向量。
如此我们可以说训练集是由n张图片和n个相应的shape组成的,如下所示:
(li,Si)...(ln,Sn)
下图是Dlib中的高级视图。在这个回归级联中,每一级的回归器都在提上上一级的检测结果。
将第t级的回归器*rt*当做一个黑盒,其实输入、输出如下:
输入:
- 用黄色点标出的当前估计的shape
- 输出的面部图像
$\hat S
输出:
- 当前估计的变换可以获得更优的shape
用数学公式可以如下表示:$\hat S$ ^(t+1)=$\hat S$^(t) +r_t(l,$\hat S$ ^(t))