首页 > 其他分享 >Coupled Iterative Refinement for 6D Multi-Object Pose Estimation论文精读

Coupled Iterative Refinement for 6D Multi-Object Pose Estimation论文精读

时间:2022-10-09 11:47:57浏览次数:70  
标签:Multi 精读 mathbf Object times 作者 right 光流 left

目录

Coupled Iterative Refinement for 6D Multi-Object Pose Estimation论文精读

这是2022年发表在CVPR上一篇关于位姿估计的一篇文章。在正式介绍这篇论文之前,我们需要了解一下RAFT,因为本篇论文很多地方都受到了RAFT的影响。

image-20221007203907511

RAFT Introduction

RAFT: Recurrent All-Pairs Field Transforms for Optical Flow;观其名便知道这是一篇关于光流估计的论文。

image-20221007204114088

模型介绍

为了方便理解和阅读,我写了两个版本:

  • 先是一个网络\(Net_1\)提取两张输入\(I_1,I_2\)的特征(左上角),还有另一个网络\(Net_2\)再提取一次\(I_1\)的特征(左下角),然后通过一个correlation layer接收\(Net_1\)的输出并建立两张图片的相似度向量。最后作者使用了自然语言处理中GRU的思想,把相似度向量每一次迭代预测出的光流,以及\(Net_2\)的输出三者作为输入去迭代着更新光流。

  • RAFT由三部分组成:(1)一个feature encoder提取两张输入图片\(I_1,I_2\)在每个像素点上的特征。这里我们假设\(I_1,I_2\)的尺寸是\(H \times W\),那么经过feature encoder之后得到的特征维度就是\(H \times W \times D\);此外还有一个 context encoder提取\(I_1\)的特征,也就是图片的左下角。(2)一个 correlation layer负责把\(I_1,I_2\)的特征向量通过点乘的方式连接起来,那么最终输出的是一个\(H \times W \times H \times W\)的向量,此向量表示\(I_1\)每一个像素点与所有\(I_2\)像素点的相关度。然后作者也考虑到这样的表示可能比较稀疏,因此在这个输出之后做了四层的池化,并将每一层池化的输出连接起来做成了一个具有多尺度特征的相似性变量。(3)一个update operator,通过使用一个look up方法(查看 4D Correlation Voulumes的值)迭代着去更新光流。当然第三点需要下面的详细介绍。

将模型拆解一下:

  1. 两次特征抽取

image-20221007212732960

这个比较好理解,就不多说了。

  1. Correlation Layer

    image-20221007212830981

这里我们得到了\(I_1\)对\(I_2\)上的多尺度4D Correlation Voulumes,那么这个值是怎么得到的,又代表什么意义呢?前面我们提到过,我们得到\(H \times W \times H \times W\)的向量之后,作者觉得这样比较稀疏,因为\(I_1\)不可能与\(I_2\)所有的像素点相关,所以作者又将这个向量进行了四层池化:

image-20221007213358363

得到了如图所示的3层向量(第四层没画出来,也就是\(H \times W \times {H\over8} \times {W\over8}\)),将他们叠在一起,就构成了一个多尺度的相似性向量的金字塔。

image-20221008092055230

image-20221008093442498
  1. Look up

image-20221007213836428

