下面这张据说是最多人自拍的照片里面有1000个人。 百度的人脸检测技术成功找到其中880个人。这个的确考验眼神,让人来数的话,估计拿着放大镜也数不清。
这还是2018年底的成绩,估计现在又厉害了一截。这就今天我们讨论的问题。
人脸检测现在应用已经非常普遍,但是背后的技术原理还是很有意思的。比如大家用手机照相时候,应该注意到了相机能够自动检测到人脸。
首先要稍微区分一下人脸检测和人脸识别两个概念,非常相关又略有不同:
- 人脸检测: 当前照片里,哪些部位是人脸?
- 人脸识别: 当前照片里面的人是谁?手机照片自动归类就用到了这个技术。
1.
从人工智能大的方面来说,这两个问题很好统一。其实就是给定输入变量X (照片),模型自动给出结果Y。这个Y可能不同,比如1)是不是人脸?2)谁的人脸?3)这个人年纪多大?)。
简答来说,人工智能模型是解决一个方程:
X * W = Y
其中W就是模型要学习的一系列参数。参数学好了,就能成功的把输入变量映射到我们想要的输出变量。
1)对于人脸检测问题来说,X是照片的各个像素值,包括3个通道的颜色。图像在计算机中的存储方式是数字矩阵对应像素点阵,比如1024×768等。而每个像素点是用数值来表示RGB或者黑白灰。而Y就是人脸框框的四个坐标值。
2)对于人脸识别问题,就是判断这个人和谁是同一个人时候,X输入同上,而Y是一长串特征值向量,可以用来和已有标签人脸图片进行对比,特别一致的可以判断为同一个人。
3)对应年龄识别问题,X输入同上,而Y输出就是年龄大小。
2
人脸检测和识别问题大的方法可以分为两大类:
1)基于统计特征+传统机器学习算法
2)基于深度学习方法
1)基于统计特征+传统机器学习算法
早期的人脸检测可以理解为模板匹配技术, 即用一个人脸模板图像与被检测图像中的各个位置进行匹配,确定这个位置处是否有人脸。
此后机器学习算法被用于判断是否是人脸的问题,包括神经网络,支持向量机等。
在2001年Viola和Jones设计了一种人脸检测算法。这个算法较之前的算法有一个速度和精度上的提高,是第一个真正能在工业界应用的算法。其主要原因是用了一个叫做AdBoost的集成算法。用一些快速偏弱的算法先过滤掉大部分不是人脸的图片部位。
在比较图片中各个部位是否有人脸时候,有一个“滑动窗口”的概念。由于人脸可能出现在图像的任何位置,在检测时用固定大小的窗口对图像从上到下、从左到右扫描,判断窗口里的子图像是否为人脸。为了检测不同大小的人脸,还需要对图像进行放大或者缩小构造图像金字塔,对每张缩放后的图像都用上面的方法进行扫描。比如512x512像素大小的图片,假设分类器窗口为24x24,各种缩放总的下来扫描的窗口可能会超过1百万。
在深度学习之前,输入变量的特征都是人工设计的。人工设计的好处是简单好理解,虽然效果可能没有深度学习好,但是速度比较快。比如下面的图片特征就是基于方向梯度直方图(HOG)设计的,人脸的轮廓还是很明显的:
2)基于深度学习
深度学习的技术日新月异,但是基础都和卷积神经网络有关。
基于一副图片每个像素点的数值,卷积神经算法通过一层层的神经元网络,对图片的各种特征进行组合和加工。对于这个算法最好的理解就是,想象一下,你拿着各种各样形状的小件物品。这些物品可以是一个勾的形状,可以是一个叉的形状,或者一个圆圈。总之你能想到的各种形状,有可能对研究图片的特征有效的东西。然后你把每一个物品拿到你要研究的图片上去比较(这个物品尺寸肯定要比研究的图像小很多)。从上到下,从左到右的移动,每次移动一个像素点。在这个过程中,你记录当前图片的区域是否和你手里拿的物品相似,如果相似你记录1,不相似的话,你记录0。 不断重复这个过程,可以很多次,直到你觉得你已经能充分的把图片的各种特征给找了出来。这就是深度学习能够自动寻找图片特征的基本原理。
卷积的过程如下图所示:
人脸检测算法是在卷积神经网络的基础上进行各种升级和创造。比如Cascade CNN]可以认为是传统技术和深度网络相结合的一个代表,和传统的人脸检测技术相似,其包含了多个分类器,这些分类器采用级联结构进行组织,然而不同的地方在于,Cascade CNN采用卷积网络作为每一级的分类器。快速的剔除掉超过90%的检测窗口。
再回到文章一开始的百度技术,居然能够密密麻麻图片里面的800多人,不得不感叹机器学习算法在人脸识别上应用已经炉火纯青了。这给大家省了多少事情。以后全校集合,不用费事点名了,拍一张照片自动数人,很方便。
欢迎关注公众号: