随缘更新

一篇被CVPR2022接收,有关6D位姿估计的文章

论文链接:Coupled Iterative Refinement for 6D Multi-Object Pose Estimation

论文代码:Github


文章目录

  • 主要内容和贡献
  • 相关工作
    • 传统方法
    • 基于学习的方法
    • iterative refinement
  • 模型架构
    • 预备知识
    • Coupled Iterative Refinement
      • Correlation Lookup
      • GRU Update
      • Bidirectional Depth-Augmented PnP (BD-PnP)
      • Inner and Outer Update Loops
    • RGB图片的处理
  • 实验部分

主要内容和贡献

本文提出了一个能够利用几何信息的端到端的可微分结构 (differentiable architecture),用一种紧密耦合的方式迭代地对pose和correspondence共同进行refine,动态地移除外点 (outliers),进而提高预测准确率。

本文提出的结构命名为 BD-PnP,即 Bidirectional Depth-Augmented Perspective-N-Point

“We use a novel differentiable layer to perform pose refinement by solving an optimization problem.”

相关工作

传统方法

  • 早期的6D位姿估计利用具备不变性的局部特征得到2D图片像素点和3D模型点之间的对应 (correspondence),然后在对应点集的基础上利用 PnP 估计6D的物体位姿。注意这里所说的点集其实就是一部分匹配点,即2D像素点和3D模型点的匹配,所以一张图片只会选出一小部分能够匹配的点进行位姿估计,即 sparse matches

  • 利用2D-3D响应得到位姿的方法主要有 closed formiterative algorithm 两种,一般使用 closed form solution 进行初始化,然后在接下来的过程中使用 iterative refinement。

  • 由于外点 (outliers) 的存在,常用RANSAC用于移除外点,增加鲁棒性。

缺陷:传统方法使用的局部特征非常依赖纹理,如果纹理不清晰不明显,则产生的correspondence不足以支撑产生准确率高的位姿。

改进:本文也是在2D图像和3D模型之间产生响应,但是不同于传统方法的sparse matches,本文产生的是dense correspondence field,即对于一张输入图片,利用3D模型渲染多个视图,输入图片和每个视图都产生像素级别的置信权重,进而保证足够数量的匹配点。

基于学习的方法

有两种方法:一、直接回归旋转和平移参数;二、通过检测和回归关键点 (keypoints) 生成2D-3D对应;

我们主要聚焦第二种方法,如何回归出关键点:

  • 一种方法是回归关键点的在位姿对应的坐标系下的三维坐标,代表方法有Pixel2Pose、BB8等。通过回归object coordinates,就能产生一个密集的2D-3D correspondence的集合,然后用PnP得到位姿,值得一提的是,BPNP 把 PnP solvers 实现成了一个可微分的网络层,让网络可以实现端到端而不用单独做PnP,本文的思路也和BPNP相似。
  • 另一种方法就是回归出三维点的编码,比如我在之前的文章中写到的这种 【论文阅读】ZebraPose: Coarse to Fine Surface Encoding for 6DoF Object Pose Estimation,这里不做过多讨论。

缺陷:correspondence的产生和PnP solvers的运作是两个独立的过程,产生的correspondence在后一个过程中是固定不变的,如果前者结果不好,那么PnP的结果自然就不好。

改进:本文以光流的方式直接回归出2D-3D correspondence,并且在迭代的过程中同时对correspondence和pose进行refine,也就是说correspondence不再是固定的了,而是可以进行refine更新的。

iterative refinement

single-shot setting并不能产生高准确率的位姿,所以iterative refinement广泛用于提高位姿估计的准确性。这里主要提到两种代表性的方法:

  • DeepIM & CosyPose,DeepIM是一种迭代的“渲染-比较”方法,在每轮迭代中,用当前预测结果渲染3D模型,然后用渲染图和真实图回归一个pose update,用于更新当前的位姿以更好地进行对齐。CosyPose在DeepIM的思想上使用了更好的网络结构和旋转参数化。
  • RAFT-3D,在场景流估计的上下文 (context of scene flow estimation) 中进行iterative refinement,在光流refinement和拟合刚体变换之间迭代。RAFT-3D applies iterative refinement in the context of scene flow estimation, they iterate between optical flow refinement and fitting rigid body transformations.

本文提出的方法和上述两种方法都有相似之处。

