【60】什么是人脸识别;One-Shot学习;Similarity函数

1. 人脸识别
现在可以看到很多产品在运用人脸识别,如手机解锁、车站身份识别认证、刷脸支付等

在人脸识别的相关文献中,人们经常提到

人脸验证(face verification)
人脸识别(face recognition)
人脸验证问题:
如果有一张输入图片,以及某人的ID或者是名字
这个系统要做的是,验证输入图片是否是这个人
有时候也被称作1对1问题
只需要弄明白这个人是否和他声称的身份相符

而人脸识别问题比人脸验证问题难很多
因为这是1对多问题(1:K)
假设有一个验证系统,准确率是99%,自我感觉还可以
但是现在,假设在识别系统中,K=100
如果把这个验证系统应用在100个人身上,人脸识别上,犯错的机会就是100倍了
如果每个人犯错的概率是1%,如果有一个上百人的数据库
如果想得到一个可接受的识别误差,要构造一个验证系统,其准确率为99.9%或者更高
然后才可以在100人的数据库上运行,而保证有很大几率不出错
事实上,如果有一个100人的数据库,正确率可能需要远大于99%,才能得到很好的效果

2. One-Shot学习
人脸识别所面临的一个挑战就是需要解决一次学习问题
这意味着在大多数人脸识别应用中:
需要通过单单一张图片或者单单一个人脸样例就能去识别这个人

而历史上,当深度学习只有一个训练样例时,它的表现并不好
看一个直观的例子,并讨论如何去解决这个问题:

假设数据库里有4张成员照片,分别是哆啦A梦、大雄、胖虎、小夫

现在假设有个人(编号1所示)来到一个地方,并且想通过带有人脸识别系统的任意门
现在系统需要做的就是,仅仅通过一张已有的胖虎照片,来识别前面这个人确实是他
相反,如果机器看到一个不在数据库里的人(编号2所示),应该能分辨出她不是数据库中四个人之一

所以在一次学习问题中,只能通过一个样本进行学习,以能够认出同一个人
大多数人脸识别系统都需要解决这个问题
因为在数据库中每个成员可能都只有一张照片

有一种办法是,将人的照片放进卷积神经网络中
使用softmax单元来输出4种,或者说5种标签,分别对应这4个人,或者4个都不是
所以softmax里会有5种输出
但实际上这样效果并不好
因为如此小的训练集不足以去训练一个稳健的神经网络

而且,假如有新人加入伐木累,现在将会有5个成员需要识别,所以输出就变成了6种
这时要重新训练神经网络吗?这听起来实在不像一个好办法

3. Similarity函数
所以要让人脸识别能够做到一次学习,为了能有更好的效果
现在要做的应该是学习Similarity函数

详细地说,想要神经网络学习这样一个用d dd表示的函数:
d(img1,img2) d(img1,img2)d(img1,img2) = degree of difference between images
它以两张图片作为输入,然后 输出这两张图片的差异值
如果放进同一个人的两张照片,希望它能输出一个很小的值
如果放进两个长相差别很大的人的照片,它就输出一个很大的值

所以在识别过程中:
如果这两张图片的差异值小于某个阈值 τ ττ,它是一个超参数,那么就预测这两张图片是同一个人
如果差异值大于 τ ττ,就能预测这是不同的两个人,这就是解决人脸验证问题的一个可行办法

将它应用于识别任务:

要做的是拿这张新图片(编号6)
然后用d dd函数去比较这两张图片(编号1和编号6)
这样可能会输出一个非常大的数字,在该例中,比如说这个数字是10
之后再让它和数据库中第二张图(编号2)片比较
这样可能会输出一个非常大的数字,在该例中,比如说这个数字是10
之后再让它和数据库中第三张图(编号3)片比较
这样可能会输出一个非常大的数字,在该例中,比如说这个数字是11

之后再让它和数据库中第四张图(编号4)片比较
因为这两张照片是同一个人,所以希望会输出一个很小的数
然后再用它与数据库中的其他所有图片(编号1、2、3)进行比较
通过这样的计算,最终能够知道这个人确实是胖虎

对应的,如果某个人(编号7)不在数据库中,通过函数d dd将他们的照片两两进行比较
最后希望d dd会对所有的比较都输出一个很大的值
这就证明这个人并不是数据库中4个人的其中一个

要注意在这过程中是如何解决一次学习问题的
只要能学习这个函数d dd,通过输入一对图片,它将会告诉这两张图片是否是同一个人

如果之后有新人加入了伐木累(编号5),只需将他的照片加入数据库,系统依然能照常工作

原文地址:https://www.cnblogs.com/lau1997/p/12384740.html