Dubbo如何支持本地调用?injvm方式解析
毕设做Mesh R-CNN的实现,在此翻译一下原论文。原论文https://arxiv.org/pdf/1906.02739.pdf。
摘要
二维感知的快速发展使得系统能够准确地检测真实世界图像中的物体。然而,这些系统在2D中进行预测,却忽略了世界的3D结构。与此同时,三维形状预测的进展主要集中在合成基准(synthetic benchmarks)和孤立目标(isolated objects)。我们结合这两个领域的进步。我们提出了一个能够检测真实世界图像中的物体并生成一个给出该物体的完整三维形状的三角形网格的系统。我们称之为Mesh R-CNN,它用一个网格预测分支来增强Mask R-CNN,它输出具有不同拓扑结构的网格,首先预测物体的粗体素表示,这些粗体素表示被转换成网格,然后用一个图卷积网络对网格的顶点和边进行细化。我们在ShapeNet上验证了我们的网格预测分支,超越了之前关于单图像形状预测的工作。然后我们在Pix3D上部署完整的Mesh R-CNN,在那里我们联合检测物体并预测它们的3D形状。
1.介绍
在过去的几年里,二维物体识别取得了飞速的发展。我们现在建立的系统可以在杂乱的真实世界图像中准确识别物体,用边界框或者掩码定位物体,预测2D关键点。尽管这些系统的表现令人印象深刻,但它们忽略了一个重要的事实:世界和图像中的目标是延伸到XY平面之外。
与此同时,三维形状理解与深层网络方面也取得了重大进展。各种各样的网络架构已经被开发出来3D形状表示,例如voxels,point-clouds,meshes;这些表示法各有千秋。然而,这种多样化和创造性的技术主要是在合成基准上开发的,例如ShapeNet,由独立呈现的目标组成,比用于2D目标识别的自然图像基准(ImageNet ,COCO)要简单得多。
我们认为,将这些迄今为止截然不同的研究方向结合起来的时机已经成熟。我们应该努力构建这样的系统,即(像当前的2D感知方法)能够在不受约束的真实世界图像上运行,其中包含许多目标、遮挡和不同的照明条件,但(像当前的3D形状预测方法)不会忽略世界丰富的3D结构。
在本文中,我们朝着这个目标迈出了第一步。我们利用最先进的二维感知和三维形状预测方法来建立这样的系统:输入真实世界的RGB图像,检测图像中的目标,并输出一个类别标签,分割掩码,和一个三维三角形网格,给出每个被检测目标的完整三维形状。
我们的方法,称为Mesh R-CNN,建立在2D识别的最先进的方法Mask R-CNN上,用网格预测分支增强它,输出高分辨率的三角形网格。
我们预测的网格必须能够捕获各种真实物体的三维结构。因此,预测网格应该根据不同的视觉刺激动态地改变其复杂性、拓扑结构和几何形状。然而,先前利用深度网络的网格预测工作由于限定拓扑结构的网格模板而被迫变形[23,56,68]。如图1所示,我们通过利用多个3D形状表示来克服这个限制:我们首先预测粗体素化的目标表示,这些表示被转换成网格并进行细化,以提供高度精确的网格预测。如图2所示,这种混合方法是允许Mesh R-CNN输出任意拓扑的网格,同时捕获精细的目标结构。
图1 图2
我们在两个数据集上对我们的方法进行基准测试。首先,我们在ShapeNet[4]上评估我们的网格预测分支,我们的体素预测和网格细化的混合方法在很大程度上优于之前的工作。其次,我们部署我们完整的Mesh R-CNN在最近Pix3D数据集[59],该数据集将395个宜家家具模型与真实世界的图像进行了匹配,这些图像具有不同的场景、杂乱和遮挡。迄今为止,Pix3D主要用于评估在ShapeNet上训练的形状预测模型,而ShapeNet使用完美剪裁,无遮挡的图像片段[40,59,72],或Pix3D模型的合成渲染图像[75]。相比之下,我们是第一个使用Mesh R-CNN在Pix3D上训练系统的,该系统可以联合检测所有类别的目标并估计其完整的3D形状。
2.相关工作
我们的系统输入一个RGB图像并输出一组检测到的目标实例,每个目标都有一个三角形网格。我们的工作与最近在二维目标检测和三维形状预测方面的进展最直接相关。我们还从其他3D感知任务中获得了更广泛的灵感。
2D物体识别 二维目标识别的方法在每个目标所预测的信息类型和整个系统架构上各不相同。目标检测器输出每个目标的边界框和类别标签;Mask R-CNN 额外输出实例分割掩码。我们的方法扩展了这一流水线的工作,以输出每个目标的一个完整的3D网格。
单一视图形状预测 最近的方法使用多样的形状表示法对单幅图像进行三维重建。一些方法预测已知形状的朝向或3D姿态。其他方法预测新的三维形状,如3D点集、patches 或 geometric primitives;另一些使用深度网络来建模符号距离函数(简称SDF,有兴趣可以查一下)。这些方法可以灵活地表示复杂的形状,但依赖于后处理来提取水密网格输出。
一些方法预测规则体素网格;然而直观,缩放到高分辨率输出需要复杂的八叉树[49,61]或嵌套的形状架构[48]。
其他的直接输出三角形网格,但被限制从固定的[55,56,68]或检索的[50]网格模板变形,限制了他们可以表示的拓扑。
我们的方法使用了体素预测和网格变形的混合,使高分辨率的输出形状可以灵活地表示任意拓扑。
一些方法在没有3D标注的情况下重建3D图形[23, 25, 47, 67, 74]。这是一个重要的研究方向,但目前我们只考虑完全监督的情况,因为我们成功地对二维感知进行了强有力的监督。
多视图形状预测 在物体和场景的多视图重建方面有一个广泛的研究方向,经典的双目立体视觉到使用形状先验,和现代学习技术。在这项工作中,我们专注于单图像形状重建。
3D输入 我们的方法输入二维图像,预测语义标签和三维形状。由于深度传感器的可用性越来越高,人们对从三维输入(RGB-D图像,点云)中预测语义标签的方法越来越感兴趣。我们预计,将3D输入纳入我们的方法可以提高形状预测的保真度(fidelity)。
数据集 二维感知的进步得益于大规模的注释数据集如 ImageNet 和 COCO 。三维形状预测数据集与二维形状预测数据集相比存在较大的差距,主要原因是三维形状预测数据集难以采集。ShapeNet 是一个大型的CAD模型数据集,它可以被渲染成合成图像。宜家数据集将宜家目标的CAD模型和现实世界的图像匹配;Pix3D 将这一思想扩展到更大的图像和模型集。Pascal3D 将CAD模型与真实世界的图像匹配,但由于其训练集和测试集共享相同的小模型集,因此不适用于形状重构。KITTI 注释户外街景3D边界框,但不提供形状注释。
3.方法
我们的目标是设计一个系统,输入一张单一的图像,检测所有的目标,并输出一个类别标签,边界框,分割掩码和每一个被检测的目标的3D三角形网格。我们的系统必须能够处理杂乱的现实世界的图像,并且必须能够端到端地训练。为了适应现实世界各种复杂的目标,我们的输出网格不应该被限制到一个固定的拓扑。我们通过结合最先进的2D感知和3D形状预测来实现这些目标。
具体来说,我们建立在 Mask R-CNN 上,一个最先进的2D感知系统。Mask R-CNN是一种端到端的基于区域的目标检测器。它输入一个RGB图像并为每个检测到的目标输出一个边界框、类别标签和分割掩码。图像首先通过一个主干网络(e.g. ResNet-50-FPN [34]),接着是区域提议网络(RPN),该RPN网络给出了用目标分类和掩码预测分支处理的目标建议。
Mask R-CNN的成功部分归功于RoIAlign,它从图像特征中提取区域特征,同时保持输入图像与最终预测分支中使用的特征之间的对齐。我们的目标是在预测三维形状时保持相似的特征对齐。我们使用一种新的网格预测器来推断三维形状,该预测器包括一个体素分支和一个网格细分分支。体素分支首先估计对象的粗3D体素化,然后将其转换为初始三角形网格。然后网格细分分支使用一系列操作在网格边缘上的图卷积层来调整初始网格的顶点位置。
体素分支和网格细化分支与Mask R-CNN现有的box和mask分支是同源的。所有分支均采用与RPN建议相对应的图像对齐的特性作为输入。将下面详细描述的体素和网格损失添加到边界框和掩码损失后,对整个系统进行端到端的训练。输出是一组边界框以及它们的预测目标得分、掩码和三维形状。我们将系统称为Mesh R-CNN,如图3所示。
记一次项目总结
图3
我们现在详细描述我们的网格预测器,包括体素分支和网格细化分支,以及它们的相关损失。
3.1网格预测
我们的系统的核心是一个网格预测器,它接收到与一个目标的边界框对齐的卷积特征,并预测一个给出该目标完整3D形状(full 3D shape)的三角形网格。与Mask R-CNN类似,在所有处理阶段,我们通过区域和针对于顶点的对齐操作(即RoIAlign 和 VertAlign)来维持输入图片与特征图之间的相关性。我们的目标是捕获一个图像中所有目标的特定于实例的3D形状。因此,每个预测的网格必须具有特定于实例的拓扑(种类,顶点数,面,连接组件)和几何(顶点位置)。
我们通过展开一系列的形状推断操作来预测不同的网格拓扑。首先,体素分支对每个目标的形状进行自底向上的体素化预测,类似于Mask R-CNN的Mask分支。这些预测被转换成网格,并通过网格细化头进行调整,给出最终的预测网格。
对于每个物体,网格预测器的输出是一个三角形网格$T=(V,F)$。$V = {v_i∈R^3}$是一组顶点位置,$F⊆V×V×V$是一组三角形面。
3.1.1体素分支
体素分支预测一个体素占用概率网格,给出每个被探测目标的3D形状。可以把它看作是 Mask R-CNN 的mask预测分支的3D模拟:我们不是预测$M×M$网格给出图像平面上物体的形状,而是预测$G×G×G$网格给出物体的完整三维形状。
与Mask R-CNN一样,我们通过在RoIAlign生成的输入特征图上应用一个小的全卷积网络[38]来维持输入特征与预测体素之间的对应关系。该网络生成一个带有$G$通道的特征图,为输入中的每个位置提供一个体素占用分数列。
在3D中,保持图像和我们的预测之间的像素对应是很复杂的,因为当物体远离时,它们会变得更小。如图4所示,我们通过使用相机的(已知的)固有矩阵来预测体素。
图4
(预测体素在接收面的位置需要一个不规则形状的体素网格。我们通过在由摄像机(已知)固有矩阵$K$变换的空间中进行体素预测来实现这一效果。
应用$K^{−1}$将我们的预测转换回世界空间。结果在世界空间中形成了平截体形(frustum-shaped)体素。)
CuBify: Voxel to Mesh 体素分支产生一个三维网格的占用概率,给出一个物体的粗糙形状。为了预测更精细的3D形状,我们希望将这些体素预测转换为一个三角形网格,该三角形网格可以传递给网格细分分支(mesh refinement branch)。
我们用一种叫做cubify的操作来填补这个空白。它输入体素占用概率和体素占用的二值化阈值。每个被占据的体素被一个长方体三角形网格替换,它有8个顶点,18条边和12个面。合并相邻已占用体素之间的共享顶点和边,并消除共享的内部面。这样就形成了一个水密网格,其拓扑结构依赖于体素预测。
Cubify必须是高效和批量的。这不是小事,我们在附录中提供了实现这一点的技术实现细节。或者,移动立方体(marching cubes)[39]可以从体素网格中提取等值面,但是要复杂得多。
Voxel Loss 体素分支被训练来最小化预测体素占用概率和真实体素占用之间的二元交叉熵。
3.1.2网格细分分支
来自体素分支的cubified网格只提供了一个粗糙的3D形状,它不能精确地建模椅子腿这样的精细结构。网格细分分支处理这个初始的cubified网格,用一系列细分阶段细化其顶点位置。与Pixel2Mesh[68]类似,每个细化阶段包括三个操作:顶点对齐,提取顶点的图像特征;图卷积层,沿网格边缘传播信息;顶点细化,更新顶点位置。网络的每一层为每个网格顶点维护一个三维位置$v_i$和一个特征向量$f_i$。
顶点对齐(Vertex Alignment) 为每个网格顶点生成与图像对齐的特征向量。我们使用相机的固有矩阵将每个顶点投影到图像平面上。给定一个特征图,我们在每个投影顶点位置计算一个双线性插值图像特征。在网格细分分支的第一阶段,VertAlign输出每个顶点的初始特征向量。在随后的阶段中,VertAlign输出的是与前一阶段的顶点特征连接起来的特征向量。
图卷积层(Graph Convolution) [28]沿着网格边缘传播信息。给定输入顶点特征,$f_i$它计算更新的特征$f_i’=ReLU(W_0 f_i+\sum\nolimits_{j\in N(i)}W_1 f_j)$,其中$N(i)$给出网格中第i个顶点的邻居,$W_0$和$W_1$是学习过的权值矩阵。网格细分分支的每个阶段都使用几个图卷积层来在局部网格区域上聚合信息。
顶点细化(Vertex Refinement) 计算更新的顶点位置$v_i’=v_i+tanh(W_{vert}[f_i;v_i])$,其中$W_{vert}$是一个学习过的权值矩阵。这使得保持其拓扑固定的同时,更新网格的几何形状。网格细分分支的每个阶段都以顶点细分结束,生成一个中间网格输出,在下一阶段进一步细分。
Mesh Loss 定义在三角形网格上本地操作的损失是具有挑战性的,所以我们使用定义在有限点集上的损失函数。我们通过密集采样点云的表面来表示一个网格。因此,点云损失近似于形状上的损失。与[56]类似,我们使用可微分网格采样从网格表面均匀地采样点(及其法向量)。为此,我们实现了一种高效的批量采样器;详见附录。我们使用这个操作从ground-truth网格中采样点云$P^{gt}$,从我们的模型中每个中间网格预测中采样点云$P^i$。
给定两个点云$P$,$Q$和法向量,令$\Lambda_{P,Q}=\{(p,arg min_q||p-q||):p\in P\}$为一组数据对$(p,q)$集,其中 $q$ 是 $Q$ 中 $p$ 的最近邻居,令 $u_p$ 是点 $p$ 的法向量。点云$P$与$Q$之间的倒角距离为
$L_{cham}(P,Q)=|P|^{-1}\sum\limits_{(p,q)\in \Lambda_{P,Q}}||p-q||^2+|Q|^{-1}\sum\limits_{(q,p)\in \Lambda_{Q,P}}||q-p||^2$
而(绝对)法向距离为
$L_{norm}(P,Q)=-|P|^{-1}\sum\limits_{(p,q)\in \Lambda_{P,Q}}|u_p\cdot u_q|-|Q|^{-1}\sum\limits_{(q,p)\in \Lambda_{Q,P}}|u_q\cdot u_p|$
倒角和法线距离惩罚两个点云之间的不匹配位置和法线,但是仅仅最小化这些距离就会导致退化网格(见图5所示 )。高质量的网格预测需要额外的形状调整器:为此(To this end),我们使用边缘损失 $L_{edge}(V,E)=\frac{1}{|E|}\sum\nolimits_{(v,v’)\in E}||v-v’||^2$,其中 $E\subseteq V\times V$ 是预测网格的边。另外,拉普拉斯损失[7]也施加平滑约束。
第i级的网格损失为 $L_{charm}(P^i,P^{gt})$,$L_{norm}(P^i,P^{gt})$,$L_{edge}(V,E)$ 的加权和。网格细分分支被训练来最小化所有细分阶段的平均损失。
在 Ubuntu 上安装 K8S教程