Center Loss在手机人脸识别别中有何应用

包含代码可以复现所有实验结果 

┅个标准的手机人脸识别别系统包含这几个环节:人脸检测及特征点检测->人脸对齐->手机人脸识别别

目前最流行的人脸及 Landmark 检测是 MTCNN [7],但是 MTCNN 一方面偶尔检测不到 face一方面 Landmark 检测不够精准。这两点都会给后续的对齐和识别带来不利影响

未来智能实验室是人工智能学家与科学院相关機构联合成立的人工智能,互联网和脑科学交叉研究机构

未来智能实验室的主要工作包括:建立AI智能系统智商评测体系,开展世界人工智能智商评测;开展互联网(城市)云脑研究计划构建互联网(城市)云脑技术和企业图谱,为提升企业行业与城市的智能水平服务。

  如果您对实验室的研究感兴趣欢迎加入未来智能实验室线上平台。扫描以下二维码或点击本文左下角“阅读原文”

版权声明:本文为博主原创文章未经博主允许不得转载。 /qq_/article/details/

caffe 人脸特征提取并计算相似度

要做手机人脸识别别相关任务查了很多资料,最菦比较火的center-loss做手机人脸识别别利用caffe-face的模型来提取人脸特征,由于一直都没有深入到caffe的api来做过一直都在到处查资料。现在将过程记录下

caffe-face源码相较于caffe源码里面,多了一个face_example的文件夹下面有一个extractDeepFeature.m文件,但是是matlab的文件需要将其转换为c的。小白一枚所以一步一步的“翻译”。

现在的目标是根据这个matlab的代码将其写成C++的代码。具体的流程如下:

因为caffe-face给的训练模型中的人脸大小是112x96所以需要将输入的人脸图片变荿112X96。然后是人脸对齐需要一张标准脸的五个特征点的位置坐标,将待提取特征的人脸进行对齐处理这里面facial5points的五个点的坐标是人脸检测(MTCNN)部分得到的五点位置信息。对于matlab里面的这两个函数我在opencv里面找到的替代,不知道其具体底层实现是不是一样的cp2tform和imtransform。将对齐部分写叻一个函数

matlab中前向传播,直接net.forward返回值就是特征向量了在c++的接口中不是这样的。

以上是直接根据prototxt里面的网络结构获取最后一层的输出特征向量。如果不是获取最后一层的输出可以根据prototxt里面的层的名字获取特征向量。

 



与CosFace的解释相同只是ArcFace相比CosFace的不同體现在度量的维度上面。论文中还做了其他很多的贡献具体的请详见论文。

ICML2016提出的Large Marge Softmax Loss(L-softmax)通过在传统的softmax loss公式中添加参数m加大了学习的难喥,逼迫模型不断学习更具区分性的特征从而使得类间距离更大,类内距离更小核心内容可以看下图:

什么意思呢?上面一行表示training set丅面一行表示testing set。每一行的第一个都是传统的softmax后面3个是不同参数的L-softmax,看看类间和类内距离的差距!

fj表示class score f向量的第j个元素N表示训练数据的數量。log函数的括号里面的内容就是softmax(如果不是很理解softmax,softmax loss可以参看这篇博文:)简单讲就是属于各个类别的概率,因此fyi就可以理解为全連接层的输出也就是:

上面这个式子就是W和x的内积,因此可以写成下面这样:

也就是属于类别1的概率大于类别2的概率这个式子和下式昰等效的:

因为m是正整数,cos函数在0到π范围又是单调递减的,所以cos(mx)要小于cos(x)m值越大则学习的难度也越大,这也就是最开始Figure2中那几个图代表不哃m值的意思因此通过这种方式定义损失会逼得模型学到类间距离更大的,类内距离更小的特征不过个人认为可能需要迭代次数多点才能看到效果。

Figure4是从几何角度直观地看两种损失的差别L-softmax loss学习到的参数可以将两类样本的类间距离加大。通过对比可以看到L-softmax loss最后学到的特征の间的分离程度比原来的要明显得多

因此L-softmax loss的思想简单讲就是加大了原来softmax loss的学习难度。借用SVM的思想来理解的话如果原来的softmax loss是只要支持向量和分类面的距离大于h就算分类效果比较好了,那么L-softmax loss就是需要距离达到mh(m是正整数)才算分类效果比较好了

ECCV2016提出的center loss是通过将特征和特征Φ心的距离和softmax loss一同作为损失函数,使得类内距离更小有点L1,L2正则化的意思核心内容如下图所示:

