美文网首页实战
深度学习网络模型部署——人脸关键点检测问题

深度学习网络模型部署——人脸关键点检测问题

作者: 不懂不学不问 | 来源:发表于2020-11-21 21:33 被阅读0次

    实现从项目调研、数据收集、数据预处理、深度卷积神经网络训练再到服务器部署的人脸表情识别小项目

    1、背景

    人脸关键点检测是人脸识别任务中重要的基础环节,人脸关键点精确检测对众多科研和应用课题具有关键作用,例如,人脸姿态矫正、姿态识别、表情识别、疲劳监测、嘴型识别等。因此,如何获取高精度人脸关键点,一直以来都是计算机视觉、模式识别、图像处理等领域的热点研究问题。

    目前github上开源的算法有很多,效果也不错,包括ERT,3000FPS,SDM,TCDCN等。ERT,3000FPS模型太大,不适合移动端,并且效果不是很好。SDM效果不错,模型10MB左右,具有一定商业价值。目前基于深度学习的算法取得了较好的效果,github也有一些开源的代码实现,zeusees/HyperLandmark 这个git包含了SDM算法和基于深度学习的106点face landmark。效果能够比得上商业级的代码,只不过只提供了SDK,底层算法没有开源。

    2、人脸关键点检测方法

    人脸关键点检测方法根据是否需要参数化模型可分为以下两类,基于参数化形状模型的方法和基于非参数形状模型的方法。目前,最为常用的是基于非参数形状模型的深度学习方法。

    传统人脸关键点检测##数据库##为室内环境下采集的数据库,比如 Multi-pie、Feret、Frgc、AR、BioID 等人脸数据库。而现阶段人脸关键点检测数据库通常为复杂环境下采集的数据库.LFPW 人脸数据库有 1132 幅训练人脸图像和 300 幅测试人脸图像,大部分为正面人脸图像,每个人脸标定 29 个关键点。AFLW 人脸数据库包含 25993 幅从 Flickr 采集的人脸图像,每个人脸标定 21 个关键点。COFW 人脸数据库包含 LFPW 人脸数据库训练集中的 845 幅人脸图像以及其他 500 幅遮挡人脸图像,而测试集为 507 幅严重遮挡(同时包含姿态和表情的变化)的人脸图像,每个人脸标定 29 个关键点。MVFW 人脸数据库为多视角人脸数据集,包括 2050 幅训练人脸图像和 450 幅测试人脸图像,每个人脸标定 68 个关键点。OCFW 人脸数据库包含 2951 幅训练人脸图像(均为未遮挡人脸)和 1246 幅测试人脸图像(均为遮挡人脸),每个人脸标定 68 个关键点。 人脸轮廓提取常用实验图像库.png

    2.1 ASM (Active Shape Models)

    ASM 主要分为两步:第一步:训练。首先,构建形状模型:搜集 n 个训练样本(n=400);手动标记脸部关键点;将训练集中关键点的坐标串成特征向量;对形状进行归一化和对齐(对齐采用 Procrustes 方法);对对齐后的形状特征做 PCA 处理。接着,为每个关键点构建局部特征。目的是在每次迭代搜索过程中每个关键点可以寻找新的位置。局部特征一般用梯度特征,以防光照变化。有的方法沿着边缘的法线方向提取,有的方法在关键点附近的矩形区域提取。第二步:搜索。首先:计算眼睛(或者眼睛和嘴巴)的位置,做简单的尺度和旋转变化,对齐人脸;接着,在对齐后的各个点附近搜索,匹配每个局部关键点(常采用马氏距离),得到初步形状;再用平均人脸(形状模型)修正匹配结果;迭代直到收敛。 image.png

    2.2 AAM(Active Appearance Models)

    1998 年,Cootes 对 ASM 进行改进,不仅采用形状约束,而且又加入整个脸部区域的纹理特征,提出了 AAM 算法。AAM 于 ASM 一样,主要分为两个阶段,模型建立阶段和模型匹配阶段。其中模型建立阶段包括对训练样本分别建立形状模型 (Shape Model) 和纹理模型 (Texture Model),然后将两个模型进行结合,形成 AAM 模型。 image.png

    2.3 CPR(Cascaded pose regression)

    2010 年,Dollar 提出 CPR(Cascaded Pose Regression, 级联姿势回归),CPR 通过一系列回归器将一个指定的初始预测值逐步细化,每一个回归器都依靠前一个回归器的输出来执行简单的图像操作,整个系统可自动的从训练样本中学习。

    人脸关键点检测的目的是估计向量,其中 K 表示关键点的个数,由于每个关键点有横纵两个坐标,所以 S 得长度为 2K。CPR 检测流程如图所示,一共有 T 个阶段,在每个阶段中首先进行特征提取,得到ft, 这里使用的是 shape-indexed features,也可以使用诸如 HOG、SIFT 等人工设计的特征,或者其他可学习特征(learning based features),然后通过训练得到的回归器 R 来估计增量ΔS( update vector),把ΔS 加到前一个阶段的 S 上得到新的 S,这样通过不断的迭代即可以得到最终的 S(shape)。 image.png

    2.4 DCNN (Deep Convolutional Network Cascade for Facial Point Detection)

    2013 年,Sun 等人首次将 CNN 应用到人脸关键点检测,提出一种级联的 CNN(拥有三个层级)——DCNN(Deep Convolutional Network),此种方法属于级联回归方法。作者通过精心设计拥有三个层级的级联卷积神经网络,不仅改善初始不当导致陷入局部最优的问题,而且借助于 CNN 强大的特征提取能力,获得更为精准的关键点检测。

    如图所示,DCNN 由三个 Level 构成。Level-1 由 3 个 CNN 组成;Level-2 由 10 个 CNN 组成(每个关键点采用两个 CNN);Level-3 同样由 10 个 CNN 组成。 image.png

    2.5 Face++版 DCNN (Extensive Facial Landmark Localization with Coarse-to-fine Convolutional Network Cascade)

    2013 年,Face++在 DCNN 模型上进行改进,提出从粗到精的人脸关键点检测算法,实现了 68 个人脸关键点的高精度定位。该算法将人脸关键点分为内部关键点和轮廓关键点,内部关键点包含眉毛、眼睛、鼻子、嘴巴共计 51 个关键点,轮廓关键点包含 17 个关键点。

    针对内部关键点和外部关键点,该算法并行的采用两个级联的 CNN 进行关键点检测,网络结构如图所示。 image.png

    针对内部 51 个关键点,采用四个层级的级联网络进行检测。其中,Level-1 主要作用是获得面部器官的边界框;Level-2 的输出是 51 个关键点预测位置,这里起到一个粗定位作用,目的是为了给 Level-3 进行初始化;Level-3 会依据不同器官进行从粗到精的定位;Level-4 的输入是将 Level-3 的输出进行一定的旋转,最终将 51 个关键点的位置进行输出。针对外部 17 个关键点,仅采用两个层级的级联网络进行检测。Level-1 与内部关键点检测的作用一样,主要是获得轮廓的 bounding box;Level-2 直接预测 17 个关键点,没有从粗到精定位的过程,因为轮廓关键点的区域较大,若加上 Level-3 和 Level-4,会比较耗时间。最终面部 68 个关键点由两个级联 CNN 的输出进行叠加得到。

    算法主要创新点由以下三点:(1)把人脸的关键点定位问题,划分为内部关键点和轮廓关键点分开预测,有效的避免了 loss 不均衡问题;(2)在内部关键点检测部分,并未像 DCNN 那样每个关键点采用两个 CNN 进行预测,而是每个器官采用一个 CNN 进行预测,从而减少计算量;(3)相比于 DCNN,没有直接采用人脸检测器返回的结果作为输入,而是增加一个边界框检测层(Level-1),可以大大提高关键点粗定位网络的精度。

    2.6 TCDCN(TCDCN-Facial Landmark Detection by Deep Multi-task Learning)

    2014 年,Zhang 等人将 MTL(Multi-Task Learning)应用到人脸关键点检测中,提出 TCDCN(Tasks-Constrained Deep Convolutional Network)[7]。作者认为,在进行人脸关键点检测任务时,结合一些辅助信息可以帮助更好的定位关键点,这些信息如,性别、是否带眼镜、是否微笑和脸部的姿势等等。作者将人脸关键点检测(5 个关键点)与性别、是否带眼镜、是否微笑及脸部的姿势这四个子任务结合起来构成一个多任务学习模型,模型框架如图所示。

    image

    网络输出为 4040 的灰度图,经过 CNN 最终得到 22*64 的特征图,再通过一层含 100 个神经元的全连接层输出最终提取得到的共享特征。该特征为所有任务共同享用,对于关键点检测问题,就采用线性回归模型;对于分类问题,就采用逻辑回归。

    2.7 MTCNN(Joint Face Detection and Alignment using Multi-task Cascaded Convolutional Networks)

    2016 年,Zhang 等人提出一种多任务级联卷积神经网络(MTCNN, Multi-task Cascaded Convolutional Networks)[9] 用以同时处理人脸检测和人脸关键点定位问题。作者认为人脸检测和人脸关键点检测两个任务之间往往存在着潜在的联系,然而大多数方法都未将两个任务有效的结合起来,本文为了充分利用两任务之间潜在的联系,提出一种多任务级联的人脸检测框架,将人脸检测和人脸关键点检测同时进行。

    MTCNN 包含三个级联的多任务卷积神经网络,分别是 Proposal Network (P-Net)、Refine Network (R-Net)、Output Network (O-Net),每个多任务卷积神经网络均有三个学习任务,分别是人脸分类、边框回归和关键点定位。网络结构如图所示:

    image image

    MTCNN 实现人脸检测和关键点定位分为三个阶段。首先由 P-Net 获得了人脸区域的候选窗口和边界框的回归向量,并用该边界框做回归,对候选窗口进行校准,然后通过非极大值抑制(NMS)来合并高度重叠的候选框。然后将 P-Net 得出的候选框作为输入,输入到 R-Net,R-Net 同样通过边界框回归和 NMS 来去掉那些 false-positive 区域,得到更为准确的候选框;最后,利用 O-Net 输出 5 个关键点的位置。

    2.8 TCNN(Tweaked Convolutional Neural Networks)

    2016 年,Wu 等人研究了 CNN 在人脸关键点定位任务中到底学习到的是什么样的特征,在采用 GMM(Gaussian Mixture Model, 混合高斯模型)对不同层的特征进行聚类分析,发现网络进行的是层次的,由粗到精的特征定位,越深层提取到的特征越能反应出人脸关键点的位置。针对这一发现,提出了 TCNN(Tweaked Convolutional Neural Networks)[8],其网络结构如图所示:

    image image

    上图为 Vanilla CNN,针对 FC5 得到的特征进行 K 个类别聚类,将训练图像按照所分类别进行划分,用以训练所对应的 FC6K。测试时,图片首先经过 Vanilla CNN 提取特征,即 FC5 的输出。将 FC5 输出的特征与 K 个聚类中心进行比较,将 FC5 输出的特征划分至相应的类别中,然后选择与之相应的 FC6 进行连接,最终得到输出。

    2.9 DAN(Deep Alignment Networks)

    2017 年,Kowalski 等人提出一种新的级联深度神经网络——DAN(Deep Alignment Network)[10],以往级联神经网络输入的是图像的某一部分,与以往不同,DAN 各阶段网络的输入均为整张图片。当网络均采用整张图片作为输入时,DAN 可以有效的克服头部姿态以及初始化带来的问题,从而得到更好的检测效果。之所以 DAN 能将整张图片作为输入,是因为其加入了关键点热图(Landmark Heatmaps),关键点热图的使用是本文的主要创新点。DAN 基本框架如图所示:

    image

    DAN 包含多个阶段,每一个阶段含三个输入和一个输出,输入分别是被矫正过的图片、关键点热图和由全连接层生成的特征图,输出是面部形状(Face Shape)。其中,CONNECTION LAYER 的作用是将本阶段得输出进行一系列变换,生成下一阶段所需要的三个输入,具体操作如下图所示:

    image

    从第一阶段开始讲起,第一阶段的输入仅有原始图片和 S0。面部关键点的初始化即为 S0,S0 是由所有关键点取平均得到,第一阶段输出 S1。对于第二阶段,首先,S1 经第一阶段的 CONNECTION LAYERS 进行转换,分别得到转换后图片 T2(I)、S1 所对应的热图 H2 和第一阶段 fc1 层输出,这三个正是第二阶段的输入。如此周而复始,直到最后一个阶段输出 SN。文中给出在数据集 IBUG 上,经过第一阶段后的 T2(I)、T2(S1)和特征图,如图所示:

    image

    从图中发现,DAN 要做的「变换」,就是把图片给矫正了,第一行数据尤为明显,那么 DAN 对姿态变换具有很好的适应能力,或许就得益于这个「变换」。至于 DAN 采用何种「变换」,需要到代码中具体探究。

    3、我们项目采用那种人脸关键点检测问题

    在阅读许多其它论文后发现,现在应用成熟最常用的是68个关键点检测。如下图所示:

    68个关键点
    但也有许多不同数量关键点,比如:在FaceSDK 6.2当中,改进了面部特征检测和跟踪引擎现在基于面部特征的70点检测(从上一发行版的66个面部特征开始),改进了张开嘴的追踪并显着提高了主要移动平台上的速度。 70个关键点
    目前,本次实验运用开源库Dlib。利用Dlib官方训练好的模型“shape_predictor_68_face_landmarks.dat”进行68点标定,利用OpenCv进行图像化处理,在人脸上画出68个点,并标明序号;Dlib中为我们提供了关于人脸检测标注训练好的文件可在http://dlib.net/files/shape_predictor_68_face_landmarks.dat.bz2下载 (下载完成后解压到工程目录下)
    image.png
    关键点检测主要流程:
      1. 调用dlib库来进行人脸识别,调用预测器“shape_predictor_68_face_landmarks.dat”进行68点标定
      2. 存入68个点坐标
      3. 利用 cv2.circle 来画68个点
      4. 利用 cv2.putText() 函数来画数字1-68

    与人脸关键点检测相关方面文章:

    ——python+OpenCv+dlib实现人脸68个关键点检测并标注过程代码
    ——Dlib人脸Landmark检测速度优化
    ——人脸关键点对齐
    ——人脸检测关键点新增至81个,比Dlib更精准、更贴边

    81个点,额头区域增加了13个点
    后续会添加详细代码,不断改进文章内容。

    相关文章

      网友评论

        本文标题:深度学习网络模型部署——人脸关键点检测问题

        本文链接:https://www.haomeiwen.com/subject/tbvjiktx.html