人脸识别和检测

图像处理:

  • 人脸检测应该可以正确检测出图片中存在的所有人脸,不能有遗漏,也不能有错检。
  • 第二步要做的是人脸对齐( Face Alignment )。原始图片中人脸的姿态、位置可能有较大的区别,为了之后统一处理,要把人脸“摆正”。为此,需要检测人脸中的关键点( Landmark ),如眼睛的位置、鼻子的位置、嘴巴的位置、脸的轮廓点等。根据这些关键点可以使用仿射变换将人脸统一校准,以尽量消除姿势不同带来的误差,人脸对齐的过程如图

MTCNN(人脸检测和对齐方法)的原理

MTCNN由三个神经网络组成,分别是P-Net、R-Net、O-Net。 在使用这些网络之前,首先要将原始图片缩放到不同尺度,形成一个“图像金字塔”,如图6-3所示。接着会对每个尺度的图片通过神经网络计算一遍。这样做的原因在于:原始图片中的人脸存在不同的尺度,如有的人脸比较大,有的人脸比较小。对于比较小的人脸,可以在放大后的图片上检测;对于比较大的人脸,可以在缩小后的图片,上检测。这样,就可以在统一的尺度下检测人脸了。

现在再来讨论第一个网络P-Net的结构,如图6-4所示,P-Net的输入是一个宽和高皆为12像素,同时是3通道的RGB图像,该网络要判断这个12x12的图像中是否含有人脸,并且给出人脸框和关键点的位置。因此,对应的输出由三部分组成:

  • 第一个部分要判断该图像是否是人脸(图6-4中的face classification),输出向量的形状为1x1x2,也就是两个值,分别为该图像是人脸的概率,以及该图像不是人脸的概率。这两个值加起来应该严格等于1。之所以使用两个值来表示,是为了方便定义交叉熵损失。
  • 第二个部分给出框的精确位置(图6-4中的bounding box reression)一般称之为框回归。P-Net输入的12x12 的图像块可能并不是完美的人脸框的位置,如有的时候人脸并不正好为方形,有的时候12x12的图像块可能偏左或偏右,因此需要输出当前框位置相对于完美的人脸框位置的偏移。这个偏移由四个变量组成。一般地,对于图像中的框,可以用四个数来表示它的位置:框左上角的横坐标、框左上角的纵坐标、框的宽度、框的高度。因此,框回归输出的值是:框左上角的横坐标的相对偏移、框左上角的纵坐标的相对偏移、框的宽度的误差、框的高度的误差。输出向量的形状就是图中的1x1x4。
  • 第三个部分给出人脸的5个关键点的位置。5个关键点分别为:左眼的位置、右眼的位置、鼻子的位置、左嘴角的位置、 右嘴角的位置。每个关键点又需要横坐标和纵坐标两维来表示,因此输出一共是10维(即1x1x10)。

在实际计算中,通过P-Net中第一层卷积的移动,会对图像中每一个12x12 的区域都做一一次人脸检测 ,得到的结果如图6-5所示。图中框的大小各有不同,除了框回归的影响外,主要是因为将图片金字塔中的各个尺度都使用P-Net计算了一遍,因此形成了大小不同的人脸框。P-Net的结果还是比较粗糙的,所以接下来又使用R-Net进一步调优。

R-Net的网络结构如图6-6所示。这个结构与之前的P-Net非常类似,P-Net的输入是12x12x3 的图像,R-Net是24x24x3 的图像,也就是说,R-Net 判断24x24x3的图像中是否含有人脸,以及预测关键点的位置。R-Net 的输出和P-Net完全一样,同样由人脸判别、框回归、关键点位置预测三部分组成。

在实际应用中,对每个P-Net 输出可能为人脸的区域都放缩到24x24的大小,再输入到R-Net中,进行进一步判定。得到的结果如图6-7所示,显然R-Net消除了P-Net 中很多误判的情况。

进一步把所有得到的区域缩放成48x48的大小,输入到最后的0-Net中,0-Net 的结构同样与P-Net类似,不同点在于它的输入是48x48x3的图像,网络的通道数和层数也更多了。0-Net 的网络结构如图6-8所示,检测结果如图6-9所示。

总结:从P-Net到R-Net,最后再到O-Net,网络输入的图片越来越大,卷积层的通道数越来越多,内部的层数也越来越多,因此它们识别人脸的准确率应该是越来越高的。同时,P-Net的运行速度是最快的,R-Net的速度其次,O-Net的运行速度最慢。之所以要使用三个网络,是因为如果一开始直接对图中的每个区域使用O-Net,速度会非常慢。实际上P-Net先做了一遍过滤 ,将过滤后的结果再交给R-Net进行过滤,最后将过滤后的结果交给效果最好但速度较慢的O-Net进行判别。这样在每一步都提前减少 了需要判别的数量,有效降低了处理时间。最后介绍MTCNN的损失定义和训练过程。MTCNN中每个网络都有三部分输出,因此损失也由三部分组成。针对人脸判别部分,直接使用交叉熵损失,针对框回归和关键点判定,直接使用L2损失。最后这三部分损失各自乘以自身的权重再加起来,就形成最后的总损失了在训练P-Net和R-Net时,更关心框位置的准确性,而较少关注关键点判定的损失,因此关键点判定损失的权重很小。对于O-Net,关键点判定损失的权重较大。

使用深度卷积网络提取特征

可以回想一下VGG结构,神经网络的是图像,经过一系列卷积计算后,全连接分类得到类别概率。

在通常的图像应用中,可以去掉全连接层,使用卷积层的最后一层当作图像的“特征“,如图3-1中的conv5_ 3。 但如果对人脸识别问题同样采用这种方法,即使用卷积层最后一层做为人脸的“向量表示”,效果其实是不好的。这其中的原因和改进方法是什么?在后面会谈到,这里先谈谈希望这种人脸的“向量表示”应该具有哪些性质。在理想的状况下,希望“向量表示”之间的距离可以直接反映人验的相似度:

  • 对于同一个人的两张,人脸图像,对应的向量之间的欧几里得距离应该比较小。
  • 对于不同人的两张人脸图像,对应的向量之间的欧几里得距离应该比较大。

在原始的CNN模型中,使用的是Softmax损失。Softmax是类别间的损失,对于人脸来说,每一类就是一个人。尽管使用Softmax损失可以区别出每个人,但其本质上没有对每-类的向量表示之间的距离做出要求。
举个例子,使用CNN对MNIST进行分类,设计一个特殊的卷积网络,让最后一层的向量变为2维,此时可以画出每一类对应的2维向量,如图6-10所示。

图6-10是直接使用Softmax训练得到的结果,它不符合希望特征具有的特点:

  • 希望同一类对应的向量表示尽可能接近。但这里同一类的点可能具有很大的类间距离。
  • 希望不同类对应的向量应该尽可能远。但在图中靠中心的位置,各个类别的距离都很近。

对于人脸图像同样会出现类似的情况。对此,有很多改进方法。这里介绍其中两种,一种是使用三元组损失(Triplet Loss),一种是使用中心损失

猜你喜欢

转载自blog.csdn.net/yangyang688/article/details/82906573
今日推荐