0%

近期位姿估计方法

简介近期若干种基于单帧RGBD输入在Category-level进行位姿估计的方法。(论文链接与引用说明略)

Category Level Object Pose Estimation via Neural Analysis-by-Synthesis

  • analysis-by-synthesis
  • 不需要具体模型
  • RGB/RGBD

image-20220928184536148

  • Training:就是VAE

  • Inference:迭代式优化初始的z值(由Encoder给出)和初始的R、T位姿值(Encoder、Generator冻结)。损失为:

    E(I,R,T,z)=Fvgg(I)Fvgg(I^)2+z2E(I, R, T, z)=\left\|F_{v g g}(I)-F_{v g g}(\hat{I})\right\|_2+\|z\|_2

    第一项是原图和生成图各自用预训练的VGG网络提取的特征之差的范数,第二项就是对code的约束。

    • 非凸,因此通过不同方式选择多种初值,输出最好的结果。
  • Encoder:就是普通CNN

  • Generator:结构如下

image-20220928190516941

(图上的Rz,RyR_z,R_y可能反了),这里的x,y轴是在成像平面的两个轴,z轴是和成像平面正交的轴,z轴的旋转就在成像平面内。

SPD

image-20220928221753080

过程非常明了,看图说话。

橙色的Network结构如下:

image-20220928222303829

最后一步用梅山算法+RANSAC得出结果。

不过Shape Prior的产生需要说明:通过普通的Encoder-Decoder获取某一类各个实例的code(选用Chamfer distance为损失),最后Shape Prior为这些code的平均值经过Decoder的结果,见下图(按:左下角为code的TSNE可视化结果):

image-20220928222059101

FS-Net

image-20220928222836278

左上角:RGB用yolov3确定bounding box和类别标签(C),切出对应部分的点云(目标物体+少量背景)。

右上蓝色部分:Shape-based Network。

  • 首先使用3D deformation用于训练时数据增强
  • 随后是autoencoder-decoder段,encoder段使用3D Graph Convolution(3DGC),其具有平移、缩放不变性,生成的Latent feature只包含旋转相关信息。
  • 较有特色的是中部橙色框回归出两根正交轴(即作者所称的用两个decoder,正交的原因正文未指出,可能需要看看代码。另:作者认为这和6D表示不同。),然后叉出第三根轴即可得到旋转矩阵。这部分用余弦损失。

下方绿色部分:上面的encoder还输出segment信息,加到最初切出的点云上后过PointNet回归(相对于切出点云重心的)平动和(相对本类平均尺寸的)尺寸。

SGPA

image-20220928233230044

I0I_0:RGB patch

PrP_r:先验点云(表示类别信息,文中未限制其获取方式)

P0P_0:RGBD得到的观测点云

S0S_0:由逐点取出CNN得出的语义特征组成

GrG_r,G0G_0:PointNet++得到的feature

中部获得SrS_r的过程其实是简化(低秩)的transformer。Structure Network应该就是普通FC(需要查看代码确定),Structure Similarity表现了P0P_0部分关键点和PrP_r所有点之间的匹配关系。由于I0I_0P0P_0的点是一一对应的,因此直接把用在P0P_0EE矩阵用在I0I_0(所提取的特征)上即可。

右部就是PrP_r上的特征和P0P_0上的特征结合:首先回归二者间的deformation,其次预测matching关系,最后梅山方法。

DualPoseNet

image-20220929130340367

  • 左边部分:用maskRCNN做出mask,然后分别提取出可见部分的点云PP和点云各点对应的RGB值所形成的“RGB点”云X={xiR3}i=1,...,NX=\{x_i\in\mathbb{R}^3\}_{i=1,...,N}

  • 中间部分:以上的P,XP,X都输入Pose Encoder,在不同尺度上交换信息(Fusion),最后得到多尺度位姿特征。

其中,SC指spherical conv,它是在球面上直接做卷积的方法。

