关于VR手势识别的两类算法模型分析
扫描二维码
随时随地手机看文章
(文章来源:VR陀螺网)
当我们通过摄像头得到深度图后,下一步就是把深度图输入给算法,算法可以输出我们手部所有关键点的 3D 位置。手部关键点也可以理解为手部骨架的关节点,通常用 21 个 3D 关键点来描述。每个 3D 关键点有 3 个自由度,那么输出维度就是 21*3。目前学术界已经提出各种算法用于解决“基于深度的手势姿态估计问题“,这些算法大体可以分成模型驱动(model-driven)和数据驱动(data-driven)两种方式。
1、模型驱动类算法,此类算法通常是预先用手部 pose(pose 指位姿参数或节点位置,后文将统称为 pose)生成一系列手的几何模型,并建立一个搜索空间(所有可能的手势几何模型的集合),然后在搜索空间内找到与输入深度图最匹配的模型。此时,模型对应的参数就是所求的 pose。模型驱动类算法通常需要设计一种方式把 pose 转换成对应的几何模型。
此论文用了 linear blend skinning(一种骨骼蒙皮动画算法):意思就是给骨架蒙上一层皮肤,并让皮肤跟随骨骼运动一起变化,多用于动画领域。先把 pose 转换成对应的 mesh(下图左侧),在进一步转换成光滑曲面模型。我们可以理解为 pose 是自变量,几何模型可由 pose 算出,且几何模型与 pose 一一对应。
输入的手部深度图可转化为点云, 此点云就相当于在真实的手表面上采集到的一些 3D 点,如下图中的红点和蓝点:这样就可以定义损失函数为点云中的点到模型表面的距离(上图中的红线),以此描述深度图和pose的相似度。损失函数的输入是深度图和 pose,输出是差异度。损失函数的输出值越小,说明输入的深度图和pose越相似。
因此,只要在搜索空间中找到令损失函数最小的 pose 即为所求的pose。但因搜索空间不能写成解析形式,没法一次性求出损失函数的最小值,通常只能用数值计算方法,如PSO,ICP等,不断迭代计算得到最优解。迭代的数值解法通常对初始化要求较高,若初始化的不好,则需要很长时间才能迭代收敛,还有可能无法收敛到全局最小值(因为损失函数是非凸函数),所以算法实现时,通常利用上一帧的pose来初始化当前帧的计算。
这种模型驱动类方法需要手工设计几何模型和损失函数。简单的几何模型计算量小,复杂的几何模型准确度高。通常设计模型时需要在准确度和性能之间做权衡。模型驱动类的算法优势是不需要任何训练数据,只要设计的好,写完就可以直接用。 缺点是需要手工设计模型,计算量较大,容易误差累计导致漂移,对初始化要求高,通常只能用在手势追踪领域。
2、数据驱动类算法,此类算法是指利用收集数据中训练样本与其对应的标签关系,让机器学习一个从样本到标签的映射。 此类算法属于判别式方法(Discriminative Approaches)。
这样的机器学习算法有很多,可以是早期使用的随机森林,SVM 或是最近研究的火热的神经网络等。此类方法的优点是不需要设计复杂的模型,缺点是需要大数据。但现在大数据时代数据量已经不是问题,这种数据驱动的方式已经成为目前的主流研究方向。
早期学术界研究手势关键点回归的经典方法有 Cascade regression, Latent Regression Forest 等。近些年研究主要集中在各类神经网络如:DeepPrior 系列、REN、pose guided、3D-CNN、MulTI-View CNNs、HandPointNet、Feedback Loop 等。
由于此处讨论的用于手势的神经网络与普通的图的神经网络并无本质差异,而神经网络的科普文章已经很多,这里就不做科普了,我们仅挑几个有代表性的网络结构介绍一下:DeepPrior:网络结构大体如下图,通过初始网络得到粗略的 pose,再用 refine 网络不断优化, 并且在最后的全连接层前加了一个低维嵌入,迫使网络学习把特征空间压缩到更低维度。 此网络后续有更优化的版本 DeepPrior++。
网络在预测 pose 之后,反过来用 pose 生成深度图,并与输入的深度图一起预测更优的 pose,此 pose 又可用来生成更优的深度图,以此迭代循环优化pose。3D CNN:网络结构如下图,此网络把2D深度图上用像素的描述的深度信息,以TSDF的方式转化为体素(3D的像素),并用3D 卷积代替了普通的2D卷积。
此处最大的贡献就是在网络结构上从2D走到了3D,因为传统2D卷积网络是为2D图像设计的,并不一定适合3D信息的提取,而用3D卷积网络则更容易获取3D特征,也就更适用于3D手部关键点回归的问题。HandPointNet:网络输入时把深度图转成点云,然后用 PointNet 做手部 3D 关键点回归。
HandPointNet的主要贡献是首次把PointNet用在了手势关键点回归上,其中的PointNet是很有代表性的网络。PointNet 首次用 3D 点云来作为网络输入而不是 2D 图片。PointNet 比上一个介绍的 3DCNN 更进一步探索了在 3D 空间中的神经网络架构,以及如何更有效的提取 3D 特征,PointNet后续有更优化的版本PointNet++。