Facial Keypoint
人脸关键点检测的技术原理
人脸关键点是人脸相关的项目中需要使用的, 是在人脸检测获取到人脸在图像中具体位置的基础上, 进一步定位人脸器官的位置。
获取到人脸上的关键点, 可以极大地提升人脸识别、人脸属性分析、表情分类等算法的性能和稳定性。人脸关键点可以使要识别的人脸做一个空间归一化,这个空间归一化的操作就叫:人脸对齐(face alignment)。这个操作可以使后续模型提取到与五官的位置无关,只有五官的形状纹理相关的特征。
人脸关键点分为2D关键点和3D关键点。2D关键点输出的是人脸关键点的x、y的坐标信息,常用的 2D 关键点数量 5 点、68 点、106 点等。
3D关键点,则输出关键点的 x、y、z的坐标信息。3D关键点的检测,是采用3DMM模型,重建人脸的3D mesh,再将3D mesh投射到2D的图像空间。由于3D关键点比2D关键点多了深度信息,在人脸姿态估计、3D 物体穿戴方面,优势较为明显。
人脸关键点检测算法演进与应用
人脸关键点检测的方法分为传统机器学习方法和深度学习方法。传统机器学习的方法,典开的代表包括 ASM(Active Shape Model)、AAM(Active Appearance Models)。
ASM 是一种基于点分布模型的算法,外形相似的物体的身体形状,可通过若干关键点的坐标依次串联形成的一个形状向量表示。ASM 算法需要人工标定的方法预先标定训练集,经过训练获得形状模型,再通过关键点的匹配实现特定物体的匹配。ASM 算法的优点是模型简单,架构清晰,对轮廓形状有较强的约束,但近似于穷举搜索的关键点定位方式,限制了其运算的效率。AAM 是 ASM 的进阶版,在形状约束的基础上,加入整个脸部的纹理特征。传统机器学习的方法,检测的速度相对较快,但关键点检测的精度有限,难以满足应用的要求。
基于深度学习的人脸关键点检测方法,大致可分为两个流派:热力图方法和和直接回归方法。
热力图方法,是每个关键点生成一个热力图,关键点处的值最大,离关键点越远,值越小。该类方法常用MSE损失,也有论文提出对损失函数进行改进, 如Wing loss。热力图方法,关键点检测的精度高,并可判断关键点是否被遮挡,对遮挡的鲁棒性较好。由于热力图大小通常是输入图像的 1/4,对内存的占用大。检测关键点的数量越多,内存占用越大,限制了热力图方法在端侧设备上的应用。直接回归方法,通过卷积神经模型预测关键点的坐标,内存占用小,关键点检测的精度较热力图方法差一些。由于直接回归方法内存占用小,检测速度快,在端侧设备上的应用前景广阔。
人脸关键点的应用领域十分广泛,如人脸姿态对齐、人脸美颜、虚拟面部重现
挑战与困难
- 输入样本多样性问题:多变的人脸姿态和遮挡,不同的光照情况
- 大场景小样本问题:在图像中存在非常多的小尺寸人脸
- 检测速度: 在端侧的应用
数据集
-
现阶段常见的数据集有5关键点、21关键点、68关键点、98关键点,以及超过100关键点的数据集。数据集地址: 300W、WFLW、COFW、AFLW
-
评价指标
\[NME = \frac{1}{K} \sum_{k=1}^{K}{NME_k} \quad (1) \]
NME:Normalized Mean Error, 归一化平均误差。Y是真实标注的关键点矩阵, Yˆ是预测的关键点矩阵, d是数据集的归一化系数。Nl是数据集中每张图片的关键点数量, K是测试图片数量。此指标越小越好
FR: Failure Rate, 表示NME高于10%阈值的图像数量。指标值越低越好。
CED-AUC: Cumulative Error Distribution – Area Under Curve, 累计误差分布-曲线下面积。绘制出NME小于或等于X轴上NME值的图像的比例, 然后计算出曲线下的面积。通常,NME的范围是[0: 10%]。计算出的CED-AUC值在[0:1]范围内进行缩放。计量值越大越好。
backbone
概述
一般地,人脸关键点和人体关键点算法使用的backbone类似。人脸关键点算法分类两种,直接回归方法和基于热力图的方法。直接回归方法即直接预测每个关键点的x,y的坐标。基于热力图的方法则是为每个关键点构建2d热力图,热图中的值表示为关键点在某个图像位置的概率,使用argmax来获取热图中关键点的精确位置。
直接回归方法通常采用分类中较为常用backbone,如Resnet、Mobilenetv2、Mobilenetv3、ShuffleNet-v2等。基于热力图的方法通常使用Hourglass网络架构,以及HRNet和CU-Net等。
Hourglass
如上图所示为hourglass的网络结构。
-
为减少计算和内存,首先使用卷积将输入缩放至64*64, 并保持这个分辨率直至结束。输入的图片先通过一个卷积层,卷积核大小为7*7,slide为2,pad为3,输出层数为64。经过这一层的卷积后,conv1的大小为64*128*128,再接batch normalization和用ReLU激活。conv1接下来通过一个Residual的网络,接下来的网络依次是一个池化层和两个Residual模块网络,到这边为止,得到将是N*64*64的特征, 这里N一般是256
-
另外网络会以这个分辨率为每个关键点生成一个热图。Hourglass是典型的编码器解码器结构, 通过多种分辨率处理特征图,来提高姿态估计和关键点检测的准确率。hourglass模块的堆叠会导致降低训练的速度, 于是作者在模块之中加入跳跃连接, 改善梯度传播,加快网络收敛。Hourglass还加入了中继监督,即在每个模块结束时生成特征图(红色)和预测图(绿色), 不仅最终预测,这些中间的预测的损失也会加入损失函数的计算。
-
gt由关键点生成的二维高斯图, 损失函数是所有stack的输出热图与GT之间的MSE
import torch class HeatmapLoss(torch.nn.Module): """ loss for detection heatmap """ def __init__(self): super(HeatmapLoss, self).__init__() def forward(self, pred, gt): L = ((pred - gt)**2) L = L.mean(dim=3).mean(dim=2).mean(dim=1) return L ## L of dim bsize
-
预测时,输入任意一张人物图片(256*256),得到最后一个stack的输出热图(不是所有的)。算出每一个joint对应的热图中最大值元素所在的坐标(argmax),然后scale回去,作为最后预测到的关键点位置。
CU-Net
CU-Net试图在精度、内存占用、推理速度上改进Hourglass的这种编码解码的unet结构,作者不仅在同一模块内添加跳跃链接而且在不同模块之间增加了跳跃链接。CU-Net通过避免不必要的特征复制、共享内存以及量化特征和参数来减少内存消耗并提高推理速度。
HRNet
关于hrnet的论文、应用以及代码地址可以参考王井东博士主页,包含hrnet姿态估计、语义分割、人脸对齐、图像分类、目标检测这几项任务上实现的详细介绍。HRNet-pose。姿态估计中多数方法如上一节说到的Hourglass都是高分辨率到低分辨率,再逐步恢复提高分辨率。但是hrnet在整个过程中始终保持高分辨率的表征。如上图所示,输入图像首先经过卷积下缩放到64*64的大小, 在每组卷积块之后,添加一个分辨率小四倍的并行分支。总体而言,在网络端创建了 4 个并行分支,最小分辨率为 8×8。不同分辨率块之间的特征被交换。为了将特征传递给更高分辨率的块,使用最近邻上采样(橙色箭头)。为了将特征传递给分辨率较小的块,使用了跨步卷积(绿色箭头)。蓝色箭头表示特征图未重新缩放。最终输出包含所有尺度的特征总和。文章中的 Repeated multi-scale fusion, 也就是不同分辨率feature map的fusion。如下图所示图所示exchange unit:
- 同分辨率之间的直接复制
- 需要升分辨率的使用bilinear upsample, 并利用1x1卷积统一通道数
- 需要降分辨率的使用stride 3x3卷积。这里降分辨率之所以不使用池化,是想利用stride3x3 可学习的方式降低信息的损耗
参数对比
上图展示了不同backbone浮点运算量和参数量的对比。Hourglass、CUNet、HRNet参数量相对较少,但是浮点计算量要更大。这是因为这些网络是基于热图估计的方法,需要为每个关键点生成大分辨率的热图。
人脸关键点检测
基于回归的方法
DCNN
标签:nn,self,人脸,facial,热图,cnblog,channel,关键点 From: https://www.cnblogs.com/xle97/p/17750866.html
2013