前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >入门 | 单样本学习:使用孪生神经网络进行人脸识别

入门 | 单样本学习:使用孪生神经网络进行人脸识别

作者头像
机器之心
发布2018-05-11 11:55:22
1.3K0
发布2018-05-11 11:55:22
举报
文章被收录于专栏:机器之心

选自towardsdatascience

作者:Firdaouss Doukkali

机器之心编译

参与:Nurhachu Null、刘晓坤

这篇文章简要介绍单样本学习,以孪生神经网络(Siamese neural network)进行人脸识别的例子,分享了作者从论文 FaceNet 以及 deeplearning.ai 中学到的内容。

图片来自 pixabay.com(https://pixabay.com/)

如果你对这个主题很感兴趣并希望深入了解的话,可以参考论文:

FaceNet:人脸识别和聚类的统一嵌入(FaceNet: A Unified Embedding for Face Recognition and Clustering)。

让我们开始吧!

单样本学习

为了理解使用单样本学习的原因,我们需要讨论一下深度学习和数据。通常,在深度学习中,我们需要大量的数据,拥有的数据越多,结果就会越好。然而,仅从少量数据中学习会更加方便,因为并不是所有的人都拥有丰富的数据。

此外,为了识别一个对象,人脑也不需要成千上万张这类对象的图片。我们现在不谈论对人脑的模拟,因为它过于复杂和强大并且很多东西都与学习和记忆有关,例如感觉、先验知识、交互等。

这里的主要思想就是,我们需要仅仅从少量的数据中就能学会一个对象分类,这就是单样本学习(one-shot learning)算法。

人脸识别

在人脸识别系统中,我们希望通过输入一张人脸图片就能够识别对应的人的身份。而如果系统并没有成功地识别图片,是因为这个人的人脸图片并不在系统的数据库中。

为了解决这个问题,我们不能仅使用单个卷积神经网络的原因有两个:1)CNN 在小数据集上是不起作用的;2)如果每次向系统中加入一位新人的一幅图片时再去重新训练模型,也是极其不方便的。为此,我们在人脸识别中使用了孪生神经网络。

孪生神经网络

孪生神经网络的目标是寻找两个可比较对象的相似程度(例如,签名验证、人脸识别等)。这个网络有两个相同的子网络,两个子网络有相同的参数和权重。

图片来源于 C4W4L03 Siamese Network(https://www.youtube.com/watch?v=6jfw8MuKwpI),感谢 Andrew Ng。

上图是 deeplearning 中利用孪生网络架构做人脸识别的例子。正如你所看到的,第一个子网络的输入是一幅图片,然后依次馈送到卷积层、池化层和全连接层,最后输出一个特征向量(我们并没有使用 softmax 函数来做分类)。最后的向量 f(x1) 是对输入 x1 的编码。然后,向第二个子网络(与第一个子网络完全相同)输入图片 x2,我们对它做相同的处理,并且得到对 x(2) 的编码 f(x2)。

为了比较图片 x(1) 和 x(2),我们计算了编码结果 f(x1) 和 f(x2) 之间的距离。如果它比某个阈值(一个超参数)小,则意味着两张图片是同一个人,否则,两张图片中不是同一个人。

上式是 x1 和 x2 的编码之间的距离。

这适用于任何两张图片。

那么,为了得到对输入图片的良好编码,我们如何学习相应的参数呢?

我们可以在三重损失函数上应用梯度下降,所谓三重损失函数指的是使用三幅图片计算一个损失函数:一副固定影像 A,一副正例图像 P(与固定影像是同一人),以及一张反例图像 N(与固定影像不是同一人)。所以,我们想让固定影像 A 与正例 P 的编码之间的距离 d(A,P) 小于等于 A 与 N 的编码之间的距离 d(A,N)。也就是说,我们要让同一个人的图片更加相互接近,而不同人的照片要互相远离。

三重损失将固定影像 A 与正例 P 之间的距离最小化了,这两者具有同样的身份,同时将固定影像 A 与反例 N 之间的距离最大化了。来自论文《FaceNet: A Unified Embedding for Face Recognition and Clustering》。

这里的问题是,模型可能学习给不同的图片做出相同的编码,这意味着距离会成为 0,不幸的是,这仍然满足三重损失函数。因为这个原因,我们加入了边际α(一个超参数)来避免这种情况的发生。让 d(A,P) 与 d(N,P) 之间总存在一个差距。

三重损失函数:

这里的最大化处理意味着只要 d(A, P)—d(A, N)+ α小于等于 0,那么 loss L(A, P, N) 就会是 0,但是一旦它大于 0,那么损失值就是正的,这个函数就会将它最小化成 0 或者小于 0。

代价函数是训练集的所有个体的三重损失的和。

训练集

为了定义 A 和 P,训练集应该包含同一个人的多张图片,一旦模型训练完毕,我们就可以仅仅通过一张图片来识别出一个人。

我们如何选择用于训练模型的图片呢?

如果我们随机选择图片,可能很容易就能满足损失函数的限制,因为大多数情况距离都是很大的,而且梯度下降也不会从训练集中学到很多(大幅更新权重)。因为这个原因,我们需要寻找这样的 A、P 和 N,使得 A 和 P 很接近 N。我们的目标是让训练模型变得更加困难,以使得梯度下降学到更多。

原文链接:https://towardsdatascience.com/one-shot-learning-face-recognition-using-siamese-neural-network-a13dcf739e

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-01-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 机器之心 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
人脸识别
腾讯云神图·人脸识别(Face Recognition)基于腾讯优图强大的面部分析技术,提供包括人脸检测与分析、比对、搜索、验证、五官定位、活体检测等多种功能,为开发者和企业提供高性能高可用的人脸识别服务。 可应用于在线娱乐、在线身份认证等多种应用场景,充分满足各行业客户的人脸属性识别及用户身份确认等需求。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档