w~视觉~3D~合集5

发布于:2025-02-11 ⋅ 阅读:(51) ⋅ 点赞:(0)

我自己的原文哦~    https://blog.51cto.com/whaosoft/12898983

#Neural Sewing Machine (NSM)

Neural Sewing Machine (NSM),一种新颖的保持 3D 衣物结构的学习框架,可以有效表示多样化形状和拓扑结构的 3D 衣物,并应用于 3D 衣物表征,3D 衣物重建和可控衣物编辑。

中山大学 HCP 实验室联合牛津大学 TVG 实验室共同发表论文《Structure-Preserving 3D Modeling with Neural Sewing Machines》该工作主要由陈曦鹏、王广润博士等人完成。

3D 衣物建模是计算机领域的一个关键且具有挑战性的任务,具体是指如何在计算机中构建一件 3D 的虚拟衣物。构建 3D 衣物具有多种实际应用,包括 3D 虚拟试衣、虚拟数字人和服装设计。最近基于学习的衣物建模方法收到越来越多的关注,然而,现有方法多针对特定类别或相对简单拓扑的衣物进行建模。

论文链接: https://arxiv.org/abs/2211.06701

背景

目前基于学习的方法要么使用固定的 3D 网格模板,将衣物表示为 SMPL 模型上的位移,或是借助人体的 UV 参数化来表示衣物。这些方法主要针对特定的衣物类别,或是拓扑结构相对简单的衣物进行建模。那么是否存在一个模型可以表达不同种类且形状各异的衣物呢? 

缝纫纸样(sewing pattern)是衣物建模和生产中广泛使用的一种结构。缝纫纸样由一组 2D 面板以及面板间的缝合信息组成。例如,一条裙子的缝纫纸样有 4 个 2D 面板(panel)。每个面板对应于 3D 衣物的一部分。使用缝纫纸样来建模 3D 衣物可带来以下好处:

  • 首先,可以表达各种不同类别和形状的衣物
  • 其次,描述了 3D 衣物的内在结构
  • 最后,提供了衣物的 UV 参数化

模型

本文提出了 Neural Sewing Machine(NSM),一种保持 3D 衣物结构的学习框架,能够学习不同形状和拓扑的衣物的表示,主要由以下三个模块组成:

1)缝纫纸样编码模块能够将不同衣物类别的缝纫纸样编码到一个低维空间中。一件衣物可以分解为几个基本部分,例如,一件夹克可以由帽子、袖子和背心部位组成。因此可以将衣服拆解成几个基本的部件类别,并为每种类别计算一个 PCA 子空间。通过拼接这些类别的 PCA 系数来获得缝纫纸样的特征编码。

 2)3D 衣物预测模块负责从缝纫纸样的特征编码中解码出 3D 衣物。本文引入了带有掩模的 UV 位置图(UV position maps with masks)来表示一件 3D 的衣物。具体来说,UV 位置图将衣物的 3D 坐标存储在缝纫纸样每一个面板的 UV 坐标处,而掩模图表示了缝纫纸样每一个面板的形状。其中 UV 位置图是通过一个 CNN 解码器预测得到,而预测的掩模图通过 inverse PCA 解码获得。 

3)为了保持 3D 衣物的内在结构,本文在框架的训练中引入了四个损失函数: (a)3D 重建损失约束了预测的 UV 位置图和 3D 标签相同。(b)面板内结构保护损失约束了缝纫纸样与对应的 3D 衣物在局部的拉伸保持一致。(c)面板间结构保护损失将 3D 空间中两个邻接面板的边缘缝合在一起。(d)表面法线损失约束了预测的 3D 衣物应具有与 3D 标签相同的表面法线向量。 

实验

实验表明了我们的框架能够表示不同的形状和拓扑结构下的 3D 衣物。同时,我们验证了基于单张图像的 3D 衣物重建任务,可以看到我们的方法有助于保持衣物的细节结构。我们还展示了可控的衣物编辑,通过在缝纫纸样上进行编辑来显著改变衣物的 3D 形状或是将衣物从一个类别变换到另一个类别。 

消融实验验证了我们框架中每个组件的有效性。我们还展示了在缝纫纸样的特征编码上插值的结果。可以看到,2D 缝纫纸样和 3D 衣物的变化是一致的。最后,我们展示了方法对真实场景具备一定的泛化能力,尽管我们的框架仅在合成数据进行训练,合成数据与真实场景之间存在域差距,但结果证实了我们方法的具备一定的泛化能力。        

实验室简介

中山大学人机物智能融合实验室 (HCP Lab) 由林倞教授于 2010 年创办,围绕人工智能前沿技术布局研究课题,获得中国图像图形学会科技一等奖、吴文俊自然科学奖、省级自然科学一等奖等荣誉;培养了梁小丹、王可泽等国家级青年人才。

#BEV~融合部署

在算法开发中,激光雷达-相机3D目标检测遇到了过度拟合问题,这是由于违反了一些基本规则。在数据集构建的数据标注方面,本文参考了理论补充,并认为回归任务预测不应涉及来自相机分支的特征。通过采用“检测即标签”的前沿观点,本文提出了一种新的范式,称为DAL。使用最经典的初级算法,通过模仿数据标注过程构建了一个简单的预测流水线。然后,本文以最简单的方式对其进行训练,以最小化其依赖性并增强其可移植性。尽管构造和训练都很简单,但所提出的DAL范式不仅在性能上取得了重大突破,而且在所有现有方法中提供了速度和精度之间的优越权衡。凭借全面的优势,DAL会是未来工作开发和实际部署的理想基准。代码已发布,https://github.com/HuangJunJie2017/BEVDet。

