Gaze Estimation笔记——data normalization

  最近在看一些视线检测(Gaze Estimation)相关的东西,由于之前没怎么接触过,所以也算是从头开始,很多新的东西要学。写一个系列笔记,把慢慢看懂的东西记录下来,做个整理,也方便以后回头查阅的时候能快速捡起来。
  第一篇写的是基于normalization图像的工作,包括一系列类似的方法。这类方法的关键之处在于对输入的图像(face/eye)先进行normalization操作,将不同head pose、 不同距离等一般情况下的图像转化到预先定义好的不变的normalization模式下的照片,然后再进行视线检测的工作。在所谓的normalization模式下,相机的姿态和距离是预先定义好的不能改变的。说白了就是,训练和测试时人离相机的姿态和距离等是不可控的,那直接采集得到的图像情况会很复杂,为了解决这些问题之前的方法需要标定相机,保证拍摄出来的人的照片的头部角度、位置和距离是不动的,只有眼睛在动。换言之,如果有一只无形的手,能够始终通过平移和旋转,把相机调整到一个预先定义好的姿态去拍摄人脸图像,那是最好的了。但是这种物理移动相机的操作是显然不可能的,normalization的意义在于通过图像变换的方式模拟相机的物理移动,使得变换后的图像尽量逼近于相机物理移动后拍摄的图像。

目录

  • Data Normalization
    • 几个坐标系
    • Normalization模式
    • Normalization过程

Data Normalization

  这个data normalization是这类方法中最关键的一步,需要首先理解清楚,其本质就是一点立体几何和图像变换的东西。这类方法最早提出于东京大学的一篇论文,先把论文的题目贴上来《Learning-by-Synthesis for Appearance-based 3D Gaze Estimation》。
  如前所述,我们希望有一只无形的手能够时刻的调整相机的位置,实际无法做到,则通过图像变换来近似模拟这个相机的物理移动过程。当然这样的模拟也是有缺陷的。首先通过已经投影为2d的图像去还原3d姿态变化后的投影图像这件事虽然在3d立体几何上是严格准确的,但是和真值还是有误差。另外这样的模拟变换方式也需要首先估计出人头的姿态等数据,估计的准确性也会影响还原的准确性。
  首先给个整体的input-output,比如我们希望通过normalization得到人脸左眼的还原图像。下图左侧为任意角度和姿态下相机拍摄的人脸照片,下图右侧为通过normalization变换后的左眼图片,基于此再进行后续的视线检测,后面会详细分析normalization过程。
Gaze Estimation笔记——data normalization_第1张图片

几个坐标系

  这个问题涉及到几个坐标系,分别是世界坐标系,相机坐标系和人头坐标系,各自的含义从名字中就能看出来。其中人头坐标系的x轴为两个眼睛的连线且从左眼指向右眼,y轴为人脸平面(这里认为人脸是平的哈)内垂直于x轴方向向下,z轴按右手系确定,坐标系的原点无所谓取哪个点,仅仅多了一个平移的环节。这里认为相机安装好之后是不动的,因此世界坐标系和相机坐标系是一样的,简化为只有相机坐标系和人头坐标系。所谓拍照,从立体几何的角度来讲就是三维物体沿着相机坐标系 z c z_c zc方向在 x c x_c xc y c y_c yc所构成平面内的投影。后面的部分对照着下图进行解释:
Gaze Estimation笔记——data normalization_第2张图片

