68点人脸关键点定位

人脸对齐/人脸关键点基本概念

  • 根据输入的人脸图像,自动定位出面部关键特征点,如眼睛,鼻尖,嘴角点,眉毛以及人脸各部件轮廓点等
    68点人脸关键点定位_第1张图片
  • 想要表示形状信息时,使用的是点的集合(向量)
  • 2D人脸:5 / 21 / 29 / 68 / 96 / 192等等
  • 3D人脸:1000 / 8000点

评价人脸关键点性能的指标:

  • NME:Normalized mean error (预测点和基准点之间的欧式距离)
  • CED: Cumulative Errors Distribution (CED) curve

NME的计算公式
68点人脸关键点定位_第2张图片

  • 为了去掉因为脸的大小而带来的误差,所以进行标准化。 d i o d_{io} dio的值通常使用1:两外眼角间距离 2: 人脸外接矩形对角线长度
  • CED是结合NME绘制出来的曲线。其中横坐标表达当前的偏差值,而纵坐标表达了满足当前偏差值的图片的数量68点人脸关键点定位_第3张图片

人脸关键点方法(传统方法 / 深度学习方法)

传统方法

  • 基于形状学习的模型:ASM(点分布模型(主动形状模型Active Shape Model)),AAM(Active Appearance Model 产生式模型)
  • 基于级联回归学习的模型:CPR
    68点人脸关键点定位_第4张图片
  • 首先会对人脸的特征点进行建模。这个建模的过程就是人脸模型构造的过程。人脸模型构造如下:
    • 首先会选择一个基准的图片。利用这个基准图片作为参照,将训练集中的图片以这个基准图片为基准进行相应的变换(尺度上的放缩/旋转),然后我们就可以拿到一个处理过的训练集合。
    • 根据在训练集中人脸关键点标定的位置,我们对每一个点来进行特征提取。对于点的特征提取操作是这样的:以这个关键点为中心提取它的一个局部图像区域。然后对这个局部的图像区域进行特征提取(特征可以使用颜色,纹理等等)。于是就可以利用这个点的领域信息来对这个点进行表示。
  • 然后进行点搜索。 假设有五个关键点,我们就会拿到5个特征向量。于是在给定一个测试集中的图片时,我们会先进行一个关键点的搜索。在初步搜索的时候,我们会选择这5个关键点中的某几个点,如只选择眼睛作为最开始点搜索的对象。如何进行点搜索呢?对测试图片中的每一个点计算特征向量,会得到一组向量。然后利用最开始的基准5个特征向量与这一组向量去计算相似度,就能找到最佳匹配的一些点,而这些点就是我们想找到的人脸关键点。
  • 接着对人脸进行对齐。让测试集的人脸和我们的基准人脸尽可能相似。这个过程也包含了一系列的旋转放缩。人脸对齐是依赖关键点的,当我们拿到关键点后,通过仿射变换就可以对人脸对齐。
  • 然后再对其他点来进行定位。我们由于这里已经和基准人脸进行对齐了,所以我们通过基准人脸就可以估算出在测试集人脸中想要定位的其他点的大致的位置(也就是基准模型中该点的位置)。有了这个大致位置,我们在变形的图片中这个点的领域/周边去寻找我们想要拿到的最终的关键点的位置。

