《Learning to Estimate 3D Hand Pose from Single RGB Images》 论文笔记

《Learning to Estimate 3D Hand Pose from Single RGB Images》ICCV_2017.3

摘要

本文介绍了从2D彩色图像进行3D hand pose estimation的一种方法,总体来说方法很直观。
project page

论文摘要主要讲了以下几点:

低成本的深度相机和深度学习使得能够从深度图像进行合理的3D手姿势估计;
本文提出了一种从常规RGB图像估计3D手部姿态的方法。由于缺少深度信息,该任务具有更多的模糊性;
为此,本文提出了一个深度网络,学习网络隐式3D关节的先验。与图像中检测到的关键点一起,该网络 产生良好的3D姿势估计;
引入了基于合成手模型的大规模3D手势数据集用于训练相关网络。在各种测试集上的实验,包括关于手语识别的测试,证明了对单一RGB图像3D手姿态估计的可行性。

主要流程

Figure 2: 我们的方法由三个构建块组成。首先,通过分割网络(HandSegNet)将手定位在图像中。根据手部掩模,将输入图像裁剪并作为PoseNet的输入。这将定位一组表示为score map

困难

为了训练网络,需要具有真实标注3D关键点的大型数据集。由于没有这样的数据集具有足够的多样性,我们创建了一个包含各种数据增强处理的合成数据集。
在这里插入图片描述

手姿势表示

• 给定显示单手的彩色图像, 想要推断其3D姿势, 我们通过一组坐标来定义手部姿势, 其描述了3D空间中J个关键点的位置, 在这个例子中,J = 21
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

HandSegNet

• 对于手部分割,我们部署了一个网络架构,该架构基于Wei [19]等人的Person detector并进行了初始化
• 我们的HandSegNet是Wei等人[19]在我们的手姿势数据集上训练的网络的较小版本。
• HandSegNet提供的手部掩模允许我们对输入进行裁剪和标准化,从而简化了PoseNet的学习任务。

HandSegNet网络结构:
在这里插入图片描述

PoseNet

• 我们将二维关键点的定位表示为二维分数图的估计: c = {c1(u, v), . . . , cJ (u, v)}.
• 我们训练一个网络以预测J个得分图 ,其中每个图包含关于某个关键点在空间位置处出现的可能性的信息。
• 我们使用来自Wei等人[19]的权重进行了初始化,并应用了这些权重,并对网络进行了重新训练以进行手部关键点检测。

PoseNet网络结构:
在这里插入图片描述

PosePrior network

• PosePrior网络在可能不完整或有噪声的分数图的条件下学习预测相对的、标准化的三维坐标。
• 为此,它必须学习多种可能的手部关节及其先验概率。根据分数图的条件,它将输出给定2D信息时的最有可能的3D配置。
• 首先,在x轴和z轴周围寻找旋转Rxz,使得某个关键点与规范框架的y轴对齐:
• 然后,计算围绕y轴的旋转Ry
• 为了适当地处理左手和右手之间的对称性,我们沿着z轴向右翻动
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

根据这个规范坐标系的定义,我们训练网络来估计规范坐标系内的三维坐标,并分别估计旋转矩阵R(wrel),我们使用带有三个参数的轴角表示法对其进行参数化。
估计变换R等价于预测给定样本相对于规范坐标系的视点。
因此,我们将这个问题称为视点估计。
两个流的网络结构除了最后一层都相同:
在这里插入图片描述
输入32x32x21,输出两个层。一个是正则化的手的坐标,以手掌的点为原点,且长度进行了normalize, 即维度为21x3。另一个是相对于实际图片的空间的变换关系,即维度为3

数据集

在这里插入图片描述Figure4 : 我们的新数据集提供了33个类的分割图: 每个手指、手掌、人和背景对应3个类。手的三维运动模型为每只手提供21个关键点:每根手指4个关键点,靠近手腕的一个关键点。 包含 41258个用于训练的图像和2728个用于验证的图像,分辨率为320×320像素。

完整系统的例子

在这里插入图片描述
Figure7 :完整系统的例子。输入到网络的是彩色图像和是左手还是右手的信息。该网络对手部分割掩模进行估计,在二维空间中定位关键点,并输出最有可能的三维姿态。
左边的样本来自于我们记录的一个用于定性评估的数据集,右上角的样本来自于手语数据集,右下角的样本来自于S-val。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`estimate_pose_for_tag_homography` 是一个用于估计相机位姿的函数,它基于 Apriltag 检测结果中的 Homography 矩阵来计算相机的旋转和平移。具体来说,该函数使用 OpenCV 中的 `solvePnP` 函数来求解相机位姿。 以下是 `estimate_pose_for_tag_homography` 的主要实现步骤: 1. 根据 Apriltag 检测结果中的 Homography 矩阵,计算相机的内参矩阵和畸变系数。 ``` cv::Mat cameraMatrix, distCoeffs; cv::Mat H = cv::Mat::zeros(3, 3, CV_64F); for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { H.at<double>(i, j) = det->H[i*3+j]; } } cv::Mat K_inv = cv::Mat::eye(3, 3, CV_64F) / H.at<double>(2, 2); cameraMatrix = K_inv.inv(); distCoeffs = cv::Mat::zeros(1, 5, CV_64F); ``` 2. 根据 Apriltag 检测结果中的码的实际大小和标定板的大小,计算相机的外参矩阵。 ``` std::vector<cv::Point3f> objPoints; for (int i = 0; i < 4; i++) { objPoints.push_back(cv::Point3f(i==0||i==3 ? 0 : tag_size, i==0||i==1 ? 0 : tag_size, 0)); } std::vector<cv::Point2f> imgPoints; for (int i = 0; i < 4; i++) { imgPoints.push_back(cv::Point2f(det->p[i][0], det->p[i][1])); } cv::Mat rvec, tvec; cv::solvePnP(objPoints, imgPoints, cameraMatrix, distCoeffs, rvec, tvec); cv::Mat R; cv::Rodrigues(rvec, R); ``` 3. 将旋转矩阵和平移向量合并为一个 4x4 的变换矩阵,得到相机的位姿。 ``` cv::Mat T = cv::Mat::eye(4, 4, CV_64F); R.copyTo(T(cv::Rect(0, 0, 3, 3))); tvec.copyTo(T(cv::Rect(3, 0, 1, 3))); ``` 需要注意的是,该函数只能处理单个 Apriltag 的情况,如果需要处理多个 Apriltag 的位姿估计,需要对每个 Apriltag 分别调用该函数进行计算。此外,由于相机位姿的计算过程涉及到多个参数,因此在实际使用中需要进行适当的参数调整和误差处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值