注意,这并非直接在空间球面上画出网格之类;实际做法是由于没法显式地画出网格,因此先变换到频域再乘再反变换得解。按:球面上的函数的一个正交基是球谐函数。除spherical conv外,一个较简明的参考为https://blog.goodaudience.com/spherical-convolution-a-theoretical-walk-through-98e98ee64655

在使用SC前需要先把X,PX,P改造为适合使用SC的形式,即先改为图中所示的SX,SPS^X,S^P

  • 右上:Explicit Pose Decoder,由位姿特征回归位姿。

  • 右下:Implicit Pose Decoder,由位姿特征和PP重建canonical中的PP,即QQ。这里不会直接用QQ来解算位姿,而是通过回归QQ来辅助训练。即训练分两步:

image-20220929143722421

CR-Net

image-20220929150930078

  • 首先用maskRCNN之类分割出物体,得到点云和RGB图(patch)

  • 随后对RGB图、点云以及Shape Prior(右上角,“Shape Prior”参考SPD)特征提取,分别得到特征Ft,Fg,FcF_t,F_g,F_cFt,FgF_t,F_g的点数应该相同,FtF_t是将对应点特征向量提取出来得到的特征;三者的特征维数可以不同)

  • instance relation network(IRN)和category relation network(CRN)有相似的结构。这种网络都必须先确定一个二元关联函数GG(IRN和CRN可以选择不同的GG,可以是MLP,transformer等),且其输入和输出都总是成对的。当输入为a,ba,b时,输出为混合后的结果a^=a+G(a,b)\hat{a}=a+G(a,b)b^=b+G(b,a)\hat{b}=b+G(b,a)

    图中的FIF_IFt^\hat{F_t}Fg^\hat{F_g}的连接。

  • D代表deformation,M代表correspondence matrix。多次迭代回归D和M。

  • 最后用M确定匹配关系,使用梅山+RANSAC得到6D pose和size。

SAR-Net

image-20220929165555684

  • 开头几步和前面的模型基本一致,不过考虑到分割出的点云可能还带有背景点(segmentation未必是完美的),因此用3D-GCN卷积网络产生质量更好的点云。然后将此点云归一化
  • category template直接随机在类中选一个,并用FPS构建一个稀疏的点云。
  • Shared features部分可能需要参考源码(尚未开源),其余部分就非常直接了。

GPV-Pose

image-20220929175738915

主要组合了三个部分:

  1. 基于3DGC的encoder
  2. 对称重建
  3. bounding box voting
  • PP:Point Cloud - Pose
  • PBP:Point Cloud - Bounding Box - Pose
  • 左边三个MLP:
    • 前两个:C1,C2C_1,C_2代表可信度,rx,ryr_x,r_y为回归出的两根轴旋转后的位置(不必正交)。再根据设计的损失即可求出该可信度和轴位置下的一组正交轴即可。二者叉积得z轴位置,即可得到旋转矩阵。
    • 第三个:由于3DGC会丢掉位置和尺寸信息,因此要把点云重新拿回来接上。由此回归尺寸和位移。
  • 右边的部分:只是为了辅助训练,预测时其实只用左半部分
    • 对称重建,不必多言
    • bounding box:每个点投向最近的平面。按:Global feature未详细说明,需要check代码。

RBP-Pose

image-20220929173224706

image-20220929173802617

利用了各家之长

  • Encoder:3DGC
  • Shape Prior:同SPD
  • Pose Regression:
    • 旋转:同GPV-Pose
    • 平移、尺寸:同FS-Net,用所谓residual表示

i~iii三部分就是预测时工作的部分,iv、v用于辅助训练。

  • Shape decoder:同SPD
  • DVPB:Displacement Vectors from the observed points to the corresponding Projections on the Bounding box,就是输入的点云P0P_0各点到bounding box最近面的向量(同GPV-Net)
  • SPRV:Shape Prior Guided Residual Vectors,其实就是DVPB和真实的DVPB(在世界坐标系中)的差向量。我们要求SPRV Decoder(图中的最下面)回归这一差向量。
  • 非线性数据增强(c,N.L.Aug)。增强方式也是根据该类别的形态人工确定的。对于NOCS中的点,使用在对应轴投影长的二次函数确定其各个轴坐标被缩放的比例(这是其中一种方法,另一种方法就是只有一个轴按这种方法缩放,另两个轴按相同比例缩放)

