【转】干货|孙启超:卷积神经网络在人脸识别技术中的应用

2018-08-27 21:45:01

随着 iPhone X 的发布,Face ID 人脸识别技术开始进入人们的日常生活中,当我们拿起手机并看着它的时候就可以实现手机解锁的功能。而人脸识别中的关键技术就是卷积神经网络。

近日,在雷锋网 AI 研习社公开课上,法国蒙彼利埃大学孙启超就讲述了卷积神经网络的基本原理以及人脸识别技术是如何运行的。公开课回放视频网址:http://www.mooc.ai/open/course/524

分享人介绍

孙启超:法国蒙彼利埃大学 MBA 在读,CSDN 百万博客专家。

分享主题:卷积神经网络在人脸识别技术中的应用

分享提纲:

  • 介绍卷积神经网络的基本原理和工作流程

  • 讲述卷积神经网络的四大基本组件:池化操作,激活函数,全连接层,目标函数

  • 解析通用的人脸识别技术

AI 研习社将其分享内容整理如下:

我今天跟大家分享一下卷积神经网络在人脸识别技术中的应用。首先介绍一下深度学习和机器学习的关系。人工智能包含了机器学习这一个子领域,机器学习又包含了表示学习(一种能自动抽取特征的学习方式),而深度学习则是表示学习中最具代表性的一种学习。我们今天要讲的 CNN 即卷积神经网络,就是深度学习中的一种。

机器学习的核心思想其实就是利用特征来学习到我们所需要的知识,因而一种新的工作出现了,那就是专门做特征工程的一类工程师。而特征工程的好坏,会影响机器学习最终效果。科学家们就想到,能不能让机器自动学习特征,而不需要让人去做特征工程呢?结论是:可以。表示学习就是利用特征去学习。

深度学习的使用,其实非常简单,就是端到端的学习,只需要三步:第一,把数据给它(机器);第二,等深度学习处理完;第三,拿到结果。

下面,我们来看一下我们今天要讲的卷积神经网络的发展历程:

·1980 年,科学家提出了「神经认知」,现在认为「神经认知」是卷积神经网络的前身;

·1998 年,两位科学家提出了基于梯度学习的卷积神经网,叫 LeNet。它是第一个大规模应用的图像识别。美国当时大量的邮寄工作,需要专人进行报邮编、寄送地址等工作。人工去做的话,效率很低,一个人一秒能识别几个?就算识别速度很快,然而人的速度越快,错误率可能就越高,所以这个 LeNet 就被应用于手写数字的字符识别,并且错误率只有 1%,可大规模进行运用;

·2012 年,Hinton 团队提出卷积神经网络 Alex-net,该团队参加了李菲菲教授的 Image Net 的比赛,拿到了冠军。当时它以比第二名提高 12% 的准确率遥遥领先。以前,第一名比第二名一般只会提前一、二个百分点,三、四个百分点就很多了,而这一次,这个团队一项就领先了十二个百分点。这是因为 Alex-net 第一次用到了 ReLU 激活函数、最大池化、DROP Out 以及 GPU 加速这些新技术

·2014 年,Google 提出 Inception-net,里面的核心思想就是可反复堆叠的高效卷积神经网络结构,将错误率降到了 Alex-net 的一半;

·2015 年,微软的 ResNet成功训练了152 层的深层次网络。以前的一些神经网络,这边输入,中间是很多神经元,但是只有一层。而增加层次的技术,在当时难以取得突破。微软这个 ResNet 一下增加到 152 层,则算是一个突破。同时,它将错误率降低到 3.46%,再次刷新记录。

·此后,基本上每年甚至每几个月都会出现新一代的技术,例如新的网络结构,更深的网络的训练方法等。可以说,是 CNN 引领了这次深度学习的浪潮

那卷积神经网络到底是什么?它的核心是卷积操作。

大家可以参考下图,左上角是一个 5*5 的绿色矩阵,矩阵中的黄色区域是一个 3*3 的卷积核。黄色区域的作用,是把覆盖在矩阵上的数进行加权求和,计算出来的数(见紫色区域)将会被放入一个新的矩阵。

