【论文笔记】PVNet: Pixel-wise Voting Network for 6DoF Pose Estimation

PVNet: Pixel-wise Voting Network for 6DoF Pose Estimation
来自浙江大学,论文作者在知乎发过关于这篇论文,目前在LineMod、LineMod Occluded、YCB-Video、数据集上都是第一名。

项目主页
开源代码

一.引言

1.1 问题描述

在本文中,我们提出了一种用于6DoF对象姿态估计的新颖框架。 给定图像,姿势估计的任务是检测对象并估计其方向和3D平移。 具体而言,6D姿态由从对象坐标系到摄影机坐标系的刚性变换(R; t)表示,其中R表示3D旋转,t表示3D平移。所以算法的输入是一张rgb图像、3D keypoints、bbox_8,输出是(R,t),最终展现的效果是:bbox_8经过旋转、平移、2D映射之后,投影在原图像上,能够准确地将特定物体框住。

1.2 现有方法的局限

最近流行的方法是,利用CNN回归得到2D keypoints,然后利用PnP算法进行求解得到6D pose parameters。但是这些方法对于遮挡、截断的物体难以精准检测。

1.3 作者的分析

作者认为,针对遮挡、截断等问题,我们需要在中间阶段或最后阶段得到稠密的预测,即像素或小区域级别的预测。于是作者提出了像素级预测的PVNet,对于每个像素,会得到一个指向2D keypoints的方向向量,如此对于截断物体的位置推理有大大的帮助。(实际上,这种像素级的回归越来越流行了,如hand-object estimation中的H+O方法也有这种思想)
在这里插入图片描述

1.4 作者的贡献

  • 提出了PVNet(pixel-wise voting network),它可以学习到一个指向2D keypoint的向量场表示,即便在遮挡和截断的情况下;作者的创新之处–能够学习到十分robust的2D keypoints。
  • 基于PVNet得到的稠密预测,作者用了一种基于关键点分布的PnP算法来从2D keypoints分布求取(R,t)位姿。

二.论文方法

我们使用两阶段算法估算对象姿态:首先使用CNN检测2D对象关键点,然后使用PnP算法计算6D姿态参数。 我们的创新在于2D对象关键点的新表示以及用于姿态估计的改进的PnP算法。 具体来说,我们的方法使用像素级投票网络(PVNet)以类似于RANSAC的方式检测2D关键点,该方法可以强大地处理被遮挡和被截断的对象。 基于RANSAC的投票还给出了每个关键点的空间概率分布,从而使我们能够利用不确定性驱动的PnP来估算6D姿态。简单来说,第一步,利用PVNet得到向量场预测和语义分割,基于RANSAC的投票得到2D keypoints的候选点,候选点带有位置和分布;第二步,利用3D keypoints、相机内参、2D keypoints进行PnP、最优化求解,得到位姿(R,t)。

2.1 基于投票的关键点定位方法

在这里插入图片描述
Bilinear upsampling
双线性插值原理
Residual Block
Dilated Convolution
图2概述了用于关键点检测的流程。给定RGB图像,PVNet会预测像素级对象标签和单位矢量,这些对象标签和单位矢量表示从每个像素到每个关键点的方向。给定从属于该对象的所有像素到某个对象关键点的方向,我们针对该关键点生成2D位置的假设,并通过基于RANSAC的投票生成置信度得分。基于这些假设,我们估计每个关键点的空间概率分布的均值和协方差。与直接从图像区域中定位关键点位置相反,预测像素方向的任务使网络更加关注对象的局部特征,并减轻了背景混乱的影响。这种方法的另一个优点是能够表示被遮挡或位于图像外部的关键点。即使关键点不可见,也可以根据从对象的其他可见部分估计的方向正确定位关键点。
对于像素p,PVNet输出将其与特定对象关联的语义标签和代表从像素p到对象的2D关键点 X k X_k Xk方向的单位矢量 v k ( p ) v_k(p) vk(p),如下定义:
在这里插入图片描述
给定语义标签和单位向量,我们在基于RANSAC的投票方案中生成关键点假设。首先,我们使用语义标签找到目标对象的像素。然后,我们随机选择两个像素,并将它们的向量的交点作为2D 关键点 X k X_k Xk假设点 h k , i h_k,_i hk,i,如此重复N次,得到第k个2D keypoint的N个假设点 { h k , i ∣ i = 1 , 2 , . . . , N } \lbrace h_k,_i|i=1,2,...,N\rbrace {hk,ii=1,2,...,N}。最后,对象的所有像素都为这些假设投票。

每个假设点的投票分数:
在这里插入图片描述

Π \Pi Π为指示函数,θ=0.99。从直觉上讲,较高的投票分数意味着该假设与更多预测的方向一致时,其置信度更高。得出的假设点表征了图像中关键点的空间概率分布。
最后,关键点 X k X_k Xk的均值 µ k µ_k µk和协方差 Σ k Σ_k Σk可通过以下公式估算:
在这里插入图片描述
在这里插入图片描述
关键点选择:
需要根据3D对象模型定义关键点。 许多最近的研究都使用对象的3D边界框的八个角作为关键点。 图3(a)中显示了一个示例。 这些边界角远离图像中的对象像素,距目标像素的距离越长,定位误差越大,因为关键点假设是使用从目标像素开始的矢量生成的。 图3(b)和(c)分别显示了由PVNet生成的边界框角和在对象表面上选择的关键点的假设。 物体表面上的关键点通常在定位方面的变化要小得多。
因此,在我们的方法中,在对象表面上选择关键点。 同时,这些关键点应在对象上散布以使PnP算法更稳定。 考虑到这两个要求,我们使用最远点采样(FPS)算法选择K个关键点。首先,通过添加对象中心来初始化关键点集。 然后,我们反复在对象表面上找到一个距离当前关键点集最远的点,并将其添加到集合中,直到集合的大小达到K。第5.3节中的经验结果表明,该策略产生的效果优于使用边界框角。 我们还使用不同数量的关键点比较结果。 考虑到准确性和效率,我们根据实验结果建议K = 8。
关键点的ground truth在物体的表面,由farthest point sampling(FPS)algorithm得到:首先首先,通过添加对象中心点来初始化关键点集。然后,我们不断地在物体表面找到一个点,这个点离当前的键值集最远,然后将它加入到集合中,直到集合的大小达到K。作者论文中通过实验验证,建议K取8。

