当前位置: 首页 > 科技观察

4万字长文,科普人脸识别算法与系统

时间:2023-03-15 09:23:23 科技观察

人脸识别的目标总结为两点。第一,要认出同一个人,无论你的状态如何变化,你都能知道你就是你。二是区分不同的人。也许两个人长得很像,或者都化了妆,但无论状态如何变化,人脸识别都能知道是两个不同的人。人脸识别本身就是一种生物识别技术,主要是提供一种身份认证手段。就准确率而言,人脸识别并不是最高的。人脸识别受许多其他条件的影响,例如光照。人脸识别的优点是一般不需要用户过多的配合。各地的监控摄像头,包括电脑摄像头、手机视频输入设备、摄像设备等已经非常普及。使用这种可见光的设备可以进行人脸识别。所以引入人脸识别的时候,新增的投入可能很小,这是它的优势。人脸识别流程人脸识别的核心流程,所谓核心流程是指无论在什么样的人脸识别系统中,这个流程基本都存在。第一步是人脸检测,第二步是人脸对齐,第三步是特征提取。这是每张照片必须完成的三个步骤。该比较的时候,就比较提取出来的特征,然后判断这两张脸是否属于同一个人。人脸检测人脸检测是判断大场景中是否有人脸,并找到人脸的位置并裁剪出来。它是一种物体检测技术,是整个人脸感知任务的基础。人脸检测的基本方法是在图像金字塔上滑动窗口,用分类器选择候选窗口,用回归模型校正位置。上面绘制的三个窗口分别是0.3倍、0.6倍、1.0倍。当人脸位置不确定无法识别尺寸时,可以利用该技术让图片本身尺寸不同,滑动窗口尺寸相同。深度网络输入的图像大小一般是固定的,所以前面的滑动窗口基本是固定的。为了让固定的滑动窗口覆盖不同的范围,对整个图的大小进行了不同比例的缩放。这里画的0.3、0.6、1.0只是一个例子,实际使用中还可以有很多其他的倍数。分类器指的是看滑动窗口的每个位置来判断是否是人脸,因为滑动窗口滑动的位置可能不包含整个人脸,也可能比整个人脸大一点。为了找到更准确的人脸,将滑动窗口放入回归模型可以帮助修正人脸检测的准确性。输入是一个滑动窗口。如果输出的是人脸,哪边应该修正,需要修正多少,所以Δx,Δy,Δw,Δh是它的坐标,它的宽高应该修正多少。有了校正量和分类器确定是人脸的窗口,将这两者结合起来可以得到更准确的人脸位置。以上是人脸检测的流程,也可以应用到其他物体检测中。人脸检测的评价指标,无论是哪种模型,都分为速度和准确率两个方面。1.速度(1)速度在指定分辨率下检测速度之所以指定分辨率是因为滑动窗口每滑动到一个位置都需要做一次分类回归判断,所以当图片越大,需要检测判断的窗口数可能越多,整个人脸检测需要一段时间。时间越长。因此,评价一个算法或模型的好坏,需要看其在固定分辨率下的检测速度。一般来说,这个检测速度会是一个什么样的值呢?可能是检测图片中人脸的时间,比如100毫秒、200毫秒、50毫秒、30毫秒等,速度的另一种表达方式是fps的数量。现在一般的网络摄像机往往是25fps或者30fps,也就是每秒可以处理多少张图片。使用fps的好处是可以判断人脸检测是否可以实现实时检测,只要人脸检测的fps大于摄像头的fps就可以做到实时,否则不能做到。(2)速度是否受同屏人脸数影响从我们实际操作来看,大部分是不受影响的,因为主要是受滑动窗口的数量影响,点击次数不是特别重要,但影响不大。2.准确率准确率基本是通过召回率、误检率、ROC曲线来判断的。召回率表示这张照片是人脸,真实模型判断是人脸。误检率和负样本错误率是指这张照片不是人脸,但被误判为人脸的比例。ACC准确度ACC的计算方法是将正确的样本数除以样本总数。比如你拍10000张照片做人脸检测,这10000张照片有的有脸,有的没有脸。然后判断成对的比例是多少。但是这种准确性存在问题。如果用它来判断,它与正负样本的比例完全无关,即不关心正样本中的正确率和负样本中的正确率。它只关心总的。当这个模型的准确率达到90%时,其他人不知道正负样本之间的区别。包括分类,包括回归,一般来说,一个分类模型会先用回归得到一个所谓的置信度。当置信度大于某个值时,就认为是,当置信度小于同一值时,就认为不是。ACC统计模型是可调的,即置信度调整时精度会发生变化。所以ACC值本身受样本比例的影响很大,用它来代表一个模型的好坏有点问题。当测试指标说达到99.0%的时候,光看这个数值还是比较容易被骗的,或者这个统计有偏差。为了解决这个问题,一般用一条叫做ROC的曲线来表征这个模型的准确率。ROC接收者操作特征曲线横坐标:FPR(FalsePositiveRate)为负样本错误率纵坐标:TPR(TruePositiveRate)即正样本的正确率可以区分算法在正样本和负样本上的表现,曲线的形状与正负样本的比例无关。ROC(ReceiverOperatingCharacteristic)曲线是用负样本错误率和正样本正确率来标记横坐标和纵坐标。这样,同一个模型在这个图上看不到一个点,或者说不是单个数据,而是一条线。这条线是置信度阈值。调的越高越严,调的越低越不严。如果在这个之上,就可以反映置信度阈值的变化对它的影响。以后最好不要直接问你的accuracy是多少,而是看ROC曲线,这样更容易判断模型的能力。人脸对齐人脸对齐的目的是尽可能将人脸纹理调整到标准位置,降低人脸识别的难度。为了人为地降低它的难度,可以先对齐,即将检测到的人的眼睛、鼻子、嘴巴都放在同一个位置。这样,模型进行比较时,只需要找到相同位置的附近,它们之间是否相同或相似,还是有很大区别的。所以我们会做这一步对齐。对于这一步,我们现在常用的方法是二维的方法,就是找这张图片中的关键特征点。一般是五点、十九点、六十点左右。各种点都有,八十多个点。但是对于人脸识别来说,五个基本就够了。除了这五个点之外的其他点的图像可以认为是类似插值的操作,然后粘贴到那个位置。完成后就可以传给后面的人脸识别设备我们做了识别。这是一个通用的方法,还有更前沿的方法。一些研究机构在用所谓的3D人脸对齐,就是说我会告诉你一张正面脸长什么样子,比如旋转45度后长什么样子。然后用这种图片训练他之后,他就会知道我看到的图片是左右旋转45度的,很可能是右转之后的样子。这个模型可以猜到。以往传统的人脸特征提取算法就是所谓的局部纹理模型、全局纹理模型、形状回归模型等。现在比较流行的是用深度卷积神经网络或者循环神经网络,或者3DMM参数的卷积神经网络。所谓3DMM参数就是说里面有三维的信息,然后有级联的深度神经网络。级联的深度神经网络,也就是得到人脸,首先需要推断出这五个点的位置。如果你一次使用一个模型来做这个,模型将需要非常复杂。但是如何降低这个模型的复杂度呢?即进行多次输入,在第一次输入网络后进行猜测。这个猜测是可以接受的,不是那么准确的猜测,你大概知道面部的五个点在哪里。然后把这五个点和原图一起放到第二个网络中,得到大概的校正量。如果有一个基本的五点,再算出修正量,会比直接从原图找准确的五点要准确。稍微容易一点。因此,采用这种逐步细化的方法,将多个网络级联在一起,可以在速度和准确率之间取得更好的平衡。其实现在做的时候基本上用两层就差不多了。人脸特征点提取的评价指标NRMSE(NormalizedRootMeanSquareError)用来衡量每个特征点的坐标与标记坐标之间的差距。为了让不同大小的人脸可以一起比较,精度在统计学上被称为归一化均方根误差。举个例子:我们在纸上画五个点,然后让机器说出这五个点之间的距离。给出的值越接近真实距离,预测越准确。一般来说,预测值肯定是有偏差的,那么这个精度值怎么表示呢?我们通常用距离的平均值或均方根值来表示。但是,问题是同一台机器预测不同尺寸的图像,准确率值会出现不同,因为图像越大,误差的绝对值就越高。换不同大小的脸也是一样。因此,我们的解决方案是考虑到人脸的原始大小。总分母就是人的两眼距离或者脸的对角线距离,然后用距离差除以两眼距离,或者除以脸的对角线,这样一个值基本不随人脸大小的变化可以得到并用于评价。人脸对比(1)目的:判断对齐的两张人脸是否属于同一个人(2)难点:同一张脸在不同的条件下会出现不同的状态,比如特别亮,雾霾,化妆等。是由映射到二维照片的不同参数引起的。所谓映射到二维参数就是原来的人脸长这个样子。准确与否,拍摄的视角等等,都会对光线的积累产生影响,从而导致同一张脸产生不同的状态。三是年龄和整容的影响。人脸比对方法(一)传统方法1、人工提取一些特征,如HOG、SIFT、小波变换等。一般来说,提取的特征可能需要固定的参数,即不需要训练或学习。使用一组固定的算法,然后比较这个特征。(2)深度法的主流方法是深度法,即深度卷积神经网络。总的来说,这个网络是用DCNN来代替以前的特征提取方法,即一张图片和一张人脸上的一些图像得到不同的特征,而DCNN的参数很多。这个参数是学来的,不是人告诉的。如果学会了,那比人家总结出来的要好。那么得到的特征集一般有128维,256维,或者512维,或者1024维的维度,然后进行比较。判断特征向量之间的距离,一般采用欧氏距离或余弦相似度。人脸比对的评价指标也分为速度和准确率。速度包括单个人脸特征向量的计算时间和比较速度。准确性包括ACC和ROC。由于之前介绍过,所以这里着重对比一下速度。普通比较是一个简单的操作。它是两点之间的距离。内积你可能只需要做一次,就是两个向量的内积。但是当人脸识别遇到1:N比对的时候,当N库很大的时候,你拿到一张照片去N库搜索的时候,搜索的次数会非常多。比如N库有一百万,你可能需要检索一百万次。由于要进行一百万次比较,此时对总时间还是有要求的,所以就会有各种技术来加速这种比较。其他与人脸识别相关的算法主要包括人脸跟踪、质量评估、活体识别等。●人脸追踪在监控等视频人脸识别场景中,如果对经过的同一个人的每一帧都执行整个人脸识别过程,不仅会浪费计算资源,还可能会因为一些低质量的帧而导致错误.识别,所以需要判断哪些人脸属于同一个人。并选择合适的照片进行识别,大大提高了模型的整体性能。现在不仅是人脸跟踪,各种物体跟踪或者车辆跟踪等,都会用到跟踪算法,这种算法不依赖也不会一直依赖检测。比如一开始检测到一个物体之后,根本就检测不到,只用跟踪算法来做。同时,为了达到非常高的精度,不至于丢失,每次跟踪都需要花费大量的时间。为了防止被跟踪的人脸与人脸识别器的范围匹配,一般来说还是采用人脸检测器进行检测。这种检测方法依赖于人脸检测进行的相对轻量级的跟踪。在某些场景下,可以做到速度和质量的平衡。这种检测方式称为TrackingbyDetection,即每一帧仍然进行人脸检测。检测到人脸后,根据每个人脸的四个值,即它的坐标位置,它的宽高,来比较前后两帧人脸的位置和大小,大概可以推断两张脸是否属于同一个运动物体。●可选的间隔全屏检测是指在做TrackingbyDetection时,前后两帧,一种方法是做全屏检测,所谓全屏检测就是整帧扫描一次,但是这种方法比较耗电有时很严重,所以有时会用另一种方法每隔几帧做一个全屏。一般预测下一帧,位置变化不会太大。只要将上一帧的位置稍微上下左右展开,然后检测一次,往往有很大的概率能检测到,大部分帧都可以跳过。为什么我们必须每隔几帧做一次全帧检测?就是为了防止有新的物体进来,如果只根据前一个物体的位置搜索,新物体进来的时候可能检测不到。为了防止这种情况,可以每隔五帧或十帧做一次。全帧检查。●人脸质量评估由于人脸识别器训练数据的限制,不可能对所有状态的人脸都表现良好。质量评价会判断检测到的人脸与识别器特征的吻合程度,只选择高级人脸送去识别,以提高系统的整体性能。人脸质量评价包括以下四个要素:①人脸的大小,如果人脸太小难以识别,识别效果会大大降低。②人脸姿势是指三个轴的旋转角度,一般与识别器训练使用的数据有关。如果训练中用到的人脸大多不是太大,实际做识别时最好不要选择偏转大的,否则不适用。③模糊程度,这个要素很重要,如果照片丢失了信息,识别就会出现问题。④遮挡,如果眼睛、鼻子等被遮挡,无法获取到这块的特征,或者获取到的是错误的,是遮挡物的特征,会影响后续的识别。如果可以判断为被屏蔽,则将其丢弃,或者做一些特殊处理,比如不放入识别模型。●活体识别这是所有人脸识别系统都会遇到的问题。如果只识别人脸,照片也能被骗。为了防止系统被攻击,会做一些判断,这是真人脸还是假人脸。目前的方法基本上有以下三种:①传统的动态识别,很多取款机会需要用户配合,比如要求用户眨眼或转头,从而根据眨眼或转头来判断用户是否在做。转过头。同样合身。所以动态识别存在一个问题,就是需要用户更多的配合,这样用户体验会有点差。②静态识别,即不根据动作判断,只根据照片本身判断是真脸还是假脸。它基于当今常用的攻击方法,更方便。比如拿着手机或者显示屏,就可以利用屏幕进行攻击。这种屏幕的发光能力不同于实际照明条件下人脸的发光能力。比如显示器有1600万个色数,达不到可见光的发光能力,即都是连续的,所有波段都可以发出。因此,再拍摄这种画面时,人眼可以看出,与真实自然环境下的成像相比,会有一些变化和一些不自然。把这种不自然放到模型中训练后,还是可以根据这种细微的差别来判断是不是真人脸。③立体识别。如果使用两个摄像头或者一个有深度信息的摄像头,就可以知道拍摄点到摄像头的距离。飞机,意识到是飞机,飞机绝对不是真人。这是用三维识别的方法来排除平面。人脸识别系统的组成首先做一个分类。从比较的角度来看,有1:1识别系统和1:N识别系统;从比对对象来看,有照片比对系统和视频比对系统。系统;按部署形式分为私有部署、云部署或移动设备部署。图片1:1识别系统1:1识别系统是最简单的。拍两张照片,为每张照片生成一个特征向量,然后比较两个特征向量,看是不是同一个人,就可以识别出来了。图1:N的识别系统1:N的识别系统,即判断照片素材是否在样本库中。这个样本库是事先准备好的,可能有一个白名单或者黑名单,里面有每个人的一张照片,通过拍这张照片生成一系列的特征向量。以此作为样本库,将上传的照片与样本库中的所有特征进行比对,看哪一张最相似,就认为他就是这个人。这是一个1:N的识别系统。视频1:1识别系统视频1:1识别系统类似于照片1:1系统,但比较的对象不是照片,而是视频流。拿到视频流后,我们会做检测、跟踪和质量评估,然后在得到合适的照片后,再做比对。视频1:N识别系统视频1:N适配系统类似于1:N照片系统,只是使用视频流进行识别,还需要进行检测、跟踪和质量评估。一般来说,所谓的系统构成不一定是人脸识别系统,各种AI系统大概都是这样。首先是计算资源层,运行在CPU或GPU上,运行在GPU上时可能还支持CUDA、CUDN等。二是计算工具层,包括深度学习前向网络计算库、矩阵计算库和图像处理工具库。由于做算法的人不可能自己写数据计算,所以会使用一些已有的数据计算库,比如TensorFlow、MXNET或者Caffe等,或者自己写一个。