FaceNet--Google的人脸识别
FaceNet--Google的人脸识别
引入
随着深度学习的出现,CV领域突破很多,甚至掀起了一股CV界的创业浪潮,当次风口浪尖之时,Google岂能缺席。特贡献出FaceNet再次刷新LFW上人脸验证的效果记录。
本文是阅读FaceNet论文的笔记,所有配图均来自于论文。
转载请注明:http://blog.csdn.net/stdcoutzyx/article/details/46687471
FaceNet
与其他的深度学习方法在人脸上的应用不同,FaceNet并没有用传统的softmax的方式去进行分类学习,然后抽取其中某一层作为特征,而是直接进行端对端学习一个从图像到欧式空间的编码方法,然后基于这个编码再做人脸识别、人脸验证和人脸聚类等。
FaceNet算法有如下要点:
- 去掉了最后的softmax,而是用元组计算距离的方式来进行模型的训练。使用这种方式学到的图像表示非常紧致,使用128位足矣。
- 元组的选择非常重要,选的好可以很快的收敛。
先看具体细节。
网络架构
大体架构与普通的卷积神经网络十分相似:
如图所示:Deep Architecture就是卷积神经网络去掉sofmax后的结构,经过L2的归一化,然后得到特征表示,基于这个特征表示计算三元组损失。
目标函数
在看FaceNet的目标函数前,其实要想一想DeepID2和DeepID2+算法,他们都添加了验证信号,但是是以加权的形式和softmax目标函数混合在一起。Google做的更多,直接替换了softmax。
所谓的三元组就是三个样例,如(anchor, pos, neg),其中,x和p是同一类,x和n是不同类。那么学习的过程就是学到一种表示,对于尽可能多的三元组,使得anchor和pos的距离,小于anchor和neg的距离。即:
所以,变换一下,得到目标函数:
目标函数的含义就是对于不满足条件的三元组,进行优化;对于满足条件的三元组,就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因素,即:
网络模型
论文使用了两种卷积模型:
- 第一种是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上也进行了评测。
下面说明了多种变量对最终效果的影响
网络结构的不同
图像质量的不同
最终生成向量表示的大小的不同
训练数据大小的不同
对齐与否
在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--Google的人脸识别相关推荐
- Centerface + Facenet实现视频人脸识别(附代码)
Centerface + Facenet实现视频人脸识别 Facenet的pytorch版本:GitHub地址:https://github.com/timesler/facenet-pytorch ...
- 视觉识别入门之人脸识别——基于FACENET的高精度人脸识别
视觉识别入门之人脸识别---- 基于FACENET的高精度人脸识别 一:项目展示: - 这是实时视频读取的展示,是可以读单张图片,或者本地视频流,抑或是实时人脸检测与分类的,至于我为什么不展示我的自拍 ...
- python人脸识别库_基于facenet的实时人脸识别系统
facenet_facerecognition opencv+mtcnn+facenet+python+tensorflow 实现实时人脸识别 Abstract:本文记录了在学习深度学习过程中,使用o ...
- 基于FaceNet的实时人脸识别训练
FaceNet人脸特征提取 FaceNet是一种用于提取人脸图像特征的深度神经网络.它由谷歌研究人员 Schroff 等人提出. 论文地址:https://arxiv.org/abs/1503.038 ...
- facenet + Mtcnn 实现人脸识别(实现步骤)
网上关于facenet以及Mtcnn原理的博客有很多,本文便不再赘述,如果有不明白的可以参考该博客http://www.uml.org.cn/ai/201806124.asp. 本文更多的是帮助大家使 ...
- 【项目实战】Python基于MTCNN+FaceNet+SVM进行人脸识别项目实战
说明:这是一个机器学习实战项目(附带数据+代码+文档+视频讲解),如需数据+代码+文档+视频讲解可以直接到文章最后获取. 1.项目背景 人脸识别的现代研究始于20世纪60年代末.在近20年,随着计算机 ...
- 机器学习20:基于ResNet50和FaceNet实现人脸识别
说明: 这是优达学城的一个机器学习作业项目, 我觉得还比较典型综合了几个常见的深度学习技术,值得分享一下:实现包括,数据增广,迁移学习,网络模型构建,训练,评估方法等. 这里只是做了一个迁移学习的实现 ...
- 利用MTCNN和facenet实现人脸检测和人脸识别
利用MTCNN和facenet实现人脸检测和人脸识别 人脸检测和人脸识别技术算是目前人工智能方面应用最成熟的技术了.本博客将利用mtcnn和faceNet搭建一个实现人脸检测和人脸识别的系统.基本思路 ...
- 如何在 Keras 中使用 FaceNet 开发人脸识别系统
https://www.infoq.cn/article/4wT4mNvKlVvEQZR-JXmp Keras 是一个用 Python 编写的高级神经网络 API,能够以 TensorFlow.CNT ...
- facenet训练自己的数据_基于SSD与Facenet的人脸识别
小方哥-AI人工智能模式识别算法 系统介绍 随着深度学习的日益发展,人脸识别的技术越来越趋于成熟.基于人脸识别的也伴随着众多的应用,比如说基于人脸识别的工厂打卡或者签到系统:基于人脸识别的五官定位以及 ...
最新文章
- html5表单实例元素,HTML5新表单元素的图文实例-
- oracle 11g goldengate DML单向复制测试环境搭建
- 简单module_深入理解JavaScript之全面解析Module模式
- SAP S/4HANA Cloud SDK 入门介绍
- 技术分享:开源矿工的超频
- docker安装mysql8_Centos7-Docker-安装Mysql8
- excel制作跨职能流程图_用Excel规划求解工具,实现组合投资优化
- jvm 初始化之 cinit , init
- 下载m3u8加密视频
- 拓扑排序以及拓扑排序算法
- python如何计算等额本息还款_等额本息还款方式计算
- Simulink中步长、powergui采样时间、模块采样时间、控制周期的关系
- 解决viewUI中 DatePicker控件获取的日期总是少一天的问题
- 发现薪资被倒挂!跳槽还是等待?
- MATLAB运用——多项式插值
- NETCore项目报错 An error occurred while starting the application
- 关于RInda和dRuby(DRB)
- 天正显示无法连接服务器,如何修改天正的网络服务器地址
- ARM Cortex A7 架构简介
- 打造自己的JavaScript武器库
热门文章
- 文科学业水平测试题软件,学业水平测试:文科备战理科篇
- spark 提交任务到集群
- DPVS_DPVS配置说明
- Leetcode 125. 验证回文串 (每日一题 20210816)
- 机器学习笔记 :LSTM 变体 (conv-LSTM、Peephole LSTM、 coupled LSTM、conv-GRU)
- pytorch 笔记:torch_geometric (1)创建一张图
- 从C语言的角度重构数据结构系列(八)-数据结构堆知识超级丑数
- Leetcode每日必刷题库第3题,如何实现无重复字符的最长子串?
- 深度学习核心技术精讲100篇(十七)-多标准中文分词( Multi-Criteria-CWS)
- MapReduce编程实战之“高级特性”