论文题目:《A Discriminative Feature Learning Approach
for Deep Face Recognition》
论文地址:http://ydwen.github.io/papers/WenECCV16.pdf

概述

ECCV2016年的这篇文章主要是提出了一个新的Loss:Center Loss,以辅助Softmax Loss进行人脸的训练。主要就是先利用Softmax loss来分开不同类别,然后利用Center Loss来压缩某一类。最终获得discriminative features。

1. 前言

在深度学习里,深度学习网络通常被看作是特征提取器(从第1层网络层到最后一层隐藏层),提取出来的特征x随后经过线性变换(W ^T · x)得到类别分数,通过softmax层计算损失。通常,我们没有对提取出来的特征x提出太大的约束,只要它能被最后一层分类器正确分类就可以了。特征x与其类别要有什么关系,需要特征x具有什么约束,这些都没有被明确地要求或规定。Softmax损失要求特征x能够被最后一层分类器正确分类,这个对特征x的约束不是很强。当给网络传入一些对抗样本(容易被网络误识别的样本)时,网络难以分辨出这些样本属于哪类。如果从提取出来的特征来说,是因为网络从对抗样本提取出来的特征处于最后一层分类器的分类边界,或者说,网络提取出来的特征没有很强的区分度。

上图是使用Softmax loss训练,从MNIST数据集中提取出来的特征分布图。不同颜色代表不同类别的特征。图a是训练集的特征,可以看到不同类之间的特征有明显的间隔,很容易区分不同的类别。但是,图b是测试集的特征,可以看到,有些测试样本的特征位于分类器的分类边界,使得分类器难以判断样本的类别。其原因可以认为是提取的不同类别的特征没有明显的区分度,同类的特征没有紧凑地聚在一起。
       从特征特征的角度来看,为了增强网络的性能,网络提取出来的特征应该具有强的区分度(discrimination power)。怎样的特征算是有强的区分度呢?(看下图)学过聚类的朋友应该听说过,聚类的结果“簇内相似度”高且“簇间相似度”低。套用这种说法,特征应该有类内紧凑性和类间可分离性(intra-class compactness and inter-class separability)。类内紧凑性的意思是同一类的特征应该聚在一起,类间可分离性是指特征很容易划分成不同的类别。同类样本特征聚在一起,不同类特征之间的间隔更大,更容易对特征进行分类,提高网络模型的分类能力,提高鲁棒性。Softmax损失能够要求特征具有类间的可分离性,但不能约束特征的类内紧凑性。

为了约束网络提取出来的特征具有紧凑性,contrastive loss 和 triplets loss 被提出来了。contrastive loss的思想是最小化一对同类样本特征的距离,最大化一对不同样本特征之间的距离。Triplets loss则把一对变成3个。contrastive loss 和 triplets loss 需要把样本两两配对或三三组合起来,导致样本急剧增大,加长了训练的时间,提高了训练难度。

2. Center Loss

2.1. Softmax Loss

在介绍Center Loss之前先回顾一下传统的softmax loss。公式如下:


公式解释如下:
       公式(1)中:x_i是倒数第二个全连接层输出的特征向量,w和b分别为最后一个全连接层的权重和偏置,m为mini-batch的大小,n为类别个数,log函数的输入就是softmax的结果(概率),Ls表示softmax loss的结果(损失),wx+b是全连接层的输出。

2.2. Center Loss

Center Loss为每一个类别提供一个类别中心,最小化min-batch中每个样本与对应类别中心的距离,这样就可以达到缩小类内距离的目的(特征与同类别的平均特征的距离要足够小,这要求同类特征要接近它们的中心点),因此Center loss 能够直接对样本特征之间的距离进行约束。

公式解释如下:
       其中x_i表示第i个样本提取到的特征向量(倒数第二个全连接层的输出),c_yi表示样本i所对应的类别的所有样本特征的平均特征,或者说同类样本特征的中心点,m表示mini-batch的大小。因此这个公式就是希望一个batch中的每个样本的feature离feature 的中心的距离的平方和要越小越好,也就是类内距离要越小越好。

Center Loss有一个难点,就是如何计算C_yi。理论上来讲,可以通过所有的样本来为每个类别算一个中心点(即通过计算同一类别所有样本的特征,然后求平均值)。但是这种方法有以下缺点:其一是我们的训练样本非常庞大;其二是样本统计到的中心点不能代表真正的中心点,这个中心点应该随训练而动态变化(即模型在当前分类能力前提下的中心点)。因此作者提出使用mini-batch中的每个类别的平均特征来近似不同类别所有样本的平均特征,即在进行类别中心的求导时,只用当前batch中某一类别的图片来获得该类别中心的更新量。即每一个类别中心的变化只用属于这个类别的图片特征来计算。

损失L_c的梯度为公式(3)所示,公式(4)为c_j 梯度公式。

公式解释如下:
       m表示mini-batch size,δ(y_i = j)是指示函数,当j是类别类别y_i时,函数返回1,否则返回0,意思就是当y_i(表示y_i类别)和c_j的类别j不一样时,c_j是不需要更新的,只有当y_i和j一样才需要更新。分母的1是防止mini-batch中没有类别j类别的样本而导致分母为0。同时设置了一个c_j的更新速率α,控制c_j的更新速度。

训练是softmax loss结合center loss进行联合训练的,公式如下,loss的权重为lambda,用来控制二者的比重。这里的m表示mini-batch size,n表示类别数。

整体的算法流程如下:

3. 实验