尽管构造和训练简单,但提出的DAL范式不仅极大地推动了性能边界(例如,在nuScenes val集上为74.0 NDS,在nuScenes test集上为74.8 NDS),而且在所有现有方法中提供了速度和精度之间的优越权衡。本文的主要贡献可以概括如下

  1. 文章提出了一个前沿的视角,即“检测作为标注”,用于3D物体检测中的LiDAR-相机融合。这是对现有方法的良好补充,也是未来工作应遵循的基本规则。
  2. 文章遵循“检测作为标注”的观点,构建了一个名为DAL的鲁棒范例。DAL是第一个具有极其优雅的训练管道的LiDAR-Camera融合范例。此外,它极大地推动了该问题的性能边界,在推理延迟和准确性之间实现了优异的权衡。凭借全面的优势,DAL是未来工作发展和实际使用的理想基线。
  3. 文章指出了速度分布不可避免的不平衡问题,并提出了实例级速度增益来缓解这一问题。

算法的网络设计

DAL范式的预测管道。将来自图像和点云的BEV特征融合在一起,生成密集的热图。提取前K个建议及其点云特征,用于回归任务预测。与图像特征、图像BEV特征和点云BEV特征融合的特征用于类别预测。根据每个建议的相应预测中心提取稀疏图像特征。

在稀疏感知阶段,首先根据候选对象在密集热图中的坐标收集每个候选对象的点云特征。然后使用简单的前馈网络(FFN)预测回归目标(例如中心、大小、方向和速度)。在这个过程中不涉及图像特征,以防止过拟合问题。最后,本文将图像特征、图像BEV特征和点云BEV特征融合在一起,生成用于类别预测的融合特征。图像BEV特征的部分是根据候选对象在密集热图中的坐标提取的,而图像特征的部分是根据预测的对象中心提取的。

除了进行一些关键修改外,DAL的预测管道从BEVFusion继承了大部分结构设计。首先,点云BEV特征和图像BEV特征在密集BEV编码器之后进行融合,而BEVFusion在之前进行融合。本文推迟融合,以最大限度地保留LiDAR分支的回归能力。然后,由于发现没有必要,去除了稀疏实例和BEV特征之间的注意力。最后,回归任务仅使用点云特征进行预测,而BEVFusion使用融合特征。

由于本文在构建预测管道时分配了适当的方式,只需要像大多数经典视觉任务一样加载在 ImageNet 上预训练的图像骨干的参数。然后本文以端到端的方式训练 DAL,只有一个阶段。只使用来自目标数据集 nuScenes的数据。通过这种方式,本文以最优雅的方式训练 DAL 模型,这在文献中很少见。

例如,DAL与TransFusion和BEVFusion共享目标和损失的设计。除此之外,本文在图像特征上添加了一个辅助分类头,以加强图像分支在搜索候选对象和区分不同类别方面的能力。这对于DAL来说非常重要,因为3D目标检测头中密集感知阶段和稀疏感知阶段的监督都有缺陷。具体来说,在密集感知阶段,图像特征会根据视图转换中的预测深度得分进行调整。反向传播中的梯度也是如此。预测深度得分有缺陷是不可避免的,监督也是如此。在稀疏感知阶段,损失计算中只涉及预测实例的图像特征,而不是所有注释目标的图像特征。具有所有注释目标监督的辅助分类头可以解决上述问题,并在一定程度上加强图像分支。在实践中,使用注释目标的重心来提取每个注释目标的稀疏特征。然后,使用另一个FFN对稀疏特征进行分类,损失计算与3D目标检测头中的分类任务相同。不进行重新加权,本文直接将辅助损失添加到现有的损失中:

在回归任务预测中弃用图像特征不仅可以防止不可避免的性能退化,而且可以在图像空间中进行更广泛的数据增强。本文以调整大小增强为例进行解释。基于相机的3D物体检测根据其在图像视图中的大小预测目标的大小。当图像随机调整大小时,为了保持图像特征与预测目标之间的一致性,需要对预测目标进行相应的调整。然后是LiDAR-相机融合的3D物体检测中的连锁反应中的点云。因此,现有的方法总是在图像空间中使用小范围的数据增强。结果,它们远离了大多数图像2D任务(例如分类,检测,分割)中图像空间大规模数据增强的好处。

最后,本文观察到训练数据中速度分布极不平衡。如图3所示,nuScenes训练集中汽车类别的多数实例是静态的。为了调整分布,随机选择了一些静态物体,并根据预定义的速度调整其点云,如图4所示。本文仅对静态物体进行速度增强,因为可以从其带注释的边界框中轻松地识别来自多个LiDAR帧的全套点。

相关实验结果

数据集

本文在大规模基准nuScenes上进行全面的实验。NuScenes是验证许多室外任务的最新流行基准,如3D物体检测、占用率预测、BEV语义分割、端到端自动驾驶。它包括1000个场景,其中包含来自6个相机的图像和来自具有32束光束的LiDAR的点云。相机组具有与LiDAR一致的360度视野。这使其成为评估LiDAR-相机融合算法的首选数据集。这些场景被正式分为700/150/150个场景,用于训练/验证/测试。有10个类别的140万个注释的3D边界框:汽车、卡车、公共汽车、拖车、工程车辆、行人、摩托车、自行车、障碍物和交通锥。

评估指标

对于3D对象检测,本文报告了官方预定义的度量标准:平均精确度(mAP)、平均平移误差(ATE)、平均缩放误差(ASE)、平均方向误差(AOE)、平均速度误差(AVE)、平均属性误差(AAE)和NuScenes检测评分(NDS)。mAP类似于2D对象检测中的mAP,用于衡量精度和召回率,但基于地面上2D中心距离的匹配,而不是交集比(IOU)。NDS是其他指标的组合,用于综合判断检测能力。其余指标用于计算相应方面的阳性结果精度(例如,平移、缩放、方向、速度和属性)。

预测管道

如表2所示,本文遵循两种经典的3D对象检测范式BEVDet-R50 和CenterPoint ,分别构建图像分支和LiDAR分支,用于消融研究。此外,本文还提供了一些推荐的配置,在推理延迟和准确性之间实现了出色的权衡。

训练和评估

