OnePose++:无CAD模型、无关键点的单张图像位姿估计新范式
2026/9/17 18:02:42 网站建设 项目流程

做机械臂抓取和增强现实位姿估计的同学,大概率都碰到过同一个灵魂拷问:手里只有一台RGB相机、几张现场拍的照片,没有CAD模型,也没有物体表面的纹理细节,到底能不能在一条新物体上快速做一次位姿估计?传统答案通常很残酷——特征点匹配在无纹理物体上一塌糊涂,PnP又绕不开稳定的2D-3D对应。OnePose++这篇工作想解决的,正是"没有CAD模型 + 单张查询图 + 不依赖关键点"这一整套组合问题。它是OnePose系列的第二代,核心理念从"找特征点然后匹配"彻底转向了"稠密对应 + 渲染比较"。

这篇内容适合正在做机器人操作、AR识别、开集物体位姿估计的工程师和研究生,尤其是那些被"没有模型文件"和"物体太光滑"折磨过的人。我严格按照自己复现这个项目的经验来拆解它,不打算只复述摘要,而是把它的设计逻辑、实操细节和我踩过的坑铺开聊清楚。

1. 一个"没有CAD也没有关键点"的位姿估计,值不值得折腾

1.1 拆题:OnePose++标题里的三个反常识关键词

先把标题拆开看,它有三个关键词几乎每个都跟主流的位姿估计范式对着干。

第一个是"One-Shot"。意思是查询阶段只输入一张RGB图像,没有视频序列可以做多视角融合,也不允许用户围着物体转一圈采集数据。这种设置对工业视觉很有吸引力,因为很多场景里物体是突然出现在传送带或者料筐里的,你没法提前设计一场"环绕拍摄"。

第二个是"Keypoint-Free"。过去十年,基于特征点的匹配一直占据主导地位,SIFT、ORB、SuperPoint、LoFTR这些名字大家都很熟。OnePose++直接把这个层级干掉了,不做关键点检测,不做稀疏匹配,而是预测逐像素的稠密对应。这不是简单的换了一个特征提取器,而是整个位姿估计的中间表示都变了。

第三个是"without CAD Models"。经典方法通常从已知CAD模型出发渲染模板,或者提取3D特征用于PnP。OnePose++斩断了这个依赖,只用一组参考图像(reference images)就能完成物体身份绑定。对实际工程来说,这意味着换产线的时候只需要拍几十张照片,而不是去翻产品模型库或者重新做三维扫描。

这三个词叠在一起,实际上释放了一个非常重要的信号:作者想把物体位姿估计从"受控环境 + 模型资产 + 人工标注"的束缚中解放出来,做成一件可以快速迁移的事情。

1.2 传统位姿估计到底卡在哪

传统方法在逻辑上是自洽的:先通过CAD模型得到物体的3D几何,离线提取3D关键点和描述子;在线阶段从查询图像中提取2D关键点,在2D-3D之间做匹配;然后用PnP求解相机位姿,RANSAC筛掉外点;最后用ICP或者局部优化精修。这套流程在纹理丰富、几何明显的工业零件上效果不错,但真实世界不会每次都这么配合。

卡壳的地方基本是这三处:

第一,纹理。塑料外壳、纯色杯子、磨砂金属件,这类表面在相机里几乎是"信息荒漠",提取出来的特征点又少又容易串。特征点的本质检测的是图像梯度结构,无纹理物体在梯度层面就没有多少可检测的"独特标记"。

第二,关键点的可重复性。同一个物体换个视角再拍一遍,关键点位置会发生偏移,尤其是弱纹理区域,检测器经常在相邻几帧里输出完全不同的关键点集合。

第三,对称和重复结构。圆形法兰、饮料罐、圆柱形瓶子,这些物体的表面在不同角度下长得非常接近,稀疏特征匹配很难区分"这个视角"和"那个绕轴转了30度的视角"。