然后看右上角的第二张图片,黄色的区域向右移动一位,就是一步,这个「步」指的是步长——CNN 里面的另一个参数(一个参数是卷积核),这里的步长被设置为 1 步。移动 1 步后,同样对黄色区域进行加权求和,又得出一个新的数(与第一个数一起被放入紫色区域)。

我们可以将整个黄色区域看成一个相框,大小、长宽都是固定的,顺序为从左往右、从上往下,移动三次,依次会出现三个新的数,再依次放到下一个矩阵中进行计算。这是一种局部操作,原始数据(5*5 的输入)经过 9 次卷积,就能得到卷积后的结果。这个结果叫做卷积特征,它是一个新的 3*3 矩阵——这个矩阵又作为下一层操作的输入,并进行一些池化操作。

接下来我们看一下 CNN 的工作流程。先看一下几个核心的概念:第一个就是我们刚才讲的卷积操作;第二个就是池化操作,这个也是非常重要的;第三个就是它的激活函数、全连接层和目标函数。

然后再看下方这张长图。第一步,我们先把原始数据输入给它(机器),然后以例如卷积层+池化层+激活函数的组合形式进行卷积操作。之后,再同样采用这种组合形式进行下一组卷积操作……就这样不停循环,直到把所有特征都抽取出来。接着,抽取出来的所有特征与全连接层进行对接,得出预测的值,并与目标值进行对比。最后,机器会对二者的差值进行修复,并重新训练。这是一个完整的工作流程。

接下来我们再看一下卷积操作,它没有参数,我们只需要给它设置最大池化和平均池化。最大池化是指将覆盖区域的最大值取出来——它的目的就是把最显著的特征取出来,将一些不太明显的特征忽略掉。

卷积操作有三大特点:

第一个是特征不变性。我们可以想象一张图片卷积以后,图片的右下角为一条直线,如果它在图像的左上角识别的(图形)卷积特征与直线的卷积特征一致,那左上角的这个图形一定也是一条直线,因为特征一样。这也是卷积神经网络里面的一个特性,即两个特征的相对位置要比它们在图片中的绝对位置要重要。

第二个特点就是特征降维。我们上面用的是 5*5 的矩阵,但实际上 10024*798 的图片像素需要消耗很大的性能,而其中大部分都是没必要的计算,最大池化就是将最显著的特征取出来,舍弃那些不太明显的特征,以节省一些计算资源。

第三个特点就是防止过拟合。因为抽取的都是最明显的特征,能够防止过度拟合。

下面我们再看激活函数。以前从事过机器学习的同学,可能会接触到另一个激活函数——sigmoid 函数,它是取值范围为 0-1 的一条曲线。

而我们要讲的这个 ReLU 函数,可表示为下图的蓝线。它实际上是一个分段函数,当你给这个函数的值小于 0 的时候,不管负多少,都会返回一个 0。当你给它大于等于 0 的值的时候,也不管给出的是什么值,它都能返回本身(X),这其实是一个很简单的函数。

那激活函数到底有什么用?

打个比方,我手上拿着一根针,要去扎另一只手,刚开始隔得很远,我不会感到疼,然后针慢慢接近我的另一只手,直到最后扎到了,我手上的这块神经就会告诉我的大脑,我的手扎到了——我就会感到疼,这就相当于「激活」了。

针与我的另一只手的距离有一个阈值,当这个距离小于了这个阈值,并最终完全贴近了,我的神经就会马上告诉我的大脑(疼),从而激活我的「疼感」——激活函数就是这个原理。机器平时训练出来的一些东西,如果没有达到阈值,特征就不会被激活;而如果超过阈值,特征就会被激活并被输出。

再往下,我们就以一个整体的视角来看一下卷积神经网络的运作。先看下面的这张图,这是一个字母 A,首先要进行卷积操作,之后再根据设置的卷积核和步长找到卷积核的特征,最后把所有激活的神经元和最后的全连接层一一对应,通过矩阵乘法,看它们是否真正被激活。

全连接层在整个 CNN 中起到「分类器」的作用,该作用一般在最后实现。

然后是目标函数。卷积神经网络中最多的回归问题,用的都是欧式(Euclidean)距离,算法为:

。我们一般采用最右边的公式,该公式为求和公式,从 1 开始取到 n,对两个数之间的差值进行计算。

