从一张室内照片里框出一把椅子,和把一份具体的椅子 CAD 模型严丝合缝地摆进相机三维坐标系,难度完全不在一个量级。

前者只需要识别二维语义轮廓;而后者不仅要判断椅子朝向哪边(三维旋转 RR)、离镜头有多远(三维平移 tt),还要算出它在长、宽、高三个方向上分别被拉伸或压缩了多少倍(三维各向异性尺度 SS)。更棘手的是,真实照片里的椅子往往被书桌挡住了一半,单目估计出的深度图带着畸变,而你从三维资产库里检索出来的候选 CAD 模型,本来就和照片里的实物不是同一款椅子——可能扶手更宽、靠背更矮,而且还是没有纹理的白模。

面对这一连串麻烦,卢森堡大学与萨拉戈萨大学团队提出的 SUFLECA: Scaling Up Feature Learning for CAD-to-image Alignment(官方代码)交出了一份极具启发性的答卷:单张 RTX 5090 上平均只需 0.53 秒 和 2.1 GB 显存,就能在完全没见过 ScanNet 姿态标注的前提下,把零样本 9D 对齐准确率推到 33.4% / 42.3%,甚至反超了多款在目标数据集上全监督训练的方法。

如果透过具体的公式和实验看本质,SUFLECA 的成功建立在四条环环相扣的设计哲学之上:

  1. 神经网络停在“表征接口”,把空间变换求解还给经典几何(Neural Features + Classical Registration):不让神经网络黑盒回归旋转矩阵,也不做耗时数秒的在线渲染比对(Render-and-Compare),而是让神经网络专心解决“跨真实照片与合成白模的像素级部位认亲”,再把三维旋转、平移和尺度的组合优化交给拥有严格数学保证的鲁棒几何求解器。
  2. 用 3D 规范坐标做“训练脚手架”,却用高维特征做“推理匹配”(Supervise with 3D Coordinates, Match in High-D Space):原生视觉基础模型(如 DINOv3、DUNE)分不清椅子的左前腿和右后腿,所以训练时必须加上三维规范坐标(NOC)监督,强迫网络学会空间方位;但到了推理时,作者却果断扔掉预测 3D 坐标的输出头,退回前一层用 384 维特征做匹配——既享受了三维几何塑形的红利,又避开了把对称物体的多解不确定性硬压成 3 个标量坐标所引发的信息坍缩。
  3. 保留 2D 多视角渲染图,拒绝过早向 3D 网格顶点坍缩(View-Space Caching over 3D Vertex Aggregation):不在三维网格顶点上平均多视角特征,而是直接缓存候选 CAD 在 6 个规范视角下的二维特征图。这不仅让视觉编码器始终工作在熟悉的二维图像网格上,更从物理上杜绝了“把物体背面不可见的点混进正面视角做匹配”的隐患。
  4. 用点对平方距离消去未知旋转,在 RANSAC 前解耦各向异性尺度(Rotation-Invariant Scale Consensus):三轴独立缩放破坏了刚体的等距性,但旋转矩阵本身不改变向量长度。利用任意两点做差后的平方距离,可以在完全不知道旋转和平移的情况下,先把三轴缩放比例通过线性回归估出来,进而用谱图主特征向量把几何自洽的内点团簇筛出来。

下面我们就顺着这四条设计哲学,结合论文推导与开源仓库代码,由浅入深拆解整套系统的来龙去脉。


1. 为什么 9D CAD 对齐这么难?任务边界与路线权衡

1.1 9 自由度变换的数学含义与“等距性破缺”

设候选 CAD 模型在自身规范坐标系下的三维表面点集为 Xcad\mathcal X_{\mathrm{cad}}。单图 9D 对齐的目标,是求出一个将 CAD 模型放进相机坐标系 Xcam\mathcal X_{\mathrm{cam}} 的仿射变换:

Xcam=RSXcad+t,R∈SO(3),S=diag⁡(sx,sy,sz),t∈R3.\mathcal X_{\mathrm{cam}}=RS\mathcal X_{\mathrm{cad}}+t, \qquad R\in SO(3),\quad S=\operatorname{diag}(s_x,s_y,s_z),\quad t\in\mathbb R^3.

为什么是 9 个自由度?三维旋转矩阵 RR 虽然有 9 个数字,但受正交群 SO(3)SO(3) 约束只有 3 个独立自由度;加上三维平移 t=(tx,ty,tz)⊤t=(t_x,t_y,t_z)^\top 的 3 个自由度,以及对角矩阵 S=diag⁡(sx,sy,sz)S=\operatorname{diag}(s_x,s_y,s_z) 沿物体长、宽、高三个主轴的独立缩放比例,正好是 3+3+3=93+3+3=9 个自由度。

这里最关键的设计取舍就是引入各向异性尺度 (sx,sy,sz)(s_x, s_y, s_z)。在工业资产库检索中,你几乎不可能搜到和照片里长宽高分毫不差的原版 CAD 模型:照片里的双人沙发可能比检索出的标准沙发模型宽了 30%,但高度和进深差不多。如果只允许统一尺度缩放(7D 对齐),把宽度拉够了,沙发靠背就会变得像城墙一样高。

然而,允许三个轴独立缩放也付出了沉重的几何代价:它打破了刚体变换的等距性(Isometry)。在普通 6D 刚体配准中,CAD 模型上相距 0.5 米的两个点,变换到相机坐标系后依然相距 0.5 米,我们可以轻易靠“距离不变”剔除 90% 的错配外点;但在各向异性缩放下,横着长的点对按 sxs_x 拉伸,竖着长的点对按 szs_z 拉伸,传统的欧氏距离比值过滤彻底失灵。这也是后文第 4 节专门设计“各向异性尺度共识机制”的直接原因。

1.2 三条主流技术路线的工程权衡

SUFLECA 在 ScanNet25k 上的准确率、速度与显存比较

围绕“怎样从单张图算出 R,S,tR, S, t”,现有方法大体分化为三条路线(对应 Fig. 1 中的不同气泡簇):