我把关键点匹配比作看书时只靠每页的红色标记来定位内容,弱纹理物体就像一本没有标记的书,阅卷人能力再强也无从下手。OnePose++的思路则是"不给标记,直接把整页文字做成图像比对",换一条完全不同的路。

1.3 这套方法最适合哪类落地场景

从我个人的观察来看,OnePose++最合适的落地场景有三类。

第一类是机械臂无序抓取。工厂里新工件往往没有CAD模型,或者模型与实际注塑批次有公差偏差,传统的基于模型位姿估计很难快速上架。如果能在几分钟内拍摄一组参考图,让系统学会这个工件的"长相"和几何关系,抓取系统就能立刻投入工作。

第二类是AR内容摆放与电商视觉。很多消费品没有全尺寸三维模型,但商家可以提供几张多角度商品图。OnePose++可以帮助AR应用在真实桌面上识别并摆放一个虚拟商品,不需要预先的工程建模。

第三类是服务机器人在开放环境中的感知。用户随手从柜子里拿出一个杯子或遥控器,机器人之前从未见过它,也没有对应模型库。这种"开集"场景下,参考图集很快就位,它比逐个物体维护CAD库要现实得多。

当然它也不是万能的,对于完全无纹理且没有任何几何轮廓的物体,单目RGB做one-shot位姿估计仍然有天花板,这一点后面我会专门展开。

2. 先用参考图集搭出"物体身份",再谈位姿

2.1 用SfM把参考图变成粗3D点云,CAD就退场了

OnePose++的整套流程里,第一阶段是"物体身份构建":准备一组覆盖物体各个视角的参考图像,然后通过运动恢复结构(SfM)算出每张参考图的相机位姿,同时生成物体的三维稀疏点云。

实际做的时候,参考图像来源一般是两种。一种是用RGB相机围着物体转一圈录一段视频,然后均匀抽帧;另一种是直接用多张相机从不同角度拍摄的静态图。无论哪种,SfM都能在大部分场景下解出相机位姿和稀疏三维点。

工具方面大家用得最多的是COLMAP,增量式SfM已经是社区里的标准选择。配置不需要太激进,默认的SIFT特征检测配合"sequential matching"或者"exhaustive matching"都可以。需要注意的一个坑是:参考图的视角覆盖必须充足,最好覆盖一个半球,而不是只在正面拍。否则SfM重建出来的点云只覆盖物体正面一小块,后面的稠密对应和SDF都跟着崩。

在这一步之后,CAD模型已经退场了。物体的几何信息由参考图集和其重建出的点云来表征,新物体上线的成本就从"建模需要几天"变成了"拍图加重建需要几分钟"。

2.2 物体级SDF:比纯点云更适合做可微优化

拿到SfM点云之后,直接拿点云做位姿优化行不行?行,但在可微渲染和render-and-compare的框架里并不方便。点云是离散的,没有连续表面的概念,梯度在点与点之间会断裂。OnePose++在参考阶段会进一步把物体几何拟合成为一个SDF(Signed Distance Function,符号距离函数),也就是在三维空间里建立一个标量场,物体表面所在的位置函数值为0,物体外部为正,内部为负。

为什么要绕这一步?因为SDF天然适合做可微渲染和位姿精修。你可以在表面附近对SDF求梯度,从而把"渲染图与查询图不一致"的误差逐步反传回6自由度位姿参数。这就像在山上通过测量海拔高度来定位等高线一样,比单纯依赖一棵一棵树的离散坐标要稳定得多。

实际拟合SDF的方式有很多,常见做法是从SfM得到的稠密点云出发,用体素网格或轻量神经场去逼近一个有符号距离场。有RGB-D相机的情况下,可以把深度图直接融合进SDF构建,这样得到的几何会更厚实;只有单目相机的话,就用SfM点云加单目深度估计来补。

作者团队在论文里用的是物体级SDF,这一点很关键。它不是在整张场景上建场,而是把目标物体从背景中分离出来,只对物体占据的空间做建模。好处是后续渲染时的遮挡关系更清晰,优化时也不会被背景拖累。

2.3 单目深度估计如何补上"最后一公里"

只靠SfM稀疏点云是远远不够的,因为后续想在查询图像的每个像素上都建立2D-3D对应,必须知道参考图像中每个像素对应的3D位置。稀疏点云只在少数特征点上有深度,无法支撑逐像素的映射。

所以OnePose++这类方法往往会引入单目深度估计网络来补完参考图的像素级深度。用DPT这类预训练模型,为每张参考图生成一个稠密深度图,但单目深度估计有一个老问题:它预测出来的深度尺度和真实物理尺度不一致。

好在SfM已经给出了相机位姿和真实尺度信息,所以可以把单目深度做一次全局对齐,缩放和平移SfM点云尺度,让深度图在尺度上逼近真实值。这样,每个参考图像素有了深度,再配合对应相机位姿,就能把每个像素背投到三维空间中去,形成一个稠密的三维点云。

如果手头有条件,直接用RGB-D相机采集参考图是最省心的方式,深度误差远小于单目估计。但纯单目的方案也让这套方法在没有深度传感器的老产线上具备了可落地性,这是它很加分的地方。

3. DenseCorrespondenceNet:把匹配问题变成学习问题

3.1 为什么稀疏关键点在真实物体上不够用

OnePose++里最核心的模块是DenseCorrespondenceNet,一个专门用来预测稠密对应的网络。要理解它为什么是Keypoint-Free的,得先想明白另一个问题:既然SuperPoint、LoFTR已经这么强了,为什么还要另起炉灶?

这些先进匹配器本质上仍然在寻找图像中"足够独特"的局部结构。所谓独特,就是可以被稳定检测、被准确描述的东西。但真实的物体表面经常缺乏这种结构。一个纯色杯子、一个磨砂圆管、一块没有任何刻字的金属盖板,它们的图像梯度非常微弱,关键点检测器找不到足够多、足够稳定的点。即便LoFTR这种基于Transformer全局匹配的方法能给出相对稠密的匹配,它在本质上还是以"找到可区分位置"为导向的,面对极度弱纹理或重复纹理时,匹配结果会产生大量歧义。

OnePose++的取舍是:不要关键点这个中间人。它让网络直接回答一个更原始的问题——查询图里的每一个像素,到底对应参考图里的哪个像素?这是一个逐像素的稠密对应场预测,本质上已经超越了"特征点检测 + 描述子匹配"的经典管线。

3.2 稠密相关体与soft-argmax:核心数学直觉

DenseCorrespondenceNet的输入是查询图和参考图,输出是两张图之间的稠密对应关系。这一步背后的实现思路,在视觉社区里已经比较成熟,可以拆成三个步骤理解。

第一步,把查询图和参考图分别输入一个共享编码器,得到两张高分辨率特征图。编码器的选择可以是卷积网络带FPN,也可以是视觉Transformer,目标都是把语义和局部纹理信息编码成逐像素的特征向量。

第二步,计算两个特征图之间的相关性矩阵,也就是"相关体"(correlation volume)。简单来说,对于查询图上任意一个位置,它和参考图上每个位置都可以算一个特征向量内积,形成一个二维的响应热图。这个热图表达了"查询图这一像素在参考图各个位置上的相似度分布"。

第三步,使用soft-argmax把热图转化为连续的亚像素坐标。对响应图做softmax,再对坐标位置求期望,得到的就是一个可微的、能输出浮点精度的对应坐标。soft-argmax的好处是它可导,这让整条梯度通路从位姿参数一直连到网络权重都是畅通的。

最终得到的结果是一张稠密的2D-2D对应图,再结合参考图的深度图,就能把查询图像的每个有效像素映射到物体三维坐标。这种设计等于把原来"检测关键点 + 描述 + 匹配"的离散流程,换成了一个端到端可学习的连续回归问题,相关性构建得非常自然。