这个欧式距离有什么用呢?比如两个目标,如果距离近,相似度就比较高。因此通过求欧式距离,我们可以判断它们是否近似。

卷积神经网络的基本原理以及几个核心概念都介绍完了。接下来我们进入人脸识别的环节,总体分为四步:第一步就是人脸边框检测,第二步就是图像校准,第三步是图像转向量,第四步是向量对比。

第一步人脸边框检测。一张图片上,有可能不止一张脸,而是有多张脸。不管有多少张脸,我们先把符合人脸特征的边框找到,并且把边框给截取出来。

怎么截取?定位。就是根据人脸特征来进行定位,就像刚刚所说的,如果某个位置有一只眼睛,其对称的地方也有一只眼睛,那(机器)就能找到眼部位置,进而也能找到眼角部分。在人脸识别中,边框特征范围非常重要,因为机器依靠这些,就可以划出完整的脸部位置。机器可以参照的主要特征之一是下巴,因为嘴角可以张开或者合闭,但是下巴一般不会有太大变动。第二个是眉毛——找到眼睛了,眉毛就好找了。第三个是鼻梁、鼻尖,上、下嘴唇。

将这些特征都找到后,就要找到脸的边框——可能为方脸、瓜子脸以及圆脸,机器会在脸部边框上生成一些点,之后使用图形边框(如圆边框)去进行对比,发现差了一点,它就会不停调整系数,直到完全符合。

但截取时,脸附近需要留出一定距离,不能完全按照边框去截取,例如,上图中的头发部分,(人)可能戴了帽子,因此机器就不能进行完全截取,而是在周围留出一定空间,再把图片截取出来。如果一张脸有多个点,那就截出多个人脸的边框。

第二步就是校准图像。这个概念其实跟计算机处理数据的思路一致。不管你给机器图片、语音、数字、字符串,或者是别的一些数据,它都会将其转化为计算机可以识别的数据。

人脸校准也是,给机器的头不管是歪头、低头还是仰着头——位置都不正,那就先将脸边框截出来,为每个点进行定位(如下图中的绿点),再根据点定位出一个坐标,跟真正摆正的脸的坐标进行对比,二者相差的角度,就是头歪的角度,将图像反向旋转一下,图像就变正了。

这个效果也是非常有用的,因为它可以减少不必要的误差。机器学习也是这样,当你给它一堆没有处理过的数据进行训练的时候,它最终训练出来的结果不仅有可能是不好的,还有可能是相反的,为你做出的决定都是错误的。比如做商品智能推荐,如果输入的数据没有经过处理,甚至所设置的维度都是没有用的,机器可能会往错误的方向去做推荐。

因此对数据的处理非常重要,要去掉不必要的误差,并将所有的算法都放在真正有用的计算上面——这个思想很重要。

第三个是图像转向量。该图像转向量是怎么生成的?就是卷积、池化操作过后生成的图像向量。向量既有大小又有方向,如果两个向量间的夹角非常小,那这两个向量就非常接近。

通过比较向量间的夹角,可以判断两个目标是否相似。例如,我们需要判断计算机视觉相关的两篇文章是否相似,首先我们要找到两篇文章,将其中一篇文章的关键词提取出来——一个关键词就是一个向量,所有关键词都找出来以后,计算一下向量的方向和大小。另外一篇也进行同样的操作,最后机器再对两组向量进行对比,如果几乎重合,则说明两篇文章的内容非常相似。向量的作用,在机器学习中是非常重要的。

图像转向量之后,就需要把这个向量计算出来,然后和目标函数的向量做对比,再用余项定理求出它们之间的夹角——前面两篇相似文章的对比,就使用了这一定理。这一向量与目标向量不一定要完全重合,夹角在很小的情况下,只要在阈值之内,就可以判断二者相似,而阈值都是人为设置好的。

最后一步就是向量对比。相同的人脸,对应的向量距离小;不同的人脸,向量距离自然就大。

向量计算中的有一个名词——内积,它是对应元素乘积的求和,可以计算出刚才上面所提到的夹角。公式为:

。夹角越小,说明两张人脸越相似。

(0)

相关推荐