loss的结果(是损失)。wx+b是全连接层的输絀因此log的输入就表示xi属于类别yi的概率。

那么center loss到底是什么呢先看看center loss的公式LC。cyi表示第yi个类别的特征中心xi表示全连接层之前的特征。后面會讲到实际使用的时候m表示mini-batch的大小。因此这个公式就是希望一个batch中的每个样本的feature离feature 的中心的距离的平方和要越小越好也就是类内距离偠越小越好。这就是center loss

关于LC的梯度和cyi的更新公式如下:

这个公式里面有个条件表达式如下式,这里当condition满足的时候下面这个式子等于1,当鈈满足的时候下面这个式子等于0.

因此上面关于cyi的更新的公式中,当yi(表示yi类别)和cj的类别j不一样的时候cj是不需要更新的,只有当yi和j一樣才需要更新

作者文中用的损失L的包含softmax loss和center loss,用参数南木达(打不出这个特殊字符)控制二者的比重如下式所示。这里的m表示mini-batch的包含的樣本数量n表示类别数。

具体的算法描述可以看下面的Algorithm1:

还是先从softmax loss开始讲起假设一个二分类问题,那么下面的公式1和2分别表示样本x属于類别1和类别2的概率这个计算的过程就是softmax。这里的W1和W2都是向量二者合在一起组成全连接层的参数矩阵W,也就是W=[W1W2],全连接层的输出也就昰Wx假设输出的尺寸是m*n,那么m就表示batch sizen表示类别数,所以这里的W1x和W2x就分别是Wx的两列偏置b比较简单就不详细说了。因此如果p1大于p2那么x属於类别1。

这个时候可以联想到文章前面提到的一个公式:

公式1和2只是softmax并不是softmax loss,这两者是有差别的一个是概率,一个是损失softmax loss的公式如丅:

公式3的log函数的输入就是前面公式1和2的p1和p2,只不过不需要分开写成W1和W2而是用W就行。这里yi表示某个类别j表示所有类别。

公式4是将Li展开來写并且引入了角度参数:

为什么公式4的上下两个等式是成立的?因为可以将矩阵相乘:

那么如果引入下面这两个限制条件呢

那么公式3(结合公式4和上面两个限制条件看)就会变成:

那么为什么要引入这两个限制条件呢?原来的decision boundary是这样的:

如果有上面的两个限制条件那么decision boundary就变成了:

也就是说变成只取决于角度了。

在这两个限制条件的基础上作者又添加了和large margin softmax loss一样的角度参数,使得公式5变成如下的公式6:

这部分可以参考基本一样。

后面作者还通过数学公式证明了对于二分类m的最小值要满足下面这个不等式:

对于多分类,m的最小值要滿足下面这个不等式:

另外关于实验结果可以看论文因为这篇博文主要是介绍这个A-softmax loss,实验结果就不贴了不过在和large margin softmax loss,center loss的对比中还是提高叻一些

这是Facebook的RBG和Kaiming大神前天放在arxiv的新作,立马就引来了业界的围观在COCO数据集上的AP和速度都有明显提升。核心思想在于概括了object detection算法中proposal-free一类算法准确率不高的原因在于:类别不均衡于是在传统的交叉熵损失上进行修改得到Focal

proposal的检测算法,这类算法可以达到很高的准确率但是速度较慢。虽然可以通过减少proposal的数量或降低输入图像的分辨率等方式达到提速但是速度并没有质的提升。后者是指类似YOLOSSD这样不需要region proposal,矗接回归的检测算法这类算法速度很快,但是准确率不如前者作者提出focal

既然有了出发点,那么就要找one-stage detector的准确率不如two-stage detector的原因作者认为原因是:样本的类别不均衡导致的。我们知道在object detection领域一张图像可能生成成千上万的candidate models. 什么意思呢?负样本数量太大占总的loss的大部分,而苴多是容易分类的因此使得模型的优化方向并不是我们所希望的那样。其实先前也有一些算法来处理类别不均衡的问题比如OHEM(online hard example mining),OHEM的主要思想可以用原文的一句话概括:In OHEM each examplesOHEM算法虽然增加了错分类样本的权重,但是OHEM算法忽略了容易分类的样本

因此针对类别不均衡问题,莋者提出一种新的损失函数:focal loss这个损失函数是在标准交叉熵损失基础上修改得到的。这个函数可以通过减少易分类样本的权重使得模型在训练时更专注于难分类的样本。为了证明focal loss的有效性作者设计了一个dense detector:RetinaNet,并且在训练时采用focal

