• 本文主要梳理V2V关节点估计算法的原理、网络结构、以及工程应用。
  • 虽然V2V是2017年的算法,但是其3D点云处理流程和效果还是很经典的,值得作为入门3D深度学习领域的一个窗口。

1 算法部分

V2V-PoseNet基本介绍

  • 发明时间:2017年
  • 功能:3D关节点估计(如应用于手掌关节点估计)
    • 输入数据:一张包含目标的depth图。(如用Kinect、realsense等传感器采集的的depth图)
    • 输出结果:目标物体关节点的X,Y,Z坐标值。
  • 两句话概括创新点:
    • 第一句话:传统方法是基于2D深度图直接回归关节点坐标,而我们是把2D深度图投影到3D空间,然后用3D卷积去操作,这能解决2D深度图的透视畸变问题。(透视畸变问题见下面)
    • 第二句话:我们不是直接回归关节点坐标,而是估计每个点云所属某关节点的概率值。(用热图表示)
  • 所获荣誉:
    • CVPR2018
    • 大大领先优势,获得当年基于帧的3D手部姿态估计挑战赛第一名。
    • 在当前(2021年8月)手势姿态估计领域,效果排名第3。

算法结构介绍

论文中结构图如下:

自己绘制的更详细版结构图如下:

V2V网络输入的预处理过程见后面内容,这里说明下网络输出及其后处理过程。

  1. 网络输出的[16, 44, 44, 44]是什么意思?

    1. 答:16代表关节点个数,每个关节点的XYZ坐标信息单独用一个44x44x44立方体来预测表示。此时,网络输出的立方体(44x44x44的矩阵)里面每个元素值有正有负,值越大的元素位置,即代表关节点在此处的概率越大。把这立方体里面所有元素值经过一个softmax后,每个元素值就能转换成一个0~1之间的概率值了。
  2. 在输出的44x44x44立方体中,怎么找到关节点的具体XYZ位置?
    1. 44x44x44立方体矩阵经过softmax后,44x44x44=85184个元素值能够转换成关节点落在此处的概率值,最简单的获取关节点XYZ位置的方法就是取这立方体中,概率最大的那个值,看这个最大的值在44x44x44立方体的什么位置,那个位置就判定为网络预测的关节点位置。但是,这种方法有很多弊端,第一个大弊端是,这种方式得到的关节点XYZ只能是整数值([0, 44]之间的整数),这就导致预测的精度损失。第二个大弊端是,概率最高的那个位置点,可能是个离群点,即有可能并不是概率密度最高区域的中心点。既然这样,那怎么根据这85184个概率值,在44x44x44的立方体中,找到关节点最佳位置呢?方法就计算所有位置概率的平均!我还不知道怎么用简短的语言描述,让我用一幅图来解释:(我用2D图中找热图中心点位置为例子,3D立体找热图中心点同理)
    2. 上图,关键是理解构造的那两个X、Y方向的递增矩阵就好了,它们和概率图按位点乘然后25个元素累加,其结果的物理意义,就是所有25个点位置的平均值!看热图的X方向,热图中概率最高点0.37,它左边是0.15,右边是0.21,所以,按道理中心点会在0.37网格的右边,而0.37所在的X值为2,所以,中心点的X方向值,应该大于2!实际上按上图这样计算,结果也一定会大于2!

损失函数

就是把预测的3D热图(每个关节点有一个3D热图)和标签生成的热图计算均方误差:

作者认为3D识别关节点的好处

作者如何制作数据集的 

算法数据流图详情

2 工程部分

需求

通过手势来虚拟触控激光投影,其中就需要使用V2V算法,识别手掌的16个关节点,并计算手指3关节点的空间延长线和桌面的交汇点坐标。 

16个手指关节点位置:

 Kinect2相机:

16位深度图转8位灰度图 

Kinect2相机采集的depth图是16位存储的,原因是depth图中包含距离信息,值在0~2000mm之间。但是实际上我们只需要手部区域的depth图用于后续的V2V做关节点估计。最简单方法是,用YOLO目标检测器训练一个depth图的手掌目标检测模型,让YOLO算法裁剪人的手掌区域。

YOLO检测的是depth区间在1200mm至1800mm高度区间的图像,得到手部区目标框位置后,我们需要基于原始16位的depth图,去找到手部区的“中心点”,这个中心点物理意义大概是手掌在空间中的几何中心,后续我们需要基于这个中心点,去在depth转3D点云图上,以这个中心点为立体中心,去裁剪一个手部区空间,并最终送到V2V网络去预测手掌关节点位置。计算出这个中心点位置的方法有很多,这里我们简单的用16个“网格点”去获取中心点的Z值,XY值就取YOLO裁剪的手部depth图的XY值。

中心点选取方案的测试方法如下:(评估到底有多少手部点被排除在立方体之外)

V2V样本的标注

最开始,我们在2D RGB图上标注16个关节点,然后通过RGB图坐标转depth图坐标转3D点云坐标,来获取手掌在3D空间的XYZ标签信息。但是,这种方法导致非常大的标注误差,原因在于,depth图精度并不是特别高,而且有很多噪音。RGB图上标注的点,人眼看上去标的很准,但很可能通过公式,映射到3D空间时,这个点会落在噪音点上。

计算手指关节点的空间延长线和桌面点云的交点

V2V得到手掌16个关节点后,我们使用食指尖和食指末2个关节点的XYZ值,可以计算出其连接线射线与桌面点云的交点位置。

具体计算代码如下:

3 效果

YOLO目标检测器检测手掌区域效果

V2V算法对手掌16关节点预测的效果 

3D仿真

在开发过程中,我们设计了一个3D仿真程序,用于测试各模型及其语义逻辑在虚拟空间的操控效果。初版仿真程序是用一个简单的立方体来表示,后期仿真使用pyqtgraph库设计了一个更全功能的虚拟仿真,包括实时可视化如下内容:环境空间中的所有点云、RGB图、虚拟立方体(用于测试手掌非接触控制它的效果)、手指方向延长线与环境中点云的交汇点等等。

初版仿真程序如下:

最终版仿真程序如下:

后续更新截图。

V2V-PoseNet算法和应用详解(3D关节点估计领域)相关推荐

  1. python如何调用文件进行换位加密_python 换位密码算法的实例详解

    python 换位密码算法的实例详解 一前言: 换位密码基本原理:先把明文按照固定长度进行分组,然后对每一组的字符进行换位操作,从而实现加密.例如,字符串"Error should neve ...

  2. DL之AlexNet:AlexNet算法的架构详解、损失函数、网络训练和学习之详细攻略

    DL之AlexNet:AlexNet算法的架构详解.损失函数.网络训练和学习之详细攻略 相关文章 Dataset:数据集集合(CV方向数据集)--常见的计算机视觉图像数据集大集合(建议收藏,持续更新) ...

  3. DL之ShuffleNet:ShuffleNet算法的架构详解

    DL之ShuffleNet:ShuffleNet算法的架构详解 相关文章 DL之ShuffleNet:ShuffleNet算法的简介(论文介绍).架构详解.案例应用等配图集合之详细攻略 DL之Shuf ...

  4. DL之MobileNetV2:MobileNetV2算法的架构详解(包括ReLu的意义)

    DL之MobileNet V2:MobileNetV2算法的架构详解 相关文章 DL之MobileNetV2:MobileNetV2算法的简介(论文介绍).架构详解.案例应用等配图集合之详细攻略 DL ...

  5. DL之SqueezeNet:SqueezeNet算法的架构详解

    DL之SqueezeNet:SqueezeNet算法的架构详解 相关文章 DL之SqueezeNet:SqueezeNet算法的简介(论文介绍).架构详解.案例应用等配图集合之详细攻略 DL之Sque ...

  6. ​​​​​​​DL之ResNeXt:ResNeXt算法的架构详解

    DL之ResNeXt:ResNeXt算法的架构详解 相关文章 DL之ResNeXt:ResNeXt算法的简介(论文介绍).架构详解.案例应用等配图集合之详细攻略 DL之ResNeXt:ResNeXt算 ...

  7. 【算法知识】详解堆排序算法

    点击蓝色字关注我们! 什么是堆 「堆」首先是一个完全二叉树,「堆」分为「大顶堆」和「小顶堆」: 「大顶堆」 : 每个节点的值大于或等于其左右孩子节点的值,称为大顶堆. 「小顶堆」同理就是每个节点的值小 ...

  8. 【算法知识】详解基数排序算法

    已发布: [算法知识]详解选择冒泡算法 [算法知识]详解选择排序算法 [算法知识]详解插入排序算法 [算法知识]详解快速排序算法 [算法知识]详解归并排序算法 基本思想 基数排序的思想是将整数按位数切 ...

  9. 【算法知识】详解归并排序算法

    已发布: [算法知识]详解选择冒泡算法 [算法知识]详解选择排序算法 [算法知识]详解插入排序算法 [算法知识]详解快速排序算法 基本思想 归并排序的基本思想是: 先将序列一次次分成子序列,直到子序列 ...

最新文章

  1. 为什么 SQL 语句不要过多的 join?
  2. Liferay 集群 (fail-over)
  3. 收藏长文|Java 代码精简之道
  4. Python中简化的验证码功能实现
  5. Oracle集合运算
  6. 绩效工作流_流绩效–您的想法
  7. webpack自定义打包命令
  8. SPS:设置访问群体
  9. npm install 错误 安装 chromedriver 失败的解决办法
  10. 软考知识点之需求管理
  11. 编译原理归纳学习——去除晦涩
  12. 收集国人不良习惯 -- 有哪些不好的习惯敬请指出,那些不能算作不好的 只能说习俗不同也请指出
  13. ssh隧道连接的3种方式
  14. oracle10g 概述,Oracle 10g数据库概述
  15. 关于css的display:flex inline block inline-block和float
  16. 【读书速记】《汽车嵌入式系统手册》(1)
  17. 苹果电脑如何用HTML5播放,用HTML5播放IPCamera视频
  18. 淘口令真实url API 返回值说明
  19. 连续分配方式 -- 可重定位分区分配
  20. node.js中fs.readFile和fs.readFileSync的使用

热门文章

  1. 整数n的倒数第k个数字
  2. oracle do date,Oracle to_date函数的使用
  3. Uncaught SyntaxError: Unexpected token
  4. 用vue-cli脚手架搭建一个仿网易云音乐的全家桶vue项目
  5. jQuery和dom的相互转换
  6. YTU 2723: 默认参数--求圆的面积
  7. SQL Server存储过程输入参数使用表值
  8. 服务器温度3d显示,智能问答助手、3D可视化展示,腾讯医典“黑科技”助力科普更有温度...
  9. java mysql 是否插入 成功_您如何确定使用Java和MySQL插入或更新是否成功?
  10. oracle grand select,Oracle SQL 高级篇