来源:http://blog.csdn.net/ice_actor/article/details/78603042
1.什么是人脸识别
这部分演示了百度总部大楼的人脸识别系统,员工刷脸进出办公区,在这个演示中主要应用到了人脸识别技术和活体检测。 人脸识别的术语: 1)face verification:输入图像、名字ID判断输入图像是不是名字ID指定的用户 2)face recognition:有一个包含K个用户的数据库,拿到一幅图片,然后判断图片中的人是不是在数据库中,在输出指定用户name,不在就输出未识别。 人脸识别要比人脸验证要困难的多,在人脸验证中准确率99%也许可以接受,但是放到包含100个用户的人脸识别数据集下,这个误差就会被放大,意味着1%的概率会出错。在后续我们首先构建人脸验证系统作为基本模块,如果准确率够高就可以把它用在识别系统上。人脸验证系统的难点在于解决one-shot learning(一次学习)问题。
2. one-shot learning
one-shot的意思是你需要通过单单一张图片,就能去识别这个人,但是在深度学习中只有一个训练样本时,它的表现并不好,那么如何去解决这个问题呢? 假如员工数据库有四个员工,当某个员工来的时候,你想通过人脸识别系统判断他是不是四个员工之一,系统需要做的是仅仅通过一张照片,来识别前面这个人。所以在one-shot学习问题中只能通过一个样本来进行学习以能够认出同一个人,大多数人脸识别系统都要解决这个问题,因为在你的数据库中每个雇员可能都只有一张照片。有一种办法是将人的照片输入卷积神经网络,使用softmax单元输出5个标签,分别对应四个员工和四个都不是,但是这样的效果并不好,假如有新的员工加入你的团队,你就需要重新训练你的神经网络,这个确实有些糟糕。
要让人脸识别做到一次学习,为了能有更好的效果,你需要做的是学习similarity函数,详细的说就是下图中d表示的函数,d以两张图片作为输入,然后输出这两张图片的差异值,如果是同一个人的两张照片,希望输出一个很小的值,如果是两个差异很大的人的照片d输出一个很大的值。这样新加入一个员工只许将其的照片加入到数据库中即可,不需要重新训练模型。
3.Siamese网络
Siamese网络就是实现上节函数d的训练,你经常会看到如下的网络结构,输入一个图像经过一系列的卷积、池化和全连接层最终得到一个特征向量,有时候会将其输入softmax单元来做分类,但是在这里我们不需要将其输入softmax单元。加入输出的特征向量大小是128维,将其命名为f(x),你可以将其看成输入图像的编码。
从上面的描述可知,计算两个图片的网络结构有着同样的参数,所以实际只需要训练一个网络,它计算得到的编码可以用于计算函数d,换句话说其实就是神经网络的参数定义了一个编码函数f(x)可以将图片转换成向量编码。所以我们需要做的就是训练这个网络,使其在两张图片是同一个人的时候距离函数尽可能的小,不是同一个人的时候距离函数尽可能的大。
详细内容请参考上述原文!