深度学习在图像审核中的应用(人脸检测篇)

上篇文章主要介绍了如何用深度学习的方法鉴别nsfw图片,这篇文章以及后面的一篇文章将会介绍如何利用深度学习的方法来识别一些特定人脸(明星或者政治人物),在识别人脸之前,我们需要先把人脸区域给检测出来,识别一张图片有没有人脸,并表示出人脸的范围,也就是人脸检测和对齐,这篇文章主要是介绍MTCNN网络架构(一种可以同时进行人脸检测和对齐的深度学习网络架构)以及自己的思考和总结

人脸检测的目标

人脸检测(Face Detection), 就是给一幅图片,找出图像中所有人脸的位置,通常用一个矩形框框出来,输入是一副图像img, 输出是若干个包含人脸的矩形框的位置, 以及5个关键人脸位置坐标(左眼,右眼,鼻子,左嘴角,右嘴角)。 如下图所示:

有了表示人脸区域的矩形框,后续就可以裁剪这块区域,进行后续的人脸匹配和识别工作。

MTCNN网络架构

本文介绍的主要算法是Multi-task Cascaded Convolutional Networks, 来自于论文 Joint Face Detection and Alignment using Multi-task Cascaded Convolutional Network

这篇论文提出了一种通过三个CNN网络进行级联来进行人脸检测和人脸对齐的网络架构,网络架构如下图所示:
深度学习在图像审核中的应用(人脸检测篇)_第1张图片
网络架构分为P-Net, N-Net, 和O-Net
整体的pipeline如下图所示:
深度学习在图像审核中的应用(人脸检测篇)_第2张图片
给定一个图片,把它的尺寸resize到不同的大小(通过一定的比例,对图像进行缩放,就可以生成多个不同大小的图片),由此可以建立一个**图像金字塔 image pyramid **建立图像金字塔的目的是为了得到不同大小的人脸图片,提高人脸检出的概率。

  • Stage 1: P-Net, 全称(Proposal Network), 是一个纯卷积神经网络(不包含fc层),这个网络的主要目的是获得候选的人脸以及这些人脸的bounding box的坐标向量,bounding box 就是人脸外边的矩形方框,用来把人脸标出来,然后通过 non-maximun suppression(NMS, 非极大抑制)算法来选出一些bounding box 高度重叠的候选。

  • Stage 2: R-Net, 全称(Refine Network), 所有的候选人脸区域,会被喂入另一个CNN, 这个网络用来进一步过滤错误的候选,对bounding box 进行进一步的校准,这里也会用到NMS。

  • Stage 3: O-Net, 全称(Output Network), 这一层类似于R-Net, 但是这一层会在脸部区域给与更多的监督,会输出人脸的五个关键位置的坐标。

训练

