一、前言
- 本博客是对Facebook Oculus发布的一篇VR方向(手势追踪)论文的解读;
- Oculus是一家做VR的公司,2014年被FaceBook收购了,本次参考的论文就是FaceBook Oculus团队的最新论文;
- 论文2020年7月发表于SIGGRAPH。
SIGGRAPH是什么?
-
Special Interest Group for Computer GRAPHICS,计算机图形图像特别兴趣小组,成立于1967年,可以看作一个论坛或者是会议,内容主打电脑绘图和动画制作。
-
绝大部分图像相关厂商和游戏制作者都会每年在这个会议上发布自己的作品和科研成果。因此,SIGGRAPH在图形图像技术,计算机软硬件以及CG等方面都有着相当的影响力。
论文地址:https://research.fb.com/publications/megatrack-monochrome-egocentric-articulated-hand-tracking-for-virtual-reality/
二、论文分析
1、这篇论文讲的啥?
现在市面上的VR游戏机,都需要手柄一类的操作杆来获取玩家手部动作和实时坐标,如下图:
而本篇论文中所提到的手势追踪,则不要手柄操纵杆之类的外设:
他这篇论文讲的就是——手势追踪。而他这个手势追踪系统的名称,叫做MegaTrack。
2、MegaTrack和谷歌同类产品的对比:
谷歌也有一个类似的手势追踪系统——MediaPipe Hand。
- MediaPipe Hand采用的是一个摄像头(非3D摄像头/深度摄像头),虽然一个摄像头无法展示场景的深度,但是谷歌采用了2.5D技术去近似模拟3D。
- 2.5D是啥什么?在摄像头输入图像中,在大部分的情况下将手腕处或是手掌中心会被设为相对深度的基准点,也就是这个位置的深度视为零。这种表示相对深度的方法被统称为2.5D表示法。
- 当然,只有一个固定的摄像头是肯定无法提取深度信息的,所以团队使用神经网络来进行训练,他们是用深度相机为每一帧图像打标签(深度信息),之后测试集使用的是普通相机。
有了深度的基准点,接下来的问题变成2.5D表示法要怎么近似真实3D位置。现在我们有:
- 各个点在影像上的2D位置;
- 各个关键点的相对深度。
- 这时候只要再假设手骨长度,将2D的预测与相对深度以几何投影方式投到3D空间,并放置在手骨长度恰好等于假设值的3D位置上,这样就完成了3D手姿态的近似。
2.5D 映射为 3D 过程如下图:
再说本文的主角MegaTrack:
- MegaTrack采用了四个摄像头用来感知手部姿态:
- 使用者的手至少会落在两颗相机的视野中:
由于MegaTrack使用了4个摄像头,所以相比于谷歌的解决方案,具有以下优势:
- 能够更好的解决“遮盖问题”(手被物品遮蔽或自我遮蔽 ,比如说背面拳头事实上,遮蔽是所有基于视觉方法的难题,这点如果不考虑非视觉的输入,就只有增加更多不同视角的相机输入了)
- 在大多数时候他们会使用 多相机算法 来抓取手的位置,只有在极少的位置使用单一相机算法。(比如手的位置特别的远离身体,以至于只有一个摄像头能捕捉到手的姿势…)
3、实现过程(共3部分)
MegaTrack的实现步骤,可以分为三大步:
- Detection (DetNet)——手部探测网络
- Keypoint Network (KeyNet)——手势关键点生成网络
- Hand Kinematic Model(手势估计)——建立手部运动模型
系统的实现思路:
- 使用普通摄像头+神经网络来达到深度摄像头的效果,获取三维坐标,再进行手部建模。
3.1、DetNet——检测手部图像
- 团队使用了260万张照片来训练DetNet时别取手部图像,学习率为0.001。
DetNet层的输入:
- 四个相机的原始视频图像;
- 之后,在原始视频中识别出手和附近的图像,之后将图像裁剪成正方形(方便网络计算);
最终DetNet层输出:
- 只包含手的正方形视频。
3.2、KeyNet——生成手部关键点(2.5D)
KeyNet使用了200万张图片来训练网络,学习率为0.025,来预测手部关键点的2.5D坐标。
- 注意,他之所以只生成2.5D坐标,是因为普通鱼眼相机只能生成2D坐标,即使团队使用神经网络为每个像素点附加该点的深度信息(增加了一维热图)并最终能做到手部模型的最终生成,但是这种方式并没有真正获取像素点的3D坐标,而这种2D坐标+相对深度坐标的方法,叫做2.5D近似法。
- 换句话说,如果现在深度相机和普通相机一样又便宜又耐用有灵巧,那么,也就没有KeyNet的存在意义了。
KeyNet层的输入:
- 输入:1、经过初步处理的手部影像;2、21个用于参考的3D手势点;
- 注意:这21个点来源自上一轮的第三步骤——Hand Kinematic Model,使用上一轮生成的手部模型,来辅助下一轮的输入。
KeyNet层的输出:
- 输出21个我们刚刚预测出来的2.5D 手部关键点坐标,具体表现形式为1、2D热图和2、对应的一维深度热图:
补充,21个参考点的输入是KeyNet一大特色:
- MegaTrack KeyNet输入的这组21个3D 点最大的效果在于稳定模型的预测,主要解决以下扰动:
- 当手在重叠的相机视图之间移动时,预测的质量会降低;
- 手指交叉咬合时;
- 在手部或者VR眼镜出现强烈抖动;
- 个人理解,把我上一轮生成的关键点用来辅助下一轮关键点的预测。毕竟有上一轮的参考点,就可以重点观察新关键点的特点和分布。
- 对于KeyNet来说,他最终输出的21个点,其中90%其实还是来自于上一步输入的3D点,只有剩下的10%的关键点的预测才是由KeyNet新生成的,系通过这种方法来优化计算速度,不至于每帧都产生大量的计算。
3.3、Hand Kinematic Model——手部运动模型
Hand Kinematic Model的输入:
- Hand Kinematic Model使用前两帧KeyNet输出的21个2.5D 的手部关键点,来生成本帧的手部3D模型;
- 对于输入的两帧数据,将计算两帧之间的残差,来优化第三帧的生成。
具体优化了三个残差项:
1、将前两帧的21个3D点的前2D数据投影回相机空间,与这一帧KeyNet预测的2D 位置坐标越接近越好;
2、计算前两帧21个3D点的相对深度,与这一帧KeyNet预测的depth distance越接近越好;
3、预测这一帧与上一帧的点越接近越好,即smooth term。(注意,这里可不是这一帧和前两帧做对比了,而是只和上一帧做对比)
Hand Kinematic Model的输出:
- 最终生成由26个自由度组成的3D的手部模型(这一层最终成像);
- 并且保存这个手模的scale,保存使用者的信息。
另外,每当一个新的使用者使用该设备,整个系统会先进入kinematic model scale模块,在预存的手模库里查看是否是该设备的老用户,并进行手部姿态的校正。
4、MegaTrack实际运行流程
以下流程是根据论文中提到的内容和我自己的理解结合而来:
- 首先,在不同camera上跑DetNet,直到找到使用者的手。
- 将camera的影像通过KeyNet和Hand Kinematic Model得到第一个3D pose手部模型。
- 随后,利用这个3D pose投影到其他camera中找到别的camera中的手。这个方法减少了多次跑DetNet所需的运算资源(相当于告诉DetNet一个手的大致位置,从而不需要让DetNet进行全图搜索)。
- 接下来进入手部追踪模式,每次进行KeyNet的时候,插入上一帧的Hand kinematic model,以推测下一帧中手可能会出现的位置,更进一步的减少运行DetNet的运算需求。
- 运行100帧之后,这个手的scale会被储存下来,直到VR眼镜被放下才会清除。
- 大多数的情况下,三大层中只有KeyNet会持续地运行,DetNet只有在丢失手部追踪(比如手突然抽走,再突然出现在另一个位置)的情况下才会被重新启动
- 另外,为了压低运算量,即使同一支手存在于超过两个camera的视角内,MegaTrack还是只会跑其中两只camera。
5、本论文中,MegaTrack的缺点
- 在双手有复杂交叉的时候,识别会失效
- 当收的方向并不是以自己的方向为中心时,识别会失败
- 手和现实物体发生交互式,识别会失败
遗留的问题
1、至于为什么不直接用VR眼镜上的四个摄像头生成3D坐标?
具体原因论文里没说,我也没查到。个人猜测是这样生成的3D坐标效果不好?所以最终还是要考先模拟出2.5D坐标,之后再往3D上面靠。
3、什么非要使用鱼眼摄像头?因为更精确么?
因为鱼眼摄像头的视野足够大,如果不用鱼眼手很容易超出视野范围
8、如何完成的手部追踪???