3.3 训练数据与一致性约束:不止是有监督这么简单

训练DenseCorrespondenceNet的时候,最理想的情况是拿到大量带真实对应关系的数据对。但真实场景中逐像素标注对应关系非常昂贵,所以实际训练通常采用合成数据加真实数据混合、再辅以多种自监督约束的方案。

合成数据很容易生成:渲染物体在不同视角下的图像,利用已知相机位姿和深度图,可以直接算出每一对像素之间的真实对应关系。用这种方式做预训练,让网络先具备一个原始的相关性感知能力。

真实数据阶段,常见做法是利用已有的粗匹配器(比如LoFTR或SuperPoint生成的匹配)作为伪标签,或者引入循环一致性约束。循环一致性的意思是:查询图某个像素对应参考图某个位置,那么参考图那个位置再反查查询图,应该回到原来的像素附近。这个约束可以显著抑制错误对应,尤其是在对称物体和重复纹理区域。

对称物体还有一个特别的问题:绕轴旋转后的外观几乎不变,网络可能会在多个等价位姿之间犹豫。应对方法通常是采用对称感知的对应损失,在损失函数里考虑物体本身的对称群,允许"同一外观的多个对称对应"共享损失下降路径,而不是强制网络硬拟合一个其实并不唯一的目标。

4. Render-and-Compare:从"假设-验证"到"梯度下降"

4.1 为什么PNP+RANSAC在无关键点下会失效

看到这里你可能已经发现,DenseCorrespondenceNet输出的是一堆稠密对应,但OnePose++并没有走我们熟悉的"用对应关系 + PnP + RANSAC求解位姿"老路。为什么不走?

PnP的输入是若干组可靠的2D-3D对应,它本身的数值解法很成熟,RANSAC又能在一定比例外点存在时保持鲁棒。但这一切成立的前提是:匹配质量足够好,外点比例足够低。在无纹理或重复纹理物体上,稠密对应虽然比稀疏关键点多了很多,但里面也夹杂着不少噪声和错误对应;如果把这些带噪对应直接塞给PnP,RANSAC的迭代次数会暴涨,解出来的位姿也容易在某些"半对半错"的对应分布下落入局部最小值。

OnePose++换了一个思路:先产生一个粗位姿假设,然后把这个假设放到"渲染-比较"回路里做非线性优化。这个思想有点像Lucas-Kanade光流里的图像配准,把位姿估计当成"让模板渲染结果与观测图像尽可能一致"的图像对齐问题,而不是"找到几个点然后解方程"的代数问题。

4.2 可微渲染的比较回路怎么设计

Render-and-Compare的回路可以分四步走。

第一步,给定当前位姿假设,利用物体级SDF做渲染,生成物体在该位姿下对应的图像。这一步要用到可微渲染器,典型做法是光线步进(ray marching),从相机光心出发发射大量光线,用SDF的连续场求出光线与物体表面交点,再获取对应特征或颜色。

第二步,把渲染结果与查询图像的特征图放到同一个特征空间里比较。直接比较RGB值对光照太敏感,工程上更常比较的是由特征提取网络输出的高层特征,或者在多个分辨率尺度上同时比较。这样既保留了几何轮廓信息,又降低了对绝对颜色和光照的依赖。

第三步,把渲染-比较的误差(比如逐像素特征距离的加权和)通过可微渲染器反向传播到位姿参数上,用梯度下降更新位姿。因为SDF是连续的,渲染过程是可微的,所以这条梯度通路是完整的,位姿参数会朝"渲染结果更像观测"的方向移动。

第四步,重复多轮迭代直到收敛。实际实现中,通常会从低分辨率渲染开始粗对齐,再逐步提高渲染分辨率和特征尺度做精修,这样既能避免陷入局部极值,又能兼顾运行速度。

