多目灰度cam手势追踪系统——MegaTrack

news2024/11/18 6:16:28

一、前言

本文是对Facebook Oculus发布的一篇VR方向(手势追踪)论文的解读。Oculus是一家做VR的公司,2014年被FaceBook收购了,本次参考的论文就是FaceBook Oculus团队的最新论文。论文2020年7月发表于SIGGRAPH。

因为最终是要给大家讲明白这个手势追踪是怎么实现的,所以我尽量不出现数学公式,尽量使用中文。

【补充】SIGGRAPH是什么?:Special Interest Group for Computer GRAPHICS,计算机图形图像特别兴趣小组,成立于1967年,可以看作一个论坛或者是会议,内容主打电脑绘图和动画制作。绝大部分图像相关厂商和游戏制作者都会每年在这个会议上发布自己的作品和科研成果。因此,SIGGRAPH在图形图像技术,计算机软硬件以及CG等方面都有着相当的影响力。

二、论文分析

1、这篇论文讲的啥?

现在市面上的VR游戏机,都需要手柄一类的操作杆来获取玩家手部动作和实时坐标,如下图:

而本篇论文中所提到的手势追踪,则不要手柄操纵杆之类的外设。实现效果如下图:

说白了,他这篇论文讲的就是,他怎么实现的第二张图——手势追踪。而他这个手势追踪系统的名称,叫做MegaTrack。

而我接下来的任务就是以平易近人的科普方式,给大家讲解他们团队的手势追踪系统是如何实现的。
2、直接传感器->间接传感器

为了脱离操纵杆,最开始人们的解决方案是制作一双充满电容手套,玩家戴上手套之后,系统就可以完美的掌握手势的每一个细节,但这样和直接握操纵杆没有本质区别,二者都属于在手部直接安装传感器。这篇论文的第一个特点:就是不安装直接传感器,通过摄像头观察手部姿势+深度学习来达成间接传感器的作用。
【补充】两种间接传感器的对比:首先,谷歌也有一个类似的手势追踪系统——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个摄像头,所以相比于谷歌的解决方案,具有以下优势:

  • 能够更好的解决“遮盖问题”(手被物品遮蔽或自我遮蔽 ,比如说背面拳头事实上,遮蔽是所有基于视觉方法的难题,这点如果不考虑非视觉的输入,就只有增加更多不同视角的相机输入了)
  • 在大多数时候他们会使用 multiple cameras with geometric calibration的演算法,只有在极少的位置使用单一相机的演算法。(比如手的位置特别的远离身体,以至于只有一个摄像头能捕捉到手的姿势…)
  • 在3D hand pose estimation演算法方面,Oculus除了会采用2D/2.5D hand pose estimation方法外,还可以更进一步地利用多相机的几何校正优势。
  • 同时,由于它具有四个摄像头,于是就可以在最初的数据采集中获取一些3D坐标用于辅助最终的手势坐标。

3、实现过程

介绍完了硬件,现在开始介绍实现步骤,可以分为三大步:

  • Detection (DetNet)——手部探测网络(自己翻译的…)
  • Keypoint Network (KeyNet)——手势关键点生成网络
  • Hand Kinematic Model(或者说手势估计)——建立手部动态模型

注:前两步都是通过神经网络来实现的。

3.1 DetNet(手部探测网络)

  • 团队使用了260万张照片来训练DetNet来提取手部图像。
  • VR眼镜上的四个摄像头采集影像(VGA格式),每一帧将手部信息裁剪成正方(因为正方形图像方便神经网络计算嘛),输入到下一层。
  • DetNet,结合了通过跟踪检测的策略,可以优雅地处理手部在多个摄像机之间的移动。

3.2 KeyNet(手势关键点生成网络)

KeyNet使用了200万张图片来训练网络,来预测手势关键点的2.5D坐标。

  • 注意:KeyNet的训练的图片来源,来自该团队实验室的深度相机。
  • 当模型已经训练好之后,在VR眼镜中则使用已经训练好的模型+普通摄像头来近似深度摄像头的作用,以节省成本。

在KeyNet层中,首先输入手的影像(已经处理成正方形)和21个用于参考的3D手势点(这21个点来源自上一轮的Hand Kinematic Model,有点循环神经网络那种感觉);随

后通过网络输出21个预测出来的2.5D 手势关键点坐标。

之所以输入来自上一轮的用于参考的3D点,是为了拟合真实数据和模拟数据的误差,也为了解决输入图像手部关键点的抖动问题(个人理解,这一步运用了残差的思想,把我上一轮生成的关键点用来辅助下一轮关键点的预测。毕竟有上一轮的参考点,就可以更重点观察新关键点的特点和分布)。