技术路线代表工作核心工作方式为什么难以兼顾精度与效率?
1. 直接姿态回归(Direct Regression)Mask2CAD、Total3D、ROCA 回归分支从检测框图像特征直接通过 MLP 预测旋转、平移与尺度参数强依赖目标数据集的 3D 姿态标注;网络必须硬背特定相机的内参与物体类别分布,跨域泛化能力弱,遇到对称物体极易输出折中废解
2. 渲染比对优化(Render-and-Compare)SPARC、MultiObj-SPARC、FoundationPose 精化从粗初始位姿出发,在循环中反复渲染 CAD 模型并与图像掩码/特征做梯度更新或评分虽能抠出细粒度轮廓对齐,但每次迭代都要在线渲染,单物体耗时动辄 2~13 秒、显存开销大,且初值偏差大或重度遮挡时极易卡在局部极小值
3. 对应点匹配 + 几何配准(Correspondence + Registration)ZeroCAD、Diorama、SUFLECA神经网络只负责建立图像像素与 CAD 表面点之间的 3D-3D 对应关系,再交给 RANSAC 求解变换神经网络与几何估计解耦,无需目标域 9D 标注即可泛化;真正的难点在于如何让跨域特征匹配算得既准又快,且不被重复纹理的外点冲垮

看 Fig. 1 的横纵坐标对比:SUFLECA 把单实例推理速度推进到了每秒约 2 个物体(0.53 秒/个),峰值显存压到 2.1 GB,同时准确率跨过了代表全监督方法平均水平的虚线。

在进入细节前,有必要先厘清这个领域里的一个关键评测背景:什么是 CAD 对齐里的 zero-shot(零样本)?

在三维场景理解全链路中,从单张照片构建 CAD 场景其实包含一串上下游模块:目标检测/分割(框出椅子像素)→\rightarrow 单目度量深度估计(把二维像素反投影成三维点云)→\rightarrow CAD 检索(Retrieval)(从资产库挑出最像的椅子模型)→\rightarrow CAD 对齐(Alignment)(算出 R,S,tR,S,t 把模型摆进去)。SUFLECA 论文明确界定:其 zero-shot 指的是在 Alignment 阶段完全不使用目标测试集(ScanNet25k)的图像或 9D 姿态真值进行训练;而在 ScanNet25k 主表评测中,为了和过往方法公平对比对齐器本身的能力,所有方法统一共享了上游 ROCA 的检测框与检索结果、SAM2 掩码以及微调过的度量深度(后文第 6 节我们会专门剖析当把上游也换成全零样本检索时,性能会发生怎样的变化)。


2. 核心设计哲学一:用 NOC 弱监督给基础模型特征“装上三维罗盘”

2.1 为什么不能直接拿 DINOv3 或 DUNE 的特征做匹配?

今天做视觉匹配,大家的第一反应往往是直接拿预训练好的视觉基础模型(如 DINOv2/v3,或者融合了 2D/3D 多教师蒸馏的 DUNE)提取密集的 Patch Token,算余弦相似度找最近邻。但如果你直接拿原生 DINOv3-L(1024 维)或 DUNE-B(768 维)去跑 ScanNet25k 的 CAD 对齐,实例准确率只有可怜的 15.1% 和 16.6%。

为什么这么强的视觉基座在 CAD 对齐上会水土不服?

  1. 外观域差(Domain Gap)大于几何共性:真实室内照片有复杂的光影、木纹、布料褶皱和杂乱背景,而资产库里的 CAD 渲染图往往是干净的灰白漫反射几何体。原生特征很容易被表面材质和光照带偏。
  2. 部件语义不变性成了几何配准的毒药:对比学习训练出的语义特征致力于把“同一类部件”聚在一起——在 DINO 看来,椅子的“左前腿”和“右后腿”都是椅腿,特征向量几乎一模一样。但对于 3D 配准而言,把左前腿匹配到右后腿,意味着旋转矩阵直接转错了 180∘180^\circ!几何配准真正需要跨越单纯的“这是椅腿”类别标签,精确分辨出“这是物体规范坐标系下左前下角 (0.1,0.1,0.0)(0.1, 0.1, 0.0) 处的椅腿”。
  3. 高维冗余拖慢在线检索:768~2048 维的特征在缓存多视图模板和计算密集点对内积时,显存和矩阵乘法耗时都偏重。

2.2 引入 NOC(归一化对象坐标)弱监督与 12 数据集构建

怎么教会特征提取器区分“左前腿”和“右后腿”?答案是引入 Normalized Object Coordinates(NOC,归一化对象坐标) 作为辅助训练目标。

NOC 的概念非常直观:把每一个 CAD 模型放进一个边长为 [0,1]3[0,1]^3 的标准单位立方体盒子中(中心对齐、主轴对齐)。这样,物体表面上的任意一个点,都有一个唯一的三维坐标 n=(x,y,z)∈[0,1]3\mathbf n=(x,y,z)\in[0,1]^3,通常可视化为 RGB 彩色图(例如 xx 映射红、yy 映射绿、zz 映射蓝)。左前腿和右后腿虽然长得一样,但它们的 NOC 坐标截然不同;而在同一个椅背曲面上,相邻像素的 NOC 坐标则连续平滑变化。

SUFLECA 多数据集 RGB、NOC 与合成配对示例

早期工作 ZeroCAD 也用过 NOC 监督,但它只在 9 个类别、30 万张干净的单物体合成渲染图上训练,一遇到真实房间里的遮挡和杂乱背景就容易失效。SUFLECA 的做法是把弱监督数据规模和场景复杂度直接推高一个数量级——整合了 9 个真实世界数据集与 3 个合成数据集,共计 674,851 张图像帧,包含约 228 万个标注物体实例(平均每帧 3.38 个物体):

SUFLECA 训练数据集统计

