A Discriminative Feature Learning Approach for Deep Face Recognition 原理及在caffe实验复现

来源:互联网 发布:淘宝怎么买二手衣服 编辑:程序博客网 时间:2024/05/29 18:22

文主要讲centerloss 的原理,及其创新点。然后用caffe 跑自己的数据(CASIA-WebFace | MsCelebV1-Faces-Aligned) 
Reference paper:A Discriminative Feature Learning Approach for Deep Face Recognition ECCV:2016 
github:https://github.com/ydwen/caffe-face


简介

一句话:通过添加center loss 让简单的softmax 能够训练出更有内聚性的特征

作者意图,在配合softmax适用的时候,希望使学习到的特征具有更好的泛化性和辨别能力。通过惩罚每个种类的样本和该种类样本中心的偏移,使得同一种类的样本尽量聚合在一起。 
相对于triplet(Google FaceNet: A Unified Embedding for Face Recognition and Clustering:2015)和contrastive(汤晓鸥Deep LearningFace Representation by Joint Identification-Verification:2014)来说,这个目标其实相对‘清晰’, 所以网络收敛的速度甚至比仅仅用softmax更快,而且不需要像前两者那样构造大量的训练对。

我们来看一张图: 

这里写图片描述

在左图中,我们发现一个类如果太胖,那么出现的结果就是类内距离>类间距离。(任意红点之间的距离应该小于红蓝之间的距离。) 
左边时softmax一般结果,右边时centerloss结果。我们期望特征不仅可分,而且时必须差异大。如右边图。

centerloss

这里写图片描述

其中:xi 代表 d 维空间中第 i 个deep feature。属于第 yi 类。 
d——特征空间的维度。 
W——全连接层的参数矩阵。W={d*n}。d行n列。联想线性分类器 f=Wx+b。 
Wj——W的第j  
m——The size of mini-batch 。 
n——and the number of class。 
b——偏置。 
我们将问题简化(人不要为难自己,看一大堆烂公式,还不明白,代个数试试呗) 
假设我们的batch=1. 也就是m=1. 数据集就一样图片。那么我们的公式就是简化成: 

这里写图片描述

我们这个公式是不是非常像softmax function(去掉-log)。参见上一篇博客。 
我还是一图解千言吧: 
这里写图片描述

我们发现,这个softmax的损失仅仅与正确那项的概率相关。 
运行截图: 
这里写图片描述

验证

在lfw上验证结果: 
这里写图片描述

这个图片回答了:batch_size 对于训练收敛速度有没有影响。

这里写图片描述

我们看到bath_size 大的情况下。虽然每次迭代时间消耗比batch_size =70 的时候大。但是batch_size =256的情况下。下降的更加稳健。比较少的出现波动。另外,对于最终的对于测试LFW精确率有一定的影响。

小结

【注】对于深度学习,数据成为核心,那么这个实验的核心也是数据的预处理。 
LFW的数据处理应该与CASIA数据集处理方式相同。 
其中检查自己的数据处理方式好不好的一个直接有效的方式是:

【1】LFW中有很多图片包含多人脸。你的算法是不是裁剪的图片正中心的那个人?

这里写图片描述

【2】Alignment做的怎么样?很明显最后一张对齐有问题。

这里写图片描述

我这里给大家提供一个已经裁剪好的LFW用来测试:http://pan.baidu.com/s/1kVzA599

宏观感受

先来看看作者对一个刚从github上拉下来的caffe做了哪些改动。

这里写图片描述

step1: 修改caffe.proto

vim caffe/src/caffe/proto/caffe.proto 
图为未修改之前LayerParameter的配置

这里写图片描述

 // 1-修改如下注释 //Update the next available ID when you add a new LayerParameter field //LayerParameter next available layer-specific ID: 148 (last added: center_loss_param) //其中148 这个数字得注意。 caffe的LayerParameter中新定义下一个变量的ID:147. 我们新加入一个变量后,下一个新加入的变量ID:148. // 2-添加如下代码 在LayerParameter中 optional CenterLossParameter center_loss_param = 147; // 3-在caffe.proto 最末尾添加自己定义层message CenterLossParameter {  optional uint32 num_output = 1; // The number of outputs for the layer  optional FillerParameter center_filler = 2; // The filler for the centers  optional int32 axis = 3 [default = 1]; //default = 1 相当于c++总的缺省初始化值。 }                /* 标签数字1和2,3表示不同的字段在序列化后的二进制数据中的布局位置。在该例中,center_filler字段编码后的数据一定位于num_output后。需要注意的是该值在同一message中不能重复。*/// 说白了,1,2,3代表了他们编码之后的顺序,小号在前,大号在后。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

最近一周会更新完毕!!


0 0
原创粉丝点击