1、什么是人脸识别
人脸识别就是识别人脸,比如手机人脸识别开机,人脸识别打卡等。
需要注意的是,人脸识别需要和活体检测(用来确认被识别的是一个活人)放在一起使用,这样才能避免用照片骗过手机或者打卡机,我们这里主要将人脸识别部分。
人脸识别相关术语:
验证问题:
输入:图片,名字/ID
输出:确认是否输入的信息与该人相符
识别问题:
假设有一个验证系统,其准确率为99%,假设在识别系统中有100个人需要识别,那么其很有可能会有一个人被识别错,如果需要识别的人很多,比如上班打卡,好几千人,那么如果 其准确率还是99%,那么其有可能会有几十个人被识别错,这种错误率相当大,所以,识别系统需要做到更高的准确度,百分之99.9%以上才说得过去。
所以,识别问题比验证问题难得多。验证问题是1对1,而识别问题是多对多。
2、one-shot学习
one-shot -学习就是在很少样本的情况下训练好系统,然后做到很高的识别率。
上图所示,如果数据库中的训练集只有上图右边四张图片,我们要识别这四个人,如果来一个测试集我们能识别出。这就是one-shot学习。
我们如果用传统的卷积神经网络去做模型很麻烦:
1、它需要很多训练集,这不符合one-shot学习的少量训练集。
2、就算用卷积神经网络,如果我们在公司首先识别四个人并且训练好了模型,当公司新来一个人,模型的softmax部分就要修改,这样需要重新训练模型,很麻烦。
引入one-shot学习:
similarity函数:d(imag1,imag2)=degree of difference between images
试想,如果数据库中有image1,新来一张imag2,如果他们直接的不同值很小,就可以认为他们很相似,如下图所示,我们设置一个阈值,我们两张图片小于阈值,就认为这两张图片一样,这样就识别出来了,这也是一个验证问题。
如果要将其引入到识别问题:
如上图所示,输入一张图片与数据库中图片做similarity函数计算,我们发现新图片与左边第二张图片的差别值最小,差不多就认为新的图片就是左边第二个人。
同理,又来一人又做该处理。
所以one-shot学习的精髓就是学习similarity函数,该函数学习好了,就能计算出新来图片和数据库中图片的差别值,若差别值小于某阈值,就任务两张图片一样,若大于则不同,这就做到了识别。若把one-shot函数用到公司打卡里,我们也只需将新来员工放到数据库中,这样当新来员工打卡刷脸时,也能识别。
3、siamese网络(将图片编码,用于计算两张图片的差值)
我们要得到d函数,就要训练siamese网络。
该网络用于训练一个神经网络用于将图片编码,编码后的数据用来计算图片之间的差值d。
d函数的作用就是输入两张图片,计算他们之间的差值。
如上图所示,一般输入一张图片到卷积网络,最后是用softmax做分类。我们这里去除最后softmax部分,输入一张图片,最终得到一个128维的向量。如果我们把x(1)作为输入,那么这个向量用f(x(1))表示,也就是给x(1)编码了。
若我们用相同的神经网络并且权重相同,输入第二张图片x(2),最终得到f(x(2)),那么:
定义d(x(1),x(2))=f(x(1))与f(x(2))之间的范数。这也是两张图片之间的差别具体数值处理。
而这个网络结构也就是siamese网络,接下来的工作就是训练该网络学习参数。
总结:
两边各个图片经过siamese编码,然后用范数计算图片之间的差值,若小于某阈值,则识别同一人,反之亦然。
siamese网络中的权重不可能随随便便给出,这就要通过训练获得。
如上图所示,siamese网络的作用就是用于编码图片x(i),并且将该图片映射到一个128维度的向量。
要做的工作是训练该网络并且学习到参数,用来计算两张图片之间的差值,通过差值进行识别。
训练网络参数的目标:
输入数据集经行,使得输入两张图片,x(i),x(j)若两张图片是同一个人,则他们之间的范数很小,若两张图片不是同一个人,则他们之间的范