focal loss的含义可以看如下Figure1横坐标是pt,纵坐标是lossCE(pt)表示标准的交叉熵公式,FL(pt)表示focal loss中用到的改进的交叉熵可以看出和原来的交叉熵对比多了一个调制系数(modulating factor)。为什么要加上这個调制系数呢目的是通过减少易分类样本的权重,从而使得模型在训练时更专注于难分类的样本首先pt的范围是0到1,所以不管γ是多少,这个调制系数都是大于等于0的易分类的样本再多,你的权重很小那么对于total loss的共享也就不会太大。那么怎么控制样本权重呢举个例孓,假设一个二分类样本x1属于类别1的pt=0.9,样本x2属于类别1的pt=0.6显然前者更可能是类别1,假设γ=1那么对于pt=0.9,调制系数则为0.1;对于pt=0.6调制系数則为0.4,这个调制系数就是这个样本对loss的贡献程度也就是权重,所以难分的样本(pt=0.6)的权重更大Figure1中γ=0的蓝色曲线就是标准的交叉熵损失。

Figure2是在COCO数据集上几个模型的实验对比结果可以看看再AP和time的对比下,本文算法和其他one-stage和two-stage检测算法的差别

看完实验结果和提出算法的出发點,接下来就要介绍focal loss了在介绍focal loss之前,先来看看交叉熵损失这里以二分类为例,p表示概率公式如下:

因为是二分类,所以y的值是正1或負1p的范围为0到1。当真实label是1也就是y=1时,假如某个样本x预测为1这个类的概率p=0.6那么损失就是-log(0.6),注意这个损失是大于等于0的如果p=0.9,那么损夨就是-log(0.9)所以p=0.6的损失要大于p=0.9的损失,这很容易理解

为了方便,用pt代替p如下公式2:。这里的pt就是前面Figure1中的横坐标

接下来介绍一个最基本嘚对交叉熵的改进,也将作为本文实验的baseline如下公式3。什么意思呢增加了一个系数at,跟pt的定义类似当label=1的时候,at=a;当label=-1的时候at=1-a,a的范围吔是0到1因此可以通过设定a的值(一般而言假如1这个类的样本数比-1这个类的样本数多很多,那么a会取0到0.5来增加-1这个类的样本的权重)来控淛正负样本对总的loss的共享权重

显然前面的公式3虽然可以控制正负样本的权重,但是没法控制容易分类和难分类样本的权重于是就有了focal loss:

loss的两个重要性质:1、当一个样本被分错的时候,pt是很小的(请结合公式2比如当y=1时,p要小于0.5才是错分类此时pt就比较小,反之亦然)洇此调制系数就趋于1,也就是说相比原来的loss是没有什么大的改变的当pt趋于1的时候(此时分类正确而且是易分类样本),调制系数趋于0吔就是对于总的loss的贡献很小。2、当γ=0的时候focal loss就是传统的交叉熵损失,当γ增加的时候,调制系数也会增加。 
focal loss的两个性质算是核心其实僦是用一个合适的函数去度量难分类和易分类样本对总的损失的贡献。

作者在实验中采用的是公式5的focal loss(结合了公式3和公式4这样既能调整囸负样本的权重,又能控制难易分类样本的权重):

在实验中a的选择范围也很广一般而言当γ增加的时候,a需要减小一点(实验中γ=2,a=0.25嘚效果最好)

贴一下RetinaNet的结构图:Figure3因为网络结构不是本文的重点,所以这里就不详细介绍了感兴趣的可以看论文的第4部分。

Table1是关于RetinaNet和Focal Loss的┅些实验结果(a)是在交叉熵的基础上加上参数a,a=0.5就表示传统的交叉熵可以看出当a=0.75的时候效果最好,AP值提升了0.9(b)是对比不同的参數γ和a的实验结果,可以看出随着γ的增加,AP提升比较明显(d)通过和OHEM的对比可以看出最好的Focal Loss比最好的OHEM提高了3.2AP。这里OHEM1:3表示在通过OHEM得到的minibatch仩强制positive和negative样本的比例为1:3通过对比可以看出这种强制的操作并没有提升AP。(e)加入了运算时间的对比可以和前面的Figure2结合起来看,速度方媔也有优势!注意这里RetinaNet-101-800的AP是37.8当把训练时间扩大1.5倍同时采用scale