DAL模型在16个3090 GPU上以64个批处理大小进行训练。如表1所示,
与大多数需要多个预训练阶段和复杂学习率策略的现有方法不同,DAL仅从ImageNet分类任务中加载预训练权重,并使用CBGS对整个流水线进行20个epoch的训练。DAL与CenterPoint共享相同的学习率策略。具体来说,学习率通过遵循循环学习率策略进行调整,初始值为2.0×10-4。在评估过程中,本文报告了单个模型在无测试时间增广情况下的性能。默认情况下,推理速度都在单个3090 GPU上测试。BEVPoolV2 用于加速视图变换算法LSS。

nuScenes val set的结果。如表4所示和图1所示,提出的DAL范式不仅极大地推动了性能边界,而且还提供了速度和精度之间的更好权衡。配置DAL-Large的分数为71.5 mAP和74.0 NDS,大大超过了现有的最佳记录,分别增加了+1.0 mAP和+0.7 NDS。在如此高的准确度下,DAL-Large仍然以6.10 FPS的推理速度运行。另一个推荐的配置DAL-Base以与最快的方法CMT-R50 类似的推理速度运行。其准确度大大超过了CMT-R50,分别为2.1 mAP和2.6 NDS。与CMT-R50具有相似的准确度,DAL-Tiny的加速率为54%。

nuScenes测试集的结果。本文报告了DAL-Large配置在nuScenes测试集上的性能,没有模型集成和测试时间扩展。DAL在NDS 74.8方面优于所有其他方法。

总结

本文提出了一个前沿的视角“检测作为标注”,用于激光雷达-摄像头融合的3D物体检测。DAL是按照这个视角开发的模板。DAL是一个非常优雅的范例,具有简洁的预测管道和易于训练的过程。尽管在这些方面很简单,但它极大地推动了激光雷达-摄像头融合的3D物体检测的性能边界,并在速度和精度之间实现了最佳的平衡。因此,它对未来的工作和实际应用来说都是一个很好的里程碑。

DAL中没有考虑超出激光雷达范围的对象。本文尝试过通过仅使用点云特征预测密集的热图,并将其与使用融合特征预测的热图进行比较,来区分这种情况。然后,使用另一个FFN在融合特征上预测这些实例的回归目标。然而,这种修改对最终准确性的贡献较小。这是因为 nuScenes 中只注释了具有 1 个以上激光雷达点的目标。此外,在 nuScenes 评估中,范围足够小,确保了足够的激光雷达点用于预测回归方面。

此外,nuScenes数据集中的简单分类任务限制了DAL应用SwinTransformer、DCN 和EfficientNet等高级图像骨干。开放世界分类任务要复杂得多,因此也更加困难。因此,图像分支在实践中可以利用高级图像骨干。

虽然DAL有一个无注意力的预测管道,但它只是一个揭示“检测作为标记”价值的模板。因此,本文使用最经典的算法,而不应用注意力。然而,本文并没有有意将其排除在DAL之外。相反,本文认为注意力是一种吸引人的机制,可以在许多方面进一步发展DAL。例如,本文可以应用像UniTR 这样的高级DSVT主干,应用基于注意力的LiDAR-相机融合,如CMT,以及应用基于注意力的稀疏检测范式,如DETR。

#UniM-OV3D

针对3D open-vocabulary场景理解问题,腾讯优图实验室提出了一个新的统一模态的架构UniM-OV3D,将3D场景的四个模态数据point、image、text和depth map统一到了一个模型中。通过深入挖掘点云本身的特征,对各个模态做细粒度特征的表示,并进行四个模态的对齐,所提出的方法在包含室内、室外场景的四个数据集ScanNet, ScanNet200, S3IDS and nuScenes上均达到了SOTA的效果。

题目:UniM-OV3D: Uni-Modality Open-Vocabulary 3D Scene Understanding with Fine-Grained Feature Representation

论文:https://arxiv.org/abs/2401.11395

代码:https://github.com/hithqd/UniM-OV3D

背景

现有的方法在3D open-vocabulary场景理解问题上要么从2D图像中进行知识蒸馏,再映射到3D空间,要么只使用点云数据进行特征学习和表示。这种缺乏对其他更多模态的表示和对齐阻碍了他们有效处理细粒度点云对象实例的能力,如下图所示。考虑到3D场景的属性,深度信息是深度不变特征聚合的关键模态,但常常被忽视。尽管有一些方法进行了深度信息的探索,但是他们采用的是投影或者是渲染,而且仅仅是和一个模态进行对齐,这并不能充分发挥深度模态的作用。而考虑到点云信息本身的探索, 针对点云的caption learning是很多工作的方向所在,但是现有的工作都聚焦于以2D图像作为桥梁来生成3D点云的caption,这种及间接的caption生成方式并不是真正意义的点云caption learning,而且他们对于点云特征的提取也往往采用单一的冻结的3D提取器。

因此,为了充分利用各种模态的协同优势,本文提出了一个新的多模态对齐方法,将 3D 点云、image、depth map和text共同对齐到统一的特征空间中,以实现更精确的3D open vocabulary 场景理解 。

方法

UniM-OV3D的整体架构如上图所示,点云数据由层次化点云特征提取模块处理以融合局部和全局特征。为了实现coarse-to-fine的文本监督信号,point-semantic caption learning被设计为从各种 3D 视角获取点云的文本表示。整体框架以点云、2D图像、文本和深度图作为输入,为3D open-vocabulary场景理解建立统一的多模态对比学习。

Hierarchical Feature Extractor

以稀疏点云作为输入,本文提出了一种可训练的层次化点云提取器来捕获细粒度的局部和全局特征,而不是仅仅利用冻结的 3D 提取器。输入被引导到transformer网络中,该网络采用基于注意力的层来回归 4×4 变换矩阵。该矩阵包含表示学习的仿射变换值的元素,这些元素用于对齐点云。对齐后,这些点被引入多个堆叠的空间感知层,这些层用于产生这些点的排列不变的特征。在这个结构中,使用PointBERT和PointMAE分别提取局部和全局的特征表示,并使用注意力模块充当两个相邻层之间的连接桥梁进行特征的传递。在通过基于注意力的层处理信息后,所有这些 N 维层的输出被连接起来。最后,可以添加分割头来输出点云的全局信息聚合,提供点云的全面表示。