【补充】参考点是MegaTrack KeyNet一大特色

  • 值得一提的是,MegaTrack KeyNet的一大特色就是除了影像外还要输入一组参考用的keypoint 3D pose,而这组21个3D pose最大的效果在于稳定模型的预测,在某几帧采集效果不佳的情况下,依然能提供稳定的模型预测。
  • 对于MegaTrack系统来说,90%的关键点预测是由上一步输入的3D生成,剩下的10%的关键点的预测是由20帧前的手部姿势生成。(具体又是怎么根据前20帧生成的剩下的10%的点在此先不解释了)

3.3 Hand Kinematic Model(手部动态模型)

这一部分的作用:

  • 使用KeyNet输出的2.5D 的手势关键点来最终生成3D手势。
  • 另外,一个新的使用者使用VR设备,整个手势追踪会先进入kinematic model scale模块,进行手部姿态的校正。

具体流程:

  • 使用一个26 关键点的手部动态模型,通过观测KeyNet预测的2.5D pose,去近似真实的3D 手势。(为什么这突然变成26…我也不知道)
  • 其中,手腕6 个关键点,每根手指4个关键点 ,对KeyNet的2.5D pose计算残差,并使用Levenberg-Marquardt方法最佳化。

【补充】Levenberg-Marquardt最佳化:

Levenberg-Marquardt方法,是一个穷举3D空间中手的方法,并从中挑选最符合相机观察(KeyNet输出的2.5D pose) 的那只手,就是这个演算法最终输出的结果。

最佳化时,通过forward kinematic,得到3D空间中的21个3D点 (与KeyNet一样的21个点)。实际上最佳化的residual term有三项:

  • 将21个3D点投影回相机空间,与KeyNet预测的2D pose越接近越好;
  • 计算21个3D点的relative distance,与KeyNet预测的depth distance越接近越好;
  • 与前一个pose越接近越好,即smooth term。

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的缺点

在双手有复杂交叉的时候,识别会失效

当收的方向并不是以自己的方向为中心时,识别会失败

手和现实物体发生交互式,识别会失败

论文地址:

https://research.fb.com/wp-content/uploads/2020/08/MEgATrack-Monochrome-Egocentric-Articulated-Hand-Tracking-for-Virtual-Reality.pdf

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1509401.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Go语言简介

一.Go语言简介 1.1 优点 自带gc静态编译,编译好后,扔服务器直接运行简单思想,没有继承,多态和类等丰富的库和详细开发文档语法层支持并发,和拥有同步并发的channel类型,使并发开发变得非常方便简洁语法&am…

手机和电脑同步的好用记事本软件有哪些

我常常需要随手记录各种信息,以便随时查阅和使用。比如,在下班路上,我会用手机记录明天要处理的工作事项、购物清单,或是某个突然迸发的创意想法;而在办公室,我则需要在电脑上整理会议纪要、项目计划&#…

[AutoSar]BSW_Com012 CAN TP 模块介绍

目录 关键词平台说明一、知识储备二、缩写对照表三、CAN TP 所在架构位置四、CAN TP 的主要作用五、CAN TP 在 autosar 架构中的基本概念5.1、CAN TP 的处理模式5.2 数据一致性5.3 静态配置 六、功能规范6.1 Services provided to upper layer6.1.1 Initialization and shutdow…

基于cnn的卷机神经网络的项目毕业课题实践应用(毕业选题-深度学习-卷及神经网络)

这些项目可以作为毕业课题选择,共计超过20个: 往期热门项目回顾: 计算机视觉项目大集合 改进的yolo目标检测-测距测速 路径规划算法 图像去雨去雾目标检测测距项目 交通标志识别项目 yolo系列-重磅yolov9界面-最新的yolo 姿态识别…

Mybatis操作sql报错ibatis.binding.BindingException: Parameter ‘empId‘ not found.

