专栏名称: AI前线
微信号:AI前线,ID:ai-front 运营
目录
相关文章推荐
新智元  ·  1次搭建完胜1亿次编码,MCP硅谷疯传!An ... ·  20 小时前  
爱可可-爱生活  ·  本文提出了一种名为 Q-Filters ... ·  2 天前  
宝玉xp  ·  这两天国内 AI 圈最火的非 Manus ... ·  3 天前  
51好读  ›  专栏  ›  AI前线

使用Siamese神经网络进行人脸识别

AI前线  · 掘金  · AI  · 2018-01-24 01:52

正文

本文由 「 AI前线 」原创,原文链接: 使用Siamese神经网络进行人脸识别
作者|Firdaouss Doukkali
译者|孙浩
编辑|Emily

AI 前线导读:” 本文通过人脸识别的例子,介绍了一次性学习 (One-shot learning),特别是其中的 Siamese 神经网络。我将与大家分享我从 deeplearning.ai 上一篇论文 FaceNet《人脸识别和聚类的统一嵌入》上学到的知识。如果你对它很感兴趣的话,以此,你可以节省更多的时间深入研究这个话题。”


一次性学习

为了理解为什么我们有一次性学习的原因,我们需要讨论下深度学习和数据。通常,在深度学习中,我们需要大量的数据,而我们拥有的数据越多,结果就越好。可是,假如可以用仅仅很少的数据学习就更方便了,因为我们并不是所有人都有丰富的数据。

另一方面,为了识别物体,大脑并不需要见过成千上万相同物体的图片。这里我们不讨论与大脑的类比,因为它太复杂,太强大,很多事情都涉及到我们学习和记忆的过程,比如感觉、先验知识和互动等等。

本文的思路是,我们只从很少的几个数据中学习对象类,这就是一次性学习算法的原理。

人脸识别

在这个人脸识别系统中,我们只想通过向系统提供一张人脸的照片便可识别一个人的身份。而且,如果它不能识别图片,那就意味着这个人的图像没有存储在系统的数据库中。

为了解决这个问题,我们不能只使用卷积神经网络,有两个原因:1)CNN 并不在一个小的训练集上工作 ;2) 我们每次向系统添加一个新人的图片时,不方便对模型进行再训练。然而,我们可以使用 Siamese 神经网络来进行人脸识别。

Siamese 神经网络

Siamese 神经网络有一个目标,就是找出两个相似的东西有多相似 (例如,签名验证、人脸识别等)。这个网络有两个相同的子网络,它们都具有相同的参数和权重。

图片来自 C4W4L03 Siamese Network.Andrew Ng 创建

上面的图片是来自 deeplearning.ai 的一个例子,它很好地使用 Siamese 神经网络体系结构进行了人脸识别。正如您所看到的,第一个子网络的输入是一个图像,然后是一系列的卷积、池化、全连接层,最后是一个特性向量 (我们不打算使用 softmax 函数进行分类)。最后一个向量 f(x1) 是输入 x1 的编码。然后,我们对图像 x2 做同样的事情,把它输入到与第一个子网络完全相同的第二个子网络中,得到了输入 x2 的编码 f(x2)。

为了比较这两个图像 x1 和 x2,我们计算编码 f(x1) 和 f(x2) 之间的距离 d。如果它小于一个阈值 (一个超参数),这就意味着这两个图像是同一个人,否则便是两个不同的人。

x1 和 x2 的两种编码之间的距离函数

此方法适用于任意两张图片 xi 和 xj。

那么,我们如何学习这些参数以便为输入图像获得良好的编码呢?

我们可以通过三联体损失函数使用梯度下降法,这是一个使用三张图片的损失函数:一张锚点图像 A,一张正确的图像 P(和锚点图像中人物一样),以及一个不正确的图像 N(人物与锚点图像不同)。我们想让图像 A 与图像 P 的距离 d(A,P) 小于等于图像 A 与图像 N 的距离 d(A,N)。换句话说,我们想让有同一个人的照片间的距离接近,而有不同人的照片距离则远离对方。

“三联”的损失使锚与正之间的距离最小化,两者都具有相同的身份,并使锚与一个不同的身份之间的距离最大化。《FaceNet: 人脸识别和聚类的统一嵌入》

这里有个问题,模型可以学习对不同的图像进行相同的编码,这就会使其间距离为 0,同时它仍满足三元组损失函数。由于这个原因,我们添加了一个边际 alpha(一个超参数) 值,以防止这种情况发生,这样在 A 和 P 及 A 和 N 之间便可一直存在差值。

三元组损失函数







请到「今天看啥」查看全文