在这个L里,作者做了一件有趣的事情,我们知道,光流\((f^1 , f^2 )\)表达了这样一件事情, 它可以把\(I_1\)上的每一个像素\(x(u,v)\)通过$ x'=(u+ f^ {1} (u),v+ f^ {2} (v)) $与 \(I_2\)上对应像素\(x'\)建立映射。然后作者在\(x'\)附近构造了一个网格:

\[\mathcal{N}\left(\mathbf{x}^{\prime}\right)_r=\left\{\mathbf{x}^{\prime}+\mathbf{d} \mathbf{x} \mid \mathbf{d} \mathbf{x} \in \mathbb{Z}^2,\|\mathbf{d} \mathbf{x}\|_1 \leq r\right\} \]

\(r\)超参数是超参数,有点类似于圆的半径,\(d_x\)是整数,通过这个公式把\(x'\)附近的值拿到,同时这个操作会在每一层的金字塔上取值,最后将这些得到的值串联成一个向量。这个向量也就是 Look up的输出。总结一下就是光流建立了\(I_1\)的像素点到\(I_2\)像素点的映射,然后使用对应的\(I_2\)点的坐标,在对应的相似性向量的金字塔上采样得到一个输出向量。那么大胆猜测一下,对于快速移动的物体,\(r\)设置的偏大一些,效果应该更好;对于移动较慢的无题,\(r\)设置的应该偏小一些。当然这个也是Coupled Iterative Refinement for 6D Multi-Object Pose Estimation,标题中论文沿用的一个方法。

  1. update operator

    image-20221008093905063

这个类似于GRU模型的结构,把context features以及Look up输出的向量(通过flow和correlation pyraid得到)作为输入\(x_t\),以及hidden state作为 \(h_{t-1}\)作为输入,然后输出\(\Delta \mathrm{f}\)和更新后的的hidden state\(h_t\)。GRU的内部结构是这样定义的:

\[\begin{aligned} z_t &=\sigma\left(\operatorname{Conv}_{3 \times 3}\left(\left[h_{t-1}, x_t\right], W_z\right)\right) \\ r_t &=\sigma\left(\operatorname{Conv}_{3 \times 3}\left(\left[h_{t-1}, x_t\right], W_r\right)\right) \\ \tilde{h}_t &=\tanh \left(\operatorname{Conv}_{3 \times 3}\left(\left[r_t \odot h_{t-1}, x_t\right], W_h\right)\right) \\ h_t &=\left(1-z_t\right) \odot h_{t-1}+z_t \odot \tilde{h}_t \end{aligned} \]

  1. loss function

\[\mathcal{L}=\sum_{i=1}^N \gamma^{N-i}\left\|\mathbf{f}_{g t}-\mathbf{f}_i\right\|_1 \]

作者使用的并不只是最后的输出,而是update operator每一次迭代的光流输出\(\left\{\mathbf{f}_1, \ldots, \mathbf{f}_N\right\}\),去跟\(f_{gt}\)求loss。

\(gamma=0.9\)

最后再简单看一组对比结果:

image-20221008095139743

至此我们介绍完了RAFT,更多细节感兴趣的读者可以去查阅一下原论文,现在我们正式开始介绍本篇博文的核心Coupled Iterative Refinement for 6D Multi-Object Pose Estimation

论文介绍

Abstract

提出了一个6D multi-object pose的任务:给予一些已知的3D模型的RGB或者RGBD输入图片,去检测,估计每一个物体的6D位姿。然后作者提出了一个方法端到端地去解决这个问题,并且使用了几何信息。方法是去refines both pose and correspondence in a tightly coupled manner。然后作者又通过他提出的BD-PnP方法把位姿估计变成了一个最优化问题。

Introduction

作者介绍了传统的6D位姿估计的一些方法:

(1)通过特征匹配的方法去建立2D-3D的对应关系。然后通过PNP求解6D位姿,这个恰好是我毕设的做的事情。但是这种方法的缺点是无法处理无纹理的物体,遮挡,对称物体,还有关照变化等情况。

(2)最近这些问题通过深度学习的方法得到了一定程度的解决,但是这些方法都是直接建立输入和输出的映射,并没有充分使用像素是3D object的投影这个事实,这句话我其实看得有点莫名其妙,当然作者的确使用到了一些几何知识,我们最后直接看看本文的方法和直接建立输入和输出的映射的对比吧。

(3)一些方法也尝试了使用深度学习和投影几何结合,比如有一种是通过学习的方法建立2D-3D的映射,然后再使用PNP求解;是另一种方法是以隐含层或陈述层的形式施加几何知识,这些工作表明,PnP可以作为一个模块化组件在端到端可微体系结构中实现。然而,这两种方法都是"一次性"的,因为对应关系是预测一次,然后通过一个PnP求解器(可微或不可微)来解决;这使得方法对异常值和对应关系中的错误很敏感。(翻译)

然后作者提出了一个模型结构,使用了几何信息,并且通过迭代的方式去共同更新 pose and correspondence;

作者提到了他们的工作建立在RAFT的基础上,作者的基础思想是估计输入图片与一系列的渲染图片的光流,然后建立2D-3D的对应关系去估计位姿(还记得前面提到的光流的作用吗),作者同样使用了GRU的思想去迭代着更新光流和位姿,并且这二者是紧密连接的。

为了更新位姿,作者然后使用了Bidirectional Depth-Augmented PnP (BD-PnP),这层把通过使用 Gauss-Newton update 来更新pose以最小化投影误差。

然后有意思的地方来了,其实看到Bidirectional这个词,我就意识到了一些事情,在自然语言处理中,以及使用到一些具有时序信息的数据(视频,语音等)把数据正向输入模型的同时,通常会反向再输入一次,因为有前就有后,有后就有前,而且这样做,模型的性能一般都会获得提升。

言归正传,作者是怎么体现Bidirectional的呢?前面我们提到,作者估计了输入图片和一系列渲染图片的光流,然后这个光流可以是双向的,也就是input->render,render->input。具体是怎么用的,且待稍后揭晓。之后,作者还使用了depth-augmented。不过由于我的几何基础比较差,不太能看懂,直接放原文吧。

Second, our layer is “depth-augmented”: the optimization objective also includes the reprojection error on inverse depth, which we show to be important for improving accuracy.

这里就是介绍了其他人的一些方法,就不过多展开了,感兴趣的读者可以去阅读原论文。

Approach

作者先是假定了,RGB-D输入,然后说明方法分为三部分:(1)object detection, (2) pose initialization, and (3) pose refinement.前两部分作者沿用的方法是CosyPose的方法,由于本文重点书写的内容是第三步,前两步我就不过多展开了,感兴趣的读者可以看一下CopyPose;或者假定我们检测到了输入图片中的物体,并且给予了初始位姿,看看作者是怎么去做 refinement的。

Preliminaries

给予了3D object还有相机内外参数,可以生成一系列的渲染图片还有深度图。

\[\mathbf{G}_i=\left(\begin{array}{cc} \mathbf{R} & \mathbf{t} \\ \mathbf{0} & 1 \end{array}\right) \]

\[\mathbf{K}_i=\left(\begin{array}{ccc} f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{array}\right) \]

我们让\(G_0\)作为object pose,也就是后期要进行迭代优化的对象。\(\left\{\mathbf{G}_1, \ldots, \mathbf{G}_N\right\}\)

作为系列渲染图片的pose。那么可以建立这两者之间的点的映射关系。就是\(G_0\)渲染图片的像素点到\(\left\{\mathbf{G}_1, \ldots, \mathbf{G}_N\right\}\)渲染图片的像素点可以通过一些计算建立映射关系,(嗯,的确是可以的,但是需要一定的几何知识才好理解),反之亦然。

  • \(\left\{\mathbf{G}_1, \ldots, \mathbf{G}_N\right\}\) image points to \(G_0\) image points

\[\mathbf{x}_{i \rightarrow 0}^{\prime}=\Pi\left(\mathbf{G}_0 \mathbf{G}_i^{-1} \Pi^{-1}\left(\mathbf{x}_i\right)\right) \tag 1 \]

  • \(G_0\) image points to \(\left\{\mathbf{G}_1, \ldots, \mathbf{G}_N\right\}\) image points

\[\mathbf{x}_{0 \rightarrow i}^{\prime}=\Pi\left(\mathbf{G}_i \mathbf{G}_0^{-1} \Pi^{-1}\left(\mathbf{x}_0\right)\right) \tag 2 \]

我们的目标就是求解\(G_0\),使得方程(2)能够正确的建立起input image crop和renders的像素点的映射关系。

更多定义的细节:

image-20221008214142850

总之,作者通过几何的方法,使用公式(1),(2)建立了\(G_0\)渲染图片的像素点\(\left\{\mathbf{G}_1, \ldots, \mathbf{G}_N\right\}\)渲染图片的像素点互相的映射关系,并且是Bidirectional。

然后就是\(G_0\)作为后续不断地Refine的基础,它的初始化自然也是十分重要,作者是基于CopyPose的方法做的。

image-20221008215039619

Feature Extraction and Correlation

得到了初始位姿之后,作者在这个位姿的基础上做了一些pitch, yaw or roll方向上旋转,最后得到了7个render views。然后作者采用了RAFT的方法,建立了每个render和输入图片image cropcorrelation pyramids,然后注意,这个是双向的。correlation pyramids在前面RAFT介绍过,遗忘的读者可以回顾一下。

Coupled Iterative Refinement

image-20221008221657041

作者先是使用公式(1)(2)分别求解renders到\(G_0\)以及\(G_0\)到renders的\(\mathbf{x}_{i \rightarrow 0}\),\(\mathbf{x}_{0 \rightarrow i}\)的映射,其实我感觉\(\mathbf{x}\)像是是光流,因为建立了图像间点的映射,但又不完全是光流,因为\(\mathbf{x}\)还与inverse depth有关。但总之是像素点之间的映射

image-20221008233206026
这里的inverse depth我不太明白具体的作用,以后遇到的时候再来回顾吧

之后又通过这个映射Correlation Features输入到 Look up方法,得到一个correlation features \(\mathbf{s}_{i \rightarrow 0} \in \mathbb{R}^{H \times W \times L}\).最后作者将这个向量 + 上一时刻的 hidden state 以及 additional context and depth features输入到GRU,得到下一时刻的 hidden state + r(represents a new flow estimate) + w(a dense map of confidence in the predicted revisions,似乎是r的一个置信度)。

Bidirectional Depth-Augmented PnP (BD-PnP)

BDPnP layer 把上面预测出的校正值 \(\mathrm{r}\) 和confidences \(w\) 转换成 a camera pose update \(\Delta \mathbf{G}_0\).

但是这一节我绞尽脑汁也没看懂:

先把原文放上,然后说一下我的问题,感兴趣的读者欢迎留言讨论:

image-20221009101822482

image-20221009101854430

结合公式(6)(7),我们知道,\(x\)是renders Pose 到\(G_0\)以及\(G_0\)到renders Pose两个方向分别求出的,\(G_0\)是一个估计值,那么公式7的目的应该是最小化\(G_0\)与\(G_{gt}\)的距离,但是公式(7)中没有出现\(G_{gt}\)。

我首先猜测一种回答:公式(7)\(G_0\)是image crop的Ground truth,我们记为\(G_{gt}\),然后把公式(7)变成下面这个:

\[\begin{aligned} \mathbf{E}\left(\mathbf{G}_0\right)=& \sum_{i=1}^N \| \mathbf{x}_{i \rightarrow 0}^{\prime}-\Pi\left(\mathbf{G}_{gt} \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}_{gt}^{-1} \Pi^{-1}\left(\mathbf{x}_0\right) \|_{\Sigma_{0 \rightarrow i}}^2\right. \end{aligned} \]

所以上述公式变为了一个\(G_{gt}\)与\(G_{0}\)的最小距离优化问题,往下的许多内容也似乎说得通了。

Summary

image-20221008221657041

  • Correlation Features是Renders与\(G_0\)计算得到的。

  • Depth + Pose二者可以求出\(x\) ,Renders pose 与 \(G_0\)之间点的对应关系。

  • 上述两者通过 Lookup方法得到一个向量。

  • \(GRU\)接收输入,输出针对\(x\)的修正,使\(G{0}\)其更加接近\(G_{gt}\),还有confidence map \(w\),这里算是对光流估计的一个训练。

  • BD-PNP接收参数。输出对Pose的更新值,也就是\(G_{0}\)更新。

  • 最后要注意的是,当\(G_{0}\)更新后,相关的7个renders也会在下一次迭代更新,然后重复这个过程。

  • innerloop就是模型内部update operator的迭代次数,Outloop就是这个模型整体上迭代多少次,大概是下图的意思:

    image-20221009111628850

Conclusion

这篇论文的方法其实是比较复杂的,也需要很多的先验知识,RAFT, CopyPose,投影几何等,而且一些地方我看得也不是特别清晰。还有就是整个文章的代码效率我觉得比较低,运行一张4个物体的照片甚至会需要20s,不知道在实际应用中会有什么意义。还有就是之前实验的代码跑的是RGB的,但是这篇论文整体上是假设以RGBD为输入进行优化的,所以看起来RGB可能效果没那么好,作者是把RGB的深度值看成一个定值去处理的。

如果要总结一些收获的话,我觉得可能有以下几点:

  • 自然语言处理中一些方法开始进入视觉了,从 RAFT光流估计到这篇论文,我看到了其中的一些思想的借鉴,比如使用GRU迭代去处理一些信息。

  • Bidirectional思想,对时序信息的双向输入,往往能使模型的性能得到提升。

  • 投影几何的一些基础知识,会继续学习。

标签:Multi,精读,mathbf,Object,times,作者,right,光流,left
From: https://www.cnblogs.com/programmerwang/p/16771556.html

相关文章

  • C++ STL :unordered_multimap
    1、代码#include<iostream>#include<unordered_map>usingnamespacestd;intmain(){unordered_multimap<int,int>myUnorderedMultiMap={{2,10},{1,20}......
  • https://github.com/succlz123/AcFun-Client-Multiplatform
    GitHub-succlz123/AcFun-Client-Multiplatform:Athirdpartmultipaltformclientofhttps://www.acfun.cn/.Thegoalofthisrepositoryistobuildaonlinemed......
  • AttributeError: 'tuple' object has no attribute 'sort'
    报错源码contours,hierarchy=cv2.findContours(img_handled,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)#据面积排序contours.sort(key=lambdac:abs(cv2.conto......
  • 关于Object.keys()和Object.values()的使用
    关于Object.keys()和Object.values()的使用1.关于Object.keys()1)处理对象,返回可枚举的所有可枚举属性的字符串数组letperson={name:'张三',age:25,address:'深圳'......
  • jira项目笔记18-Object.fromEntries
    Object.fromEntries()方法把键值对列表转换为一个对象。constentries=newMap([['foo','bar'],['baz',42]]);constobj=Object.fromEntries(entries);......
  • 建模仿真软件:Comsol Multiphysics for Mac/Win
    COMSOLMultiphysics是一款全球通用的基于高级数值方法和模拟物理场问题的通用软件,拥有、网格划分、研究和优化、求解器、可视化和后处理、仿真App等相关功能,轻松实现各......
  • 【STL】关联式容器 - Set和Multiset
    Set和MultisetSTL提供的vector,list和deque属于序列式容器即可序群集,每个元素均有固定的位置,取决于插入时机和地点,和元素值无关。如果以追加的方式对一个群集置入六个元素......
  • Component name “xxx“ should always be multi-word vue/multi-word-component-name
    vue报错Componentname“xxx“shouldalwaysbemulti-wordvue/multi-word-component-names新的版本中,要求了componets的命名格式,如果想要忽视此规则,需要修改vue.conf......
  • object 和map 的区别
    相同点:二者都是以key-value形式对数据存储不同点;key的数据类型范围不同Object可以作为key的有String,Number,symbolmap:目前js的数据类型都可以作为keykey的顺序不同Obje......
  • 「POI2013」Multidrink
    题目点这里看题目。给定一棵包含\(n\)个结点的树。构造一个\(1\simn\)的排列\(p_1,p_2,\dots,p_n\),满足:\(p_1=1,p_n=n\)。对于任意的\(1\lek<n\),\(p_k\)......