训练的时候,采用三个任务(人脸分类, bounding box 回归,人脸关键位置定位)来训练CNN 模型, 这个应该就是Muti-task CNN 这个名字的由来吧, 这里的训练方式还是挺有意思的。

  1. 人脸分类 : 这个任务主要是一个二分类问题(人脸,非人脸),对于每个 样例 xi, 通过交叉熵损失函数计算cross-entroy loss:
    L i d e t = − ( y i d e t l o g ( p i ) + ( 1 − y i d e t ) ( 1 − l o g ( p i ) ) ) ( 1 ) L^{det}_i = -(y^{det}_ilog(p_i) + (1-y^{det}_i)(1-log(p_i)))(1) Lidet=(yidetlog(pi)+(1yidet)(1log(pi)))(1)
  2. bounding box 回归 : 对于每个候选的人脸区域,计算它和最近的人脸真实位置的距离(主要是 left, top, height, and width), 这个任务可以看成是一个回归问题,对每个样例xi, 损失函数是欧式损失 (Eucliddean loss):
    L i b o x = ∣ ∣ y ^ i b o x − y i b o x ∣ ∣ 2 2 ( 2 ) L^{box}_i = ||\hat{y}^{box}_i - y^{box}_i||^2_2(2) Libox=y^iboxyibox22(2)
  3. 人脸关键位置定位: 这个任务和 bounding box 回归任务有点类似,人脸关键点定位可以看作是一个回归问题,同样需要最小化欧式损失(Eucliddean loss):
    L i l a n d m a r k = ∣ ∣ y ^ i l a n d m a r k − y i l a n d m a r k ∣ ∣ 2 2 ( 3 ) L^{landmark}_i = ||\hat{y}^{landmark}_i - y^{landmark}_i||^2_2(3) Lilandmark=y^ilandmarkyilandmark22(3)
    这里的 y ^ i l a n d m a r k \hat{y}^{landmark}_{i} y^ilandmark 是 网络计算出来的人脸关键位置坐标, y i l a n d m a r k y^{landmark}_{i} yilandmark是真实人脸的关键位置坐标,一共有五个关键位置坐标,包括左眼,右眼,鼻子,左嘴角,右嘴角,因为一个坐标包括两实数,所以 y i l a n d m a r k ∈ R 10 y^{landmark}_{i}\in\Rho^{10} yilandmarkR10
  4. 多数据源(Multi-source)训练:由于每个CNN(P-Net, R-Net, O-Net)都是不同的训练任务,所以这些CNN的训练都是通过不同种类的训练图片,例如人脸、非人脸,部分对齐的人脸。在这种场景下,一些损失函数(i.e Eq.(1)-(3))就不会使用,例如,对于图片的背景区域,只需要计算 L i d e t L^{det}_i Lidet, 其他两个损失函数设置为0。因此,整体的学习目标可以表示为:
    m i n Σ i = 1 N Σ j ∈ { d e t , b o x , l a n d m a r k } α j β i j L i j ( 4 ) min\Sigma^N_{i=1}\Sigma_{j\in{\{det, box, landmark\}}}\alpha_j\beta^j_iL^j_i (4) minΣi=1NΣj{det,box,landmark}αjβijLij(4)
    这里 N N N表示训练集的数量, a j a_j aj表示任务的重要性。在P-Net和R-Net中 , α d e t = 1 , α b o x = 0.5 , α l a n d m a r k = 0.5 \alpha_{det} = 1, \alpha_{box}=0.5, \alpha_{landmark} = 0.5 αdet=1αbox=0.5,αlandmark=0.5, 在O-Net中, α d e t = 1 , α b o x = 0.5 , α l a n d m a r k = 1 \alpha_{det} = 1, \alpha_{box}=0.5, \alpha_{landmark} = 1 αdet=1αbox=0.5,αlandmark=1, 目的是为了提高人脸关键点定位的精度, β i j ∈ { 0 , 1 } \beta^j_i\in{\{0,1\}} βij{0,1} 是样例的类别标识,在这种情况下,可以很自然地通过随机梯度下降法来训练这些CNNs。
  5. online hard sample mining, 这个方法的特点是在每个mini-batch中,取loss最大的70%进行反向传播,忽略那些简单的样本。只需要计算这些较难分类的样本的梯度,这个方法可以提高分类效果,并省去了手动选择较难分类的样本的巨大工作量。

问题和思考

  • 为何要采用级联的CNN架构?
    首先,相比于级联adaboost架构和复杂的深度CNN架构,级联的CNN架构可以减少人为的特征提取和标注工作(相对与非深度学习架构),同时由于级联架构每一个State架构比较简单,可以减少计算复杂度,以实现实时的人脸检测,另外,级联的架构,在训练上可以更充分利用数据,比如通过P-Net检测到的候选人脸可以作为R-Net的训练数据(依据候选人脸和真实人脸的IOU的数值来区分是positive还是negativa的样本)。
  • 为何要人脸检测和人脸关键点定位结合起来训练?
    作者给出的解释是:人脸检测任务是检测人脸区域的位置,关键点定位任务是找出人脸区域内的关键位置坐标,这两个任务是有内在联系的。所以训练过程中可以相辅相成。
  • 为何 P-Net的卷积核大小(filter-size)要设置为3, 并减少filter的个数?
    为了更精准地识别人脸,增加CNN的深度和同时降低计算复杂度,减少filter的个数和filter的大小是一个选择。
  • 关于构建图像金字塔的思考
    图片在进入P-Net网络之前,需要构建一系列的图像金字塔,看源码是将图片按照一定的缩放比例(通常是缩小),得到一系列尺寸不一的图片(内容和长宽比例和原图是一致的,仅仅是尺寸上(分辨率)的缩放),然后P-Net会处理图像金字塔里的每个图片,进行人脸检测,这样提高了人脸被检测的概率,下图就是一个图片金字塔, 由4 张分辨率不同的图片组成。 图像金字塔的作用在于解决目标检测中的尺度问题,在比较早的时候,是通过改变滑动窗口的形式来检测图像中大小不一的物体,而目前阶段,更多的是采用滑动窗口规格不变,改变图片大小来检测图像中尺度不一致的物体,金字塔的层级越多,计算量更大,花费的时间会更多,但是,在某种程度上有获得更准确的结果。主要根据自己的应用场景选择合适的比例进行生成图像金字塔。
    笔者对于图片金字塔的了解不是很深入,感兴趣的同学可以通过看下目标检测的一些论文了解下。
    深度学习在图像审核中的应用(人脸检测篇)_第3张图片

下篇文章,会介绍下人脸识别的一些算法

源码和论文

https://kpzhang93.github.io/MTCNN_face_detection_alignment/

你可能感兴趣的:(机器学习算法,图像分类)