Multi-task Convolutional Neural Network 训练人脸识别和关键点检测 (论文解读)
论文链接:https://arxiv.org/ftp/arxiv/papers/1604/1604.02878.pdf
翻译连接:
摘要:https://blog.****.net/mid_Faker/article/details/104530183
算法实现部分 : https://blog.****.net/mid_Faker/article/details/104553719
三层网络的结构:
1.人脸/非人脸分类
使用交叉熵损失函数(cross-entroy loss):
pi是有网络产生的描述一个样本是一张脸的可能性,符号yi【0-1】是ground-truth label
2.边界框回归
对于每一个候选窗口,都预测出它和最近窗口的抵消。(例如边界框的左上角坐标,高度和宽度)。学习目标被定为为一个回归问题,使用Euclidean loss(欧氏损失)来记录每个样本xi
3.面部关键点的定位
最小化欧氏损失:
尖是通过网络获得的面部坐标,yi是标注坐标。有五个面部标志:左右眼,鼻子,左右嘴角。因此yi是一个10维向量。
同时当标记点不是五个而是更多个的时候,yi就是更多维的向量。
4.对于不同样本不同网络的训练策略
在每个CNN结构中执行不同的任务,在学习过程中训练不同类型的图片,比如人脸,非人脸,还有一部分是整齐的脸。在这种情况下,一些损失函数,就不被使用了。例如,对于一些背景区域的样本,我们只计算Li,另外两个损失就直接设置为0.这个过程可以用一个样本类型指示器直接执行。然后整体的学习目标就可以被描述为:
N是训练样本的总数,αj表示任务的重要性,在P-net和R-net中α det =1,α box=0.5,α landmark =0.5 ,在O-net中是 1,0.5,1,在O-net中使用更精确的面部标志定位, β【0-1】是样本类型指示器,使用随机梯度下降法来训练CNNs(stochastic gradient descent)。
5.同步的困难识别样本采集
不同于在原始分类器被训练完成后再采集困难样本的传统方式,我们在面部分类任务过程中在线采集困难样本。特别的,在每一批次采集中,我们把所有样本中使用向前传播方式计算出的损失排序,把他们之中的前70%作为困难样本。然后我们就只计算困难样本的向后传播的梯度?这意味着我们忽视掉了那些对加强训练分类器有很小帮助的简单样本,实验证明这种方法在没有手工样本选择的时候会产生更好的结果。
实验表明使用困难样本采集策略的效果更好
6.训练数据的处理
因为我们想要把人脸识别和关键点校准结合起来处理,所以我们就在训练过程中使用四种不同的数据标注:(i)负面的:交并比(IOU)(模型产生的目标窗口和原来标记窗口的交叠率。具体我们可以简单的理解为: 即检测结果(DetectionResult)与 Ground Truth 的交集比上它们的并集。)比例对于任何标记数据在0.3以下。(ii)正面的: IoU 比例在0.65以上 (iii)部分人脸:IoU比例在0.4-0.65 (iv)标记人脸:标记好了五个关键部位的位置。 正反面的数据被用来训练人脸分类任务,正面的和部分人脸的两组用来训练边界框回归。标记好的人脸用来训练面部关键部位的定位。
实验证明将包围盒识别和关键点标注两个工作结合起来的效果更好:
一,训练Proposal Network(P-Net)
(浅层的CNN快速产生候选窗体)
使用一个全卷积的网络,叫做Proposal Network(P-Net),来得到候选窗口,和他们的边界区域向量 。然后使用这些估算的边界回归向量 来校准候选窗口。之后,使用NMS来合并高度重叠的窗口。
二,训练RNet网络
(通过更复杂的CNN去掉一些没有人脸的窗口来精炼窗口)
所有的窗口都被送到另一个卷积神经网络中,它叫做Refine network(R-Net),可以把大部分错误的窗口给去除掉,用边界框回归进行校准,并使用了NMS
三,训练ONet 网络
(使用更加强大的CNN来改进结果,输出面部的位置标记)
和第二阶段类似,但是在这个阶段使用用更多的细节描述面部,尤其是,网络将会输出五个面部标记。