实现细节:
假设有C类对象且每个类有K个关键点,PVNet将H×W×3图像作为输入,以全卷积结构对其进行处理,并输出H×W×(K×2×C)个张量表示单位向量和代表类概率的H×W×(C + 1)个张量。我们使用经过预训练的ResNet-18作为骨干网络,并对它进行了三个修订。首先,当网络的特征图大小为H / 8×W / 8时,我们不再通过丢弃后续的池化层来对特征图进行下采样。其次,为了使感受野保持不变,随后的卷积被合适的膨胀卷积代替。第三,将原始ResNet-18中的全连接层替换为卷积层。然后,我们反复在特征图上执行跳连接,卷积和上采样,直到其大小达到H×W,如图2(b)所示。通过在最终特征图上应用1×1卷积,我们可以获得单位向量和类概率。我们使用CUDA实现假设点生成,逐像素投票和密度估计。用于初始化姿势的EPnP在OpenCV中实现。

执行细节:
1.关键点的选择:使用FPS(farhest point sampling)选出八点作为估计匹配的关键点。具体为先随机选取初始化一个点集,在对象表面重复寻找一个点使其离当前点集最远,然后将其加入这个点集,当这些不同点集的数量达到一定时,结束此过程。此方法比找对象包围框的八个点效果更好。
2.网络中使用的优化器:Adam
3.单独对象模型网络都是使用resnet_18网络一对一训练,所有模型是使用resnet_50训练
4.crossEntroyloss——交叉熵损失,用于计算分类问题,本论文在训练语义标签时用到

2.2 不确定性驱动的PnP算法

作者的创新之处在于考虑了keypoint的不确定性,即将keypoint的分布融入了PnP算法中,进行最优化求解。
给定每个对象的2D关键点位置,可以使用现成的PnP解算器(例如,许多先前方法中使用的EPnP)解决PnP问题,从而计算其6D姿态。 但是,大多数人忽略了以下事实:不同的关键点可能具有不同的置信度和不确定性模式,这在解决PnP问题时应予以考虑。
如第3.1节所述,我们的基于投票的方法会估算每个关键点的空间概率分布。 给定估计点的平均至 µ k µ_k µk和协方差矩阵 Σ k Σ_k Σk,我们通过最小化Mahalanobis距离来计算6D姿态(R,t)。
目标函数为Mahalanobis distance马氏距离表示点与一个分布之间的距离):
在这里插入图片描述
X k X_k Xk为3D keypoint, X k X_k Xk X k ~ \tilde{X_k} Xk~的2D投影, π \pi π为投影函数。(R,t)的初始化由基于四个最小协方差的关键点的EPnP算法提供。最优化解法为列文伯格-马夸尔特算法(同时具有梯度法和牛顿法的优点)。最终求得符合全局最优的物体姿态(R,t)。

三.训练函数

在这里插入图片描述
smooth L1 loss损失函数
其中w代表PVNet的参数, v k ~ \tilde{v_k} vk~是预测向量, v k v_k vk是真实单位向量,而 ∆ v k ∣ x ∆v_k| _x vkx ∆ v k ∣ y ∆v_k| _y vky分别代表 ∆ v k ∆v_k vk的两个元素。 为了训练语义标签,采用softmax交叉熵损失。 请注意,在测试过程中,我们不需要预测的矢量为单位向量,因为后续处理仅使用矢量的方向。

四.评估

Linemod数据集:
在这里插入图片描述
效果图:
在这里插入图片描述
在这里插入图片描述
定量比较:
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
clean-pvnet是一个用于6DoF姿态估计的代码库,它是基于“PVNet: Pixel-wise Voting Network for 6DoF Pose Estimation论文开发的。如果您想要下载clean-pvnet代码并配置环境,可以按照以下步骤进行操作: 1. 使用命令`git clone https://github.com/zju3dv/clean-pvnet.git`下载代码。 2. 配置环境,可以使用以下命令: ``` conda create -n pvnet python=3.7 conda activate pvnet conda install pytorch==1.5.0 torchvision==0.6.0 cudatoolkit=10.2 -c pytorch pip install Cython==0.28.2 sudo apt-get install libglfw3-dev libglfw3 pip install -r requirements.txt ``` 这些命令将创建一个名为`pvnet`的虚拟环境,并安装所需的依赖项。 3. 当您运行`run.py`时,输出日志将显示运行的进度和结果。根据提供的日志,运行看起来是成功的,并输出了一些信息。 4. 对于权重文件,根据提供的信息,训练好的权重文件可能存储在代码库的某个目录中。 请注意,这只是对clean-pvnet的简要介绍,如果您需要更多详细信息或有其他相关问题,请参考论文和代码库中的文档。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [【复现笔记】clean-pvnet复现](https://blog.csdn.net/weixin_54470372/article/details/128293400)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值