DREAM:Pose-Robust Face Recognition via Deep Residual Equivariant Mapping

这篇文章发表于CVPR 2018,建立了一个深度残差等值映射模块,将侧脸转化为便于识别的规范脸,提高了深度神经网络的侧脸识别性能。

项目地址:https://github.com/penincillin/DREAM

平台:Pytorch

训练集:MS-Celeb-1M,作者对该数据集进行了筛选和清理,从中选择了一部分进行训练。

测试集:CFP and IJB-A

一、深度残差等值映射DREAM模块的结构和作用?

现有的多种人脸识别算法都是通过深度神经网络提取特征,作为特征向量送给分类器。这篇文章提出的DREAM模块对特征向量进行了重映射,易于嵌入各个深度神经网络之中。下图是DREAM模块的结构示意图。

将DREAM模块加入已有的CNN中

输入图像在经过了stem CNN之后,我们获得了原始的特征向量。DREAM模块则在此基础上增加了Head Rotation Estimator来计算出偏航角度Yaw,并将该角度以如下公式映射到[0,1]之间。


yaw coefficient计算公式

其中y是偏航角yaw的弧度,函数为sigmoid function。我们将提取出的原始特征向量送入两个全连接层之后与获取的yaw coefficient偏航系数相乘,再与原始特征向量相加,结果则为重映射的人脸特征。

值得注意的是,当yaw大于45度时,该系数很快到达1,为极端的侧脸加上了更多的残差。

二、如何训练和使用DREAM模块?

文中提到,作者尝试了三种训练方法:

1、stitching,直接将训练好的DREAM模块拼接到主干的CNN网络之中,无需更改CNN的参数。由上结构图可知,DREAM模块的输入有:人脸图像,主干CNN输出的特征向量,yaw coefficient。作者也开源了单独训练DREAM模块的代码,在此不多赘述。

2、End-to-end,将DREAM模块拼接到主干CNN网络之后,对整个网络进行参数初始化,用identification或者verification loss训练整个网络。但是这种方法没有使用正脸-侧脸pair训练DREAM模块,使得DREAM模块无法区分正脸和侧脸,效果并不好。

3、End-to-end+retrain,先共同训练DREAM模块和主干CNN,再用正脸-侧脸pair单独训练DREAM模块。实验证明,这种方法得到的结果最佳。

你可能感兴趣的:(DREAM:Pose-Robust Face Recognition via Deep Residual Equivariant Mapping)