4.3 从粗到细的位姿精修与多视图约束

粗位姿从哪里来?OnePose++不是完全放弃对应关系,它在初始阶段仍然会利用DenseCorrespondenceNet的输出做一次轻量求解,得到一个大致差不多的位姿初值。区别在于,这里不再指望初值一步到位,只要它落在正确的收敛域内就行,后续交给render-and-compare精修。

这个过程很像先"把拼图大致拼到一起",再"盯着拼图细节一块块压实"。粗阶段容忍一定的对应噪声,细阶段用全局几何一致性把噪声逐步磨掉。

如果实际应用中有连续的视频流而不是单张图,还可以进一步把多帧位姿放在一起做联合优化,利用时间一致性约束抑制每一帧单独估计时的抖动。这也是OnePose系列在动态场景下能保持稳定跟踪的一个隐藏技巧。

5. 实测踩坑:复现OnePose++最容易翻车的四个环节

5.1 参考图像的拍摄质量比你想的更敏感

我在自己项目里第一次跑通OnePose++时,以为参考图随便拍一拍就行,结果栽了个大跟头。因为我用手机围着物体转了一圈,但转得太快、画面模糊,加上镜头曝光在亮背景和暗背景之间跳变,SfM重建出来的点云稀疏得可怜,后面的SDF拟合出来一块"豆腐渣几何",位姿估计自然半天调不回去。

参考图的采集是有讲究的:第一是视角覆盖,争取让物体表面每个可见部分至少在两张图里出现,最好覆盖一个半球范围;第二是光照尽量均匀,避免高光、过曝、大面积阴影;第三是帧与帧之间的运动不要太大,如果录视频抽帧,间隔几帧抽一帧比连续帧抽更合理。采集完之后,我还会用COLMAP重建时输出的重投影误差做一次帧过滤,误差高的帧直接丢弃再重建一轮。这步对后续精度提升非常明显。

5.2 对称物体的表面匹配陷阱

对称物体是位姿估计领域的老大难,OnePose++也没能彻底绕开它。一个圆柱形杯子的参考图绕轴旋转30度之后,外观几乎一模一样,DenseCorrespondenceNet输出的对应关系在多个"等价位姿"之间摇摆,render-and-compare也容易收敛到其中一个合法解上。

针对这个问题,我建议在做评测和部署时都使用对称感知指标,也就是允许位姿误差在物体的对称群下做归一化。对于机械臂抓取,实际的判断标准往往是"夹爪能不能成功抓取",而不是"角度误差是不是小于5度",所以只要渲染出来的视觉外观接近真实观测,对称歧义是可以接受的。在训练时用对称感知损失,比后期硬约束要有效得多。

5.3 深度估计误差如何被SDF放大

如果你没有RGB-D相机,只能靠单目深度估计补参考图深度,那一定要小心这个坑:单目深度估计算法在物体边缘和薄壁结构上经常出现深度突变或弥散,经SfM尺度对齐后仍然存在非刚性的误差。这些误差进入SDF拟合之后,会被平滑成一个"看起来不太对劲"的几何体,进一步影响渲染比较的梯度。

我的经验处理办法有三个。第一,在SfM点云上做离群点剔除,比如依据重投影误差和三角化角度过滤。第二,深度图与SfM对齐时不要只做全局缩放,最好按局部区域做一次细粒度对齐。第三,SDF拟合时给远离点云的区域施加平滑正则,防止它出现不必要的几何漂移。

5.4 显存与batch size:量化速度的取舍

OnePose++最大的工程痛点是显存占用。稠密相关体的计算量随特征图分辨率呈二次增长,如果你在1080P原图上直接构建查询图和参考图之间的相关体,显存会瞬间爆掉。

