20170929进行更新:将代码传至github上。网址:https://github.com/KaiJin1995/MTCNN-VGG-face。
该网络可以直接进行人脸检测、识别以及陌生人报警。构成安全防盗系统。
----------------------------------------------------------------------
在使用VGG进行人脸训练过程中,我是用log日志记录了训练过程中的数据。训练过程中的参数对于训练而言,有着较大的影响,参数设置不当,(1)容易出现训练结束,但未收敛到最佳状态。(2)早就收敛,迭代次数过多,浪费时间。
本篇博客主要讲述我在使用VGG训练人脸的过程中,迭代次数对于训练效果的影响。以及,对LFW测试集准确率的影响。
首先,采取VGG11训练网络,将VGG11训练网络后得到的caffemodel送至VGG16进行fintune。
训练结束后,我们提取VGG的fc7的值作为特征向量。通过比较特征向量之间的距离,我们可以衡量两个不同人脸之间的差距。
一、VGG11网络训练。
VGG11初始值为高斯。训练采用VGG11,
表1.1 VGG迭代10万次训练情况
Learning rate | iteration | Loss | Accuracy |
0.025 | 2W | 9->6 | 0.08 |
0.0025 | 2W | 6->3 | 0.447625 |
0.00025 | 2W | 3->2 | 0.554812 |
0.000025 | 2W | 不变 | 0.57 |
0.0000025 | 2W | 不变 | 0.575625 |
表1.2 VGG finetune表格
Learning rate | iteration | Loss | Accuracy |
0.025 | 2W | 1.97348 | 0.604312 |
0.0025 | 5W | 1.76364 | 0.709125 |
0.0025 | 5W | 1.79849 | 0.73 |
0.00025 | 5W | 1.52852 | 0.804875 |
0.000025 | 5W | 1.52191 | 0.8115 |
在lr=0.0025迭代2W仍有上升空间,故再迭代5W+5W时,发现准确率不再上升,故将准确率再下降训练。
再用lr=0.00025迭代5W次,到0.80,稳定下来。再用0.000025迭代5W次,发现仅仅只有很少的提升,到81%
故用此caffemodel在LFW数据集上进行测试。当采用L2Norm+euclidean时,准确率0.903+-0.013。当采用L2Norm+cosine时,90.5+-0.012。当非L2Norm+cos时:90.5+-0.012。 非L2Norm+euclidean:0.5(因为不归一化,数字太大,均超过阈值)。
底部是我的readme写的
(第一次初始值设为0.025时,迭代两万次,降到0.0025,迭代10W次。得到caffemodel,发现准确率偏低,发现由于0.025时准确率还在上升时,lr便降了一个数量级
故使用10W次的caffemodel进行finetune,使用lr=0.025进行finetune。迭代了2W次,发现在0.0025仍有上升空间,于是,又在此基础上迭代了5万次,发现准确率还有上升空间。
于是又用5W次的caffemodel再迭代5W次,发现准确率不再上升。
故降低准确率,0.00025,迭代5万次,准确率稳定在80%不再上升。再根据此降低准确率。准确率降低十倍,发现稳定在81%难以提升。
选择此model测试,使用L2+euclidean,得到0.903+-0.013。L2+cos:90.5+-0.012 非L2+cos:90.5+-0.012 非L2+euclidean:0.5(因为不归一化,数字太大,均超过阈值)。
注:cos距离不需要归一化,因为仅仅时两个向量之间的夹角
由于fc7的4096维向量过多,于是我们采用PCA 进行降维,降至500维,测试得到准确率92%+-0.013。
另外,当使用fc6测试时,得到准确率92.2%+-0.012。但并非说用fc6一定好,当用vgg16时,发现有一个百分点的下降。
当我用VGGFace官方团队给的caffemodel进行测试时,得到的准确率是96.4+-0.009(cos距离),而欧式距离与cos距离相近,不会有0.2个百分点以上的提升。
二、VGG16网络finetune
vgg16其余层使用高斯
Learning rate | iteration | Loss | Accuracy | |
0.025 | 2W5 | 2.78113 | 0.527562 | |
0.0025 | 5W | 1.96276 | 0.67425 | |
0.00025 | 2W5 | 1.38997 | 0.7915 | |
0.00025 | 1W5 | 1.38345 | 0.798813 | |
2.5e-05 | 1W7 | 1.38007 | 0.800625 |
首先采用5000次0.025的lr进行学习,在到25000次下降十倍,发现Acc仍然还具备上升空间,故在25000次使用caffemodel重新训练,训练5W次0.0025,发现收敛,得到100000次的caffemodel 0.00025短暂看来也没提升,仅固定在80%动不了。为了进一步观测,再用0.00025训练几万次,观测收敛情况,
发现未收敛到最优,则陷入局部的极小值,得到6W的caffemodel
为了摆脱局部极小值,采用0.025训练6W次的数据,观测情况,Loss越来越高,直至发散
故再尝试0.0025,发现跟之前相似,均收敛到70%不下降
故再降低准确率0.00025,再次测试,再次在80%处停止住。准确率不易上升。降低至0.000025,稳定在80%+,接近于81%的位置。
最终再降低。
用LFW测试,得到92.0%+-0.009。
三、center loss的训练
由于对此效果不满意,故选用center loss在原有基础上训练。
使用0.0025训练,同时centerloss的学习率与之对应。lose_weight=0.008,但是在0.00025时便恒定在73%。vgg_10575_train.log_1。得到/home/free/caffe-face/face_example/vgg_CenterLoss/vgg_10575_iter_50000_1.caffemodel
故增大centerloss的学习率,lr_mult为2000.在之前caffemodel的基础上继续训练。发现centerloss相比于之前,增加了一些,到达76%。故降低学习率,lr_mult为200,再继续训练。学习率从0.00025开始,发现并没太大的变化。放弃。
从0.0025开始,lose_weight=0.003,继续观测。发现收敛到80%附近,训练完成达到82%的准确率。
而0.0025仍有上升空间,故选用此lr继续训练,并不断下降准确率,最终得到84%的准确率。
对此,可以列表格如下:
Learning Rate | iteration | loss | accuracy | loss_weight | center lr_mult |
0.0025 | 36000 | 3.5 | 74%左右 | 0.008 | 1 |
0.00025 | 44000 | 3 | 76% | 0.008 | 2000 |
0.0025(期间有下降到0.00025) | 41000 | 2附近 | 82.4% | 0.003 | 200 |
0.0025 | 6000 | 2.5附近 | 80% | 0.003 | 200 |
0.00025 | 30000 | 1.2 | 83% | 0.003 | 200 |
0.000025 | 10000 | 1.2 | 84% | 0.003 | 200 |
小结:对于训练而言,要掌握好训练的技巧。不要设置的迭代次数过多,也不要过少。过多浪费时间,过少,可能验证准确率少一个百分点。
由于数据量过少,只有50W张人脸图,跟VGGFACE官方团队的200万相比,还是过少。而50万张的小数据集对于VGGface团队也只是做到92%,没差。