资源技术动态如何使用TensorFlow Eager训练你自己的人脸识别模型

如何使用TensorFlow Eager训练你自己的人脸识别模型

2019-11-20 | |  136 |   0

原标题:如何使用TensorFlow Eager训练你自己的人脸识别模型    

来源:AI 研习社          链接:https://www.yanxishe.com/TextTranslation/1604


从社交媒体网站上的照片和视频,到iPhone Xs FaceID等消费者使用的安全应用程序,人脸无处不在。

在这种情况下,应用于面部的计算机视觉具有许多子任务。包括面部检测,识别和跟踪。此外,随着深度学习的发展,这些解决方案在商业应用中也变得越来越成熟。


这篇文章逐步向您展示了如何设计和训练自己的卷积神经网络(CNN)进行面部识别。在这里,我们提出了Siamese DenseNets的Tensorflow Eager实现。

您可以在此处找到完整的代码。

Siamese DenseNets

Siamese CNN是一类神经网络(NN),其中包含两个或多个相同的网络模型。术语“相同”指两个NN共享相同的设计和配置,最重要的是它们共享相同的权重。


要了解DenseNet,我们需要关注其体系结构的两个主要组成部分。这些是密集块和过渡层。

1574185981358293.png


简而言之,DenseNet是密集块的堆栈,后面是过渡层。一个块由一系列单元组成。每个单元包含两个卷积层。每次卷积之前都进行批量归一化(BN)和修正线性单元(ReLU)激活。


每个单元输出固定数量的特征向量。这个数字由参数增长率控制。本质上,它管理给定单元允许传递给下一单元的新信息数量。
同样,过渡层是简单的组件。它们旨在对通过网络的特征向量进行下采样。每个过渡层都包含一个BN操作,然后是一个1x1卷积加上2x2平均池。


与其他常规CNN的最大区别在于,密集块中的每个单元在连接之前都与其他每个单元相连。在一个块内,第n个单元将n-1,n-2,...一直到整个网络中的第一个单元所接收的特征向量作为输入。换句话说,DenseNets设计允许在其单元之间进行高级特征的共享。

1574186017556864.png


DenseBlock概述。 每个单元输出K个特征向量。

 以后单元通过级联从先前单元接收特征向量。


与ResNets相比,DenseNets具有通过级联而不是求和实现对特征重用的功能。 因此,与ResNets相比,DenseNets的参数数量往往更紧凑。 直观地,任何给定DenseNet单元学习到的每个特征向量都会被同一个块中的所有后续单元重新使用。 这使网络不同层学习冗余功能的可能性降到最低。

ResNets和DenseNets都使用流行的瓶颈层设计。 它由2个组件组成:

  • 1x1卷积以减小要素的空间尺寸

  • 更宽的卷积,在这种情况下,采用3x3大小的卷积操作学习特征


关于参数效率和每秒浮点运算(FLOP),DenseNets大大超过了ResNets。 与ResNets相比,DenseNets不仅在ImageNets上实现了较小的错误率,而且参数FLOP更少。

1574186199453491.png


增强模型紧凑性的另一个技巧是压缩系数。此过程在过渡层上进行,目的是减少进入下一个密集块的特征向量的数量。 DenseNets通过在0到1之间设置一个因子θ来实现这种机制。θ控制允许多少当前特征传递到下一个块。这种技术使DenseNets可以进一步减少特征向量的数量,并且具有很高的参数效率。


学习面孔相似度


这不是分类任务,我们不想将图像分类到某一个类别中。相反,我们想学习一种可以单独描述每个输入的表示形式。


具体来说,我们想找到输入图像之间的相似性。为此,我们需要一个能够表达两个可比较事物之间关系的表示方法。


在实践中,我们想学习嵌入矢量来表示人脸图像之间的关系。我们需要具有以下属性的向量:

  • 如果两个图像(X1和X2)相似,则我们希望两个输出矢量之间的距离尽可能小

  • 如果X1和X2不相似,我们希望该距离尽可能大


下面我们表示学习面部嵌入的整个Siamese DenseNets框架。下一节将介绍该体系结构的特定构建基块。

1574186248806203.png


对比损失


要了解对比损失的工作原理,首先要记住它是对成对图像起作用的。以上面的两个图像为例。 在给定的一对(X1,X2)输入图像赋予以下属性:如果X1被认为与X2类似,我们给它加上标签0;否则X1的标签为1。


现在,让我们将Gw定义为参数函数-这是一种神经网络。 它的作用非常简单,将高分辨率输入映射到低分辨率输出。

1574186321364592.png

  将高维输入减少为低维表示(D <d)


我们想要学习一个参数化的距离函数Dw,在输入X1和X2之间。这是Gw的输出之间的欧氏距离。  

 1574186376753730.png

注意,m是边距。 它定义了Gw的半径。 它用来控制不同的图像是如何影响总损失函数。 也就是说,来自不同人(类)的一对图像(X1,X2)仅在它们之间的距离在边界内时才造成损失,即if(m -Dw)> 0。


换句话说,我们要这样优化系统:

  • 如果这对图像相似(标签0),我们将距离函数Dw最小化。

  • 如果这对图像不相似(标签1),则我们增加距离函数Dw。

