FaceNet--Google的人脸识别

转载 2015年07月08日 11:13:46

转自:http://blog.csdn.net/stdcoutzyx/article/details/46687471

引入

随着深度学习的出现,CV领域突破很多,甚至掀起了一股CV界的创业浪潮,当次风口浪尖之时,Google岂能缺席。特贡献出FaceNet再次刷新LFW上人脸验证的效果记录。

本文是阅读FaceNet论文的笔记,所有配图均来自于论文。 

FaceNet

与其他的深度学习方法在人脸上的应用不同,FaceNet并没有用传统的softmax的方式去进行分类学习,然后抽取其中某一层作为特征,而是直接进行端对端学习一个从图像到欧式空间的编码方法,然后基于这个编码再做人脸识别、人脸验证和人脸聚类等。

FaceNet算法有如下要点:

  • 去掉了最后的softmax,而是用元组计算距离的方式来进行模型的训练。使用这种方式学到的图像表示非常紧致,使用128位足矣。
  • 元组的选择非常重要,选的好可以很快的收敛。

先看具体细节。

网络架构

大体架构与普通的卷积神经网络十分相似:

img

如图所示:Deep Architecture就是卷积神经网络去掉sofmax后的结构,经过L2的归一化,然后得到特征表示,基于这个特征表示计算三元组损失。

目标函数

在看FaceNet的目标函数前,其实要想一想DeepID2和DeepID2+算法,他们都添加了验证信号,但是是以加权的形式和softmax目标函数混合在一起。Google做的更多,直接替换了softmax。

img

所谓的三元组就是三个样例,如(anchor, pos, neg),其中,x和p是同一类,x和n是不同类。那么学习的过程就是学到一种表示,对于尽可能多的三元组,使得anchor和pos的距离,小于anchor和neg的距离。即:

img

所以,变换一下,得到目标函数:

img

目标函数的含义就是对于不满足条件的三元组,进行优化;对于满足条件的三元组,就pass先不管。

三元组的选择

很少的数据就可以产生很多的三元组,如果三元组选的不得法,那么模型要很久很久才能收敛。因而,三元组的选择特别重要。

当然最暴力的方法就是对于每个样本,从所有样本中找出离他最近的反例和离它最远的正例,然后进行优化。这种方法有两个弊端:

  • 耗时,基本上选三元组要比训练还要耗时了,且等着吧。
  • 容易受不好的数据的主导,导致得到的模型会很差。

所以,为了解决上述问题,论文中提出了两种策略。

  • 每N步线下在数据的子集上生成一些triplet
  • 在线生成triplet,在每一个mini-batch中选择hard pos/neg 样例。

为了使mini-batch中生成的triplet合理,生成mini-batch的时候,保证每个mini-batch中每个人平均有40张图片。然后随机加一些反例进去。在生成triplet的时候,找出所有的anchor-pos对,然后对每个anchor-pos对找出其hard neg样本。这里,并不是严格的去找hard的anchor-pos对,找出所有的anchor-pos对训练的收敛速度也很快。

除了上述策略外,还可能会选择一些semi-hard的样例,所谓的semi-hard即不考虑alpha因素,即:

img

网络模型

论文使用了两种卷积模型:

  • 第一种是Zeiler&Fergus架构,22层,140M参数,1.6billion FLOPS(FLOPS是什么?)。称之为NN1。
  • 第二种是GoogleNet式的Inception模型。模型参数是第一个的20分之一,FLOPS是第一个的五分之一。
  • 基于Inception模型,减小模型大小,形成两个小模型。 
    • NNS1:26M参数,220M FLOPS。
    • NNS2:4.3M参数,20M FLOPS。
  • NN3与NN4和NN2结构一样,但输入变小了。 
    • NN2原始输入:224×224
    • NN3输入:160×160
    • NN4输入:96×96

其中,NNS模型可以在手机上运行。

其实网络模型的细节不用管,将其当做黑盒子就可以了。

数据和评测

在人脸识别领域,我一直认为数据的重要性很大,甚至强于模型,google的数据量自然不能小觑。其训练数据有100M-200M张图像,分布在8M个人上。

当然,google训练的模型在LFW和youtube Faces DB上也进行了评测。

下面说明了多种变量对最终效果的影响

网络结构的不同

img

img

图像质量的不同

img

最终生成向量表示的大小的不同

img

训练数据大小的不同

img

对齐与否