Point-semantic Caption Learning

在生成点云的caption方面,本文首次尝试直接从点云生成相应的文本,而不是使用图像作为桥梁。我们构建了分层的点语义caption pairs,包括global、eye、sector三个层次的caption,它们可以提供细粒度的语言监督。

如上图所示,基于点云的不同层次生成的caption不仅提供了对场景的更精确和整体的描述,而且还更准确地表示了场景内目标的方向信息以及它们之间的相互关系。

统一模态的对齐

对于得到的四个模态细粒度的表示,本文采用点云和其他模态之间的对比学习损失:

其中文本模态提供全面且可扩展的文本描述,而图像模态提供关于目标和上下文数据的准确指导。此外,深度和 3D 点云揭示了物体的重要结构细节。通过将这些模态统一在一个公共空间中,本文的方法可以最大限度地发挥它们之间的协同优势,从而获得突出的3D open-vocabulary场景理解性能。

实验结果

3D Semantic Segmentation

对于室内场景,在Scannet和S3DIS数据集上,本文的方法在不同的partition上对于hIoU指标的对比上比现有的sota方法分别高3.2%-5.4%,5.5%-7.8% 。

当面对ScanNet200中的长尾问题时,UniM-OV3D比现有最好的zero-shot方法在hIoU上高出5.1%-6.9% ,在mIoU上高出3.5%-5.2%。对于室外场景,UniM-OV3D在新类上比现有方法高4.8%-6.4% hIoU 和 5%-5.6% mIoU。 

3D Instance Segmentation

在实例分割任务中,UniM-OV3D 也hAP50、mAP 50指标上超过了现有的方法:5%-10.6% , 5%-5.3%、 3.1%-13.2% 。

总结

本文针对3D open-vocabulary场景理解问题提出了一个统一模态表示的新架构UniM-OV3D,做到了针对3D场景数据中point、image、text及depth map四个模态的融合。为了充分学习各个模态的细粒度特征表示,本文首先设计了层次化点云特征提取器,而对于点云的caption learning问题,本文首次构建了直接从点云生成相应的文本的caption learning机制。这种统一模态的架构可以充分利用各个模态的优势,这种设计也在室内室外的各个场景中证明了有效性。因此,UniM-OV3D为3D open-vocabulary场景理解提供了一个有效的解决方案。

#LIO-SAM

3D激光SLAM:位姿融合输出,LIO-SAM 提出了一个利用GT-SAM的紧耦合激光雷达惯导里程计的框架。实现了高精度、实时的移动机器人的轨迹估计和建图。这里主要讲解如何通过imu来进行位姿融合输出的。

LIO-SAM的全称是:Tightly-coupled Lidar Inertial Odometry via Smoothing and Mapping,从全称上可以看出,该算法是一个紧耦合的雷达惯导里程计(Tightly-coupled Lidar Inertial Odometry),借助的手段就是利用GT-SAM库中的方法。

LIO-SAM 提出了一个利用GT-SAM的紧耦合激光雷达惯导里程计的框架。实现了高精度、实时的移动机器人的轨迹估计和建图。在之前的博客讲解了imu如何进行预积分,最终以imu的频率发布了imu的预测位姿里程计。

主要讲解,最终是如何进行位姿融合输出的。

 Eigen::Affine3f  

其中功能的核心在于位姿间的变换,所以要了解 Eigen::Affine3f 部分的内容。

Affine3f 是eighen库的仿射变换矩阵。实际上就是:平移向量+旋转变换组合而成,可以同时实现旋转,缩放,平移等空间变换。

Eigen库中,仿射变换矩阵的大致用法为:

创建Eigen::Affine3f 对象a;

创建类型为Eigen::Translation3f 对象b,用来存储平移向量;

 创建类型为Eigen::Quaternionf 四元数对象c,用来存储旋转变换。

最后通过以下方式生成最终Affine3f变换矩阵:a=b*c.toRotationMatrix();一个向量通过仿射变换时的方法是result_vector=test_affine*test_vector;

仿射变换包括:平移、旋转、放缩、剪切、反射。平移(translation)和旋转(rotation)顾名思义,两者的组合称之为欧式变换(Euclidean transformation)或刚体变换(rigid transformation);

放缩(scaling)可进一步分为uniform scaling和non-uniform scaling,前者每个坐标轴放缩系数相同(各向同性),后者不同;如果放缩系数为负,则会叠加上反射(reflection)——reflection可以看成是特殊的scaling;

刚体变换+uniform scaling 称之为,相似变换(similarity transformation),即平移+旋转+各向同性的放缩。

位姿融合输出

在imu预积分的节点中,在main函数里面 还有一个类的实例对象,那就是

TransformFusion TF

其主要功能是做位姿融合输出,最终输出imu的预测结果,与上节中的imu预测结果的区别就是:该对象的融合输出是基于全局位姿的基础上再进行imu的预测输出。全局位姿就经过回环检测后的lidar位姿。

建图优化会输出两种激光雷达的位姿:lidar增量位姿lidar全局位姿

lidar增量位姿就是通过lidar的匹配功能,优化出的帧间的相对位姿,通过相对位姿的累积,形成世界坐标系下的位姿。
lidar全局位姿则是在帧间位姿的基础上,通过回环检测,再次进行优化的 世界坐标系下的位姿,所以对于增量位姿,全局位姿更加精准。

在前面提到的发布的imu的预测位姿是在lidar的增量位姿上基础上预测的,那么为了更加准确,本部分功能就预测结果,计算到基于全局位姿的基础上面。首先看构造函数:

TransformFusion()    {        if(lidarFrame != baselinkFrame)        {            try            {                   tfListener.waitForTransform(lidarFrame, baselinkFrame, ros::Time(0), ros::Duration(3.0));                tfListener.lookupTransform(lidarFrame, baselinkFrame, ros::Time(0), lidar2Baselink);            }            catch (tf::TransformException ex)            {                ROS_ERROR("%s",ex.what());            }        }

判断lidar帧和baselink(通常baselink指车体系)帧是不是同一个坐标系,如果不是,查询一下lidar和baselink 之间的 tf变换,ros::Time(0) 表示最新的,等待两个坐标系有了变换,更新两个的变换 lidar2Baselink:

subLaserOdometry = nh.subscribe<nav_msgs::Odometry>("lio_sam/mapping/odometry", 5, &TransformFusion::lidarOdometryHandler, this, ros::TransportHints().tcpNoDelay());        subImuOdometry   = nh.subscribe<nav_msgs::Odometry>(odomTopic+"_incremental",   2000, &TransformFusion::imuOdometryHandler,   this, ros::TransportHints().tcpNoDelay());

订阅地图优化节点的全局位姿和预积分节点的增量位姿:

pubImuOdometry   = nh.advertise<nav_msgs::Odometry>(odomTopic, 2000);        pubImuPath       = nh.advertise<nav_msgs::Path>    ("lio_sam/imu/path", 1);

发布两个信息 odomTopic ImuPath,然后看第一个回调函数 lidarOdometryHandler:

void lidarOdometryHandler(const nav_msgs::Odometry::ConstPtr& odomMsg)    {        std::lock_guard<std::mutex> lock(mtx);        lidarOdomAffine = odom2affine(*odomMsg);        lidarOdomTime = odomMsg->header.stamp.toSec();    }

将全局位姿保存下来,将ros的odom格式转换成 Eigen::Affine3f 的形式,将最新帧的时间保存下来,第二个回调函数是 imuOdometryHandler,imu预积分之后所发布的imu频率的预测位姿:

void imuOdometryHandler(const nav_msgs::Odometry::ConstPtr& odomMsg)    {
  
  
static tf::TransformBroadcaster tfMap2Odom;        static tf::Transform map_to_odom = tf::Transform(tf::createQuaternionFromRPY(0, 0, 0), tf::Vector3(0, 0, 0));

建图的话,可以认为map坐标系和odom坐标系是重合的(初始化时刻):

tfMap2Odom.sendTransform(tf::StampedTransform(map_to_odom, odomMsg->header.stamp, mapFrame, odometryFrame));

发布静态tf,odom系和map系,他们是重合的:

imuOdomQueue.push_back(*odomMsg);

imu得到的里程计结果送入到这个队列中:

if (lidarOdomTime == -1)            return;

如果没有收到lidar位姿就return:

while (!imuOdomQueue.empty())        {            if (imuOdomQueue.front().header.stamp.toSec() <= lidarOdomTime)                imuOdomQueue.pop_front();            else                break;        }

弹出时间戳小于最新lidar位姿时刻之前的imu里程计数据:

Eigen::Affine3f imuOdomAffineFront = odom2affine(imuOdomQueue.front());        Eigen::Affine3f imuOdomAffineBack = odom2affine(imuOdomQueue.back());        Eigen::Affine3f imuOdomAffineIncre = imuOdomAffineFront.inverse() * imuOdomAffineBack;

计算最新队列里imu里程计的增量:

Eigen::Affine3f imuOdomAffineLast = lidarOdomAffine * imuOdomAffineIncre;

增量补偿到lidar的位姿上去,就得到了最新的预测的位姿:

float x, y, z, roll, pitch, yaw;        pcl::getTranslationAndEulerAngles(imuOdomAffineLast, x, y, z, roll, pitch, yaw);

分解成平移 + 欧拉角的形式:

nav_msgs::Odometry laserOdometry = imuOdomQueue.back();        laserOdometry.pose.pose.position.x = x;        laserOdometry.pose.pose.position.y = y;        laserOdometry.pose.pose.position.z = z;        laserOdometry.pose.pose.orientation = tf::createQuaternionMsgFromRollPitchYaw(roll, pitch, yaw);        pubImuOdometry.publish(laserOdometry);

发送全局一致位姿的最新位姿:

static tf::TransformBroadcaster tfOdom2BaseLink;        tf::Transform tCur;        tf::poseMsgToTF(laserOdometry.pose.pose, tCur);        if(lidarFrame != baselinkFrame)            tCur = tCur * lidar2Baselink;

更新tf:    

static tf::TransformBroadcaster tfOdom2BaseLink;        tf::Transform tCur;        tf::poseMsgToTF(laserOdometry.pose.pose, tCur);        if(lidarFrame != baselinkFrame)            tCur = tCur * lidar2Baselink;

更新odom到baselink的tf:

static nav_msgs::Path imuPath;        static double last_path_time = -1;        double imuTime = imuOdomQueue.back().header.stamp.toSec();        // 控制一下更新频率,不超过10hz        if (imuTime - last_path_time > 0.1)        {            last_path_time = imuTime;            geometry_msgs::PoseStamped pose_stamped;            pose_stamped.header.stamp = imuOdomQueue.back().header.stamp;            pose_stamped.header.frame_id = odometryFrame;            pose_stamped.pose = laserOdometry.pose.pose;            // 将最新的位姿送入轨迹中            imuPath.poses.push_back(pose_stamped);            // 把lidar时间戳之前的轨迹全部擦除            while(!imuPath.poses.empty() && imuPath.poses.front().header.stamp.toSec() < lidarOdomTime - 1.0)                imuPath.poses.erase(imuPath.poses.begin());            // 发布轨迹,这个轨迹实践上是可视化imu预积分节点输出的预测值            if (pubImuPath.getNumSubscribers() != 0)            {                imuPath.header.stamp = imuOdomQueue.back().header.stamp;                imuPath.header.frame_id = odometryFrame;                pubImuPath.publish(imuPath);            }        }    }

发布imu里程计的轨迹,控制一下更新频率,不超过10hz,将最新的位姿送入轨迹中,把lidar时间戳之前的轨迹全部擦除,发布轨迹,这个轨迹实践上是可视化imu预积分节点输出的预测值。

Result

其中粉色的部分就是imu的位姿融合输出path。 

#VoxDet

本文提出基于3D体素表征学习的新颖实例检测器VoxDet。给定目标实例的多视图,VoxDet建立该实例的三维体素表征。在更加杂乱的测试图片上,VoxDet使用体素匹配算法检测目标实例。实验表明,VoxDet中的三维体素表征与匹配比多种二维特征与匹配要更鲁棒、准确与高效。

论文题目:VoxDet: Voxel Learning for Novel Instance Detection

论文链接:https://openreview.net/forum?id=KgqucdSwIe

开源代码:https://github.com/Jaraxxus-Me/VoxDet

ROS部署:https://github.com/Jaraxxus-Me/voxdet_ros

一、引言

实例检测/分割是计算机视觉研究已久的问题。大多数现有的实例检测算法可以从测试图片上获取所有实例的目标框(及其ID代号),在现实生活中,我们很多时候不只需要获得“所有”实例的检测框,还需要得到“某个特定”实例的检测结果(试想,在机场找寻自己的行李箱,在洗衣房找寻丢失的袜子,在停车场找到自己的车等等)。

在本文中,我们探讨了特定新颖实例的检测问题(Novel Instance Detection)。给定任何(可能是训练过程中未见过的新颖的)特定实例的多视图,我们希望在测试图上又快又好的得到检测结果。过往的算法通常是基于物体的二维特征,如二维“局部”特征匹配,二维注意力等等。然而,这类算法有如下三大问题(1)(全局)二维特征匹配对实例的旋转是不稳定的(2)二维特征对于物体的遮挡不够稳定(3)二维匹配通常不够高效(因为每个测试图上的候选框都要和每一张二维多视图匹配)。

反观人类,我们观察,记忆,并搜索一个实例,在脑海中形成的不只是一张张独立的二维图片,而是包含该实例几何的“三维”记忆。基于这种“带有几何的记忆”,即使实例被遮挡或展现出不同的旋转方位时,我们仍能在环境背景干扰下定位该实例。

在这一直觉的驱动下,我们研发了一种基于三维体素表征的实例检测器,VoxDet。它结合了实例的三维几何和二维外观特征,很大程度上解决了纯二维的实例检测器的不足。如下图所示,VoxDet包含三部分,用于从多视图组建Voxel的Template Voxel Aggregation,用于在测试图上生成开放世界候选框的open world detector,和用于比对匹配候选框和template的Query Voxel Matching。

图一,VoxDet与以往二维框架的结构对比

除了方法外,我们发现这类任务也没有很好的基准和数据。大多数以往的研究基于BOP challenge的数据开展实验,他们的参考图片通常是直接从测试集中剪裁的,而不是我们想要的object-centric的多视图。因此,在这项研究中我们也自己制作了虚拟数据集Open World Instance Detection (OWID) 与实录的测试数据集 RoboTools。

图二,RoboTools 数据集中的一些检测示例

二、贡献

  • 我们提出了基于三维体素表征的新颖实例检测器VoxDet,其表现优于多种基于二维表征的检测器。
  • 我们发现三维重建+检测的两阶段训练范式可以大幅提高VoxDet内体素特征的表征能力。
  • 我们也提出了一种体素匹配算法,可以更高效准确得比对两个实例的体素特征。
  • 我们收集、标注了新颖实例检测的虚拟训练集OWID与实际测试集RoboTools。

三、方法

3.1 宏观架构

图三,VoxDet的算法框架

VoxDet的架构如图三所示,测试图(Query Image)首先输入开放世界检测器得到开放世界候选框。这里我们直接采用了结构简单方便端对端训练的OLN (Learning Open-World Object Proposals without Learning to Classify, RA-L, 2022)。与此同时,目标实例的多视图(以及每张视图的相机外参)输入Template Voxel Aggregation (TVA)模块得到该实例的三维体素表征。最后 Query Voxel Matching (QVM)模块比对模版体素与每个候选框的体素特征得到分类结果。

下面具体介绍两个带有三维体素的模块的实现细节。

3.2 Template Voxel Aggregation

实例的多视图二维特征输入TVA模块后,我们参考了VideoAutoEncoder(lai et al., In. ICCV 2021)的做法,直接暴力将2D特征图(feature map)reshape并结合3D卷积得到3D特征体素(feature voxel),这一步称为2D-3D mapping。之后我们将每个独立的Voxel利用相机外参旋转到同一参考系下,最后在这个参考系下取平均得到用于表征这个实例的特征体素(support voxel)。这里由于多视图是目标为中心的,相机的相对旋转可以得到实例每帧相对自己第一帧参考系的旋转,我们在此只使用了旋转没有使用平移。

3.3 Query Voxel Matching

QVA的输入是二维候选框的特征(ROI feature)与目标实例的特征体素support voxel。与TVA中的操作类似,我们首先使用2D-3D mapping得到候选框的3D特征体素。此后,我们使用了一种Voxel Relation运算(具体细节见原文)估计了每个候选框3D体素相对support voxel的旋转矩阵。获得旋转矩阵后,我们将候选框3D体素旋转到和support voxel相同的参考系下。最后,在同一个参考系下,我们使用Voxel Relation运算获取候选框3D体素的分类结果,即每个候选框是否是目标实例。

3.4 两阶段训练范式

图四,两阶段训练范式

上述模型结构听起来简单直观,但是我们发现直接设计这样的结构再端到端训练并不会取得很好的效果,实际上与普通的纯2D方法相差无几。我们发现,想要让VoxDet真正学习到如何通过实例的多视图抽取几何信息(在不同的视角下其外观与形状是什么样的)需要先使用“三维重建”训练上文提及的2D-3D mapping,再将训好的2D-3D mapping作为initialization weights植入检测器的框架中继续微调才能真正实现“可感知几何”的实例检测。

具体而言,这种两阶段范式如图四所示。在第一阶段,我们先输入几个实例的多视图,抽取其二维特征,经过TVA模块获得体素表征。之后,我们用新颖视角的相机外参旋转该体素,再将旋转后的体素解码生成新颖视角的图片。生成的新视角图片与真值之间由perception,gan,和reconstruction三个loss监督(这一操作与VideoAutoEncoder中类似)。这个过程很像Nerf,但VoxDet的重建也只需要在基训练的实例上进行,测试时不需要再针对新颖实例进行test time optimization。

在第二阶段,我们将第一阶段训练好的TVA模块中的2D-3D mapping部分参数拿出来植入进detector,之后再在detection的训练过程中进一步微调。最终训练出的VoxDet才是可感知几何,效果更好的实例检测器。

四、实验

4.1 数据集

现有的数据集绝大多数都是class-level的,因此我们在这项工作中自己搭建了训练集与测试集。

OWID训练集是完全虚拟的训练数据,我们利用Blender虚拟引擎,将ShapeNet和ABO两个3D模型数据集中的实例随机抽取丢进Blender中,之后在一定的范围内随机采样相机位姿,渲染出用于训练的图片、目标框真值,和相机旋转矩阵。

LM-O和YCB-V是半虚拟半真实的测试数据集。我们使用训练数据的制造方式,将LM-O和YCB-V中的实例加载到Blender中获取其多视图作为实例模版,测试图片直接使用BOP challenge官方提供的数据。

RoboTools是完全真实的测试数据。我们在实验室选取了一些机器人实验室常用的工具作为目标实例,手动拍摄了模版多视图与多个场景下的测试图,最终人工标注了这个数据集。

在制作这些数据集时,我们确保了训练集与测试集的实例(甚至是实例的semantic class)都是完全没有重叠的。

4.2 总体评估

在半虚拟半真实的数据集上我们比较了所有方法,包括使用OWID训练的,和使用真实数据训练的方法,结果如下表:

表一,LM-O和YCB-V上的整体评估

其中除了现有的一些实例检测器如DTOID,Gen6D,One-shot检测器如OS2D,BHRL外,我们也自己搭建了一些基于开放世界检测器的基准方法。OLN Corr中我们设计了基于depth-wise convolution的matching head,将每个多视图逐一与候选框比对后选择得分最高的作为比对结果。OLN CLIP和OLN DINO中我们先获取开放世界候选框,然后抽取其CLIP/DINO的特征与模版多视图的CLIP/DINO特征比对(cosine similarity)得到结果。可见在这些基准方法中,我们的VoxDet是效果最好,速度最快的。

在全真实的测试集上,公平起见我们在正文中只比较了完全使用OWID训练的方法,结果见原文表2与Appendix D。

4.3 消融实验

表二,消融实验

消融实验在RoboTools上开展,这里中重点强调重建的作用(表二中红色框)。不使用第一阶段重建,直接训练VoxDet会导致结果与其他2D基准方法相似,无法使用几何信息,重建后才能获得较好的结果。   

五、讨论与未来

VoxDet最大的limitation是sim2real domain gap。由于VoxDet(除了backbone initialization是ImageNet pre-train外)全部由虚拟数据集训练,它在generalize到全真实的数据集上时会有一些domain gap,详见原文Appendix D。进行这项研究之初,我们想严格确保测试实例是模型没见过的,那时也没有很好的基础模型,所以没有使用DINOv2、SAM,而是自己造了训练集从ImageNet pretrain ResNet开始做。如果想要追求更好的performance,或许可以从foundation model极强的feature extractor出发,用freeze的backbone设计feature voxel。

另外,在VoxDet中我们也没有使用vision-language model(Clip,Glip等),原因除了上面说的严格确保新颖以外,针对某个特定实例的description可能很主观,也很难做到100%精确。到底精细到何种程度的description才是适合任意实例detection的?描述实例的不同特征的description里哪些最影响模型的表现?以及我们能不能根据一组多视图生成最适合detect这个实例的description?这些都是很有趣的open problem可以进一步研究。

我们的代码,模型权重,数据,生成数据使用的工具代码,以及所有baseline方法的原始结果均已开源。新颖实例检测仍有很多有意思的问题值得发掘研究,VoxDet也有很大的提升空间,欢迎大家关注、交流与讨论。

六、后记

这项工作完成于2023年上半年,那时大厂们先后发布的SAM,DINOv2可谓是席卷了整个二维感知领域。VoxDet投出的时候没有使用这些foundation model ,所以从performance角度(尤其是真实数据上)讲可能还有不小提升空间。因此我投出时对这篇工作抱有些遗憾和担忧。结果审稿人们和AC给的意见居然都很正面,似乎都很喜欢方法本身的idea和实验的严谨设定。最后SpotLight的结果属实是我意料之外。这件事对我的research taste产生了不小的影响,可能有的时候方法的本质与实验、故事的完整性、一致性要比数据集上能取得的点数要重要

VoxDet可能是我在纯感知领域的最后一篇工作,从2020年开始研究学习视觉目标追踪至今转眼已过了四年,CV领域也似乎逐渐从model driven转为data driven,大数据,大模型似乎正逐渐垄断许多方向。现在我更感兴趣的可能是,单靠扩大数据量、模型体量大力出不了奇迹,而人类却能高效做到的事情。譬如我们学习数学做逻辑归纳与推理时似乎并不需要“背”很多东西,只需要记住、理解一些基础的运算法则我们便能泛化到各种没见过的,困难的推理/算数问题。数理推断在多年前就能被人们搭建的symbolic solver (如微软的Z3-solver)以(几乎)100%的精度解决,而如今就连LLM在这些问题上都依然显得有些笨拙,高效泛化并发现新问题的解可能就更困难了。

让模型既能从海量数据中隐式地“记忆”知识,又能显式地“理解”知识,还能“植入”人类专家的知识,最终实现“可控的”高效泛化这一研究方向有个fancy的名字,叫Neuro-Symbolic Artificial Intelligence。希望自己下一步能对这个尚不成熟的领域做出一些贡献。

Illustration From IconScout By Delesign Graphics

#Real3DPortrait

近期虚拟人方面的应用如同雨后春笋一般涌现出来。你是否在很多 App 中,看到了 AIGC 让单张照片开口说话的能力?尽管已经能够拥有清晰的画质和准确的口型,但现有的单图驱动虚拟人似乎还差了一点:呈现的结果中说话人往往采用和原图中说话人接近的头部姿态,无法像真人一样在画面中自由地运动。这是因为目前采用的技术无法对图片中说话人在 3D 世界中进行建模,因此在大姿态驱动的情况下会出现效果急剧下降的问题。

单图 3D 说话人视频合成 (One-shot 3D Talking Face Generation) 可以被视作解决这一难题的下一代虚拟人技术。它旨在从单张图片中重建出目标人的三维化身 (3D Avatar),随后根据一段输入的语音或动作表征来控制三维化身,进而合成支持大姿态驱动的真实说话人视频。然而,要实现这个目标,学界面临两个主要挑战:(1)无法实现准确的三维化身重建以及稳定的动态人脸控制;(2)现有工作主要关注人脸部分的合成,但忽视了如何生成自然的躯干和背景部分。

为实现高质量、逼真的单图 3D 说话人视频合成,浙江大学与字节跳动提出了 Real3D-Portrait 算法,被人工智能顶级会议 ICLR 2024 录用为 Spotlight。目前已开放源代码和预训练权重。

  • 论文标题:Real3D-Portrait: One-shot Realistic 3D Talking Portrait Synthesis
  • 论文链接:https://arxiv.org/pdf/2401.08503.pdf
  • 项目主页:https://real3dportrait.github.io/
  • 代码链接:https://github.com/yerfor/Real3DPortrait 

话不多说直接看效果,仅需输入单张照片也可以得到如真人一般自由运动的虚拟人视频。

模型内在技术原理

深悉 Real3D-Portrait 模型的内在原理,还要回到开头提到的两个问题:(1)如何准确地为输入图片中的人物进行三维化身重建和稳定地动态人脸控制;(2)如何合理地建模自然的躯干运动和背景画面。

对于第一个问题,团队从网络结构和训练流程两个角度进行了创新。在网络结构层面,设计了一个 Image-to-Plane 模型和一个 Motion Adapter 模型。具体来说,Image-to-Plane 模型的任务是在网络推理的过程中完成目标人物的三维重建,将输入图像转换为 Tri-plane(一种通用的 3D 表征);而 Motion Adapter 的任务是预测完成目标表情所需要对三维化身所做的最小几何修改,以达到控制 3D avatar 表情的目的。由于这两个模块承担了大量跨坐标系变换的工作(比如将图片中的人物映射到本征的三维空间),研究者大量使用了视觉 Transformer 结构。在训练流程层面,为了保证三维化身重建的精确度和鲁棒性,研究团队设计了预训练和微调两阶段流程。

「我们发现 3D 人脸生成模型可以生成海量的高质量、多视角静态人脸数据,于是首先让模型从其中蒸馏学习三维化身重建的几何知识,随后再在视频数据集上微调学习控制其面部表情」,研究团队表示。

图 1. 利用 3D 人脸生成模型对 Image-to-Plane 模型进行预训练以学习三维重建知识

图 2. 在视频数据集上对模型进行微调以学习控制三维化身的表情

在完成动态 3D 人脸建模后,团队提出了 Head-Torso-Background Super-Resolution (HTB-SR)Model, 以完成对躯干部分和背景画面的合理建模,并最终生成 512x512 分辨率的高清图像。HTB-SR 模型的设计采取了分而治之的思想,即针对不同部分的运动特性,采用不同的技术进行建模,并最终通过 alpha-blending 技术将各个部分融合成为完整的图像。具体来说,说话人的头部往往存在偏转、横滚等需要三维空间感知的运动,因此使用前文所述的 Image-to-Plane 模型对其进行建模。与头部的复杂运动相比,躯干部位的运动基本可以用简单的二维画面内的平移、拉伸实现,因此使用目前单图驱动虚拟人领域常用的图像扭曲场(Warping Field)对躯干部分进行建模。

此外,为了保证输出的说话人图像能够和背景无缝地贴合,团队额外设计了一个基于简单卷积网络的 Background Branch 对输入图像的背景部分进行建模。为了支持语音驱动的虚拟人合成任务,团队还基于 GeneFace 的语音驱动模块设计了适用于任意说话人的通用语音转动作(Audio-to-Motion)生成模型。最终,Real3D-Portrait 模型的推理框架图如下图所示,仅需单张图片,即可实现逼真的说话人视频合成,同时支持语音和视频作为驱动条件。

图 3. Real3D-Portrait 模型的整体推理流程

模型的应用前景

总体来看,Real3D-Portrait 模型首次实现了利用先进的单图三维重建技术支持大幅度姿态运动的单图驱动虚拟人视频合成。可以预见的是,随着技术的不断迭代、普及,在智能助手、虚拟现实、视频会议等多个应用场景中都将会出现虚拟人的身影。而借助 Real3D-Portrait,单图驱动的虚拟人算法有望使说话人在 2D/3D 的画面中更真实地「动起来」。

从技术的角度看,随着以 Vision Pro 为代表的空间计算平台的兴起,能够合成三维化身的虚拟人算法或将成为大势所趋,而 Real3D-Portrait 模型则为后续基于三维化身的单图驱动虚拟人算法研究提供了参考。但现阶段 Real3D-Portrait 也并不是完美无缺的,可能是由于数据量较小和样本质量问题,对于在输入图像中被遮挡的区域(如牙齿、侧脸等),模型有时难以产生清晰准确的结果。

总而言之,过去几年,随着单图驱动虚拟人技术的不断进步,口型精度、图像质量已然不断提高;而 Real3D-Portrait 模型的提出,进一步解锁了单图驱动虚拟人的运动自由度,其重建三维化身的特性也赋予了其应用在空间视觉产品的可能性。让我们一同期待虚拟人技术的加速发展,用户也将获得更加极致的视觉体验和生活便利。

#xxx

#xxx
#xxx
#xxx
#xxx

网站公告

今日签到

点亮在社区的每一天
去签到