Android制造 FaceID [FaceNet + MobileNet]

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

6. Thank

好了, 感谢大家的收看吧。差不多要睡觉啦!早唞!好梦!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,907评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,987评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,298评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,586评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,633评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,488评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,275评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,176评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,619评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,819评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,932评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,655评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,265评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,871评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,994评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,095评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,884评论 2 354

推荐阅读更多精彩内容

  • 忙忙碌碌,与时间赛跑,被时间推着走,最后得到什么,又失去了什么? (一) "叮铃,叮铃" 天色朦胧,早晨六点半,闹...
    牧野俊风阅读 288评论 2 5
  • 上周五下午,我参加了学校组织的家长会,主要是孩子的班主任郭老师向家长们通报了一些事情,我所关心的是孩子的成绩。 女...
    哎吆嗨阅读 9,471评论 0 2
  • 我是日记星球307号星宝宝,正在参加日记星球第十二期21天蜕变培训课程,这是我的第24篇原创日记。 又是一...
    哈罗宝哥阅读 278评论 0 2