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

本文介绍CenterLoss原理,旨在通过添加CenterLoss使softmax训练出更具内聚性的特征,提高特征的泛化性和辨别能力。文章对比了CenterLoss与其他方法,并通过实验展示了其优势。

文主要讲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

最近一周会更新完毕!!


《A Discriminative Feature Learning Approach for Deep Face Recognition》提出了一种用于深度人脸识别的判别特征学习方法,其核心内容和贡献如下: - **主要贡献**:提出了一种新的损失函数“中心损失(center loss)”,用于最小化深度特征类内距离,这是首次尝试使用此类损失函数来辅助监督卷积神经网络(CNN)的学习。在中心损失和softmax损失的联合监督下,能够获得高度判别性的特征,支持鲁棒的人脸识别,实验结果也证实了这一点。该损失函数在CNN中易于实现,CNN模型可训练,且能通过标准随机梯度下降(SGD)直接优化。在MegaFace Challenge数据集上进行了广泛实验,在小训练集评估协议下创造了新的最优水平,还验证了该方法在Labeled Faces in the Wild(LFW)和YouTube Faces(YTF)数据集上的卓越性能[^1]。 - **相关工作**:近年来,深度学习在人脸识别领域取得了一系列突破。早期有将一对人脸图像映射到距离的方法,如训练连体网络使正对相似度度量小、负对相似度度量大;Hu等人学习非线性变换并产生判别深度度量边界,但这些方法需图像对作为输入。后来,一些研究通过挑战识别信号(softmax损失函数)监督CNN学习过程,带来更丰富的与身份相关信息;部分研究采用联合识别 - 验证监督信号,得到更具判别性的特征;还有研究通过在每个卷积层添加全连接层和损失函数增强监督。三元组损失的有效性也得到证明,通过深度嵌入使锚点与正样本距离最小化、与负样本距离最大化,在LFW和YTF数据集上实现了最优性能[^1]。 - **具体方法**:在传统基于深度卷积神经网络的分类任务中,测试集的标签在训练集中都存在,特征较易分离;而人脸识别任务中,基于softmax损失得到的特征仅具可分性,为获得更具判别性的特征,作者提出中心损失以增加模型生成特征的判别性。单纯使用softmax损失只注重分类,会导致类内距离过大;单纯使用中心损失,深层特征和特征中心会衰减为0,因此需平衡两个损失函数,随着平衡参数增大,类内距离会变小[^1][^2][^4]。 ```python # 这里简单示意平衡两个损失函数的伪代码 import torch import torch.nn as nn # 假设softmax_loss和center_loss是已经定义好的损失函数 softmax_loss = nn.CrossEntropyLoss() # 这里center_loss需要根据具体定义实现 # 假设center_loss已经定义好 # 平衡参数 lambda_param = 0.1 # 假设output是模型输出,target是真实标签,features是特征 output = torch.randn(10, 5) # 示例输出,batch_size=10, num_classes=5 target = torch.randint(0, 5, (10,)) # 示例标签 features = torch.randn(10, 64) # 示例特征 # 计算softmax损失 softmax_loss_value = softmax_loss(output, target) # 计算中心损失 center_loss_value = center_loss(features, target) # 总损失 total_loss = softmax_loss_value + lambda_param * center_loss_value ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值