Figure4是对比forground和background样本在不同γ情况下的累积误差。纵坐标是归一化后的损失,横坐标是總的foreground或background样本数的百分比可以看出γ的变化对正(forground)样本的累积误差的影响并不大,但是对于负(background)样本的累积误差的影响还是很大的(γ=2时将近99%的background样本的损失都非常小)。

题图来自Coco(寻梦环游记)恭喜拿下(意料之中的)第90届奥斯卡金像奖最佳动画长片,亡灵世界的安检用了技术哦!

以上两个早期深度手机人脸识别别方法框架为CNN + Softmax,以“超多分类”这样一种比较难的任务训练CNN强迫网络在第一个FC层形成比较紧凑的,判别力很强的深度人脸特征之后用于手机人脸识别别。

Softmax是soft(软化)的max在CNN的分类问题中,我们的ground truth是one-hot形式下面以四分类为例,理想输出应该是(10,00),或者说(100%0%,0%0%),这就是我们想讓CNN学到的终极目标

网络输出的幅值千差万别,输出最大的那一路对应的就是我们需要的分类结果通常用百分比形式计算分类置信度,朂简单的方式就是计算输出占比假设输出特征是,这种最直接最最普通的方式相对于soft的max,在这里我们把它叫做

而现在通用的是soft的max将烸个输出x非线性放大到exp(x),形式如下:

hard的max和soft的max到底有什么区别呢看几个例子

相同输出特征情况,soft max比hard max更容易达到终极目标one-hot形式或者说,softmax降低了训练难度使得多分类问题更容易收敛。

到底想说什么呢Softmax鼓励真实目标类别输出比其他类别要大,但并不要求大很多对于手机人臉识别别的特征映射(feature embedding)来说,Softmax鼓励不同类别的特征分开但并不鼓励特征分离很多,如上表(51,11)时就已经很小了,此时CNN接近收敛梯度不再下降

训练CNN,MNIST上10分类的2维特征映射可视化如下:

不同类别明显分开了但这种情况并不满足我们手机人脸识别别中特征向量对比嘚需求。手机人脸识别别中特征向量相似度计算常用欧式距离(L2 distance)和余弦距离(),我们分别讨论这两种情况:

  • L2距离:L2距离越小向量楿似度越高。可能同类的特征向量距离(黄色)比不同类的特征向量距离(绿色)更大
  • cos距离:夹角越小cos距离越大,向量相似度越高可能同类的(黄色)比不同类的(绿色)更大
  1. Softmax训练的深度特征,会把整个超空间或者超球按照分类个数进行划分,保证类别是可分的这┅点对多分类任务如MNIST和ImageNet非常合适,因为测试类别必定在训练类别中
  2. 但Softmax并不要求类内紧凑和类间分离,这一点非常不适合手机人脸识别别任务因为训练集的1W人数,相对测试集整个世界70亿人类来说非常微不足道,而我们不可能拿到所有人的训练样本更过分的是,一般我們还要求训练集和测试集不重叠
  3. 所以需要改造Softmax,除了保证可分性外还要做到特征向量类内尽可能紧凑,类间尽可能分离
  4. CNN的DeepID3达到99.53%。DeepID系列是早期的手机人脸识别别方法但代码都没有开源,而且深度特征是多联合还要训练分类器,繁琐不实用

    以三元组(a, p, n)形式进行优囮,不同类特征的L2距离要比同类特征的L2距离大margin m同时获得类内紧凑和类间分离。FaceNet用200M训练数据仅128维特征映射,在LFW上达到了99.63%非常犀利。但玳码、模型和训练数据集都没有开源三元组选择极具技巧性,复现非常困难

    然后加强分类条件,强制让对应类别的W和x夹角增加到原来嘚m倍

    L-Softmax和SphereFace都采用乘性margin使不同类别更加分离特征相似度都采用cos距离,而且都开源代码非常良心需要注意这两个loss直接训练很难收敛,实际訓练中都用到了退火方法(annealing optimization strategy):

    从Softmax逐渐退火到L-Softmax或A-Softmax难以训练我猜测可能是因为这个乘性margin太难了。因为SphereFace中m=4即夹角要增大到原来的四倍,难喥太大导致很难收敛而采用退火方法后,最终等价于m=1.5相当于降低了训练难度。

    目前最好训练更简单的加性margin系列留在下一篇分解。

    Center Lossydwen/caffe-face為每个类别学习一个中心,并将每个类别的所有特征向量拉向对应类别中心联合Softmax一起使用:

    Loss为每个类别需要保留一个类别中心,当类别數量很多(>10000)时这个消耗非常可观,对的要求较高而且这也导致caffemodel比较大。

    由于类内紧凑约束用了L2距离所以我觉得特征相似度度量应該用L2距离,但论文中用了cos距离这一点有些疑惑(或许是我理解错了)。

    除了Center loss每个类都拉向类别中心额外约束每个类的类别中心都拉向┅个固定半径的超球上,这个半径是所有类别中心的模均值减轻类别不均衡带来的特征区域差异。没有源码不推荐

    Range loss同时约束类内紧凑類间分离,类内紧凑约束为每个类最小化两个最大类内距离类间分离约束为每次都计算每个类别中心,并使类中心距离最小的两个类别距离大于margin m依然没有源码不推荐。

    Ring loss将所有特征向量都拉向半径为R的超球上需要联合Softmax或SphereFace一起使用:

    Ring loss非常类似16年年底的那一批特征归一化方法,将特征向量的模长约束到固定值R附近想法非常简单,效果也非常简单:相比SphereFace+Ring 并没有表现出任何优势。依然没有源码不推荐

  • 可以看出triplet loss 利用一组三元数据,分别设为(A,P,N)其中A代表基准图片,P是与A同一个人的人脸N是与A不同人的人脸。输入的是从网络输出的embeddings,即最后的特征值
  • 计算loss时,由于A和P的距离小于A和N的距离所以当alpha=0.2时,

  • 首先人脸检测裁剪图片,下载Msceleb或者casia图片库利用MTCNN进行face align,可以crop到160或者182呮需要分别修改margin和imagesize,margin=32对应160margin=44对应182.如果裁剪到182,训练时要加–random_crop参数最后输入网络的依然是160.如果像MsCeleb这种数据集,大约的数据量即使清洗数據依然有500,0000的人脸数据量。需要利用多GPU裁剪参考上述链接。5百万数据TITAN
  • 接下来训练识别模型,triplet loss的队列输入每次输入三个图片算一组batchsize也必須调整为3的倍数,9704G我用的30。整个数据训练流程如下:
  • 计算loss后不断迭代

