一、 简介
这篇文章是2015年的论文,根据300W比赛的数据做的人脸关键点定位facial landmark localization。人脸关键点定位是众多工作的基础,比如美颜相机等。
![](https://img.haomeiwen.com/i12292185/8a1f3658a95e767b.png)
人脸对齐的主要需求是稳健性,即使图片模糊或者被遮挡,模型依旧可以返回一个可解释可理解的坐标点。
![](https://img.haomeiwen.com/i12292185/2c5e702e13622ec1.png)
通常处理人脸关键点定位问题,都会将其视为一个基于图片的回归问题,输入是三通道(RGB channels)的图片,输出是关键点的坐标。理论上只要回归器足够好,深度学习就可以返回一个令人满意的结果。本文采用经典的CNN方式,值得注意的是,这篇文章采用了两层级联的CNN网络,其中第一个网络输入图片中的128* 128像素大小的人脸,输出n个要求的位置预测点。第一层输出的预测点不一定是完美的,作为第二层的输入,第二层网络会继续优化这些坐标,得到更精确的人脸关键点定位。该文在第一层中使用了10层的CNN(足够深,学习能力足够强大)
关于CNN网络的基础概念,比如卷积层、池化层、激活函数等,请参考《神经网络和深度学习》这本介绍书,通俗易懂,入门必备神书。这里提一下通道(channel)数量问题。
卷积层
一个图片可以使用3维数组表示,高度宽度通道,一般图像用三通道(RGB)表示。卷积层的每个卷积函数又被称为过滤器,多通道过滤器(multi-channel filter)会同时扫描图像的三个维度,并且计算这三个维度和过滤器的点积,这些点积加上偏置就构成了下一层(池化层)的输入:
![](https://img.haomeiwen.com/i12292185/9bafa5cab0fdaed7.png)
其中p,q,c分别为过滤器的长、宽以及输入的通道数。W是一个四维的数组,第一个维度是输出的通道数量。输出的通道数不一定要和输入的通道数一致
池化层
池化层作用是减少图像的尺寸,选择b*b大小的块中最大值。每个channel被认为是独立的。池化层可以获得图像中的不变特性(哪些包含局部最大值的块的得到的池化层输出一致),当在面对局部偏移和模糊的情况时,池化层使得网络更加稳定。
![](https://img.haomeiwen.com/i12292185/d4c42a1b5e6b4cab.png)
激活函数
本文中使用的激活函数是hyper-tangent(需要理解一下)
二、网络架构
本文中使用了两层级联CNN的网络结构,其中第一层的输入是图片中的128* 128像素大小的人脸,输出n个要求的位置预测点,即2* n个输出。第二层将第一层的输出看错是1* 1大小的图片,每个图片有2* n个通道。两层级联CNN可以理解为使用coarse-to-fine方式进行预测。第一层网络获得一个全局面部结构,给出关键点定位的一个粗略的稳定的初步估计。类似于我们去医院,医生给我们一个病灶的初步估计。第二层网络通过更细致的关注第一层的预测关键点周围的区域,改善第一层的预测点。类似于医生在确定病灶大致区域之后,使用仪器具体观测病灶周围的情况,确定疾病的位置究竟在何处。
网络使用经验误差最小的策略。使用均方误差函数作为损失函数:
![](https://img.haomeiwen.com/i12292185/dd7ce91bb2cd999f.png)
第一层网络
在图片输入之前,需要先将图片中的人脸检测出来,并进行剪切。这意味着输入第一层网络的图片一定包含人脸。第一层的输出是初步预测的关键点坐标,在获得第一层输出之后,通过人两眼中心的点和嘴部中心的点得到人脸的倾斜角度,通过旋转和缩放图像,得到一个标准垂直并且比例合适的人脸。
![](https://img.haomeiwen.com/i12292185/e33f65f9144d3cf9.png)
我们默认通过学习,第一层网络可以得到一个粗略且健壮的结果,即使部分关键点被遮挡,网络也可以通过全局的脸部轮廓得到一个大致的猜测。
第二层网络
第二层一共包含了n个CNN网络,第i个CNN网络的输入是以第一层预测关键点i为中心的子图,每个CNN的任务是预测这个区域中K个最近的关键点的位置。这里K取3是一个速度和效果的trade-off结果。通过这种并行预测方式,第二层网络一共输出nK个关键点位置,也就是每个关键点至少被一个CNN网络预测。通过取平均的方式得到每个关键点最终的预测结果。
网络的优化
-
首先第一层网络已经可以得到一个大致的稳定的人脸关键点定位,在进行第二层学习很容易过拟合。因为在第一层网络中,将数据分为4份(4-Flod),依次取三份进行训练得到4个第一层网络。第二层的第一份输出数据是第一层使用后三份训练数据得到的模型对第一份数据进行预测的结果;第二层的第二份输出数据是第一层使用其余三份训练数据得到的模型对第二份数据进行预测的结果....按照这样的方式增加模型的健壮性。
网络规模
网友评论