(4) 视线追踪,也可以称为眼球跟踪。准确的 Head Pose Estimation 能够提高视线追踪的精度。视线追踪可以用在游戏领域,也许有一天你打开手游后,用眼睛就可以控制游戏内人物的移动了 (体验如何暂且不管,要的是黑科技),让体感操作更上一层楼。
说完了 Head Pose Estimation 的八卦,既然这玩意这么有用,小伙伴们是不是已经迫不及待地想去试试手呢?下面 CV_Life 君就说说 Head Pose Estimation 的原理之一。
Head Pose Estimation 如何理解?
如果你对相机标定熟悉的话,就比较好理解,因为 Head Pose Estimation 比较有难度的部分已经被大牛们搞定了,CV_Life 君普及一下比较基本的原理。一种比较经典的 Head Pose Estimation 算法的步骤一般为:2D 人脸关键点检测;3D 人脸模型匹配;求解 3D 点和对应 2D 点的转换关系;根据旋转矩阵求解欧拉角。Bingo!就是这么简单。
下面是原理时间。众所周知一个物体相对于相机的姿态可以使用旋转矩阵和平移矩阵来表示。
平移矩阵:物体相对于相机的空间位置关系矩阵,用 T 表示;
旋转矩阵:物体相对于相机的空间姿态关系矩阵,用 R 表示。
如此看来必然少不了坐标系转换。讲点人性,继续上图
估计有些小伙伴犯嘀咕了:世界坐标系中点的位置怎么得到呢?一开始 CV_Life 君也苦恼这个问题,总不能每时每刻都要测一下人脸各个点在空间的位置吧,后来 CV_Life 君从各种论文中发现,原来大牛们在算法里面内置了一个 3D 人脸模型,把关键点的空间位置都标出来,就充当真实脸的空间位置;可是大牛又觉得这样不太合理,一个 3D 人脸模型不能表示所有人的脸,对所有人采用一个模型得到的精度肯定不好,于是便有了 3DMM(3D Morphable Model),对不同人可以拟合出对应的 3D 脸模型,这样关键点的空间位置就比较准确了,Head Pose Estimation 的精度提上去了。但代价还是有的,计算量变大了,处理起来也就慢了。萝卜青菜各有所爱,速度和精度不可兼得,看你口味选择。一般的 face Model 如下所示,用一系列的点的坐标构建 mesh。
本文首发于公众号:计算机视觉 life。原文链接
重磅!头部姿态估计「原理详解 + 实战代码」来啦!mp.weixin.qq.com
写在前面
Head Pose Estimation 是干啥的?
Head Pose Estimation 有啥用呢?
(2) 行为分析。和上面的有点类似,但还是有点不同。我家乡方言里有个词叫 “胡撒”,说的就是心虚的人容易左顾右盼,通过视频监控分析再辅助其他算法可以判断一个人是否具有不轨行为,做到提前预警,防患于未然。
(3) 人机互动。人的头部动作有时可以表示意义,传递信息。摇头在大多数人看来是否认,点头表示同意 (三哥表示不服),长时间低头说不定你就是 “地狱之门” 的沉思者。如果机器人能理解这样的行为,将提高人机交互的质量和有效性。
(4) 视线追踪,也可以称为眼球跟踪。准确的 Head Pose Estimation 能够提高视线追踪的精度。视线追踪可以用在游戏领域,也许有一天你打开手游后,用眼睛就可以控制游戏内人物的移动了 (体验如何暂且不管,要的是黑科技),让体感操作更上一层楼。
说完了 Head Pose Estimation 的八卦,既然这玩意这么有用,小伙伴们是不是已经迫不及待地想去试试手呢?下面 CV_Life 君就说说 Head Pose Estimation 的原理之一。
Head Pose Estimation 如何理解?
于是世界坐标系 (UVW)、相机坐标系 (XYZ)、图像中心坐标系 (uv) 和像素坐标系 (xy) 四兄弟闪亮登场。如果相机完美无瑕,老三可以回家洗洗睡觉,关系也相对简单。
世界坐标系到相机坐标系:
相机坐标系到像素坐标系:
因此像素坐标系和世界坐标系的关系如下:
上式的求解可用 DLT(Direct Linear Transform) 算法结合最小二乘进行迭代求解,最小二乘的目标函数可为
带 ^ 的变量为预测值,其余为测量值。
可是相机也很无奈,她不完美,总有点瑕疵,比如径向和切向畸变,那关系就要稍微复杂一些,叫醒阿三继续推导:
相机坐标系要先转换到图像中心坐标系:
然后再被折磨一番 (计算畸变):
最后图像中心坐标系到像素坐标系:
看来只要知道世界坐标系内点的位置、像素坐标位置和相机参数就可以搞定旋转和平移矩阵,可上面的关系分明是非线性的,这可怎么解啊?其实 OpenCV 已经给我们提供了求解 PnP 问题的函数 solvePnp(),一步轻松到位。
得到旋转矩阵后,就可以开心地去见欧拉角了:
估计有些小伙伴犯嘀咕了:世界坐标系中点的位置怎么得到呢?一开始 CV_Life 君也苦恼这个问题,总不能每时每刻都要测一下人脸各个点在空间的位置吧,后来 CV_Life 君从各种论文中发现,原来大牛们在算法里面内置了一个 3D 人脸模型,把关键点的空间位置都标出来,就充当真实脸的空间位置;可是大牛又觉得这样不太合理,一个 3D 人脸模型不能表示所有人的脸,对所有人采用一个模型得到的精度肯定不好,于是便有了 3DMM(3D Morphable Model),对不同人可以拟合出对应的 3D 脸模型,这样关键点的空间位置就比较准确了,Head Pose Estimation 的精度提上去了。但代价还是有的,计算量变大了,处理起来也就慢了。萝卜青菜各有所爱,速度和精度不可兼得,看你口味选择。一般的 face Model 如下所示,用一系列的点的坐标构建 mesh。
可能又有小伙伴举手了:2D 关键点怎么检测啊?这个咱这里就不讨论了,有兴趣自行 google,因为 CV_Life 君目前也没研究明白 (捂脸),不过还好有大牛贡献源代码,咱们先行尝鲜,后续再去慢慢品尝。
人脸 3D 点和 2D 点的对应关系如下所示,目前的算法可以检测到更多的关键点,比如商汤科技的关键点检测已经可以做到 240,可谓行业佼佼者。下面代码用到的是人脸 68 点检测算法。
Head Pose Estimation 玩玩何妨?
添加 OpenCV 包含路径:
添加 dlib 包含路径:
其他包含路径:
添加相机内参:
调用 dlib 库,创建人脸检测和关键点检测模型:
定义空间点和图像点:
人脸关键点检测:
求解旋转和平移矩阵:
求解欧拉角:
说了这么多,CV_Life 君终于啰嗦完毕,希望有心读完的小伙伴对 Head Pose Estimation 能有一定的理解。当然 Head Pose Estimation 的算法还有很多,后续 CV_Life 君准备研究一下机器学习和深度学习的方法,有兴趣的可以一起讨论学习。
对了,上述代码和. dat 文件 CV_Life 君已经给按奈不住想要试试的小伙伴们准备好了,在计算机视觉公众号菜单栏里回复:“头” 就能下载啦!
参考文献
https://zhuanlan.zhihu.com/p/51208197