看上面这张数据构成表(Table I),有三个极其关键的数据工程细节决定了最终特征的质量:

  • 高密度多物体遮挡场景:像 Hypersim 平均每帧有多达 13.55 个物体,3D-FRONT 平均每帧 6.43 个,ARKitScenes 平均 3.55 个。网络在训练时天天面对“椅子塞在桌子底下、茶杯摆在茶几上”的局部遮挡与多物体边缘交界,被迫学会靠局部可见区域推断整体规范坐标。
  • “真合配对(Synthetic Counterparts)”与故意换模:如 Fig. 2 第三行所示,对于带 CAD 姿态标注的真实图像,作者在近似相同的相机位姿下专门渲染了一张合成配对图。妙就妙在,渲染这张合成图时,不仅随机更换了背景和表面纹理,还按一定比例故意把原 CAD 模型替换成了外观相似但局部几何略有差异的另一个同类 CAD 实例!这相当于在数据层直接模拟了在线推理时的真实处境:“你要拿一张真实照片,去和一个纹理不同、甚至形状都只差不离的合成 CAD 渲染图做部位对齐”。
  • 五步反投影 NOC 派生与自动验毒流水线:很多真实数据集并没有现成的像素级 NOC 真值。作者为此设计了一套自动派生与清洗管线:
    1. 用已知 CAD 与粗略 3D 位姿投影出 2D 包围框;
    2. 把包围框喂给 SAM2,抠出贴合真实物体边缘的精细像素掩码;
    3. 读取掩码内像素 (u,v)(u,v) 的深度值 dd,按相机内参反投影成相机坐标系下的三维点 q(u,v,d)=[(u−cx)d/fx, (v−cy)d/fy, d]⊤\mathbf q(u,v,d) = [(u-c_x)d/f_x,\ (v-c_y)d/f_y,\ d]^\top;
    4. 乘上真值位姿 (R,S,t)(R,S,t) 的逆变换,将三维点映射回 CAD 规范空间,得到反投影派生的 NOC 图;
    5. 双向一致性校验:把第 4 步反投影算出的 NOC 图,与直接渲染 CAD 模型得到的可见表面 NOC 图叠在一起比对——如果某个实例的平均坐标误差超标(比如 SAM2 掩码漏到了背景墙面上、或者反光表面深度值飞了),直接剔除该实例;如果整张图剩下的有效 NOC 像素太少,整帧丢弃。同时对 ScanNet、RealEstate10K 等视频流做固定时间步下采样与最小相机位移过滤,剔除相邻帧重复视角。

2.3 “训练用 NOC 头,推理扔掉 NOC 头”:为什么这步设计是点睛之笔?

SUFLECA 特征模型架构

看 Fig. 3 的网络结构,SUFLECA 的特征提取器由三部分串成:

  1. 完全冻结的 DUNE 编码器:主模型用 DUNE-B(总参数约 102M),轻量版 SUFLECA-S 用 DUNE-S(总参数约 29M)。在 12 个异构数据集上联合训练时,把底层 ViT 主干彻底锁死(源码 extractor.py 中不仅设置 requires_grad=False,还重写了 train() 强制主干永远保持 eval() 模式),既省去了维护主干梯度的显存开销,又防止参差不齐的多源伪标签把基础模型原本优秀的通用视觉表征冲坏。
  2. 可训练的 DPT 多尺度融合头:从冻结主干的多个中间 Transformer 层抽出 Patch Token(剥离 class token 与 register token),重排回二维网格并经多尺度残差卷积融合上采样,输出通道维数为 d=384d=384(轻量版 d=256d=256)、且沿通道维做了严格 ℓ2\ell_2 归一化的稠密特征图 FDPTF_{\mathrm{DPT}}。
  3. 仅在训练期存在的浅层离散化 NOC 头(Binned NOC Head):在 DPT 特征图后面,接一个只有两层浅卷积的预测头,把 x,y,zx,y,z 每个坐标轴各自均匀划分为 m=64m=64 个离散区间(轻量版 m=50m=50 个区间)。设某个轴上第 jj 个区间的中心坐标为 cjc_j、预测 logit 为 aja_j,则像素在该轴上的连续预测坐标由 softmax 期望恢复:
n^=∑j=1mcj softmax⁡(a)j.\hat n=\sum_{j=1}^{m}c_j\,\operatorname{softmax}(a)_j.

训练损失同时优化真实区间上的交叉熵 LCE\mathcal L_{\mathrm{CE}}(快速锁定粗略部位)与连续期望坐标上的 ℓ1\ell_1 绝对误差(精细对齐区间内部位置):

LNOC=LCE+λ∥N^−N∥1,λ=0.33.\mathcal L_{\mathrm{NOC}} =\mathcal L_{\mathrm{CE}} +\lambda\left\lVert\hat{\mathcal N}-\mathcal N\right\rVert_1, \qquad \lambda=0.33.

现在思考一个核心问题:既然已经训练出了能预测三维坐标 N^∈[0,1]3\hat{\mathcal N}\in[0,1]^3 的 NOC Head,为什么到了测试推理时,作者却把整个 NOC Head 直接扔掉,退回前一层拿 384 维的 FDPTF_{\mathrm{DPT}} 特征去做余弦相似度匹配?

这正是整篇论文最聪明的设计哲学所在:

  • 为什么训练时NOC Head 必须极浅(只有两层卷积)? 因为如果预测头本身是个深层大网络,复杂的几何推理就会被藏在预测头内部,前面的 DPT 特征层依然只输出普通的语义特征。把预测头压到极浅的两层卷积,就相当于逼着前面的 384 维 DPT 特征必须亲自把三维规范几何方位编码清楚,浅层头只负责做最后一步线性投影。
  • 为什么推理时不能直接用 3 维 NOC 坐标做匹配? 因为真实世界充满对称性与局部遮挡歧义!想象一张正对着拍摄的对称方桌或圆柱形茶几:在单张局部视图下,某个边缘像素既可能属于规范坐标系的左侧(x=0.1x=0.1),也可能属于旋转 180∘180^\circ 后的右侧(x=0.9x=0.9)。在 64-bin 分类分布和 384 维高维特征空间里,网络可以同时保留这种多模态可能性与局部纹理上下文;可一旦强行通过期望求和坍缩成 3 个标量数字 (x,y,z)(x,y,z),面对对称歧义时它就会取平均值输出中间坐标 x=0.5x=0.5(即所谓的“均值坍缩”),而且 3 个浮点数彻底丢掉了局部外观判别力,一旦回归有一点偏差就无法挽回。

因此,“训练时用浅层 Binned NOC Head 当严厉的几何教练,推理时拆掉脚手架直接用 384 维特征上场”,完美兼顾了三维坐标敏感度与高维表征容错率。

基于这套架构,论文提供了三个即插即用的模型档位:

模型变体主干与特征构成特征维度参数量定位与适用场景
SUFLECA冻结 DUNE-B + NOC 塑形 DPT 头384102M默认主力模型(0.53s,2178 MB 显存),已见室内类别精度最高
SUFLECA-S冻结 DUNE-S + NOC 塑形 DPT 头25629M轻量高速版(0.49s,1556 MB 显存),适合显存受限环境
SUFLECA-blend384 维 SUFLECA 特征 ⊕\oplus 768 维冻结 DUNE-B 原生特征1152102M零训练成本特征拼接,在训练未见过的开放类别(Unseen)上泛化最强