和DeepIM一样都包含outer loop,即用当前的预测位姿重新渲染三维模型然后对预测的位姿进行更新,但是更新所用的pose update并不是和DeepIM一样直接回归得到的,而是用本文提出的BD-PnP产生的,前文也提到了,BD-PnP能利用几何约束,这是相较于DeepIM直接回归方法进行了改良的地方。

和RAFT-3D的iterative refinement策略是相同的,但是预测刚体变换的方法是用本文提出的BD-PnP layer,而不是RAFT-3D中使用的Dense-SE3。

模型架构

输入:一张RGB-D图片

输出:一组物体的位姿估计

三个阶段:1和2沿用了CosyPose的方法,本文主要聚焦3

  1. object detection
  2. pose initialization
  3. pose refinement,用subpixel reprojection error(子像素重投影误差)把初始的coarse位姿转变成refined位姿

预备知识

  • 对于给定的有纹理的三维模型,可以用PyTorch3D和相机的内参矩阵 KiK_iKi​ 、外参矩阵 GiG_iGi​ 渲染不同视角下的图像和深度图

    Gi=(Rt01)G_{i}=\left(\begin{array}{ll} R & t \\ 0 & 1 \end{array}\right)Gi​=(R0​t1​), Ki=(fx0cx0fycy001)K_{i}=\left(\begin{array}{ccc} f_{x} & 0 & c_{x} \\ 0 & f_{y} & c_{y} \\ 0 & 0 & 1 \end{array}\right)Ki​=⎝⎛​fx​00​0fy​0​cx​cy​1​⎠⎞​

    GiG_iGi​ 是物体在相机坐标系下的位姿,则对于一张输入图片来说,G0G_0G0​ 是输入图片的位姿,{G1,⋯,GN}\{G_1,\cdots,G_N\}{G1​,⋯,GN​} 是N张渲染图片的位姿,定义两种方法用来索引二者点之间的映射关系:

    ① xi→0′=Π(G0Gi−1Π−1(xi))\mathbf{x}_{i \rightarrow 0}^{\prime}=\Pi\left(\mathbf{G}_{0} \mathbf{G}_{i}^{-1} \Pi^{-1}\left(\mathbf{x}_{i}\right)\right)xi→0′​=Π(G0​Gi−1​Π−1(xi​)) 表示渲染图片到输入图片的点的映射。

    ② x0→i′=Π(GiG0−1Π−1(x0))\mathbf{x}_{0 \rightarrow i}^{\prime}=\Pi\left(\mathbf{G}_{i} \mathbf{G}_{0}^{-1} \Pi^{-1}\left(\mathbf{x}_{0}\right)\right)x0→i′​=Π(Gi​G0−1​Π−1(x0​)) 表示从输入图片到渲染图片的点的映射。

    其中 Π\PiΠ 和 Π−1\Pi^{-1}Π−1 是 depth-augmented pinhole projection functions (深度增强的针孔投影函数),不仅能转换图片上点的坐标,还能转换帧之间的逆深度(深度的倒数)

    Π(X)=[X/ZY/Z1/Z]Π−1(x)=[x/dy/d1/d]x=[xyd]\Pi(\mathbf{X})=\left[\begin{array}{l} X / Z \\ Y / Z \\ 1 / Z \end{array}\right] \quad \Pi^{-1}(\mathbf{x})=\left[\begin{array}{l} x / d \\ y / d \\ 1 / d \end{array}\right] \quad \mathbf{x}=\left[\begin{array}{l} x \\ y \\ d \end{array}\right]Π(X)=⎣⎡​X/ZY/Z1/Z​⎦⎤​Π−1(x)=⎣⎡​x/dy/d1/d​⎦⎤​x=⎣⎡​xyd​⎦⎤​

    注意,上面的像素坐标要用内参矩阵 KiK_iKi​ 进行规范化。

    我们最终的目标就是要不断优化G0(输入图片的位姿)使得xi-0正确,也就是使渲染图片到输入图片的点的映射是正确的

  • 目标检测:为了检测到输入图片中的物体,用bounding box截取出来。

  • 初始化:并行处理每个候选物体,得到 G0(0)G_0^{(0)}G0(0)​

  • 特征抽取和相关性计算:

    对于给定的初始位姿,在位姿估计的基础上渲染几个视图,然后在仰角、俯角、偏航角上加上或减去22.5度,总共得到7个渲染视图。

    对每个渲染图片,本文的网络结构都得到输入的图片(经过裁剪后)和渲染图片之间的双向dense correspondence。

    渲染图片的位姿是已知的,输入图片的物体位姿是要估计的。

    所有图片都抽取一个 H4×W4\frac{H}{4}\times \frac{W}{4}4H​×4W​​ 的特征图,对每一个“image-render”对都建立两个correlation volume,一个是从输入图片到渲染图片的,一个是从渲染图片到输入图片的。correlation volume的计算方式是对所有特征向量对做点积运算得到的,然后像RAFT一样把correlation volume的最后两个维度做池化,产生一个4层的相关性金字塔(correlation pyramids),这个金字塔包含了匹配所用的correlation features。

