1. Abstract

好久没有在简书上写文章,最近在弄关于人脸识别的内容和研读一些论文。碰巧Apple的新iPhone X搭配了Face ID进行刷脸,我有一个想法,给Android做一个类似的Face ID。我这里主要使用2015年Google发的一篇论文FaceNet: A Unified Embedding for Face Recognition and Clustering 和2017年Google发布的一个MobileNet模型MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications。

2. Method and Related Work

2.1. FaceNet

FaceNet是一个Face identification的训练模型。我认为其最大的不同是损失函数。在我现阶段的知识范畴里面,Face Recognition通常的训练方法是利用softmax函数做分类,然后用cross_entropy作为损失函数(使用max likelihood)。然而在Face identification中是不太符合的,因为我们需要的判断两张脸是否相同,而不是判断这个脸的类别,因此我们需要计算两张脸之间的相似度,通过给定的threshold判断是否为同一个人。这才是identification的需要。

2.1.1 Triplet Loss

triplet loss就是代替我们熟悉的cross_entropy损失函数,作为训练网络模型的损失函数。我们组织三元组(anchor, positive, negative)作为一个样本,其中anchor为基准人脸图片,positive与anchor都是同一个人的图片,negative与anchor不是同一人的照片。我们希望anchor与positive的距离小于anchor与negative的距离。

anchor与positive的距离小于anchor与negative的距离

这里的alpha是一个positive距离和negative距离之间margin。因此我们有这样一个损失函数:

Triplet Loss

若 anchor和positive的距离 + alpha值 <= anchor和negative的距离,Triplet Loss就为正,若大于alpha值Triplet Loss为0。

Triplet learning

这是Triplet Loss学习的目标,anchor作为标准,positive与anchor是同类,negative与anchor不同。简单来说,我们尽可能让negative远离anchor,让positive靠近anchor。

2.1.2 Triplet Selection

对于Triplet Loss这个损失函数,我们需要选择一个合理的三元组。假如我们选择一个满足损失函数的三元组,那么Triplet Loss总是为0而且其梯度也是为0。因此我们需要选择一个违背Triplet Loss的三元组进行训练,这样才有意义。那么我就选择一组 anchor与negative的距离 - anchor与positive的距离 < alpha。选择步骤如下:

  1. 我们选择anchor和positive应该是针对有多张人脸照片的人,在这个人的人脸照片中两两组合成为<anchor, positive>的二元组
  2. 根据选择好的<anchor, positive>的二元组后,我们计算其他照片与<anchor, positive>差距小于alpha的negative。由于每pair <anchor, positive>都可能存在多个negative照片。我们每次随机选取一个negative组成<anchor, positive, negative>,因为可以保证我们尽可能学习每一张图片避免了poor training。
  3. 对于以上步骤我们在每一个mini batch的时候需要重新计算一次,因为这种组成<anchor, positive, negative>是很多的。假如有100个人,每个人有平均有4张照片,我们起码有100 * 4 * 3 / 2 = 600个。这是很不适合一次性计算全局所有的triplet sample。因此我们每次从不同人取照片样本和学习完一遍triplet sample时,应该重新计算获得triplet sample。这样才有机会学习不同的triplet sample。

2.2 MoblieNet

MoblieNet是Google今年4月出的内容,它是对CNNs在尽可能减少其准确率的情况下去缩减模型的MFLOPs和Million parameters。其当中主要的方法有两个:

  • 1 x 1 convolution
  • depthwise convolution
    其实这两个不是什么新的东西,在Inception v1 到 v4都有出现过。但是没想到两者结合可以如此有效。

Depthwise + Pointwise

假设输入数据大小为D_F × D_F × M,而最后需要输出是大小为D_F × D_F × N。如上图,标准的卷积操作需要运算时间大约是:

standard convolutions have the computational cost

而在MobileNet中,我们先对数据进行depthwise convolution操作,所谓的depthwise convolution就是有M个D_K × D_K × 1的filter对输入对应的channel进行卷积操作,如下图:

