头部姿态估计(Head Pose Estimation ):通过一幅面部图像来获得头部的姿态角. 在3D 空间中,表示物体的旋转可以由三个欧拉角(Euler Angle)来表示:分别计算 pitch(围绕X轴旋转)yaw(围绕Y轴旋转) 和 roll(围绕Z轴旋转) ,分别学名俯仰角、偏航角和滚转角,通俗讲就是抬头、摇头和转头。百闻不如一见,上示意图:

68点算头部姿态 python_人工智能

3D 2D映射的头部估计(传统的)

若对相机标定熟悉的话,就比较好理解,因为 Head Pose Estimation 比较有难度的部分已经被大牛们搞定了,一种比较经典的 Head Pose Estimation 算法的步骤一般为:

(1)2D人脸关键点检测;(2)3D人脸模型匹配;(3)求解3D点和对应2D点的转换关系;(4)根据旋转矩阵求解欧拉角。

众所周知一个物体相对于相机的姿态可以使用旋转矩阵和平移矩阵来表示:

(1)平移矩阵:物体相对于相机的空间位置关系矩阵,用T表示;

(2)旋转矩阵:物体相对于相机的空间姿态关系矩阵,用R表示.

看来必然少不了坐标系转换,分别是:世界坐标系(UVW)、相机坐标系(XYZ)、图像中心坐标系(uv)和像素坐标系(xy),如下图:

68点算头部姿态 python_人工智能_02


68点算头部姿态 python_机器学习_03


详见博客:头部姿态估计原理及可视化 ,对正脸或者测脸比较有效,yaw角150度以上准确率不够,并且受关键点影响

头部姿态估计研究进展

Head pose estimation (HPE)传统的头部姿态计算方法是通过估计人脸面部的一些关键点,利用平均的头部模型求解二维到三维的对应问题,我们认为这是一个脆弱的方法,因为它完全依赖人脸关键点性能,头部模型和3D到2D的投射。我们提出了一种鲁棒性比较好的定姿态方法,在300W-LP(一个大型综合扩展数据集)上训练一个多重损失的卷积神经网通过联合姿态分类和回归,直接从图像中预测固有欧拉角(偏航、俯仰和滚转)。

68点算头部姿态 python_人工智能_04


Fine-Grained Head Pose Estimation Without Keypoints 我们证明,与基于关键点的方法相比,使用卷积神经网络从图像中直接估计3D头部姿态表现出更高的精度。 由于深度学习,关键点探测器最近有了显著的改进。但是头部姿态恢复本质上是一个两步的过程,出错的机会很多。主要存在两个问题:

  • 可能存在检测到不到足够多的关键点
  • 其次,姿态估计的精度取决于3D头部模型的质量
    通用的头部模型,可能会因任意一个体产生偏差,调整头部模型去适应每个人需要有大量的数据,并且会产生巨大的计算量。

在实际应用中,需要高精度的头部姿态估计,一个常见的解决方案是利用RGBD(深度)相机。这些可以很准确,但也存在很多限制因素:

尽管很多姿态估计表现的都不错,但网络结构比较庞大不适合移动和嵌入式平台上运行。

模型

68点算头部姿态 python_机器学习_05


68点算头部姿态 python_机器学习_06

68点算头部姿态 python_机器学习_07


采用多重损失的方式计算。

68点算头部姿态 python_机器学习_08


68点算头部姿态 python_人工智能_09


通过利用softmax预测落得每个bin的概率(分类损失),从而计算yaw,pitch,roll的期望,期望和真实的angle计算MSE损失。

68点算头部姿态 python_旋转矩阵_10


为了是网络更轻量化,使用了EfficientNet-B0,而并不是Alexnet,ResNet50等,EfficientNet-B0 是EfficientNet 家族的基础模型,利用到残差模块(Inverted Residual Blocks)来源于MobileNet V2,从而降低了网络的参数。在CPU上能达到60FPS (或者是8155平台)

数据集

68点算头部姿态 python_3D_11

68点算头部姿态 python_旋转矩阵_12


可以对模型剪枝,是参数进一步降低。