Normalization模式

  一般情况下,相机与人脸的相对位置与姿态是任意的,data normalization的过程就是将任意相对姿态、位置下拍摄的人脸照片转化到normalization模式下,那么什么是normalization模式呢?normalization模式就是,假设有一只无形的手,能在当前的相机姿态和位置下:

  1. 仅对相机进行旋转,使得相机坐标系的z轴指向我们感兴趣的人脸上的某个点O(比如眼睛的中心或脸的中心等),这样可以使得normalization之后的图像中,我们之前感兴趣的那个点O位于图像中央。此时相机有无数种姿态(相机可以绕着z轴旋转),为了固定一种姿态,再要求人头坐标系中的水平线(垂直于人头坐标系z轴的任意直线)经过投影后在相机中的成像仍然是水平的,此时相机的旋转姿态就唯一确定了。例如,要求人眼在旋转后的相机中成像是水平的,且某个预先选取的点(例如眼睛中心)位于图像中央,此时对应的相机旋转姿态就是唯一确定的。
  2. 完成第一步后,仅对相近进行沿着z轴的平移,使得相机距离感兴趣的点O的距离是个定值。

Normalization过程

  按照前面对normalization模式的定义,则可以对任意姿态下相机拍摄的图像进行normalization,得到normalization模式下的图像。图像的变换过程也就是遵循着上面两部的描述,通过几何和数学变换算出来即可。假设我们感兴趣的点即为右眼的中心,人头坐标系的原点也是右眼的中心。

  1. 首先通过关键点检测匹配或者其他什么方法,得到人头坐标系和相机坐标系之间的平移向量 t r ⃗ \vec{t_{r}} tr 与转换矩阵 R r R_{r} Rr。为了使得旋转后的相机z轴指向右眼的中心,旋转后的相机坐标系z轴就是 t r ⃗ \vec{t_{r}} tr ,即 z c ′ ⃗ \vec {z_{c}'} zc = t r ⃗ \vec{t_r} tr
    其次,为了使得normalization之后的眼睛是水平的(即人头坐标系的x轴在旋转后的相机坐标系内的投影也是水平的),需要 x h ⃗ \vec{x_h} xh 平行于 x c ′ ⃗ \vec{x_c'} xc z c ′ ⃗ \vec{z_c'} zc 构成的平面,或者说将 x h ⃗ \vec{x_h} xh 平移与 z c ′ ⃗ \vec{z_c'} zc 相交后, x c ′ ⃗ \vec{x_c'} xc 位于 x h ⃗ \vec{x_h} xh z c ′ ⃗ \vec{z_c'} zc 构成的平面内。此时, y c ′ ⃗ \vec{y_c'} yc 垂直于 x c ′ ⃗ \vec{x_c'} xc z c ′ ⃗ \vec{z_c'} zc 构成的平面且满足右手系,即 y c ′ ⃗ \vec{y_c'} yc = x h ⃗ \vec{x_h} xh × \times × z c ′ ⃗ \vec{z_c'} zc 。最后, x c ′ ⃗ \vec{x_c'} xc 也可以根据右手系求出, x c ′ ⃗ \vec{x_c'} xc = y c ′ ⃗ \vec{y_c'} yc × \times × z c ′ ⃗ \vec{z_c'} zc 。这一步对应的坐标系变换矩阵记做RR=[ x c ′ ⃗ ∥ x c ′ ⃗ ∥ \frac{\vec{x_c'}}{\left\|\vec{x_c'}\right\|} xc xc y c ′ ⃗ ∥ y c ′ ⃗ ∥ \frac{\vec{y_c'}}{\left\|\vec{y_c'}\right\|} yc yc z c ′ ⃗ ∥ z c ′ ⃗ ∥ \frac{\vec{z_c'}}{\left\|\vec{z_c'}\right\|} zc zc ]
    Gaze Estimation笔记——data normalization_第3张图片
  2. 对旋转后的相机坐标系沿着z轴进行缩放,缩放到某个预先定义好的定值 d n d_n dn即可,这一步对应的变换矩阵记做S=diag(1,1, d n ∥ x c ′ ⃗ ∥ \frac{{d_n}}{\left\|\vec{x_c'}\right\|} xc dn)。
    Gaze Estimation笔记——data normalization_第4张图片
    后面有时间再写写基于normalization data的几个视线检测方法吧。

你可能感兴趣的:(Gaze Estimation笔记——data normalization)