人脸识别主要分两大类,第一人脸抓拍,指的是从原始的数据(如录像数据)中提取人脸,第二大类是对提取好的人脸进行进一步操作,比如人脸比对、人脸性别分类、表情分类等具体应用。今天我们把重点放在人脸抓拍这一步,还会特别注意算法的运行速度。
回放地址:http://www.mooc.ai/open/course/680
分享嘉宾:Robert Lorenz(德国籍),澎思科技资深算法研究员,德国柏林洪堡大学数学系博士,致力于人脸检测、人脸跟踪和人脸质量判断等领域的技术研发,尤其擅长模型构建和模型优化。其研究成果已经应用于澎思科技多种人脸识别软件平台和硬件产品中。同时也致力于视频结构化算法的研究和开发,负责数个子研究课题的攻坚工作。
曾任职学习宝联合创始人兼首席科学家、精通5国语言,完成学习宝所有模式识别算法的搭建及商用。精通模式识别、机器学习与图像处理的常见算法,例如贝叶斯分类器、SVM、ADA-BOOST、MLP、CNN、kernelized回归、受限制BOLTZMANN机、特征提取、特征选择,图像预处理、二值化算法、连通域分析、PPC(Project Profile Cutting),Viterbi算法,C语言数据结构,例如树结构、图形结构等等。
分享主题:有限算力资源下的深度学习与人脸识别技术——人脸抓拍算法设计、移植和优化
分享提纲:
- 深度学习定义与概念
- 人脸检测与深度学习
- 人脸跟踪与深度学习
- 人脸属性与深度学习
- 人脸识别应用
- 深度学习与人脸识别未来
雷锋网AI研习社将其分享内容整理如下:
大家好,我是来自德国的Robert,目前负责算法研究、算法设计和算法实现,今天想分享的内容是有限算力资源下的深度学习与人脸识别技术——人脸抓拍设计、移植和优化。在标题中大家可以看到两个关键词,第一深度学习,第二人脸识别。
人脸识别主要分两大类,第一人脸抓拍,指的是从原始的数据(如录像数据)中提取人脸,第二大类是对提取好的人脸进行进一步操作,比如人脸比对、人脸性别分类、表情分类等具体应用。今天我们把重点放在人脸抓拍这一步,还会特别注意算法的运行速度。
近年来,所有的人脸识别算法都是基于深度学习完成的,所以今天分享的内容也基于深度学习来展开,具体目录如下:
大家可能听过深度学习这个术语,但是深度学习到底是什么?如图所示,即为深度学习的定义。我们将深度学习之外所有的模式识别算法命名为传统模式识别算法。下面来了解一下深度学习和传统模式识别之间有哪些区别,深度学习的特点是什么。
传统算法主要有两个步骤。其中第一步为“手动特征提取”,即按照当前分类任务手动定义特征提取方法。下图显示对于文字图像的边缘特征,总共四个方向的边缘特征。深度学习之前,基于四个方向的边缘特征在文字识别领域非常流行,因为文字图像边缘特征的判别能力好于原始图像像素的判别能力。
传统算法第二步为“训练参数”,参数训练是基于在第一步提取好的特征进行的。下图显示对于文字特征向量的建模,每类由多维高斯分布建模。多维高斯分布唯一由期望值和相关矩阵描述。为了提高鲁棒性,仅仅估计了相关矩阵的前k个特征值和特征向量,后(d-k)个特征值由一个常数描述。有了每一类的参数,可以使用贝叶斯分类器对未知、不在训练库的新图像提取特征,并对提取好的特征进行分类。
传统方法有一些不太理想的地方:特征提取和参数训练的两个步骤是拆开的。更优的方案是联合优化特征提取和参数训练。另外,预测任务的变化引起特征提取方法的改动。例如,对肿瘤检测文理特征判别能力好于边缘特征。为了达到不错的预测效果,每个领域需要有经验的专家琢磨出好的手动特征提取方法。深度学习克服了这些难题。
接下来我们看一下,深度学习放弃手动特征提取而采用自动特征提取,如图所示:
上图有10个特征层,每一层的参数是自动学习的,不涉及到手动干预。因深度学习的特征提取是自动、智能的,所以深度学习属于人工智能的领域。
我们还需要知道的一点是,与传统算法相比,深度学习有一定的优势。在包含1000类的IMAGENET数据库中,基于几层深度学习的分类错误率为25%。将层数提高到19,错误率降低到7%,22层的错误率为6%,如果是非常深的深度学习模型(152层),错误率才3%,而人类的错误率也有5%。这说明在特定情况下,深度学习的识别率高于人类的识别率,这就引起了各行业都想将深度学习的思路融入到他们的领域里,人脸识别也不例外。
人脸识别属于图像处理的领域。图像处理领域中最常见的层是卷积层,比较一下卷积层和全连接层。如下图所示,全连接层每个输入节点跟任何输出节点都构造一个连接,而卷积层只有考虑特殊的连接。一个卷积核扫描所有输入图的窗口,可以做到参数共享、参数数量降低。可训练参越多,越容易发生过度适应现象,因卷积层大大降低了参数数量,其过度拟合现象大量减少,卷积操作可以理解为深度学习网络的正则化。另外全连接不考虑二维图像拓扑,而卷积层更好地利用相邻像素之间的关联性。
来看一下深度学习早期的一个完整的深度学习网络模型。下图显示所谓LENET5的拓扑:卷积层1、欠采样层2、卷积层3、欠采样层4、卷积层5、全连接6、分类输出层7。LENET5对32x32大小的输入通过卷积和欠采样和全连接层提取84维的特征向量,对84维的特征向量进行最终的分类,都在一个联合框架中。
对深度学习的定义和概念的介绍就到这,接下来了解深度学习怎么应用在人脸抓拍的领域。
人脸抓拍第一步是人脸检测,是一个二类分类问题,只有两类:人脸和非人脸。人脸检测中一个难题是人脸大小未知。克服这个难题的一个办法是图像金字塔,如下图左侧部分所示。图像金字塔包含不同缩小率的缩小图像。对不同缩小图用固定窗口大小进行扫描,就可以做到多尺度人脸检测。
人脸检测另外的难题是类内的丰富性。人脸有白种人、黄种人、黑人等不同种族,图像光照条件不同、模糊度不同,人脸姿态、角度也不同。非人脸类更复杂,有无穷多个非人脸的可能性。所以,分类人脸和非人脸需要比较深、有一定判别能力的深度学习网络。用深的网络扫描整个图像金字塔的方法不最优,计算量太大。可以利用非人脸可以细分成简单负样本(例如平稳的天空)、中等负样本(例如衣服文理、胳膊、手)和难负样本(跟人脸非常相似)的事实。先用极少的计算量排除简单负样本,然后用中等计算量排除中等负样本。以此类推,用更大的计算量排除难度更大的负样本,最中留下的所有没排除的窗口分类成人脸。在传统领域该思想叫做ADABOOST分类器组合方法。
下面介绍一个基于ADABOOST思想的三个阶段人脸检测算法,如下图所示。总共有三个深度学习模型:PNET、RNET和ONET。PNET网络不深,只有三个卷积层,用12x12的窗口扫描图像金字塔,快速排除大量的简单负样本。留下的候选窗口用大小24x24重新抠,当作RNET的输入,RNET的计算量中等,有四个卷积层。对RNET可能没有成功排除的难负样本调用计算量比较大的ONET,输入大小为48x48,ONET有5个卷积层,构造最终的人脸/非人脸分类效果。同时ONET计算人脸5个特征点(眼睛,鼻尖,嘴角),用来在人脸比对之前做人脸矫正。
三个阶段的高效人脸检测器运行速度快,分类效果不错。然而,如果CPU跟GPU联合使用的话,CPU与GPU之间的传输数据时间不可忽略,如下图所示。
为了减少传输数据的时间,我们寻找一个阶段的人脸检测器,即只有一个深度模型的人脸检测器。下面我们来看一下一个阶段的高效人脸检测器。因为没有快速预淘汰简单负样本的步骤了,我们在前两个卷积层和欠采样层大大降低网络输入图的尺寸,缩小率为32倍。两个卷积层之后还有非常多的深度学习层,但是因图像尺寸非常小了,其计算量并不大了。一个阶段的人脸检测器没有图像金字塔了,但是有一个以上的分类输出层。输出层的输入是不同尺寸的特征图,一个阶段的人脸检测器基于特征金字塔,是克服人脸大小未知的另外一种方法。两个尺度之间跨度比较大,容易漏检特征金字塔中间大小的人脸。为了避免这种现象,设计了Inception模块。其设计特点为不同分支,分支卷积核大小不一致,最终连和不同分支。不同卷积核大小的分支构造不同大小的感受野,构造不同尺度的特征图。连续三次使用Inception模块,构造非常多的卷积核大小的组合,非常好地客服了人脸大小未知的问题。
下图中显示的人脸检测器不关注运行速度,但争取更高的准确率。代价是几百倍的计算量,我们这关注的是网络架构。高准确率人脸检测器也属于一个阶段的检测器,基于特征金字塔,总共有六个尺寸层次。与以前的模型相比,特征金字塔不直接当成网络输出层的输入,但是还加上特征增强模块。特征增强模块考虑到两个相邻的特征图,对尺寸小的特征图进行上采样,构造跟尺寸大的特征图同样的尺寸。用乘法融合两个相邻的特征图,再加上基于inception思想的模块,这才是分类输出层的输入。
如下图所示,准确率高的人脸检测器对不良因素的鲁棒性非常强,可以检测出尺寸更小的人脸、模糊人脸、光照情况复杂、曝光、很暗的人脸、被局部遮挡的人脸,还有反光、姿态奇特或者化妆的人脸。抓拍系统不会使用计算量庞大的高准确率人类检测器,而调用上述提到的快速人脸检测器。当然,对不利情况下的检测率有一些折扣。假设,远处的人脸尺寸小、非常模糊,快速人脸检测器漏检了。但是十几帧之后人移动到离摄像头更近的位置,不显得那么小和模糊,检测出的概率大大提高。以人为单位的快速人脸检测器的检测率可以超过99%。
人脸检测速度快,但是每帧都做人脸检测,满足不了一个GPU实时处理数十路视频的数据。另外这种方法也放弃了帧与帧之间的关联性。假设,在帧1检测出四个人脸。在帧2出现4个人脸的概率很高,甚至4个人脸的位置跟前一帧的位置非常相似。从前一帧到当前帧人脸具体平移量是多少,这就是人脸跟踪的命题,请看下图。人脸跟踪在目标周围范围考虑问题,人脸检测在整个场景图范围考虑问题,与全局的检测相比,跟踪属于局部算法,可以大量节省整个抓拍系统的计算量。
接下来,给大家分享一下一个属于传统算法领域的跟踪算法。其特点是运行速度非常快,数学模型和求解非常潇洒。下图的第一个数学公式是空间域中的数学模型,优化对象是相关核h,使得对在帧1的图像数据f进行滤波的话,得到跟标签g尽可能接近的值,其中*代表循环卷积。标签g经常选择为高斯函数。正则化系数lambda控制过度适应现象。利用傅里叶变换和相应的一些数学定理,可以把空间域建模问题等价地描述在频率域。大写字母符号代表小写字母符号的傅里叶变换。卷积定理把耗时的循环卷积操作改成快速的乘法。频率域的解析式形式很简单,只有乘法、加法和除法的操作。在帧2,对空间域的图像数据z应用傅里叶变换,跟在帧1学到的模板H进行乘法,得到频率域的响应Y,再用逆傅里叶变换回到空间域,得到空间域的响应y。最终跟踪效果为响应y最大值的对应的位置。
虽然基于相关滤波的跟踪算法在CPU上非常快,但是利用不起来GPU并行计算资源,因为快速傅里叶变换由很多零散的计算步骤组成,其GPU并行计算加速效果很差。接下来,给大家分享基于深度学习的跟踪算法,可以充分利用GPU并行计算资源。下图显示SIAMESE网络的跟踪器的流程。在帧1以目标位置为中心稍微扩充,构造参考图,用深度学习映射phi构造尺寸非常小的特征图(6x6)。在帧2扩充范围更大,构造搜索图,用同样的映射phi计算出尺寸比较大的特征图(22x22)。SIAMESE网络的特点是其输出层,所谓的相关层。6x6的特征图当作卷积核,扫描22x22的特征图,构造17x17大小的输出图。跟踪的效果就是输出图最大值的对应的位置。因17x17尺寸比较粗糙,经常对输出图进行上采样操作,获取更大分辨率的跟踪效果。SIAMESE网络属于离线学习的跟踪器,因为映射phi与原始图像无关,需要大量的人脸训练样本在GPU上学习映射phi的参数。然而,上述介绍的相关滤波跟踪器是在线学习的跟踪器,模板H依赖于原始图像,关键在于模板H的训练过程极快。
从现在开始,内容不会给大家介绍那么详细,限于概括性的介绍。下一步给大家介绍一下人脸属性与深度学习,如图所示:前几层设计所有任务共享的卷积层和欠采样层。后来几个网络分支对应不同标签类别,比如局部、全局标签,有序标签、类别性标签等等。需要大量的标注好的人脸属性训练样本,在GPU上训练共享的参数和分支的参数。
接下来简单介绍一下人脸识别的应用,如下图:
下面讨论一下深度学习与人脸识别的未来,如下图:
最后提到的是,对算法研究和算法工程感兴趣的朋友,可以关注澎思科技,感谢大家的聆听。
来源 | 雷锋网