对 CNN facial point detection[CVPR2013]一文的实现

在Deep convolutional network cascade for facial point detection一文中,作者实现了基于CNN的人脸标注算法。而后续发表在CVPR2014上的关于人脸识别的文章,很大程度上都依赖于前端人脸标注算法的准确性。本人尝试在ConvNet上对该网络进行了实现。收获有以下几点:

1.     结构与权重初始化对训练过程的影响。

在研究中发现:深度卷积网的可优化性严重依赖于结构和初始权重。卷积层后的sigmiod或tanh函数会将输出值映射到归一化区间,如果初始权重设置不好,会将输出值归一化到相近值,如:0.981, 0.982, 0.9812等。由于计算机精度有限,经过多次非线性映射后,所有样本最终的输出将完全相同,从而导致调优困难。比较合理的训练方法是:选择好网络结构并随机初始化权值后,逐层观察非线性映射后的输出结果,根据输出结果重新调节权重大小,使不同样本的输出结果相互存在明显差异。

2.     训练样本对训练精度的影响。

在研究中发现:不同的训练样本集对卷积网的精度有很大影响,样本放入的顺序也会影响卷积网的精度。我共产生了3个训练样本集:尺度、位移随机化样本集,尺度随机化样本集,和与测试条件一致的样本集。通过训练发现:先利用差异较大尺度、位移都存在变化的样本集对网络进行训练,待收敛后再利用只存在尺度变化的样本集进行训练,最后使用与测试条件一直的样本集进行训练,会使得最终预测精度较好。个人的理解是:变化较大的样本集可以更好地训练底层卷积核的特征表达能力,变化较小的样本集可以更好地训练中层和高层网络的特征提取能力。前面采用的训练顺序可以保证网络由底层到高层都获得较为良好地训练。

3.     慎用ReLU函数。

ReLU会将所有负值输出全部置零。本实验中相当多的卷积核产生的响应都为负数,采用ReLU后网络无法收敛。

4.     学习率对网络精度的影响。

目前主流的训练算法主要采用学习率单调递减的方法进行,训练过程中学习率一旦下降后绝不会再次变大。本人在实验中发现:当学习率下降到一定程度后,再次适当增大学习率可以加速误差的减小速度,使得模型更容易被优化。

部分标注结果如下:

对 CNN facial point detection[CVPR2013]一文的实现_第1张图片对 CNN facial point detection[CVPR2013]一文的实现_第2张图片对 CNN facial point detection[CVPR2013]一文的实现_第3张图片对 CNN facial point detection[CVPR2013]一文的实现_第4张图片对 CNN facial point detection[CVPR2013]一文的实现_第5张图片对 CNN facial point detection[CVPR2013]一文的实现_第6张图片对 CNN facial point detection[CVPR2013]一文的实现_第7张图片

总体来讲,基本实现了文章的功能。目前只实现了第一层网络,没有按照原文那样用第二三层网络进行误差回归,因此精度稍逊与原文方法。

可执行代码(matlab生成的exe)下载地址:http://download.csdn.net/detail/kklots/8618505


你可能感兴趣的:(deep,learning,cnn,人脸标注)