CenterSnap

  • 多目标,但是是Single-shot(每类目标只有一个)

image-20220929215920340

  • 首先是检测:RGB图和D图分别过resnet,然后在Channel维合并并通过resnet18FPN获取多尺度特征(拼合在一起),即frdf_{rd}
  • 随后分两个头
    • 一头回归Heatmap,指出重心在成像平面的投影位置(训练时Heatmap可以假设为gauss分布,heatmap未必需要和原图有相同分辨率)
    • 一头输出O3dO_{3d}向量(包含对点云形状的编码以及位姿、尺寸的编码,全部连接成一个大向量),其training的ground truth(中点云形状编码的部分)通过使用各种类别的模型(要化为NOCS空间的点云)额外训练的Encoder-Decoder中的Encoder生成。(位姿、尺寸的编码就用二者的ground truth生成)
    • 回归结果就看这个O3dO_{3d}向量
  • 训练过程还要加上对O3dO_{3d}向量中形状编码的decoding(右上角部分),这相当于辅助任务。
  • 最后还可以再配个icp

CATRE

image-20220929222235757

图已经很明显了,只有绿框里的内容需要看看下图:

image-20220929222800535

  • 文章认为这种结构的shape prior的选取可以更为自由,不限于SPD的办法(但文中实现时还是用的SPD的办法)。
  • OO:observed point cloud
  • PP:shape prior
  • O^={o^io^i=oitinit}i=1NoP^={p^jp^j=sinitRinitpj}j=1Np\begin{aligned} &\hat{\mathcal{O}}=\left\{\hat{o}_i \mid \hat{o}_i=o_i-\mathbf{t}_{i n i t}\right\}_{i=1}^{N_o} \\ &\hat{\mathcal{P}}=\left\{\hat{p}_j \mid \hat{p}_j=\mathbf{s}_{i n i t} \odot \mathbf{R}_{i n i t} p_j\right\}_{j=1}^{N_p} \end{aligned}
  • 因此O^P^\hat{O},\hat{P},在相同的feature space,故可weight sharing
  • 旋转回归类似6D表示法

DPDN

image-20220929231036458

  • 提取点云和RGB patch(Object Observation)用maskRCNN+……(同前,上图中未体现此步骤)
  • 上图中可知每次训练时都会在位姿上再附加一对位姿,变成一对并行的Object Observation(RGB图不变,因为将RGB的特征加进来时是逐点加入的,因此不会有问题)。(作者认为的self-supervision,还可增强对transformation的敏感性,不过这看起来就是数据增强……)

下图为Deep Prior Deformation Network:

image-20220929232954177

  • 第二部分deformer输出的FQ0F_{Q_0}为canonical space且可和P0P_0一一匹配的特征,Q0Q_0就是可以匹配的canonical中的点云。
  • 后面的Estimator非常直观

返回前面的inter/intra-consistency

  • inter:复合的loss,比较的就是第一张图中两个绿框点云以及对应transformation的相符程度
  • intra:衡量Q0Q_0和用回归出的transformation作用在P0P_0上的点云之间的chamfer loss(过去也很常见的loss)

Conclusion

  1. 大量使用Encoder-Decoder
  2. 注意Category信息的处理(SPD的shape prior已被大量使用)
  3. 注意利用2D中的结果和3D中新的backbone
  4. 控制模型复杂度,简洁未必效果就差(以上就5°5cm而言最佳为CATRE,其结构就挺简洁的)
  5. 注意如何处理旋转矩阵
  6. 迭代式优化

附:最糟糕的一篇是RBP-Pose(各种模块都是从之前的文章里挖出来,而且最终效果也并不亮眼;关于最后的“主要”创新点SPRV,不知道作者是否能想起resnet……)然而水水更健康

欢迎关注我的其它发布渠道