Depthwise convolution

最后得到一个D_F × D_F × M features map。
接下来我们就对depthwise convolution操作后得到的features map进行一个1 x 1的卷积操作,每个filter kernel的大小为1 x 1 x M一共N这个的kernel。最后我们就得到一个大小为D_F × D_F × N的features map。

与标准卷积操作得到相同大小的features map,但是计算复杂度为:

depthwise convolutions + pointwise convolution

第一项是depthwise conv的计算复杂度,第二项是pointwise conv的计算复杂度。对比起标准的卷积操作,我们需要的浮点计算量和参数存取容量少了很多:

浮点运算量对比

左图是标准卷积后再进行Batch Normal和ReLu操作,右图是没进行一次卷积都进行Batch Normal和ReLu操作

按照论文里面说:理论上,相比于标准卷积操作少8到9倍的运算量,足够在移动设备上面运行。但作者认为还可以再继续把运算量降下去,那就是使用Width Multiplier。所谓的width multiplier,就是一个标量乘子,它的目的是减少每层channel的数量。本来该层有64 channels,而我们设置的width multiplier为0.5,那么该层有32 channels,但同时模型的精确度也会相应的降低。

在github上面我们可以找到mobileNet用tensorflow的实现:https://github.com/Zehaos/MobileNet。

这是MobileNet对不同年份ImageNet winner进行对比

我们可以看到当MobileNet的width multiplier为1且image大小为224 x 224时,其得分超越了GoogleNet。那是多么振奋人心的事情。

3. IDea

其实很明显我们就是用FaceNet的tripletloss作为损失函数,用MobileNet作为CNNs模型进行训练,最后嵌入到android手机上。而Face detection我们使用android sdk上面的FaceDetectionListener来进行人脸检测。获取到最主要Face(可以采用面积最大作为主要主要的Face)的矩阵我们进行一些对齐操作以后,我们就可以放入网络当中获得该脸的embedding向量。在录入Face ID信息时(也就是获取embedding向量时),我们需要多次录入同一个脸的信息,因为多个embedding我们可以增加判断的鲁棒性,或者你对这些embedding求一个平均值来作为最终的Face ID,当然这只是一个baseline啦。要记住以防那些搞事的人用不同的人脸录入信息,我们需要在每次录入后判断该次录入脸部信息(embedding向量)与之前几次的embedding向量的欧式距离是否小于某一个threshold。好啦,最后我们就是在解锁时候,获取主要人物的脸部图片求出对应的embedding向量再与录入时的embedding算他们之间欧式距离是否小于某一个threshold值,若小于我们可以判断该人是同一个人,解锁,否则相反。

4. Conclusion

在MobileNet的论文当中,我们可以看到作者也把MobileNet融入到FaceNet进行训练,相对于苹果iPhone X而言,Google早已对移动设备进行Face identification做好了准备。其结果如下:

MobileNet 在FaceNet当中的效果

其实MobileNet是17年4月份的产物,相对比较新的是Face++的shuffleNet。它是基于MobileNet的一个移动设备上面的CNNs,无论模型的浮点运算量还是在ImageNet上面的准确率都比MobileNet更胜一筹。shuffleNet加入的group操作后使得卷积操作更加快和轻,这里我就不详细解释啦,毕竟我还没认真看,我总结完的话有机会跟大家分享一下。

很抱歉,因为我个人时间和能力有限,仅仅用LFW的数据集对MobileNet的模型进行训练,但还没融入到android手机上面。可能我们还需一些时间去学习和完成相关的android代码。假如我写出来希望能分享给各位。

5. References

  • FaceNet: A Unified Embedding for Face Recognition and Clustering
  • MobileNets: Efficient Convolutional Neural Networks for Mobile Vision
    Applications
  • ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices

作者:Salon_sai
链接:https://www.jianshu.com/p/62514315757f
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