对于不同的lambda值,网络提取的特征有不同的区分度效果,如下图所示,可以看到lambda越大,提取出来的特征区分度越高。

       作者也做实验探究不同lambda值和α取值对应的不同效果,如下图所示,lambda=0.003和α=0.5时对face verification任务效果更好。

● Center的计算与更新

论文中说:

In each iteration, the centers are computed by averaging the features of the corresponding classes

但是实际在实现时候却是;
       使用"xavier"进行初始化,然后用△c_j进行更新与计算,而且△c_j并不是上面说的那样进行求均值,而是通过求梯度得到的,详见公式(5),总而言之,center就像一个参数一样,先随机初始化,然后再每个迭代后在当前类别中更新一次。

【人脸识别】Center Loss详解相关推荐

  1. 【人脸识别】arcface详解

    论文题目:<ArcFace Additive Angular Margin Loss for Deep Face Recognition > 论文地址:https://arxiv.org/ ...

  2. 【人脸识别】FaceNet详解

    论文题目:<FaceNet: A Unified Embedding for Face Recognition and Clustering> 论文地址:FaceNet 1.概述 Face ...

  3. 人脸识别动画实现详解(SurfaceView + ObjectAnimator + 三角函数 = 炫酷动画)

    前言 开门见山,先来看下效果吧. 看到这么酷炫的效果图,不得不赞叹一下我们的设计师.然而,站在程序员的角度上看,除了酷炫之外更多的是复杂.但是,上面我们所看到的还只是最简单的一种形态而已.更加复杂的情 ...

  4. 关于人脸识别SDK的详解。包括【face++ 、微众、有盾等】

    其实关于三方的人脸识别SDk 来讲,都差不多,只有有点基础,跟着文档走,完全是没问题的.今天在这先给大家介绍一下有盾SDK: 很多人听到有盾SDK很陌生,其实它是连连支付下的,这下明白清楚了很多吧. ...

  5. 【人脸识别】人脸验证算法Joint Bayesian详解及实现(Python版)

    人脸验证算法Joint Bayesian详解及实现(Python版) Tags: JointBayesian DeepLearning Python 本博客仅为作者记录笔记之用,不免有很多细节不对之处 ...

  6. 【卷积神经网络CNN 实战案例 GoogleNet 实现手写数字识别 源码详解 深度学习 Pytorch笔记 B站刘二大人 (9.5/10)】

    卷积神经网络CNN 实战案例 GoogleNet 实现手写数字识别 源码详解 深度学习 Pytorch笔记 B站刘二大人 (9.5/10) 在上一章已经完成了卷积神经网络的结构分析,并通过各个模块理解 ...

  7. Python字符串对齐方法(ljust()、rjust()和center())详解

    Python字符串对齐方法(ljust().rjust()和center())详解 Python str 提供了 3 种可用来进行文本对齐的方法,分别是 ljust().rjust() 和 cente ...

  8. matlab车牌匹配时读取,基于Matlab的车牌识别(完整版)详解.doc

    基于Matlab的车牌识别(完整版)详解.doc 基于Matlab的车牌识别 摘要:车牌识别技术是智能交通系统的重要组成部分,在近年来得到了很大的发展.本文从预处理.边缘检测.车牌定位.字符分割.字符 ...

  9. 【人脸识别】L2_Softmax Loss详解

    论文题目:<L2-constrained Softmax Loss for Discriminative Face Verification> 论文地址:https://arxiv.org ...

最新文章

  1. PHP7.3中fileinfo怎么安装与开启
  2. [kuangbin带你飞]专题六 最小生成树 L - 还是畅通工程 (简单最小生成树)
  3. 记录element-ui级联选择器,二级三级列表无法显示的解决办法
  4. OpenStack 存储服务 Cinder存储节点部署LVM (十四)
  5. React-引领未来的用户界面开发框架-读书笔记(七)
  6. 【OS学习笔记】二十三 保护模式七:保护模式下任务的隔离与任务的特权级概念
  7. java安装 hello_安装JAVA步骤,并编写HELLOWORLD程序
  8. 函数节流之debounce
  9. Luogu5607 [Ynoi2013] 无力回天 NOI2017
  10. [经典好文] 谈笑色影间,人生本无忌 (转于色影无忌)
  11. 计算机应用基础学生指导评语,计算机应用基础评课稿范本
  12. ACER 4741G
  13. Frechlet Inception Distance(FID)快速入门、使用、代码
  14. [BZOJ4340][BJOI2015]隐身术(后缀数组)
  15. 在外包公司工作是什么样的体验?
  16. 对区块链技术的一些新思考
  17. Swift 第三方库整理
  18. 阿里巴巴区签约重庆,这些合作亮点你不得不知!
  19. module java.base does not opens java.lang to unnamed module @‘‘xxxxxxxx‘‘
  20. VBA-不打开工作簿提取数据

热门文章

  1. (6)verilog语言编写售货机
  2. libevent 例子,从简单到复杂
  3. winsocket(1)
  4. 使用linux_使用 AppImage 进行 Linux 软件包管理 | Linux 中国
  5. 人工智能python基础知识_AI 人工智能基础知识-习题
  6. pythonserial函数_python3.5 中serial模块的问题
  7. 【蓝桥杯嵌入式】【STM32】11_2016_第七届_蓝桥杯_省赛_电压测量监控设备
  8. 【Python】变量那些事
  9. python算法应用(五)——搜索与排名1(连接数据库及简单排名)
  10. Linux内核分析 - 网络[八补]:IP协议补充