3. 核心设计哲学二:保留 2D 渲染视图与双向 Top-k 防坍缩匹配

有了高质量的 384 维稠密特征后,下一步是在查询图像中的目标物体与候选 CAD 模型之间建立 3D-3D 点对对应关系。

SUFLECA 官方仓库推理管线

3.1 为什么缓存 6 个 2D 渲染视图,而不是把特征绑在 3D 顶点上?

很多做 3D 资产匹配的系统,习惯先把 CAD 模型从几十个角度渲染出图片,提完 2D 特征后再反投影回 3D 网格顶点上求平均,做成一个“带特征的 3D 点云”。

SUFLECA 拒绝了这种做法。在离线缓存构建脚本 render_cache.py 中,系统为每个候选 CAD 模型固定渲染 n=6n=6 个规范视角(解像度 448×448448\times 448),直接把每个视角清理后的二维像素级特征图与对应的三维表面坐标存成独立的 clean_00.npz ~ clean_05.npz(另存一份降采样汇总特征 scores.npz 供快速选视角)。

为什么留在 2D 视图空间更好?

  1. 避免多视角平均导致的特征模糊:同一个 3D 顶点在正面看和在侧面掠射角看,其局部上下文特征并不相同;强行在顶点上求平均会把锐利的判别特征抹平。
  2. 天然的可见性过滤(Visibility Guarantee):如果你把整个 3D 网格所有顶点的特征放在一起跟单张照片匹配,照片里只拍到了椅子正面,匹配器却极易把照片里的点连到 CAD 模型背面不可见的顶点上。而保留单张 2D 渲染视图时,渲染光栅化天然已经做完了深度遮挡剔除(Z-buffering)——视图里的每一个像素都 100% 属于该视角下可见的正面外表面!

在查询图像侧(sv_align.py),系统先将实例掩码内的像素按深度图反投影为 3D 点云,并执行四步干净利落的几何去噪:

  • 剔除深度 ≤0\le 0 或超过 max_depth=5 m 的无效点;
  • 在掩码内部按深度分布的四分位距(1.5 IQR)切掉边缘深度跳变与背景飞点;
  • 将点云量化进 32332^3 的三维体素网格(Voxel Grid),剔除点数少于 2 个的孤立噪点体素;
  • 用最远点采样(FPS)在三维空间均匀抽取最多 N=512N=512 个目标查询点 Q^I\hat{\mathcal Q}_I。

随后,计算这 512 个查询点到候选 CAD 的 6 个预渲染视图的平均最大余弦相似度,挑出朝向最接近的单个最佳渲染视图 V∗V^*:

V∗=arg⁡max⁡V∈VC1∣Q^I∣∑q∈Q^Imax⁡p∈VFI(q)⊤FV(p).V^*=\arg\max_{V\in\mathcal V_C} \frac{1}{|\hat{\mathcal Q}_I|} \sum_{q\in\hat{\mathcal Q}_I} \max_{p\in V}\mathcal F_I(q)^\top\mathcal F_V(p).

因为点数被 FPS 控制在 512 以内且读的是预缓存的 scores.npz,这步选视角只需要 43.1 ms。

3.2 双向 Top-k(Mutual Top-k)+ 贪心一对一 + 空间 FPS 采样

锁定最佳渲染视图 V∗V^* 后,设 CAD 视图上的源点特征矩阵为 Fs∈RNs×dF_s\in\mathbb R^{N_s\times d},查询图像上的目标点特征矩阵为 Ft∈RNt×dF_t\in\mathbb R^{N_t\times d}。接下来怎么把源点 ii 和目标点 jj 连成匹配对?

这里藏着一个在实验中能拉开 7~8 个百分点差距 的工程关键点(见后文 Table IV 消融)。

如果我们用最简单的单向最近邻(Nearest Neighbor, NN),即对每个 CAD 源点 ii 找相似度最高的目标点 j∗(i)=arg⁡max⁡jFs(i)⊤Ft(j)j^*(i)=\arg\max_j F_s(i)^\top F_t(j),会发生什么?当椅子下半截被书桌挡住,或者书架有好几层一模一样的隔板时,CAD 模型上原本对应被遮挡部位的几百个源点,会在目标图上集体“投奔”唯一露出来的那个最清晰角落,形成成百上千对源点连向同一个目标点的多对一坍缩(Many-to-One Collapse)。这群抱团的结构化外点会瞬间把后续的几何求解器冲垮。

反过来,如果我们要求严格互为第一最近邻(Mutual Nearest Neighbor, MNN),即 ii 的第 1 名必须是 jj、同时 jj 的第 1 名也必须是 ii 呢?虽然消除了多对一坍缩,但因为真实照片和合成白模之间毕竟有域差异,真正正确的几何对应点经常排在余弦相似度的第 3 名或第 8 名,严卡“双方互为第 1 名”会把大批宝贵的正确对应关系误杀掉。

SUFLECA 在 find_correspondences_mknn() 中给出了一个极其优雅的三步解法:

  1. 宽松的双向 Top-kk 候选池(默认 k=13k=13):只要源点 ii 落在目标点 jj 的相似度前 13 名内,且目标点 jj 也落在源点 ii 的前 13 名内,就把 (i,j)(i,j) 纳入候选集 C\mathcal C:
(i,j)∈C  ⟺  j∈Nkt(i)∧i∈Nks(j).(i,j)\in\mathcal C \iff j\in\mathcal N_k^t(i) \land i\in\mathcal N_k^s(j).
  1. 按相似度排序的贪心一对一消歧:把候选集 C\mathcal C 里的所有配对按余弦相似度从高到低排序,从头往后遍历——如果当前配对 (i,j)(i,j) 的源点 ii 和目标点 jj 都还没有被更高分的配对占用,就录用它并锁死 ii 和 jj。这样既允许真实对应点在 Top-13 范围内容错入选,又保证了最终输出的匹配对严格满足一对一(One-to-One)映射,彻底根除了多对一坍缩。
  2. 源端三维空间 FPS 截断(上限 M=256M=256):当贪心消歧后的匹配对超过 256 对时,千万不能简单截取相似度最高的前 256 对——因为高分点往往全挤在物体纹理最显著的同一个局部(比如全都挤在椅子扶手上,只靠扶手上的点根本算不准整把椅子的三维旋转和长宽高尺度)。代码改为在源点的 3D 坐标上跑最远点采样(FPS)挑出 256 对,强行保证送入几何求解器的对应点均匀张满整个物体的三维包络。