在LFW上,使用了两种模式:

  • 直接取LFW图片的中间部分进行训练,效果98.87左右。
  • 使用额外的人脸对齐工具,效果99.63左右,超过deepid。

总结

  • 三元组的目标函数并不是这篇论文首创,我在之前的一些Hash索引的论文中也见过相似的应用。可见,并不是所有的学习特征的模型都必须用softmax。用其他的效果也会好。
  • 三元组比softmax的优势在于 
    • softmax不直接,(三元组直接优化距离),因而性能也不好。
    • softmax产生的特征表示向量都很大,一般超过1000维。
  • FaceNet并没有像DeepFace和DeepID那样需要对齐。
  • FaceNet得到最终表示后不用像DeepID那样需要再训练模型进行分类,直接计算距离就好了,简单而有效。
  • 论文并未探讨二元对的有效性,直接使用的三元对。

参考文献

[1]. Schroff F, Kalenichenko D, Philbin J. Facenet: A unified embedding for face recognition and clustering[J]. arXiv preprint arXiv:1503.03832, 2015.

Facenet初探

本文主要描述如何使用FaceNet验证在数据集LFW的人脸检测效果。 一、前提条件 1.已安装Tensorflow 2.已在安装下列包(二选一):     a.python下安装 scipy...
  • qq_15192373
  • qq_15192373
  • 2017年12月02日 12:27
  • 1056

基于tensorflow的人脸识别技术(facenet)的测试

人脸识别的应用非常广泛,而且进展特别快。如LFW的评测结果上已经都有快接近99.9%的。 Uni-Ubi60 0.9900 ± 0.0032 FaceNet62 0.9963 ± 0.00...
  • sparkexpert
  • sparkexpert
  • 2017年06月29日 10:56
  • 8954

tensorflow 实现人脸识别(facenet)

1.获取数据集(LFW) http://vis-www.cs.umass.edu/lfw/ 2.下载facenet并配置  1)git clone --recursive https://git...
  • tmosk
  • tmosk
  • 2017年09月25日 17:02
  • 3784

如何使用facenet

教你配置和使用facenet
  • hua18513115569
  • hua18513115569
  • 2017年10月31日 23:00
  • 3439

FaceNet--Google的人脸识别

引入随着深度学习的出现,CV领域突破很多,甚至掀起了一股CV界的创业浪潮,当次风口浪尖之时,Google岂能缺席。贡献出FaceNet再刷LFW上人脸验证的效果新高 FaceNet与其他的深度学习方法...
  • xinzhangyanxiang
  • xinzhangyanxiang
  • 2015年06月29日 21:39
  • 39271

人脸识别之FaceNet

这是一篇2015年的cvpr,FaceNet: A UnifiedEmbedding for Face Recognition and Clustering,取得了当时人脸识别的state-of-th...
  • qq_14845119
  • qq_14845119
  • 2016年11月23日 18:59
  • 9017

google facenet+ROS实现人脸识别

faceNet 实战解析facenet是google在2015年CVPR上发布的一种用于人脸识别和聚类的新架构,其主要思想是想寻求一种表示,将人脸embedding到一个128维度的空间,并且通过计算...
  • ArtistA
  • ArtistA
  • 2017年04月09日 17:32
  • 3576

人脸识别——FaceBook的DeepFace、Google的FaceNet、DeepID

DeepFace--Facebook的人脸识别 版权声明:本文为博主原创文章,未经博主允许不得转载。 目录(?)[+] 连续看了DeepI...
  • Taily_Duan
  • Taily_Duan
  • 2016年12月12日 14:23
  • 6303

使用FaceNet进行人脸检测

本文主要描述如何使用FaceNet验证在数据集LFW的人脸检测效果。 前提条件: 1.已安装Tensorflow 2.已安装下列包: scipy, scikit-learn, opencv-pytho...
  • chenhaifeng2016
  • chenhaifeng2016
  • 2017年06月14日 13:53
  • 4364

人脸识别“FaceNet: A Unified Embedding for Face Recognition and Clustering”

作者认为用于训练的三元组很重要,使用经过筛选的三元组数据训练,在LFW上识别率达到了99.63%。使用深度卷积网学习图像的欧式嵌入。方法描述: 使用了两个网络Zeiler&Fergus,Incept...
  • cv_family_z
  • cv_family_z
  • 2015年12月29日 12:33
  • 2249
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:FaceNet--Google的人脸识别
举报原因:
原因补充:

(最多只允许输入30个字)