当前位置:   article > 正文

人脸识别最低像素_深入浅出人脸识别技术

最少识别的像素点

在深度学习出现后,人脸识别技术才真正有了可用性。这是因为之前的机器学习技术中,难以从图片中取出合适的特征值。轮廓?颜色?眼睛?如此多的面孔,且随着年纪、光线、拍摄角度、气色、表情、化妆、佩饰挂件等等的不同,同一个人的面孔照片在照片象素层面上差别很大,凭借专家们的经验与试错难以取出准确率较高的特征值,自然也没法对这些特征值进一步分类。深度学习的最大优势在于由训练算法自行调整参数权重,构造出一个准确率较高的f(x)函数,给定一张照片则可以获取到特征值,进而再归类。本文中笔者试图用通俗的语言探讨人脸识别技术,首先概述人脸识别技术,接着探讨深度学习有效的原因以及梯度下降为什么可以训练出合适的权重参数,最后描述基于CNN卷积神经网络的人脸识别。

一、人脸识别技术概述

人脸识别技术大致由人脸检测和人脸识别两个环节组成。

之所以要有人脸检测,不光是为了检测出照片上是否有人脸,更重要的是把照片中人脸无关的部分删掉,否则整张照片的像素都传给f(x)识别函数肯定就不可用了。人脸检测不一定会使用深度学习技术,因为这里的技术要求相对低一些,只需要知道有没有人脸以及人脸在照片中的大致位置即可。一般我们考虑使用opencv、dlib等开源库的人脸检测功能(基于专家经验的传统特征值方法计算量少从而速度更快),也可以使用基于深度学习实现的技术如mtcnn(在神经网络较深较宽时运算量大从而慢一些)。

在人脸检测环节中,我们主要关注检测率、漏检率、误检率三个指标,其中:

检测率:存在人脸并且被检测出的图像在所有存在人脸图像中的比例;

漏检率:存在人脸但是没有检测出的图像在所有存在人脸图像中的比例;

误检率:不存在人脸但是检测出存在人脸的图像在所有不存在人脸图像中的比例。

当然,检测速度也很重要。本文不对人脸检测做进一步描述。

在人脸识别环节,其应用场景一般分为1:1和1:N。

1:1就是判断两张照片是否为同一个人,通常应用在人证匹配上,例如身份证与实时抓拍照是否为同一个人,常见于各种营业厅以及后面介绍的1:N场景中的注册环节。而1:N应用场景,则是首先执行注册环节,给定N个输入包括人脸照片以及其ID标识,再执行识别环节,给定人脸照片作为输入,输出则是注册环节中的某个ID标识或者不在注册照片中。可见,从概率角度上来看,前者相对简单许多,且由于证件照通常与当下照片年代间隔时间不定,所以通常我们设定的相似度阈值都是比较低的,以此获得比较好的通过率,容忍稍高的误识别率。

而后者1:N,随着N的变大误识别率会升高,识别时间也会增长,所以相似度阈值通常都设定得较高,通过率会下降。这里简单解释下上面的几个名词:误识别率就是照片其实是A的却识别为B的比率;通过率就是照片确实是A的,但可能每5张A的照片才能识别出4张是A其通过率就为80%;相似度阈值是因为对特征值进行分类是概率行为,除非输入的两张照片其实是同一个文件,否则任何两张照片之间都有一个相似度,设定好相似度阈值后唯有两张照片的相似度超过阈值,才认为是同一个人。所以,单纯的评价某个人脸识别算法的准确率没有意义,我们最需要弄清楚的是误识别率小于某个值时(例如0.1%)的通过率。不管1:1还是1:N,其底层技术是相同的,只是难度不同而已。

取出人脸特征值是最难的,那么深度学习是如何取特征值的?

假定我们给出的人脸照片是100*100像素大小,由于每个像素有RGB三个通道,每个像素通道由0-255范围的字节表示,则共有3个100*100的矩阵计3万个字节作为输入数据。深度学习实际上就是生成一个近似函数,把上面的输入值转化为可以用作特征分类的特征值。那么,特征值可以是一个数字吗?当然不行,一个数字(或者叫标量)是无法有效表示出特征的。通常我们用多个数值组成的向量表示特征值,向量的维度即其中的数值个数。特征向量的维度并非越大越好,google的facenet项目(参见https://arxiv.org/abs/1503.03832论文)做过的测试结果显示,128个数值组成的特征向量结果最好,如下图所示:

%E4%BA%BA%E8%84%B8%E7%89%B9%E5%BE%81%E5%90%91%E9%87%8F%E7%BB%B4%E5%BA%A6%E4%B8%8E%E5%87%86%E7%A1%AE%E5%BA%A6.jpg

那么,现在问题就转化为怎么把3*100*100的矩阵转化为128维的向量,且这个向量能够准确的区分出不同的人脸?

假定照片为x,特征值为y,也就是说存在一个函数f(x)=y可以完美的找出照片的人脸特征值。现在我们有一个f*(x)近似函数,其中它有参数w(或者叫权重w)可以设置,例如写成f*(x;w),若有训练集x及其id标识y,设初始参数p1后,那么每次f*(x;w)得到的y`与实际标识y相比,若正确则通过,若错误则适当调整参数w,如果能够正确的调整好参数w,f*(x;w)就会与理想中的f(x)函数足够接近,我们就获得了概率上足够高准确率的f*(x;w)函数。这一过程叫做监督学习下的训练。而计算f*(x;w)值的过程因为是正常的函数运算,我们称为前向运算,而训练过程中比较y`与实际标识id值y结果后,调整参数p的过程则是反过来的,称为反向传播。

由于我们传递的x入参毕竟是一张照片,照片既有对焦、光线、角度等导致的不太容易衡量的质量问题,也有本身的像素数多少问题。如果x本身含有的数据太少,即图片非常不清晰,例如28*28像素的照片,那么谁也无法准确的分辨出是哪个人。可以想见,必然像素数越多识别也越准,但像素数越多导致的计算、传输、存储消耗也越大,我们需要有根据的找到合适的阈值。下图是facenet论文的结果,虽然只是一家之言,但google的严谨态度使得数据也很有参考价值。

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
  

闽ICP备14008679号