4. 核心设计哲学三:用平方距离消去旋转,构建各向异性谱图共识

现在我们手里有了最多 M=256M=256 对空间分布均匀的 3D-3D 候选点对 (pi,qi)(\mathbf p_i, \mathbf q_i),其中 pi\mathbf p_i 在 CAD 坐标系,qi\mathbf q_i 在相机坐标系。即便经过了双向 Top-13 筛选,里面通常仍有 30%∼60%30\%\sim 60\% 的外点。怎样在不知道 R,S,tR, S, t 的情况下先把外点滤掉?

4.1 巧用旋转矩阵正交性:在不知道旋转时先求出三轴尺度

回顾我们的 9D 变换模型:对于任意两个真实内点 ii 和 jj,它们满足 qi=RSpi+t\mathbf q_i = RS\mathbf p_i + t 和 qj=RSpj+t\mathbf q_j = RS\mathbf p_j + t。

先把两式相减,平移向量 tt 当场抵消:

qi−qj=RS(pi−pj).\mathbf q_i - \mathbf q_j = RS(\mathbf p_i - \mathbf p_j).

接下来是最关键的一步:对等式两边取欧氏范数的平方 ∥⋅∥2\|\cdot\|^2。因为旋转矩阵 R∈SO(3)R\in SO(3) 是正交矩阵,满足 R⊤R=IR^\top R = I(旋转一个向量绝不会改变它的长度),所以左乘的旋转矩阵 RR 在平方距离里彻彻底底地消失了!

∥qi−qj∥2=(RSΔij)⊤(RSΔij)=Δij⊤S⊤R⊤RSΔij=Δij⊤diag⁡(s2)Δij=(s2)⊤(Δij⊙Δij),\|\mathbf q_i-\mathbf q_j\|^2 = \left(RS\Delta_{ij}\right)^\top\left(RS\Delta_{ij}\right) = \Delta_{ij}^\top S^\top R^\top R S\Delta_{ij} = \Delta_{ij}^\top\operatorname{diag}(\mathbf s^2)\Delta_{ij} = (\mathbf s^2)^\top(\Delta_{ij}\odot\Delta_{ij}),

其中 Δij=pi−pj=[Δxij,Δyij,Δzij]⊤\Delta_{ij} = \mathbf p_i - \mathbf p_j = [\Delta x_{ij}, \Delta y_{ij}, \Delta z_{ij}]^\top 是已知的 CAD 源点坐标差,s2=[sx2,sy2,sz2]⊤\mathbf s^2 = [s_x^2, s_y^2, s_z^2]^\top 是待求的三个主轴缩放比例的平方,⊙\odot 表示逐元素相乘。

我们把上式两边同时除以已知的源点距离平方 ∥Δij∥2\|\Delta_{ij}\|^2,就得到了一个极其清爽的线性方程:

ϕij=fij⊤s2,其中fij=Δij⊙Δij∥Δij∥2,ϕij=∥qi−qj∥2∥Δij∥2.\phi_{ij}=\mathbf f_{ij}^\top\mathbf s^2, \qquad \text{其中}\quad \mathbf f_{ij}=\frac{\Delta_{ij}\odot\Delta_{ij}}{\|\Delta_{ij}\|^2}, \quad \phi_{ij}=\frac{\|\mathbf q_i-\mathbf q_j\|^2}{\|\Delta_{ij}\|^2}.

看看这个式子的物理意义有多直观:

  • 左边的 ϕij\phi_{ij} 是第 (i,j)(i,j) 对匹配点在目标图与源模型之间的实际距离伸缩比平方;
  • 右边的 fij=[Δxij2∥Δij∥2,Δyij2∥Δij∥2,Δzij2∥Δij∥2]⊤\mathbf f_{ij} = [\frac{\Delta x_{ij}^2}{\|\Delta_{ij}\|^2}, \frac{\Delta y_{ij}^2}{\|\Delta_{ij}\|^2}, \frac{\Delta z_{ij}^2}{\|\Delta_{ij}\|^2}]^\top 三个分量加起来正好等于 11(即 1⊤fij=1\mathbf 1^\top \mathbf f_{ij} = 1),代表这对点的连线在 x,y,zx, y, z 三个轴向上的方向投影权重;
  • 这意味着,在完全不知道物体转了多少度(RR)、放在哪里(tt)的前提下,任意两对点组成的二元组 (i,j)(i,j) 都为未知的三轴尺度平方 s2\mathbf s^2 提供了一条线性观测方程!

因为 M=256M=256 个候选点能组合出 (2562)=32,640\binom{256}{2} = 32,640 个点对二元组,哪怕其中混有大量错配外点,只要用鲁棒回归就能稳稳把粗略的三轴尺度 s~\tilde{\mathbf s} 解出来。源码 _axis_aligned_consensus_score() 分三步求解:

  1. 各向同性直方图众数初值:先对所有点对算对数距离比 ψij=12log⁡ϕij\psi_{ij} = \frac{1}{2}\log\phi_{ij},在 60 个区间的直方图上直接找最高峰对应的众数 ℓ^iso=mode⁡{ψij}\hat\ell_{\mathrm{iso}} = \operatorname{mode}\{\psi_{ij}\}。众数天然不怕外点污染,以此构造各向同性初值 exp⁡(2ℓ^iso)1\exp(2\hat\ell_{\mathrm{iso}})\mathbf 1。
  2. 5 轮迭代重加权最小二乘(IRLS):在线性系统 ϕij≈fij⊤s2\phi_{ij} \approx \mathbf f_{ij}^\top \mathbf s^2 上跑 5 轮 IRLS,每一轮根据对数残差的中位数绝对偏差(MAD)计算 Huber 权重,自动把离群外点二元组的权重压到接近 0,并截断保证尺度严格为正。
  3. 对数空间向各向同性收缩(Shrinkage,应对共面退化):这是一个非常老道的工程保护——如果相机恰好只拍到了平整的桌面,所有匹配点都在水平面上(Δzij≈0\Delta z_{ij} \approx 0),那么垂直方向 zz 轴的尺度 szs_z 在方程里根本没有观测约束,直接解线性方程会让 szs_z 飘出极端异常值。因此,代码将 IRLS 解出的对数尺度 ℓ^\hat{\boldsymbol\ell} 按 α=0.5\alpha=0.5 的比例向第一步的各向同性众数初值拉回一半:
ℓ~=αℓ^+(1−α)ℓ^iso1,s~2=exp⁡(2ℓ~).\tilde{\boldsymbol\ell} =\alpha\hat{\boldsymbol\ell} +(1-\alpha)\hat\ell_{\mathrm{iso}}\mathbf1, \qquad \tilde{\mathbf s}^2=\exp(2\tilde{\boldsymbol\ell}).

这样一来,观测充分的轴保留了真实的各向异性长宽比,而观测退化的轴则安全地回退到整体平均尺度。

4.2 谱图几何共识滤波(Spectral Graph Consensus)

一旦拿到了粗略三轴尺度 s~\tilde{\mathbf s},前面困扰我们的“等距性破缺”问题就迎刃而解了:对于任意两对匹配 ii 和 jj,它们经过三轴拉伸后的理论目标距离平方就应该等于:

d~ij2=(s~2)⊤(Δij⊙Δij).\tilde d_{ij}^2=(\tilde{\mathbf s}^2)^\top (\Delta_{ij}\odot\Delta_{ij}).

据此,我们可以把 MM 对候选匹配看作图上的 MM 个顶点,构建一个 M×MM\times M 的二值几何共识邻接矩阵(Consensus Matrix)GG:如果第 ii 对匹配和第 jj 对匹配在目标图上的实际距离平方 ∥qi−qj∥2\|\mathbf q_i - \mathbf q_j\|^2 与理论距离平方 d~ij2\tilde d_{ij}^2 的相对误差小于 β=0.01\beta=0.01,就在顶点 ii 和 jj 之间连一条无向边(Gij=1G_{ij}=1):

Gij=1 ⁣[∣∥qi−qj∥2−d~ij2d~ij2∣<β],Gii=0.G_{ij}=\mathbf1\!\left[ \left| \frac{\|\mathbf q_i-\mathbf q_j\|^2-\tilde d_{ij}^2}{\tilde d_{ij}^2} \right|<\beta \right],\qquad G_{ii}=0.

想象一下这张图的结构:所有真正正确的内点,彼此之间的三维几何关系完全自洽,它们会在图里互相连边,抱成一个高度稠密的主团簇(Main Cluster);而随机连错的外点,顶多碰巧和一两个点距离相符,在图里处于孤立或稀疏状态。

怎么把主团簇里的节点挑出来?图谱理论给出了最经典的工具——求矩阵 GG 的主特征向量(Principal Eigenvector)e\mathbf e。源码仅用 50 次极轻量级的矩阵-向量乘法(幂迭代 Power Iteration)就算出了主特征向量 e\mathbf e,每个分量 eie_i 代表第 ii 对匹配在全局几何共识网络中的中心度得分;最后直接保留得分达到最大值 δ=0.05\delta=0.05(5%)以上的点对:

m=1[e≥δmax⁡(e)],δ=0.05.\mathbf m=\mathbf1[\mathbf e\geq\delta\max(\mathbf e)], \qquad \delta=0.05.

同时,代码 geometric_consensus_mask() 里还写了周全的降级兜底:如果遇到极端困难样本,初始候选点对少于 3 个、有效二元组不足 6 个,或者谱滤波后剩下的点对少于 7 个,系统会自动退回各向同性共识或直接保留滤波前的点集,绝不会因为过度过滤把点集清空导致程序崩溃。

4.3 SupeRANSAC 求解、Procrustes 回退与信息矩阵评分

经过谱图共识提纯后的点对连同特征余弦相似度权重,被送入仓库内嵌编译的 C++ SupeRANSAC 求解器:

  • 采样与评分:采用 PROSAC 按特征相似度从高到低优先采样,配合 MAGSAC 软阈值评分(置信度 0.999,最少迭代 500 次,最大迭代 300,000 次)。
  • 自适应内点阈值:内点距离门限 τ\tau 根据目标点云围绕中位数中心的 96% 包络半径 rr 动态调整为 τ=max⁡(0.30r, 0.11 m)\tau = \max(0.30r,\ 0.11\ \mathrm m)——大件家具(如双人床、长沙发)容差自动放宽,小件物品则保底维持 11 厘米容差。
  • 物理合法性检查与闭式回退:如果 SupeRANSAC 解出的内点少于 7 个,或者分解出的三轴尺度违反了物理常识(例如某个轴缩放 ≤0\le 0、大于 10 倍、小于 0.05 倍,或者最大轴与最小轴的拉伸长宽比 aspect_ratio >= 2.5),系统会立即触发 solve_anisotropic_procrustes() 闭式回退:先对去中心化点集做 SVD 奇异值分解求出正交旋转 RR,再逐轴最小二乘回归正对角尺度 SS,最后恢复平移 tt。

当场景里有多个候选框或重叠预测需要做三维非极大值抑制(3D NMS)时,怎么给每个解出的位姿打一个“几何靠谱度”分数?

如果只看平均残差,万一某次匹配只有 4 个内点且全都挤在同一条直线上,残差虽然为 0,但绕着这条直线的旋转自由度其实根本没被锁住!为了同时衡量内点数量、残差大小与三维空间分布的几何约束力,论文对内点残差 ri=qi−RSpi−t\mathbf r_i = \mathbf q_i - RS\mathbf p_i - t 求关于 9 维位姿微扰 x=[δθ,δt,δs]⊤\mathbf x=[\delta\boldsymbol\theta,\delta\mathbf t,\delta\mathbf s]^\top 的 3×93\times 9 雅可比矩阵:

Ji=[[RSpi]×−I3−Rdiag⁡(pi)],\mathbf J_i= \begin{bmatrix} [RS\mathbf p_i]_\times & -I_3 & -R\operatorname{diag}(\mathbf p_i) \end{bmatrix},

其中 [⋅]×[\cdot]_\times 为反对称叉积矩阵。在高斯残差假设下,9 维位姿参数的 Gauss-Newton 费雪信息矩阵(Information Matrix)为:

Λ=1σ2∑iJi⊤Ji,σ2=∑i∥ri∥23M^−9.\Lambda=\frac1{\sigma^2}\sum_i\mathbf J_i^\top\mathbf J_i, \qquad \sigma^2=\frac{\sum_i\|\mathbf r_i\|^2}{3\hat M-9}.

