跨窗口注意力钉死内存,寄存器 refinement 压住 VGGT 长序列位姿漂移

Think Locally, Refine Globally for Memory-Efficient 3D Reconstruction

Jingke Zhou, Chenhang Ma, Zhizhou Zhong, Mingkai Liu, Zhuang Zhou, Yicheng ji, Binghua Su, Bo Cai, Xianliang Huang

cs.CV, cs.AI

2026-09-18

浙大与复旦把 VGGT 改成重叠四帧滑窗,只在四个几何层做跨窗口注意力,再用 register token 修全局相机。7-Scenes 一千帧 Acc 到 0.060,InfiniteVGGT 是 0.065。

这篇在解决什么

VGGT 把所有帧的 token 丢进全局注意力,深度、位姿、点云一次前向出齐。短序列好用,序列一长,O(N²) 显存就把卡打满。

后来的补丁分两头。StreamVGGT 把历史 KV 全缓存,长了直接 OOM。WinT3R 用滑窗把内存钉死,窗口之间靠一份持久 hidden state 传信息,局部误差会顺着这份状态滚下去,长轨迹位姿漂得很厉害。InfiniteVGGT 用滚动记忆加 token 驱逐卡住缓存上限,驱逐是按层、按头各自做的启发式,没有显式跨窗口几何约束,漂移还在。

局部几何要够用,全局位姿不能漂,内存还不能随长度涨。这三件事卡在一起。

方法

LoG-VGGT 的做法可以收成一句:窗内想局部,序列末尾再修全局。

骨干是重叠滑窗,窗口大小 K=4、stride=2。窗内仍是 VGGT 那套帧注意力和窗口级全局注意力,复杂度钉在 O(K²),跟总帧数无关。窗与窗之间不存全部历史,只在 VGGT 用来喂 DPTHead 的 4 个几何层(block 4/11/17/23)做 Cross-Window Attention:当前窗的 Q 去看「当前 token + 上一窗缓存的 key 层 token」。重叠帧被显式对齐,几何连续性从窗口缝渗过去。只缓存这 4 层,内存保持常数。选这四层是因为 VGGT 的深度和位姿头本来就从它们取特征,不必另开一套跨窗通路。

深度主要靠局部连续性,滑窗推完就出。相机位姿会漂。于是加了一个轻量的 Global Camera Consistency Refinement(GCCR):把所有窗口的 register token 收成一份紧凑全局集合,每个相机 token 对这批 register 做一次 cross-attention。全序列位姿被一起修,算力只打在少量 token 上,不是再开一遍序列级全局注意力。

训练两阶段:先 12 帧训 100 epoch 把局部几何稳住,再 64 帧微调 10 epoch。数据是 11 个室内外、合成/真实混合集,16 张 H20。视觉编码沿用冻结的 DINO。损失是相机 L1 加带不确定度的深度监督,没有显式点图损失,三维点由深度和相机决定。

结果

7-Scenes 上 Acc(mean) 随长度几乎不崩:

方法200 帧500 帧1000 帧
TTT3R0.0400.0620.101
InfiniteVGGT0.0380.0430.065
LoG-VGGT0.0360.0370.060

NRGBD 200 帧 Acc 0.034,低于 WinT3R 的 0.037 和 InfiniteVGGT 的 0.049;1000 帧 0.091,略优于 InfiniteVGGT 的 0.097。

视频深度评测集都没进训练集。Sintel 50 帧 Abs Rel 0.321(InfiniteVGGT 0.323);Bonn 110 帧 0.054(WinT3R 0.058);KITTI 110 帧 0.109(TTT3R 0.113, InfiniteVGGT 0.173)。KITTI 上 InfiniteVGGT 掉得最明显。

相机位姿每场景抽 500 帧,AUC@30:ScanNet 78.56(InfiniteVGGT 78.46, TTT3R 71.36);TUM-D 91.17(90.03 / 86.75);CO3Dv2 88.24(88.02 / 83.31)。领先幅度不大,稳定压过同一代 streaming 方法。ScanNet 和 CO3Dv2 在训练集里,TUM-D 更干净。

消融把两个模块拆开。200 帧去掉 CWA 直接 OOM;去掉 GCCR,7-Scenes Chamfer 从 0.032 升到 0.045,CO3Dv2 AUC@30 从 88.24 掉到 44.27。只靠滑窗传几何,长序列位姿撑不住。

GCCR 可以改成周期性、只用过去帧:每 50 帧做一次,CO3Dv2 AUC@30 到 63.85;每 100 帧 74.91;全序列终修才到 88.24。精度和延迟是明确的交换。

1000 帧一次推理,CWA 骨干 83.9 秒占 99.84%,全序列 GCCR 只要 134 ms。FPS 在 100/200/500/1000 帧上是 12.4/12.3/12.3/11.9,InfiniteVGGT 从 7.0 掉到 5.4。

为什么重要

做 streaming 重建的人,这是一条比「把 KV cache 剪瘦」更干净的路:架构上把注意力锁在窗口里,全局只修相机。全序列 GCCR 几乎白送;想上线可以换成每 50/100 帧刷一次,或者在线逐步更新,1000 帧 FPS 会从 11.9 掉到 8.2,仍快过 InfiniteVGGT。

它不是新的几何表示,是 VGGT 的工程缩放方案。短序列上相对 InfiniteVGGT 的增益很小,真正拉开的是 500 帧以上还不漂、还不降速。

局限与存疑

深度没有全局 refinement。作者自己说大视角变化、长程遮挡、深度全局歧义时可能吃亏,表格上也不是处处第一:Bonn 110 帧 δ<1.25 是 0.968,InfiniteVGGT 是 0.972;500 帧 Bonn 的 δ 是 0.952 对 0.960。

全序列 GCCR 要用到未来帧,严格在线得用周期或在线变体,精度会掉一截。register token 随窗口堆积,FPS 仍有轻微下滑。窗口 4、stride 2 直接沿用 WinT3R,论文没做窗口大小扫描。低光、无纹理、反光、快运动、高动态场景,作者列了可能失效,没有对应定量。

术语

原文与代码

社区讨论

相关论文

全部论文解读