Android制造 FaceID [FaceNet + MobileNet]相关推荐

  1. 为什么Android Geeks购买Nexus设备

    The Galaxy S III is the highest-selling Android phone, but much of the geeky buzz is around the Nexu ...

  2. 创建支持多种屏幕尺寸的Android应用

    负责人:冰凝 原文链接:http://developer.android.com/guide/practices/screens_support.html Android涉及各种各样的支持不同屏幕尺寸 ...

  3. android 更改字体_如何在Android中更改字体

    android 更改字体 Ben Stockton 本·斯托克顿 Android offers plenty of options to customize the appearance of you ...

  4. ym——Android怎样支持多种屏幕

    转载请注明本文出自Cym的博客(http://blog.csdn.net/cym492224103),谢谢支持! 原文链接:http://developer.android.com/guide/pra ...

  5. Android如何支持多种屏幕

    支持多屏 Android涉及各种各样的支持不同屏幕尺寸和密度的设备.对于应用程序,Android系统通过设备和句柄提供了统一的开发环境,大部分工作是校正每一个应用程序的用户界面到它显示的屏上.与此同时 ...

  6. 适用于 Visual Studio 的 Android 游戏开发扩展

    在 Windows 计算机上设置 Android 游戏开发扩展并在 Android 设备或模拟器上运行示例 Visual Studio C++ 项目. 先决条件 按照本节中的步骤准备您的 Window ...

  7. ym——Android如何支持多种屏幕

    转载请注明本文出自Cym的博客(http://blog.csdn.net/cym492224103),谢谢支持! 原文链接:http://developer.android.com/guide/pra ...

  8. Beginning Android

    Beginning Android   译:Android起航 1.     Using XML-Based Layouts    译:使用XML进行布局 While it is technicall ...

  9. Android Studio 如何导出和导入自己的常用设置,避免重复制造轮子。加快开发速度...

    Android Studio 如何导出和导入自己的常用设置,避免重复制造轮子.加快开发速度 作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985 在使用 A ...

最新文章

  1. 树莓派教程之树莓派系统镜像刷入和远程登陆(1)
  2. 数据库系统概念总结:第一章 引言
  3. 在表空间有足够free space的情况下出现ORA-1652
  4. 微服务、SOA 和 API对比与分析
  5. 素数环 与 算法 全排列
  6. java hung_java – Hung JVM消耗100%的CPU
  7. Java的native方法-----你必须要知道的JAVA知识
  8. 小米获京东自营安卓平板销量冠军 小米平板5 Pro全版本闪降100元
  9. 开滦二中2021高考成绩查询,2021唐山中考录取分数线查询
  10. icem二维非结构网格划分_“白皮书”系列No.26——科研小工具之ICEM
  11. 树莓派modelB无法识别exFat格式的SD卡
  12. okfone 解密大师系列软件
  13. 内存颗粒位宽和容量_DDR4内存终极解析(一)--DDR4内存颗粒
  14. (自我介绍范文)java面试自我介绍
  15. 什么是PLC?可编程控制器的结构和工作原理介绍
  16. 天猫精灵智能家居对接,及天猫iot官网配置图文讲解(一)
  17. github加速神器
  18. 国民技术 MCU JLink仿真调试环境配置
  19. Java实现窗口框架,转换金额的大小写
  20. 山威SDUWH高性能计算课程HPL HPCC软件快速安装脚本

热门文章

  1. 面试官:说说你项目的API如何封装的?你:欸,纳尼??什么是API【一文带你详解API】【Java养成】
  2. springboot文献综述
  3. 深入聊聊微服务架构的身份认证问题
  4. RK3326[Android 8.1],获取BT、WIFI地址
  5. 伺服电机向前三秒,向后三秒,循环往复
  6. 比Teambition、Worktile 更适合研发团队的几大工具盘点
  7. Bootstrap 一篇就够 快速入门使用(中文文档)
  8. 1exe1.net - 1个exe文件搞定1切
  9. 使用USB 3G上网卡+树莓派搭建接受短信自动转发邮箱的服务
  10. 一起来看流星雨剧情简介/剧情介绍/剧情分集介绍第五集