取其对数行列式 Sfit=log⁡det⁡(Λ)\mathcal S_{\mathrm{fit}} = \log\det(\Lambda) 作为位姿质量分。从几何统计角度看,Λ−1\Lambda^{-1} 正好是 9 维位姿参数后验不确定性椭球的协方差矩阵;只有当内点数量充足、且在三维空间各个方向上张开得足够饱满(让旋转和三轴缩放的每一个自由度都被死死锁住,矩阵 Λ\Lambda 特征值全部很大)时,不确定性椭球的体积才最小,log⁡det⁡(Λ)\log\det(\Lambda) 才会拿到高分。


5. 源码深挖:从论文公式到工程落地的两处关键改造

对照官方仓库固定代码,单图推理的主调链路非常清晰:

load_sufleca_model(checkpoint)
  -> extract_sufleca_features(image)          # 冻结 DUNE + DPT 头提取 L2 归一化特征
  -> align_single_view(...)
       -> load_scores / load_clean_view       # 读取候选 CAD 的 6 视角离线缓存
       -> find_correspondences_mknn           # Mutual Top-13 + 贪心一对一 + 256 点 FPS
       -> geometric_consensus_mask            # IRLS 估三轴尺度 + 50 步幂迭代谱滤波
       -> run_ransac_registration             # SupeRANSAC + Procrustes SVD 兜底
       -> compute_information_matrix          # 9x9 雅可比信息矩阵与 logdet 评分

细读源码可以发现,作者在把论文公式写成生产代码时,做了两处非常务实的工程修正:

  1. 信息矩阵默认关掉了 1/σ21/\sigma^2 方差缩放(unbiased=False): 在 compute_information_matrix() 中,虽然完整实现了除以残差方差 σ2\sigma^2 的公式分支,但函数默认参数设为了 unbiased=False,在线对齐调用时也直接算未除以 σ2\sigma^2 的 log⁡det⁡(∑iJi⊤Ji)\log\det(\sum_i \mathbf J_i^\top \mathbf J_i)。 为什么要关掉 1/σ21/\sigma^2?因为在 9×99\times 9 矩阵求行列式时,乘在外面的标量 1/σ21/\sigma^2 会被放大成 (1/σ2)9=σ−18(1/\sigma^2)^9 = \sigma^{-18}!一旦某个退化样本恰好只剩下七八个内点,9 个自由度的模型极易把这几个点拟合到残差 σ2→0\sigma^2 \to 0,此时 σ−18\sigma^{-18} 会引发恐怖的数值爆炸,让这种擦边球样本的得分远超有 150 个内点的优质样本。去掉 1/σ21/\sigma^2 后,得分纯粹由内点数量与空间几何张成度决定,排序反而极其稳健。
  2. 场景级 NMS 的分位数秩融合(Percentile Rank Fusion): 在评测脚本 evaluation/eval_sv.py 中,系统做场景级 3D NMS 时需要同时参考“上游语义分”(检测置信度 × CAD 检索得分,落在 (0,1)(0,1) 之间)和“几何拟合分”(logdet_info,取值从负无穷到正无穷且跨度极大)。把这两个不同量纲的分数直接相加或相乘都会失真。源码的做法是:在每个房间场景内部,先把所有候选框的语义分和几何分各自转换成 (0,1)(0,1) 区间内的分位数排名(Percentile Rank) rsemr_{\mathrm{sem}} 与 rgeor_{\mathrm{geo}},再令综合得分为 smixed=rsem⋅rgeos_{\mathrm{mixed}} = r_{\mathrm{sem}}\cdot r_{\mathrm{geo}}。无需任何超参数标定,就实现了跨量纲的平滑融合。

6. 实验验证、消融拆解与系统级瓶颈剖析

6.1 ScanNet25k、无 NMS 的 DiffCAD 与 CO3D 泛化表现

论文在三套互补协议下检验了算法能力:

  • ScanNet25k 主协议(9 类家具):带场景级 3D NMS 与类别数量截断,要求平移误差 <20 cm<20\text{ cm}、旋转误差 <20∘<20^\circ、尺度误差 <20%<20\% 同时满足才算正确。
  • DiffCAD 切分协议(6 类家具):彻底去掉场景级 NMS 与数量截断,且改用未在 ScanNet25k 上微调过的通用单目深度。没有了冗余框 NMS 的掩护,每一次单实例配准的成败都会直接暴露。
  • CO3D 跨类别协议(600 张真实物体图):划分为训练见过的类别(Seen:椅子、沙发)与 12 个训练集从未见过的类别(Unseen:烤面包机、吹风机、微波炉、行李箱),并额外加上人为矩形遮挡块与非精确的 SAM3D 生成网格,专门大考开放世界外推能力。

SUFLECA ScanNet25k 与 DiffCAD 结果

对照 Table II 的实验数据,有三点核心发现:

  1. 大幅抛离原生特征与同类弱监督基线:在 ScanNet25k 上,使用严格剔除 ScanNet 训练帧的 sufleca-wo-scannet 权重,SUFLECA 拿到了 33.4% / 42.3% 的类别/实例准确率,比原生 DUNE-B(11.4% / 16.6%)高出近两倍,比同样用 NOC 弱监督的 ZeroCAD(23.1% / 30.1%)高出 10.3 / 12.2 个百分点。而在去掉 NMS 保护的 DiffCAD 协议下,ZeroCAD 跌至 15.9% / 20.9%,SUFLECA 与 SUFLECA-blend 则分别达到 36.1% / 44.8% 与 36.6% / 44.9%,相对提升超过 110%110\%,甚至超过了仅在自身 8 个扩散候选中选优的 DiffCAD (GT) Oracle(35.8% / 41.9%)。
  2. 弱监督反超全监督方法的背后原因:SUFLECA 的总体成绩高于在 ScanNet 上做全监督训练的 MultiObj-SPARC(30.3% / 40.3%)和 CosCAD(27.4% / 33.2%)。拆开逐类指标看,SUFLECA 在床(38.6%)、显示器(31.4%)、桌子(30.7%)等表面几何结构鲜明的类别上优势巨大;而在垃圾桶(bin,27.6% vs. MultiObj-SPARC 44.8%)这类体积小、近乎旋转对称的类别上,有目标域类别先验的全监督模型依然占优。
  3. 已见类别用 SUFLECA,未见开放类别用 SUFLECA-blend:

SUFLECA CO3D 已见与未见类别结果

SUFLECA 在 CO3D 上的定性对齐比较

看 Table III 与 Fig. 4 的 CO3D 实验:在训练见过的椅子和沙发(Seen)上,384 维的 SUFLECA 把 3D-IoU 从原生 DUNE-B 的 23.40% 猛拉到 62.63%,旋转误差从 35.81° 压到 10.24°;而在弱监督训练从未见过的烤面包机、吹风机等类别(Unseen)上,拼接了冻结主干原生特征的 SUFLECA-blend 拿下了全场最高的 49.50% 3D-IoU 和最低的 12.93° 旋转误差。这印证了我们的直觉:NOC 弱监督极大强化了常见家具的几何坐标感,而拼接一份冻结主干的原生特征则能为未知新物种兜底语义对应。

6.2 消融实验:如果只换好特征、不用几何共识会怎样?

SUFLECA 消融实验

Table IV 的消融实验直接回答了一个关键疑问:SUFLECA 的高分到底是因为 12 个数据集训出来的特征好,还是因为后面的双向 Top-kk 与各向异性谱共识设计得好?

答案是二者缺一不可:

  • 保持完全相同的 SUFLECA 特征,如果把匹配器退回朴素单向最近邻(NN),准确率立刻从 33.4% / 42.3% 暴跌至 26.3% / 34.2%(掉了 7.1 / 8.1 个百分点);
  • 换成严格互为第一最近邻(Mutual NN),能救回多对一坍缩,升至 30.7% / 39.4%;
  • 换成双向 Top-13 匹配 + 贪心一对一消歧,进一步涨到 32.0% / 41.0%;
  • 最后叠加上各向异性尺度谱图共识滤波,才达到完整的 33.4% / 42.3%。
  • 同时,如果把 NMS 排序中的信息矩阵质量分 log⁡det⁡(Λ)\log\det(\Lambda) 拿掉,只用上游 ROCA 检索分或视角选择分排序,准确率也会立刻掉下 3.0~4.2 个百分点。

6.3 全链路瓶颈剖析与方法局限

SUFLECA 对 CAD retrieval 质量的鲁棒性

SUFLECA 单实例对齐效率

看 Table V 和 Table VI,我们可以非常客观地看清当前单图 CAD 建模的技术水位与 SUFLECA 的真实边界:

  1. 上游零样本 CAD 检索是卡住端到端落地的头号瓶颈: 在 Table V 中,当给 SUFLECA 喂 100% 正确的真值 CAD 模型时,它的对齐准确率高达 43.0% / 54.2%;喂 ROCA 的有监督检索结果(精确实例检索率 34.3%)时为 33.4% / 42.3%;而一旦把上游换成完全零样本的 GroundedSAM + OSCAR 检索,精确 CAD 实例检索命中率直接崩盘到了 3.8%!尽管 SUFLECA 靠着各向异性尺度拉伸,在检索出的“近似错模型”上硬生生保住了 22.5% / 33.1% 的对齐率,但这组数据清晰地表明:在开放世界单图三维建模中,后端的几何配准器(Alignment)已经相当强悍,真正拖后腿的是前端“怎么从几万个 CAD 模型里零样本搜出拓扑结构对得上的那个候选模型(Retrieval)”。
  2. SupeRANSAC 占了六成以上耗时: 看 Table VI 的底部四行拆解:单物体 530.4 ms(0.53 秒)的总耗时里,DPT 特征提取只需 86.6 ms(且一张图不管有几个物体只需提一次特征),6 视角粗选 43.1 ms,双向 Top-13 匹配与谱图共识过滤共 68.7 ms,而 30 万次迭代的 SupeRANSAC 独自吃掉了 332.0 ms(占总耗时的 62.6%)。这也解释了为什么把神经网络换成轻量版 SUFLECA-S 后,显存降到了 1556 MB,总延迟却只从 0.53 s 微降到 0.49 s——因为大头在 CPU/C++ 侧的 RANSAC 循环上。在线服务如果要进一步压低延迟,最立竿见影的手段是根据内点率动态下调 SupeRANSAC 的最大迭代上限。
  3. 几何对称歧义与物理合理性边界: 纯几何对应只能保证物体的外表面轮廓对齐,遇到圆柱形茶几、四面对称的方桌,或者决定柜门朝向的把手恰好被挡住时,几何共识无法区分 90∘90^\circ 或 180∘180^\circ 的功能朝向翻转;而且 SUFLECA 是纯粹的单物体独立配准器,不包含跨物体的防穿模碰撞检测或地面支撑物理约束。

7. 横向坐标与总结:在 3D 视觉版图中的位置

如果把 SUFLECA 放到本站精读过的整个三维视觉与场景建模版图中,它的生态位非常清晰:

  • 对比场景级装配系统 Diorama:Diorama 负责从单张室内图恢复墙面地面、用 GPT-4o 推理支撑场景图并做多物体防穿模布局优化,但它底层的单物体位姿估计直接用了原生 DINOv2 特征匹配 + 外挂 GigaPose 尺度网络(在 Table II ScanNet25k 上仅得 8.7% / 11.3%)。显然,SUFLECA(33.4% / 42.3%)完全可以作为即插即用的高性能 9D 位姿求解内核,直接替换掉 Diorama 里的原生 DINOv2 配准模块。
  • 对比单图 3D 资产生成模型(AssetGen、TRELLIS.2、TripoSG、SF3D):生成式路线解决的是“资产库里没有现成模型,从零捏一个新网格出来”;而 SUFLECA 解决的是“手头已经有艺术家建好的标准干净 CAD 资产库(如家装设计软件、机器人仿真资产库),怎么在半秒内把现成资产精准摆进真实照片对应的三维位置”。

总而言之,SUFLECA 最让人印象深刻的地方,在于它摒弃了盲目堆砌复杂端到端网络的套路,展现出极其通透的分治哲学:用 12 个数据集的 NOC 弱监督辅助头做“特征塑形”,用双向 Top-kk 和消去旋转矩阵的各向异性谱图共识做“几何提纯”,最后把干净的对应点交给 SupeRANSAC 闭环。对于任何需要将视觉大模型接入经典三维几何估计的工程系统,这套“软特征学习 + 硬几何共识”的设计范式都极具借鉴价值。

参考资料