Tensorflow中的最终损失函数及其实现定义如下:

  1574186469755479.png

08.png

Tensorflow对比损失实现


重要的是要注意我们如何计算第2行的距离。由于此损失函数相对于模型的权重必须是可微的,因此我们需要确保不会产生负面影响。


请注意,在方程的平方根部分中,我们在计算平方根之前添加了一个小的epsilon。 原因很微妙。 在平方根内的内容为零的情况下,平方根0也为0。

1574186551464300.png

在w = 0时,sqrt()ope的导数将发生除以0的现象。这将破坏您的代码或在python中导致NaN。


但是,如果我们正在计算梯度的时候,如果内容为0,则平方根的导数将被0除。 那也不好,因此请始终确保所使用的例程在计算上是安全的。


此外,当使用随机梯度下降(SGD)最小化对比度损失时,有两种可能的情况。


首先,如果一对输入样本(X1,X2)属于同一类(标签0),则等式的第二部分归零。 在这种情况下,我们只会最小化同一类的两个图像之间的距离。 实际上,我们正在推动两种样本在表示形式尽可能地接近。

1574186593576009.png

对比损失将相似的面孔聚集在给定区域内在一起,并将不相似的样本尽可能地分离。


在第二种情况下,如果输入对(X1,X2)不是同一类(标签1),则方程的第一部分将被取消。 然后,在求和的第二项中,可能会出现两种情况。


首先,如果两个图像对的X1和X2之间的距离大于m,则什么也不会发生。 请注意,如果Dw> m,则它们之间的差也将为负。 结果,剩余函数的导数将为0,这样的店结果是无梯度等于无学习。


但是,如果输入对X1和X2之间的距离Dw小于m,则会发生相反的情况。 现在,梯度信号将充当排斥力。 在实践中,它将使两种图像的表示形式彼此远离。


数据

为了训练Siamese CNN的人脸相似性,我们使用了流行的大规模CelebFaces数据集(CelebA)。 它包含来自10,177个不同身份的200,000多张名人图像。 为了简化数据预处理,我们选择了数据集的对齐和裁剪好的的面部部分。 下图显示了一些数据集样本。

1574186658790554.png

CelebA样本


要使用对比损失,我们需要以非常特定的方式构建数据集。 基本上,我们需要构建一个包含很多面部图像对的数据集。 其中一些人来自同一个人,其中一些人来自不同的人。


简而言之,给定输入图像Xi,我们需要找到一组样本S = {X1,X2,…,Xj},使Xi和Xj属于同一类。 换句话说,Xi和Xj是同一个人的面部图像。


同样,我们需要找到一组图片D = {S1,S2,…,Sj},以使Sj与Xi不属于同一类。


最后,我们将输入图像Xi与来自相似和不相似集合的样本进行组合。 对于每对(Xi,Xj),如果Xj属于相似样本S的集合,则为该对分配标签0,否则得到标签1。


训练细节

们使用了原始论文中所述的DenseNet-121设计。 增长率参数(k)设置为32,去掉了最后的1000维全连接层,我们学习到大小为32的嵌入向量。

1574186714282486.png


为了优化模型参数,我们将Adam Optimizer与周期性学习率一起使用。 受fast.ai超收敛启发,我们将Adam beta2 参数固定为0.99,并将循环策略应用于beta1。


这样,两个参数:学习率和beta1-在最大值和最小值之间循环变化。 简而言之,虽然学习率增加,但是beta1在固定的时间间隔内减少。

  1574186733690035.png

结果

结果非常好。

对于这些示例,单阈值1将正确分类大多数样本。 而且,网络对于输入图像的许多变换是不变的。 这些转换包括亮度和对比度,面部大小,姿势和对齐方式的变化。 外观,年龄,理发,帽子和眼镜等人的外观发生细微变化都是不变的。


下面的相似度值对于相似的面孔较小,而对于不相似的面孔则较高。 标签为0表示这对图像来自同一个人。

1574186763794838.png

  感谢阅读!

------------------------------------------------------------------------------

发起:王立鱼 校对:唐里 审核:鸢尾

参与翻译(1人):天字一号

英文原文:How to train your own FaceID ConvNet using TensorFlow Eager execution

THE END

免责声明:本文来自互联网新闻客户端自媒体,不代表本网的观点和立场。

合作及投稿邮箱:E-mail:editor@tusaishared.com

上一篇:如何快速搭建情感识别器?预训练模型告诉你

下一篇:最新的优化深度学习交易机器人技术

用户评价
全部评价

热门资源

  • 应用笔画宽度变换...

    应用背景:是盲人辅助系统,城市环境中的机器导航...

  • GAN之根据文本描述...

    一些比较好玩的任务也就应运而生,比如图像修复、...

  • 端到端语音识别时...

    从上世纪 50 年代诞生到 2012 年引入 DNN 后识别效...

  • 人体姿态估计的过...

    人体姿态估计是计算机视觉中一个很基础的问题。从...

  • 谷歌发布TyDi QA语...

    为了鼓励对多语言问答技术的研究,谷歌发布了 TyDi...