近日,维识科技智能工程教育中心开展了一场别开生面的人脸识别技术知识公开课。本次公开课主讲人为维识教育科技金牌讲师揭李迪。
揭sir简介:本科毕业于谷歌首席科学家Geoffrey Hinton(图灵奖获得者,被称为“神经网络之父”、“深度学习鼻祖”)的母校爱丁堡大学(Edinburgh University)。研究生师从香港浸会大学(HKBU)国际电子电气工程协会(IEEE)院士刘继明(jiming LIU)。曾经担任融链科技项目总监、金力软件项目经理。参与了公安部旗下与商汤竞标的闭路摄像头人脸检测项目。精通物体检测语义分割NLP自然语言处理与AI项目全栈落地WANN无权重机器人等国内外领先技术。
人脸识别其实是对人脸特征进行分析计算并进行身份识别的一种生物识别技术,即用摄像机或摄像头采集含有人脸的照片或视频对其中的人脸进行检测和跟踪进而达到识别、辨认人脸的目的。
人脸识别技术发展到今天,主要有两种用途:
①人脸验证:人脸验证做的是1:1的比对。也就是说我们先告诉人脸识别系统,我是张三,然后用来验证站在机器面前的“我”到底是不是张三。
②人脸识别:人脸识别做的是1:N的比对。也就是说系统采集了我的一张照片之后,从数万人或者数百万人的库里自动找出“我是谁”。
而“刷脸”只是人脸识别中比较具体可感的一部分,事实上人脸识别能够给大家带来的远远不仅是“刷脸”付款这么简单。
目前,人脸识别技术在金融、安防、交通、电子商务、娱乐等领域均有着广泛应用。
了解了什么是人脸识别之后,那么问题来了——它是怎么实现的呢?
关于人脸识别目前有很多经典的算法:基于几何特征法、局部特征分析法、基于弹性模型法、特征脸法及神经网络法等
神经网络方法在人脸识别上的应用比起前述几类方法来有一定的优势,因为对人脸识别的许多规律或规则进行显性的描述是相当困难的,而神经网络方法则可以通过学习的过程获得对这些规律和规则的隐性表达,它的适应性更强,一般也比较容易实现。
卷积神经网络(CNN)的前级包含了卷积和池化操作,可以实现图片的特征提取和降维,最近几年由于计算机算力的提升,很多人都开始转向这个方向。
所以,本次公开课,揭sir以CNN为技术背景,介绍了人脸识别的基本思路:
先用人脸检测方法检测出人脸位置,然后根据返回的坐标、尺寸把脸用数组切片的方法截取下来,然后把截取的小图片送进训练好的卷积神经网络模型,得出人脸的分类结果,最后在原图片上打上包围框并且把结果写在包围框的上端。
当然,实现以上步骤的前提是有一个训练好的可以做人脸识别的模型。因为训练的好坏直接影响识别的准确度。
所以,本次课程的重点放在了训练上,揭sir简述了从LeNet到VGG-Nets的网络架构演进。
亮点:定义了CNN的基本架构;卷积层、池化层、全连接层;是CNN的鼻祖。
亮点:更深的网络;数据增广;ReLU;dropout;LRN。
亮点:网络结构没什么改进,只是调了调参,性能较AlexNet提升了不少。
亮点:卷积层使用更小的filter尺寸和间隔。与AlexNet相比,可以看出VGG-Nets的卷积核尺寸还是很小的,比如AlexNet第一层的卷积层用到的卷积核尺寸就是11*11,这是一个很大卷积核了。而反观VGG-Nets,用到的卷积核的尺寸无非都是1×1和3×3的小卷积核,可以替代大的filter尺寸。
他指出:CNN从90年代的LeNet开始,21世纪初沉寂了10年,直到12年AlexNet开始又再焕发第二春,从ZF-Net到VGG-Nets,网络越来越深,架构越来越复杂,解决反向传播时梯度消失的方法也越来越巧妙。但万变不离其宗的是CNN基本架构为:卷积层、池化层与全连接层。层数发生变化,但CNN的流程并没有变化。因此,充分理解了卷积层、池化层与全连接层,就可以找到入门CNN的诀窍了。
关于卷积层我们先来看什么叫“卷积操作”。
上图较大网格表示一幅图片,有颜色填充的网格表示一个卷积核,卷积核的大小为33。假设我们做步长为1的卷积操作,表示卷积核每次向右移动一个像素(当移动到边界时回到最左端并向下移动一个单位)。卷积核每个单元内有权重,上图的卷积核内有9个权重。在卷积核移动的过程中将图片上的像素和卷积核的对应权重相乘,最后将所有乘积相加得到一个输出。上图经过卷积后形成一个64的图。
在了解了卷积操作后,我们来看下卷积层的特点。
局部感知
在传统神经网络中每个神经元都要与图片上每个像素相连接,这样的话就会造成权重的数量巨大造成网络难以训练。而在含有卷积层的的神经网络中每个神经元的权重个数都时卷积核的大小,这样就相当于没有神经元只与对应图片部分的像素相连接。这样就极大的减少了权重的数量。同时我们可以设置卷积操作的步长,假设将上图卷积操作的步长设置为3时每次卷积都不会有重叠区域(在超出边界的部分补自定义的值)。
局部感知的直观感受如下图:
ps:使用局部感知的原因是一般人们认为图片中距离相近的部分相关性较大,而距离比较远的部分相关性较小。在卷积操作中步长的设置就对应着距离的远近。但是步长的设置并无定值需要使用者尝试。
参数共享
在介绍参数共享前我们应该知道卷积核的权重是经过学习得到的,并且在卷积过程中卷积核的权重是不会改变的,这就是参数共享的思想。这说明我们通过一个卷积核的操作提取了原图的不同位置的同样特征。简单来说就是在一幅图片中的不同位置的相同目标,它们的特征是基本相同的。
如权值共享的部分所说我们用一个卷积核操作只能得到一部分特征可能获取不到全部特征,这么一来我们就引入了多核卷积。用每个卷积核来学习不同的特征(每个卷积核学习到不同的权重)来提取原图特征。
上图的图片经过三个卷积核的卷积操作得到三个特征图。需要注意的是,在多核卷积的过程中每个卷积核的大小应该是相同的。
池化层降低了各个特征图的维度,但可以保持大分重要的信息。
池化层夹在连续的卷积层中间,压缩数据和参数的量,减小过拟合,池化层并没有参数,它只不过是把上层给它的结果做了一个降采样(数据压缩)。
降采样有两种常用的方式
①Max pooling:选取最大的,我们定义一个空间邻域,并从窗口内的修正特征图中取出最大的元素,最大池化被证明效果更好一些。
②Average pooling:平均的,我们定义一个空间邻域,并从窗口内的修正特征图算出平均值。
无论是max pool,还是average pool,都有分信息被舍弃,那么部分信息被舍弃后会损坏识别结果吗?因为卷积后的Feature Map中有对于识别物体不必要的冗余信息。我们降采样就是为了去掉这些冗余信息,所以并不会损坏识别结果。
全连接层(Fully connected)
在全连接层中所有神经元都有权重连接,通常全连接层在卷积神经网络尾部。当前面卷积层抓取到足以用来识别图片的特征后,接下来的就是如何进行分类。通常卷积网络的最后会将末端得到的长方体平摊成一个长长的向量,并送入全连接层配合输出层进行分类。比如,在下面图中我们进行的图像分类为四分类问题,所以卷积神经网络的输出层就会有四个神经元。
我们从卷积神经网络的卷积层、池化层以及全连接层来讲解卷积神经网络,我们可以认为全连接层之间的在做特征提取,而全连接层在做分类,这就是卷积神经网络的核心。
而三者与卷积神经网络的关系,可以这么理解:
卷积神经网络在形式上有一点点像咱们的“人民代表大会制度”,卷积核的个数相当于候选人,图像中不同的特征会激活不同的“候选人”(卷积核)。池化层(仅指最大池化)起着类似于“合票”的作用,不同特征在对不同的“候选人”有着各自的喜好。全连接相当于是“代表普选”,所有被各个区域选出的代表对最终结果进行“投票”,全连接保证了receiptive field是整个图像,既图像中各个部分(所谓所有代表)都有对最终结果影响的权利。
举个栗子:以VGG-16为例,对224x224x3的输入最后一层卷积可得输出为7x7x512,如后层是一层含4096个神经元的FC,则可用卷积核为7x7x512x4096的全局卷积,来实现这一全连接运算过程。它把特征representation整合到一起,输出为一个值,这样做有一个什么好处就是大大减少特征位置对分类带来的影响。
猫在不同的位置
输出的feature值相同
但是位置不同
对于电脑来说
特征值相同
但是特征值位置不同
那分类结果也可能不一样
这时
全连接层filter的作用就相当于
猫在哪我不管
我只要猫
于是我让filter去把这个猫找到
实际就是把feature map
整合成一个值
这个值大,有猫
这个值小,那就可能没猫
和这个猫在哪关系不大了
鲁棒性有大大增强
因为空间结构特性被忽略了
所以全连接层不适合用于
在方位上找Pattern的任务
比如segmentation
全连接层中一层的一个神经元
就可以看成一个多项式
我们用许多神经元去拟合数据分布
但是只用一层fully connected layer
有时候没法解决非线性问题
而如果有两层
或以上fully connected layer
就可以很好地解决非线性问题了
我们都知道
全连接层之前的作用是提取特征
全理解层的作用是分类
我们现在的任务是去区别一图片是不是猫
假设这个神经网络模型已经训练完了
我就可以判断这个东东是猫了
因为全连接层的作用主要就是实现分类
从下图
同一层的其他神经元,
要么猫的特征不明显
要么没找到
当我们把这些找到的特征组合在一起
发现最符合要求的是猫
OK
于是我们下一步的任务
就是把猫头的这么些子特征找到
当我们找到这些特征
神经元就被激活了(上图红色圆圈)
这细节特征又是怎么来的
就是从前面的卷积层,池化层来的
全连接层参数特多
(可占整个网络参数80%左右)
ps:至于VGG-Nets之后GoogLeNet引入Inception结构代替单纯卷积+激活的传统操作,中间层的辅助LOSS单元,后面的全连接层全部替换为简单的全局平均pooling;ResNet在网络结构上做了较大创新等发展,本次公开课并未做过多阐述,有兴趣的童鞋可自行查阅相关资料了解。
最后,揭sir以Facenet与Face Recognition为训练模型,让童鞋们实操了一把人脸识别的全过程。
Face Recognition的Github网址:https://github.com/ageitgey/face_recognition
Facenet的Github网址:https://github.com/davidsandberg/facenet