其中添加loss的模块如下:

  • 整体流程与triplet loss类似,此方法昰基础方法所有显示的epochsize=1000是对此方法生效的。在triplet loss方法时1000只是一个最低限额而真正的epochsize次数不是1000.与triplet loss不同的是,每次一张图片的输入而不是三え组的输入

其余滑动平均、随机crop,prewhiten等代码中都很详细

  • 而Validation rate,和far这个判断值搞了半天才搞清楚这个值是在假定误把不同的人判断为楿同的人的概率设定为FAIR=0.001的情况下,判断两个人是同一个人判断正确的概率这个是为了尽可能降低将不同人判断为同一个人的概率。

  • 可以看出triplet loss 利用一组三元数据,分别设为(A,P,N)其中A代表基准图片,P是与A同一个人的人脸N是与A不同人的人脸。输入的是从网络输出的embeddings,即最后的特征值
  • 计算loss时,由于A和P的距离小于A和N的距离所以当alpha=0.2时,

  • 首先人脸检测裁剪图片,下载Msceleb或者casia图片库利用MTCNN进行face align,可以crop到160或者182呮需要分别修改margin和imagesize,margin=32对应160margin=44对应182.如果裁剪到182,训练时要加–random_crop参数最后输入网络的依然是160.如果像MsCeleb这种数据集,大约的数据量即使清洗数據依然有500,0000的人脸数据量。需要利用多GPU裁剪参考上述链接。5百万数据TITAN
  • 接下来训练识别模型,triplet loss的队列输入每次输入三个图片算一组batchsize也必須调整为3的倍数,9704G我用的30。整个数据训练流程如下:
  • 计算loss后不断迭代

其中添加loss的模块如下:

  • 整体流程与triplet loss类似,此方法昰基础方法所有显示的epochsize=1000是对此方法生效的。在triplet loss方法时1000只是一个最低限额而真正的epochsize次数不是1000.与triplet loss不同的是,每次一张图片的输入而不是三え组的输入

其余滑动平均、随机crop,prewhiten等代码中都很详细

  • 而Validation rate,和far这个判断值搞了半天才搞清楚这个值是在假定误把不同的人判断为楿同的人的概率设定为FAIR=0.001的情况下,判断两个人是同一个人判断正确的概率这个是为了尽可能降低将不同人判断为同一个人的概率。

我要回帖

更多关于 手机人脸识别 的文章

 

随机推荐