Coupled Iterative Refinement

用下图的结构生成一个姿态估计的更新序列

左下角部分的输入和 Π\PiΠ 主要包含下面两个部分:

  • G={G0,G1,⋯,G7}\mathbf{G}=\{G_0,G_1,\cdots,G_7\}G={G0​,G1​,⋯,G7​} 是所有位姿的集合,其中 G1G_1G1​ 到 G7G_7G7​ 是渲染图片的位姿,是固定的,G0G_0G0​ 是输入图片的位姿,是可变的。

  • 计算 G0G_0G0​ 到 Gi(i=1,2,⋯,7)G_i(i=1,2,\cdots,7)Gi​(i=1,2,⋯,7) 的dense correspondence field x0→ix_{0\to i}x0→i​
    计算 GiG_iGi​ 到 G0G_0G0​ 的dense correspondence field xi→0x_{i\to 0}xi→0​

    这部分体现的是模型的bidirection

    xi→0x_{i\to 0}xi→0​的维度是H×W×3H\times W\times 3H×W×3 ,表示渲染图片 iii 中的每个像素在输入图片的2D坐标,还有逆深度信息。

    同时得到corresponding correlation pyramid

Correlation Lookup

产生 si→0\mathbf{s}_{i\to 0}si→0​ 和 s0→i\mathbf{s}_{0\to i}s0→i​

  • 用 xi→0x_{i\to 0}xi→0​ 从相关性金字塔中索引(RAFT的方法),correlation lookup对每个点都在半径为 rrr 的范围内对相关金字塔的每一层进行索引,得到 LLL 个correlation feature,最终得到一个correlation feature的映射关系 si→0∈RH×W×L\mathbf{s}_{i\to 0}\in \mathbb{R}^{H\times W\times L}si→0​∈RH×W×L
  • 同理,对 x0→ix_{0\to i}x0→i​ 得到 s0→i∈RH×W×L\mathbf{s}_{0\to i}\in \mathbb{R}^{H\times W\times L}s0→i​∈RH×W×L

GRU Update

产生 hi→0,h0→ih_{i\to 0},h_{0\to i}hi→0​,h0→i​、 ri→0,wi→0\mathbf{r}_{i\to 0},w_{i\to 0}ri→0​,wi→0​ 和 r0→i,w0→i\mathbf{r}_{0\to i},w_{0\to i}r0→i​,w0→i​

结构图的GRU是个 3×33\times 33×3 的convolution GRU,对每个"image-render"对来说,GRU的输入有四个:(以 i→0i\to 0i→0 的方向为例,0→i0\to i0→i 的同理)

  • correlation feature si→0\mathbf{s}_{i\to 0}si→0​
  • hidden state hi→0h_{i\to 0}hi→0​
  • additional context(在论文的appendix中提到,是个不变的feature)
  • depth features(在论文的appendix中提到,是变化的)

产生三个输出:

  • 新的hidden state hi→0h_{i\to 0}hi→0​
  • 修正值 (revision) ri→0\mathbf{r}_{i\to 0}ri→0​ ,维度为 H×W×3H\times W\times 3H×W×3,3是指在2D坐标和逆深度的修正值
  • 置信度(权重)wi→0w_{i\to 0}wi→0​ ,维度是 H×WH\times WH×W,代表每个位置修正值的权重

论文中解释了深度修正值的必要性,是补偿输入传感器深度可能有噪声和相应点可能被遮挡的问题。

同时论文中也说明了在两个方向的计算过程中,GRU的权重是共享的。