(最后这两步有疑惑,关于变形测试集人脸的原因)
68点人脸关键点定位_第5张图片

  • 级联回归是一种迭代的算法。
  • 首先需要初始化人脸关键点的坐标 S i S_i Si:利用平均人脸来初始化。平均人脸就是对训练集中人脸关键点的坐标求平均。
  • 然后对当前人脸图像进行特征提取(颜色/纹理/高层语意特征等等),利用提取出来的特征的来回归出我们最终的人脸关键点的位置和当前计算出来的人脸关键点的偏差 Δ s \Delta s Δs。利用其对之前计算出来的关键点进行调整,得到下一轮所使用的计算关键点。
  • 级联回归的三个问题:
    • 1.如何表示这个关键点 S i S_i Si(使用向量来表示)
    • 2: 要提取什么样的特征: ϕ \phi ϕ操作(LBP:Local Binary Pattern,局部二值模式。是一种用来描述图像局部纹理特征的算子;它具有旋转不变性和灰度不变性等显著的优点。它是首先由T. Ojala, M.Pietikäinen, 和D. Harwood 在1994年提出,用于纹理特征提取。而且,提取的特征是图像的局部的纹理特征; / HOG :方向梯度直方图(Histogram of Oriented Gradient, HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子。HOG特征通过计算和统计图像局部区域的梯度方向直方图来构成特征。)
    • 3:如何利用这个特征来得到 Δ s \Delta s Δs(通过一个回归函数 r t r_t rt来进行计算,这个回归函数的输入是我们提取出来的特征 S t + 1 = S t + r t ( ϕ ( I , S t ) ) S_{t+1} = S_{t} + r_t(\phi (I,S_t) ) St+1=St+rt(ϕ(I,St))
  • 模型收敛的标准 就是 Δ s \Delta s Δs不再变化或者变化范围很小
    68点人脸关键点定位_第6张图片

深度学习的方法

  • 多级回归(DCNN / DCNN-Face++: 由粗到细进行求参数,然后取这些值的平均值) 多任务(TCDCN:同时完成了人脸属性和人脸关键点定位这两个不同的任务 / MTCNN: 通过三个级联的网络完成了人脸检测和关键点定位)
  • 直接回归模型(Vanilla CNN:特征提取之后对其进行分析,发现特征具有类别。将特征进行分类,然后这些不同类别的特征分别去预测一个关键点) / 热力图(DAN:将每个关键点变成一个区域,中心的关键点定义为1,边缘一圈定义为0,关键点到边缘之间的距离定义为均匀分布或者高斯分布)

人脸对齐算法之3D脸

  • 3D人脸要预测出的关键点的数量要远多于2D人脸(稠密的点)
    68点人脸关键点定位_第7张图片
  • 3D人脸多余2D人脸的就是:需要用到深度信息
  • 比较常用的是3D mesh / UV图(UV图描述了3D人脸的坐标信息 / 因为对于3D人脸的标注是很麻烦的8000个点,如果从2D就直接能映射出来3D的结构就很方便)
  • 2D图片 -> UV图(利用3D人脸的UV图我们就可以定义一个3D人脸网络监测结构:输入2D图,输出UV图,中间的网络结构就是一个Enconder->Decoder过程)
  • 目前主流的方法:Dense Face Alignment / DenseReg / FAN / 3DDFA / PRNet

人脸关键点常用的数据集

  • 300W-LP数据集 / Dlib库(利用这个库能检测出人脸位置,并且可以完成一个68点的人脸定位)只是去验证其合理性,可以用这个库检测,但是如果要做一个工程型人物就需要人工标注人脸。

人脸关键点定位问题挑战及解决思路

  • 环境变化(暗光/强光) -> 数据增强(添加对光照的变化/对图像一些扭曲的变化 / 图像的旋转等等)
  • 姿态的变化(大尺度姿态变化如侧脸,使人脸关键点被挡住) -> 对姿态进行分类,不同的姿态采用不同的回归模型 人脸对齐(在网络中加入一个分支完成人脸对齐和矫正)
  • 表情的变化(睁眼/闭眼导致关键点重合) -> 数据增强(利用GAN网络去生成一些不同的表情)
  • 遮挡问题(一部分关键点消失/利用点和点之间的关联性来找出遮挡住的关键点 真假关键点,假就是消失掉的关键点,可以加一个标记位看该点是否可见)-> 使用3D人脸,对我们的人脸加一个深度信息来解决相关问题,如PRNet 编解码网络 热力图 也可以去优化主干网络
  • 稠密点(3D人脸)
  • 采用SENet / ResNet来搭建网络
  • 姿态估计:定位出人体中非常重要的骨骼点,也是一个点回归问题
  • 服装关键点定位:用于FashionAI 流行趋势的预测(比较流行的方面)

你可能感兴趣的:(3d重建)