我实际操作下来常用的配置是把输入分辨率缩放到480p左右,或者对参考图做一次检索筛选——先用全局描述子找到最相似的几张参考图,再对这几张图分别计算相关体。这样既能把显存控制在单卡可承受范围内,也能提升匹配质量,因为全局检索本身已经排除了大量明显不相关的参考图。

推理速度方面,用一块中高端GPU,粗位姿加精细优化整体大概在几十到两百毫秒之间,具体数值取决于迭代次数和渲染分辨率。实时性要求特别高的场合,可以降低精修迭代次数或者把精修放到跟踪阶段再做,查询阶段先要一个够用的粗位姿。

6. 和主流方案横向对比:什么时候选择OnePose++,什么时候别选

6.1 OnePose++ 对比传统特征匹配位姿估计

直接拆开对比的话,OnePose++和传统方法之间有几条明显分界线,我放在下面这张表里。

维度传统特征匹配位姿估计OnePose++
CAD模型依赖通常需要不需要
输入要求单张或多张RGB/RGB-D单张RGB查询图 + 参考图集
关键点依赖,注册阶段要稳定检测不需要
弱纹理表现差,关键点数量不足较好,靠稠密对应兜底
对称物体容易产生歧义失效需要对称感知的损失和评估
工程准备时间建模/扫描周期长几分钟拍一组参考图
推理阶段费用较低相对更高,包含渲染迭代

这张表最大的信息量在于"工程准备时间"这一行。传统方案在精度稳定时确实强悍,但前期模型资产准备非常重;OnePose++把这个代价削到了极低,这对快速换型生产场景来说价值巨大。

6.2 OnePose++ 对比CAD-based的RGB-D方法

CAD-based的RGB-D方法在机器人抓取中也非常流行,比如PVN3D、FFB6D这一系,它们利用RGB-D点云做特征提取,通过投票/匹配直接回归物体位姿,精度在已知物体上相当能打。但它们的共同前提是:每个待抓取物体都有一个精确的三维模型参与训练或注册。

差异在于,CAD-based方法把"几何先验"透支得很彻底,换来的是高精度和高稳定性;OnePose++不依赖精确几何,换来的是快速迁移新物体的能力。一个典型的场景对比:产线上有一千个不同的工件,每个都有CAD模型,用CAD-based方法可以做到很高精度;但如果每周都有几个新工件进来,且没有设计数据,那OnePose++这类参考图方案就明显更合适。实际项目里也可以做一个混合架构:已知物体走CAD-based,未知或新工件走OnePose++的参考图流程,两条线互补。

6.3 我的选型建议

基于我测试的结果和社区里已有的反馈,我的选型建议是这样的:

  • 如果物体表面极度光滑、完全没有纹理,并且你只有单目RGB相机,OnePose++只能说"能用但不一定稳",这种情况我更建议上结构光或RGB-D传感器,或者用偏振相机补充几何线索。
  • 如果场景允许你快速拍摄参考图,但物体种类变化频繁,OnePose++几乎是目前最值得先试跑的方法。先把参考图拍好,再跑通SfM与DenseCorrespondenceNet,通常能很快判断这个物体适不适合这条路。
  • 如果你追求的是已知物体上的极致位姿精度,手里又有CAD模型,那CAD-based的RGB-D方法依然是第一选择,OnePose++的强项不在榨干最后一个毫米级精度。

我实际跑下来的最大感受是,OnePose++更大的贡献不是把精度刷到某个榜单第一,而是重新定义了一条工作流——它把"给一个物体做位姿估计"的门槛,从"建模和标注"降到了"拍一组照片"。这套思想在机器人抓取和AR应用里是能直接产生价值的东西。最后分享一个对我帮助很大的小技巧:在SfM重建阶段不要做一个一次性流程,先粗跑一遍,把重投影误差高的参考帧删掉或重拍,然后基于过滤后的帧再跑一遍完整重建。这一步多花十分钟,换来的是后面整个SDF精度的质变,特别是对弱纹理物体,效果肉眼可见。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询