用基于center loss的人脸识别模型对LFW人脸数据集进行评测(c++)

接上一篇博文,这篇博文主要是进行人脸识别中的第③和第四个步骤:特征提取以及相似度计算。

             center loss是2016的一篇ECCV论文中提出来的,A Discriminative Feature Learning Approach for Deep Face Recognition,个人理解,center loss的思想有点类似于SVM,对于线性可分的数据,SVM不仅仅是求得的超平面线性划分训练数据,还要求划分后的最小间隔最大化,而加入了center loss的卷积神经网络,不仅要求划分出各个类别,还要求类与类之间的距离尽可能大,而类之间的元素之间距离尽可能小,这样当一副新的未出现过的人脸送入网络进行测试时,能更好的泛化其特征,而减少了因为类类间“太近”而导致的误判。就如论文中的图: 

                     用基于center loss的人脸识别模型对LFW人脸数据集进行评测(c++)_第1张图片

这里显示的是赋予center loss不同权重的效果图,左上角的权重比较小,类类间间距相对小,而右下角的权重比较大,得到的结果是类与类之间的距离相对很大。更详细的博文,大家可以看       https://sanwen8.cn/p/5c76qMZ.html

        基于center loss的caffe实现,GitHub是 https://github.com/ydwen/caffe-face ,大家可以按照其教程来配置好环境

       简而言之,为了实现center loss,作者在caffe里自定义了一个center loss层,添加了头文件以及源文件后,重新编译caffe即可。

环境配置好后,我们下载WebFace 数据集,该数据集一共有10575个人的图片,总共50W左右张图片,此时,我们应该先将这些人脸图片进行对齐(上篇博客主要介绍了对齐方法),然后我们将对齐好的图片分为训练集、验证集,开始训练我们的神经网络了。

       训练完后,我们得到了一个caffemodel,我们想在LFW上验证我们的模型,看看性能到底怎么样,我们将LFW的数据下载回来,一共有5749个人的人脸图片,每个人一个文件夹,  而LFW的评价指标是 给出了6000对人脸图片,其中3000对人脸图片是同一个人,另外3000对图片不是同一个人,现在我们需要拿出自己的模型,对这6000对人脸图片,分别回答是同一个人与否,并且画出ROC曲线来评价我们的模型。

     具体的方法是,假设前3000对是同一个人,后3000对不是同一个人,我们设同一个人的标签是1,不是同一个人的标签是0,则6000个标签中,前3000是1,后三千是0,现在,我们用我们模型进行预测,对于每一个图片对,我们会根据计算两张图片的相似度,得到一个相似度(0~1),然后根据其是否大于一个给定的阈值,会得到6000个结果,这个结果不是0就是1,比如阈值是0.7,现在模型对一个图片对算出来的相似度是0.6,则我们认为这对图片不是同一个人,因为其相似度0.6没有达到阈值0.7,这样,对于每一个阈值,我们能得到该阈值下的查准率P、查全率R、真正例率TPR、假正例率FPR。我们现在设置6000个阈值(因为有6000个测试图片对),就可以画出ROC曲线和PR曲线了, 我用一个迭代了10W次模型,进行测试,ROC曲线和PR曲线如下图:

                                               用基于center loss的人脸识别模型对LFW人脸数据集进行评测(c++)_第2张图片

图很丑,,大家别笑~~ 这是用opencv画出来的,左边的是ROC曲线,右边的是PR曲线,对于ROC曲线,有一个评价指标,是画一条从左上角到右下角的直线与ROC曲线的交点的纵坐标,也就是对应的真正例率TPR,算出来是0.947, 同时,我也试了所有的分类阈值,在最好的分类阈值的情况下,准确率为0.953,也就是6000对图片中,我正确识别了6000*0.953=5718对 ,至于在LFW数据集上的实际评价标准,我暂时也搞不清楚是用哪个,或者算AUC? 这个还请知道的同学告知~~


具体的怎么用C++提取一张人脸经过caffe网络产生的特征,会再写一篇博客供大家参考~


你可能感兴趣的:(Caffe,人脸识别)