目录
Coupled Iterative Refinement for 6D Multi-Object Pose Estimation论文精读
这是2022年发表在CVPR上一篇关于位姿估计的一篇文章。在正式介绍这篇论文之前,我们需要了解一下RAFT,因为本篇论文很多地方都受到了RAFT的影响。
RAFT Introduction
RAFT: Recurrent All-Pairs Field Transforms for Optical Flow;观其名便知道这是一篇关于光流估计的论文。
模型介绍
为了方便理解和阅读,我写了两个版本:
-
先是一个网络\(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
的值)迭代着去更新光流。当然第三点需要下面的详细介绍。
将模型拆解一下:
- 两次特征抽取
这个比较好理解,就不多说了。
-
Correlation Layer
这里我们得到了\(I_1\)对\(I_2\)上的多尺度4D Correlation Voulumes,那么这个值是怎么得到的,又代表什么意义呢?前面我们提到过,我们得到\(H \times W \times H \times W\)的向量之后,作者觉得这样比较稀疏,因为\(I_1\)不可能与\(I_2\)所有的像素点相关,所以作者又将这个向量进行了四层池化:
得到了如图所示的3层向量(第四层没画出来,也就是\(H \times W \times {H\over8} \times {W\over8}\)),将他们叠在一起,就构成了一个多尺度的相似性向量的金字塔。
- Look up
在这个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,标题中论文沿用的一个方法。
-
update operator
这个类似于GRU模型的结构,把context features以及Look up
输出的向量(通过flow和correlation pyraid得到)作为输入\(x_t\),以及hidden state作为 \(h_{t-1}\)作为输入,然后输出\(\Delta \mathrm{f}\)和更新后的的hidden state\(h_t\)。GRU的内部结构是这样定义的:
- loss function
作者使用的并不只是最后的输出,而是update operator每一次迭代的光流输出\(\left\{\mathbf{f}_1, \ldots, \mathbf{f}_N\right\}\),去跟\(f_{gt}\)求loss。
\(gamma=0.9\)
最后再简单看一组对比结果:
至此我们介绍完了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.
Related Work
这里就是介绍了其他人的一些方法,就不过多展开了,感兴趣的读者可以去阅读原论文。
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
- \(G_0\) image points to \(\left\{\mathbf{G}_1, \ldots, \mathbf{G}_N\right\}\) image points
我们的目标就是求解\(G_0\),使得方程(2)能够正确的建立起input image crop和renders的像素点的映射关系。
更多定义的细节:
总之,作者通过几何的方法,使用公式(1),(2)建立了\(G_0\)渲染图片的像素点到\(\left\{\mathbf{G}_1, \ldots, \mathbf{G}_N\right\}\)渲染图片的像素点互相的映射关系,并且是Bidirectional。
然后就是\(G_0\)作为后续不断地Refine的基础,它的初始化自然也是十分重要,作者是基于CopyPose的方法做的。
Feature Extraction and Correlation
得到了初始位姿之后,作者在这个位姿的基础上做了一些pitch, yaw or roll方向上旋转,最后得到了7个render views。然后作者采用了RAFT的方法,建立了每个render和输入图片
的image crop
的correlation pyramids,然后注意,这个是双向的。correlation pyramids在前面RAFT介绍过,遗忘的读者可以回顾一下。
Coupled Iterative Refinement
作者先是使用公式(1)(2)分别求解renders
到\(G_0\)以及\(G_0\)到renders的\(\mathbf{x}_{i \rightarrow 0}\),\(\mathbf{x}_{0 \rightarrow i}\)的映射,其实我感觉\(\mathbf{x}\)像是是光流,因为建立了图像间点的映射,但又不完全是光流,因为\(\mathbf{x}\)还与inverse depth
有关。但总之是像素点之间的映射。
这里的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\).
但是这一节我绞尽脑汁也没看懂:
先把原文放上,然后说一下我的问题,感兴趣的读者欢迎留言讨论:
结合公式(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)变成下面这个:
所以上述公式变为了一个\(G_{gt}\)与\(G_{0}\)的最小距离优化问题,往下的许多内容也似乎说得通了。
Summary
-
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就是这个模型整体上迭代多少次,大概是下图的意思:
Conclusion
这篇论文的方法其实是比较复杂的,也需要很多的先验知识,RAFT, CopyPose,投影几何等,而且一些地方我看得也不是特别清晰。还有就是整个文章的代码效率我觉得比较低,运行一张4个物体的照片甚至会需要20s,不知道在实际应用中会有什么意义。还有就是之前实验的代码跑的是RGB的,但是这篇论文整体上是假设以RGBD为输入进行优化的,所以看起来RGB可能效果没那么好,作者是把RGB的深度值看成一个定值去处理的。
如果要总结一些收获的话,我觉得可能有以下几点:
-
自然语言处理中一些方法开始进入视觉了,从 RAFT光流估计到这篇论文,我看到了其中的一些思想的借鉴,比如使用GRU迭代去处理一些信息。
-
Bidirectional思想,对时序信息的双向输入,往往能使模型的性能得到提升。
-
投影几何的一些基础知识,会继续学习。