Bidirectional Depth-Augmented PnP (BD-PnP)

这部分是以修正值 r 和置信度 w 来产生一个相机位姿的更新值 ΔG0\Delta G_0ΔG0​ ,分为以下几个步骤:

  1. 用修正值更新correspondence fields
    x’i→0=xi→0+ri→0\mathbf{x}’_{i\to 0}=\mathbf{x}_{i\to 0}+\mathbf{r}_{i\to 0}x’i→0​=xi→0​+ri→0​
    x’0→i=x0→i+r0→i\mathbf{x}’_{0\to i}=\mathbf{x}_{0\to i}+\mathbf{r}_{0\to i}x’0→i​=x0→i​+r0→i​

  2. 定义目标函数

    E(G0)=∑i=1N∥xi→0′−Π(G0Gi−1Π−1(xi)∥Σi→02+∑i=1N∥x0→i′−Π(GiG0−1Π−1(x0)∥Σ0→i2\mathbf{E}\left(\mathbf{G}_{0}\right)= \sum_{i=1}^{N} \| \mathbf{x}_{i \rightarrow 0}^{\prime}-\Pi\left(\mathbf{G}_{0} \mathbf{G}_{i}^{-1} \Pi^{-1}\left(\mathbf{x}_{i}\right) \|_{\Sigma_{i \rightarrow 0}}^{2}+\right. \sum_{i=1}^{N} \| \mathbf{x}_{0 \rightarrow i}^{\prime}-\Pi\left(\mathbf{G}_{i} \mathbf{G}_{0}^{-1} \Pi^{-1}\left(\mathbf{x}_{0}\right) \|_{\Sigma_{0 \rightarrow i}}^{2}\right.E(G0​)=∑i=1N​∥xi→0′​−Π(G0​Gi−1​Π−1(xi​)∥Σi→0​2​+∑i=1N​∥x0→i′​−Π(Gi​G0−1​Π−1(x0​)∥Σ0→i​2​

    最小化这个重投影坐标和修正后的correspondence的距离,距离函数∣∣⋅∣∣∑||\cdot||_{\sum}∣∣⋅∣∣∑​是马氏距离(Mahalanobis distance),∑i→0\sum_{i\to 0}∑i→0​ 是 wi→0w_{i\to 0}wi→0​ 的对角线元素。

    马氏距离衡量了一个点到一个分布的距离

    这个目标函数的意义是得到一个相机坐标 G0G_0G0​ ,使重投影的点能够匹配修正后的correspondence xij′\mathbf{x}'_{ij}xij′​

  3. Gauss-Netwon updates

    每次迭代都会产生一个 δξ∈SE(3)\delta \xi\in SE(3)δξ∈SE(3) ,然后用当前的位姿叠加这个修正值得到更新一次后的位姿 G0(t+1)=exp⁡(δξ)⋅G0(t)G_0^{(t+1)}=\exp(\delta\xi)\cdot G_0^{(t)}G0(t+1)​=exp(δξ)⋅G0(t)​

    在训练时迭代3次,在推理时迭代10次(这里我其实没懂到底是哪个步骤)

第二步最小化目标函数很像PnP,但是PnP只用了单个的2D-3D对应关系,而本文的方法使用了两个(正向和反向),除此以外,本文的方法包含了逆深度的重投影误差,这在PnP中是不具备的。

Inner and Outer Update Loops

  • 给定一个渲染图片的集合,跑40轮update,然后用更新后的位姿估计重新渲染新的图片得到一个集合。
  • 用得到的新集合重复上一个步骤

第一步就是inner loop,第二步就是outer loop。也就是用更好的位姿估计重新渲染7个视角的图片,然后再更新位姿估计,如此循环。

增加inner loop和outer loop的次数,就能达到用速度换准确度 (trade speed for accuracy) 的目的

RGB图片的处理

实验部分

【论文阅读】Coupled Iterative Refinement for 6D Multi-Object Pose Estimation相关推荐

  1. [论文阅读:姿态识别Transformer] POET: End-to-End Trainable Multi-Instance Pose Estimation with Transformers

    [论文阅读:姿态识别&Transformer] 2103 POET: End-to-End Trainable Multi-Instance Pose Estimation with Tran ...

  2. 【论文阅读笔记】Occlusion-Aware Siamese Network for Human Pose Estimation

    论文地址:Occlusion-Aware Siamese Network for Human Pose Estimation 论文总结   本文的网络名,作者命名为OASNet.本文的出发点就如名字所 ...

  3. 论文笔记,物体六自由度位姿估计,DenseFusion: 6D Object Pose Estimation by Iterative Dense Fusion

    论文笔记,物体六自由度位姿估计,DenseFusion: 6D Object Pose Estimation by Iterative Dense Fusion 链接 摘要 1,引言 2,模型 2.1 ...

  4. 论文笔记(三):PoseCNN: A Convolutional Neural Network for 6D Object Pose Estimation in Cluttered Scenes

    PoseCNN: A Convolutional Neural Network for 6D Object Pose Estimation in Cluttered Scenes 文章概括 摘要 1. ...

  5. 【论文阅读】Deep Compositional Captioning: Describing Novel Object Categories without Paired Training Data

    [论文阅读]Deep Compositional Captioning: Describing Novel Object Categories without Paired Training Data ...

  6. 笔记:PoseCNN:A Convolutional Neural Network for 6D Object Pose Estimation in Cluttered Scenes

    PoseCNN: A Convolutional Neural Network for 6D Object Pose Estimation in Cluttered Scenes (Robotics: ...

  7. 2020.10.03读 Robust 6D Object Pose Estimation by Learning RGB_D Features

    Robust 6D Object Pose Estimation by Learning RGB_D Features 1. 背景信息 2.方法 2.1旋转 2.2平移 3. 实验 3.1评估指标 3 ...

  8. Learning latent geometric consistency for 6D object pose estimation in heavily cluttered scenes

    Learning latent geometric consistency for 6D object pose estimation in heavily cluttered scenes 在杂乱无 ...

  9. PoseCNN(A Convolutional Neural Network for 6D Object Pose Estimation in Cluttered Scenes)复现记录

    PoseCNN: A Cbjonvolutional Neural Network for 6D Object Pose Estimation in Cluttered Scenes 挖个坑,希望研究 ...

  10. Single-Stage 6D Object Pose Estimation——6D姿态估计

    Single-Stage 6D Object Pose Estimation 作者:Yinlin Hu,Pascal Fua, Wei Wang, Mathieu Salzmann 实验室:CVLab ...

最新文章

  1. 只有这种AI芯片才能拯救人工智能?
  2. Android每周一个学习计划——RxJava2 0的学习使用
  3. Android studio自定义变量
  4. 我们为什么要尝试前后端分离
  5. iOS教程:Core Data数据持久性存储基础教程
  6. 如何看待2018年小米雷军98.18亿年薪?
  7. RESTful开发风格
  8. BZOJ 3729: Gty的游戏 [伪ETT 博弈论]【学习笔记】
  9. 谈谈对margin的理解
  10. mybatis日志在线生成sql(日志参数填充,sql日志格式化)
  11. 【Excel】五种方法添加打勾方框(其他符号差不多)
  12. 数据库之SQL更新语句中update set from用法
  13. 数据传输速率与带宽之间的关系
  14. 笔记本计算机名称PC2019,2019值得推荐的13寸笔记本电脑汇总
  15. 计算机等级考试二级ppt,高校计算机等级考试二级C.ppt
  16. LOCAL_PRIVILEGED_MODULE 详解(1)
  17. 简约大气昼夜wordpress免费导航主题
  18. python中的range()函数
  19. Dashboard使用自定义证书
  20. 应用长时间置于后台后广播失效_无奈!终于知道为什么关闭了后台应用手机还是卡了!...

热门文章

  1. 微信红包雨怎么抢_微信里的红包雨怎么下?微信里的红包雨如何设置?
  2. 牛顿二项式定理(广义二项式定理)
  3. 数学建模(4):动态规划
  4. 小钛掐指一算,今年的尖货市场不简单 | 活动预告
  5. 平年和闰年c语言程序,C语言平年,平年闰年问题
  6. openstack controller ha测试环境搭建记录(二)——配置corosync和pacemaker
  7. 测试用例---场景法和错误推测法
  8. 全国计算机等级考试二级教程——Python语言程序设计(2018年版)习题代码:第2章
  9. css3 标点符号在首位,CSS 让标点符号不出现在行首
  10. arduino u8g2 中文字 utf-8 死活不显示 问题 的解决