你们好,我是金金金。 场景 在使用Mybatis操作sql语句过程当中,更新操作,报错信息如下:Caused by: org.apache.ibatis.binding.BindingException: Parameter ‘empId’ not found. Available parameters are [arg1, arg0, param1, …

PyTorch搭建AlexNet训练集

本次项目是使用AlexNet实现5种花类的识别。 训练集搭建与LeNet大致代码差不多,但是也有许多新的内容和知识点。 1.导包,不必多说。 import torch import torch.nn as nn from torchvision import transforms, datasets, utils import matplotlib as p…

电子价签前景璀璨,汉朔科技革新零售行业的数字化新篇章

新型商超模式数字化“秘密武器”——电子价签 传统纸质价签,只要商品价格、日期等信息发生变化,就必须重新打印进行手动替换。电子价签的应用使传统的人工申请、调价、打印、营业员去货架前端更换等变价流程均可省略,所有门店的价格由后台统…

Linux命令深入学习——列出帮助手册,开机关机

linux中有多种方法查看一个不熟悉命令的详细信息,如 ls --help,help ls,man ls,info ls 在linux系统中可以使用命令进行开关机以及相关基础操作 同时在进行写入操作时,可以使用快捷键进行操作

图论(二)之最短路问题

最短路 Dijkstra求最短路 文章目录 最短路Dijkstra求最短路栗题思想题目代码代码如下bellman-ford算法分析只能用bellman-ford来解决的题型题目完整代码 spfa求最短路spfa 算法思路明确一下松弛的概念。spfa算法文字说明:spfa 图解: 题目完整代码总结ti…

【LeetCode每日一题】2129. 将标题首字母大写

文章目录 [2129. 将标题首字母大写](https://leetcode.cn/problems/capitalize-the-title/)思路:代码: 2129. 将标题首字母大写 思路: 1.先根据空格,将每个单词切割,依次遍历 2.用StringBuilder来对结构进行拼接 3.…

element plust的表格 el-table数据不按列展示

ElementPlus的表格demo代码放到原生的html <template><el-table :data"tableData" style"width: 100%"><el-table-column prop"date" label"Date" width"180" /><el-table-column prop"name"…

使用Python查询和下载Sentinel卫星数据

欢迎学习本教程,了解如何使用 Python 访问和下载 Sentinel 卫星数据。在深入探讨技术方面之前,让我们先了解一下哨兵卫星是什么以及它们为何如此重要。 哨兵家族。资料来源:欧空局。 Sentinel 卫星是欧洲航天局 (ESA) 开发的一组地球观测任务,是哥白尼计划的一部分,该计划…

Spark性能优化指南——高级篇

调优概述 有的时候&#xff0c;我们可能会遇到大数据计算中一个最棘手的问题——数据倾斜&#xff0c;此时Spark作业的性能会比期望差很多。数据倾斜调优&#xff0c;就是使用各种技术方案解决不同类型的数据倾斜问题&#xff0c;以保证Spark作业的性能。 数据倾斜发生时的现…

一文了解Cornerstone3D中窗宽窗位的3种设置场景及原理

&#x1f506; 引言 在使用Cornerstone3D渲染影像时&#xff0c;有一个常用功能“设置窗宽窗位&#xff08;windowWidth&windowLevel&#xff09;”&#xff0c;通过精确调整窗宽窗位&#xff0c;医生能够更清晰地区分各种组织&#xff0c;如区别软组织、骨骼、脑组织等。…

SSM整合项目(校验)

文章目录 1.前端校验1.需求分析2.HomeView.vue的数据池中添加校验规则3.HomeView.vue 绑定校验规则![image-20240311213428771](https://img-blog.csdnimg.cn/img_convert/7770bfa16814a0efd4eb818c9869a5bd.png)4.验证是否生效5.如果验证不通过&#xff0c;阻止用户提交表单1.…

机器学习之分类回归模型(决策数、随机森林)

回归分析 回归分析属于监督学习方法的一种&#xff0c;主要用于预测连续型目标变量&#xff0c;可以预测、计算趋势以及确定变量之间的关系等。 Regession Evaluation Metrics 以下是一些最流行的回归评估指标: 平均绝对误差(MAE):目标变量的预测值与实际值之间的平均绝对差…

webpack5零基础入门-4使用webpack处理less文件

1.安装less npm install less -D 2.创建less文件 .box{width: 100px;height: 100px;background: red; } 3.引入less文件并打包 执行npx webpack 报错无法识别less文件 4.安装less-loader并配置 npm install less-loader9 -D 这里指定一下版本不然会因为node版本过低报错 …

Java 启动参数 -- 和 -D写法的区别

当我们配置启动1个java 项目通常需要带一些参数 例如 -Denv uat , --spring.profiles.activedev 这些 那么用-D 和 – 的写法区别是什么&#xff1f; 双横线写法 其中这种写法基本上是spring 和 spring 框架独有 最常用的无非是就是上面提到的 --spring.profiles.activede…

【golang】28、用 httptest 做 web server 的 controller 的单测

文章目录 一、构建 HTTP server1.1 model.go1.2 server.go1.3 curl 验证 server 功能1.3.1 新建1.3.2 查询1.3.3 更新1.3.4 删除 二、httptest 测试2.1 完整示例2.2 实现逻辑2.3 其他示例2.4 用 TestMain 避免重复的测试代码2.5 gin 框架的 httptest 一、构建 HTTP server 1.1…

如何配置固定TCP公网地址实现远程访问内网MongoDB数据库

文章目录 前言1. 安装数据库2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射2.3 测试随机公网地址远程连接 3. 配置固定TCP端口地址3.1 保留一个固定的公网TCP端口地址3.2 配置固定公网TCP端口地址3.3 测试固定地址公网远程访问 前言 MongoDB是一个基于分布式文件存储的数…