EvTrajGS:没有相机位姿,仅凭事件流就能重建 3D 场景?

3D 重建的第一步,为什么卡在"相机位姿"?

本文讲的是 EvTrajGS 如何让一条没有相机位姿(camera pose)、也没有任何完整图像的事件流,也能重建出可自由换视角的 3D 场景。这件事听起来反直觉,要看清它凭什么能做成,得先数出三道依次升级的坎:位姿是三维重建最基础的前提,事件相机偏偏连一张完整的照片都不给你,而位姿与场景又是一对必须一起解的未知数。

第一道坎在"位姿"这个词本身。想象你拿着一台摄像机绕着客厅走一圈,想把客厅重建成一个能自由换视角的 3D 模型。常规做法里,每拍一帧你都会同时记下"那一刻相机在哪、朝哪看"。这个位置加朝向就是相机位姿,它是整个三维视觉里最基础的前提:渲染一个场景的新视角,本质上就是在问,从某个位姿看过去,世界应该长什么样。没有位姿,连"从哪看"都说不清,重建自然无从谈起。

第二道坎是,事件相机偏偏拿不出这个前提。它没有"照片"这种输出:每个像素都在独立工作,只有当这个像素感知到的亮度变化跨过某个阈值时,才异步吐出一个带时间戳的小信号,标注"这里变亮了"或"这里变暗了"。整块传感器拼不出一幅完整画面,只给你一条长长的、按时间排列的事件流,所以叫事件相机(event camera)。这种相机的时间分辨率可以做到微秒级,动态范围超过 120 dB,即使在高速运动下也不糊,代价是没有成帧图像,也没有现成的相机位姿。Event3DGS 这个代价在 3D Gaussian Splatting(3DGS)面前是致命的。3DGS 用一大片可微的 3D 高斯体表示场景,每个高斯体带位置、形状、颜色与不透明度,渲染时把它们投影到屏幕上按深度叠加,速度可以做到实时,但无论是渲染还是训练,它都必须先知道相机在哪个位姿。普通 RGB 流程里,位姿来自 SfM 这类"在图像间找特征点、再三角化"的流程;而事件流里连可做特征匹配的完整图像都没有,这条路天然走不通。3DGS

第三道坎,也是真正要命的一道:位姿与场景是一对互相牵扯的未知数。可以想象两个时刻拍下的画面:位姿要是估计偏了,两幅视图对不齐,渲染出的场景就会拖出重影;反过来,场景本身糊着,任何试图修正位姿的信号都不可信。位姿错一点点,场景就糊一片;场景糊了,用来校正位姿的线索也跟着失效。两个未知数必须一起解,而手里唯一的监督信号,只有一簇簇稀疏的亮度变化。这正是 EvTrajGS 要正面回答的问题:相机怎么走的、场景长什么样,能不能只凭事件流一起解出来。这件事在高速运动的机器人、低光环境里尤其值得做,因为普通相机要么运动模糊、要么拍不清楚,而事件相机恰好绕开了这两个坑。再加上 3DGS 的渲染全程可微,位姿一旦被写进可微的表示里,就能和场景一起反向传播优化,这给了"把位姿也变成优化对象"一个天然的台面。

3DGS pipeline

图注:3DGS 总览:从 SfM 稀疏点云初始化一批 3D 高斯,经优化与自适应密度控制(过细的复制、过大的分裂),由 tile-based 光栅化器渲染出可实时浏览的新视角。整套流水线默认每帧相机位姿已知,而这个前提恰好在事件相机场景下不成立。3DGS

两条现成的路:为什么一条快而不准、一条准而不快?

在 EvTrajGS 之前,"无位姿事件流重建"其实已经有两条现成的路可走,只是它们各自只押注了问题的一半。

第一条路押注"位姿可以从外部买来",代表是 EventSplat。它先把事件流喂给 E2VID,一个把事件重建回强度帧的神经网络,得到一串带纹理但蒙着噪声的灰度图;再用 SfM 从这些图里估出相机位姿,用三次样条插值补齐任意时刻的位姿;之后把位姿彻底冻结,只让 3D 高斯在事件监督下离线优化。这条路之所以快,是因为位姿不参与优化;但它一旦装上就成天花板,快速运动或纹理退化时 SfM 给出的位姿带着误差,整条流水线就被这个误差锁死。论文在相同评测协议下复现的 EventSplat†,在 Replica 上的平均 PSNR 只有 21.57 dB。EventSplat

第二条路押注"位姿必须边跑边解",代表是 SLAM 风格的 IncEventGS。事件流被按 50 毫秒切成块,tracker 先只优化每块首尾两个时刻的位姿,mapper 再对最近 20 个块一起做滑动窗口的 bundle adjustment(BA),位姿和 3D 高斯同步校正,初始化还要靠预训练深度模型引导。BA 是把一批相机位姿和 3D 点联合精修的经典手段,精度确实上来了,但每来一块数据就要重跑一轮滚动 BA,加上反复的 tracking 与多视角渲染,整条流水线跑完大约要 136 分钟。IncEventGS

还有第三条路 EF-3DGS,位姿自由度放得更开,但它需要同步的视频帧,外加 CMax 和光度 BA 一整套重监督,不是纯事件流输入,这里先按下不表。EF-3DGS

这背后的麻烦比表面更深一层。事件监督给出的是两帧之间的亮度变化,位姿一旦有偏差,渲染差整体错位,损失函数指向的梯度会乱成一团;而事件又稀疏、又没有颜色,能用来纠偏的信号本来就不多。所以两条老路的取舍其实是被逼出来的:要么彻底不碰位姿,把不确定性外包给 SfM;要么用 BA 这种重型武器硬扛不确定性。问题在于,有没有一种方式,让位姿自己会动,又不会乱动。

三派并排,二选一的困境清清楚楚:把位姿当死输入,效率高但精度被卡死;把位姿当滚动优化对象,精度上来了却贵得跑不动。缺的是一条中间路线:位姿可优化,但别用稠密 BA。EvTrajGS 的全部设计,就是冲着这个缺口去的。EvTrajGS

三范式对比

图注:三种处理相机位姿的范式并排对比:(a) 把位姿当成离散的可学习变量直接联合优化;(b) SLAM 风格用 sliding-window BA 滚动校正位姿与场景;(c) EvTrajGS 用 CTPF 把位姿参数化成连续时间轨迹函数,再经 TCPI 聚合成时序耦合位姿,替代稠密 BA。EvTrajGS

把位姿从散点连成连续轨迹,优化为什么反而更稳?

EvTrajGS 的关键洞察可以浓缩成一句话:别把位姿当散点,把整段相机运动写成一个函数。这是它的第一个组件 CTPF(Continuous Time-to-Pose Function,连续时间到位姿函数):一个 4 层 128 通道的 MLP,把归一化时间戳经过 Fourier 编码后,映射成旋转(四元数)、平移,外加一个由网络预测的时间尺度 σ(τ)。为什么要做 Fourier 编码?时间戳本身只是一个标量,直接喂给 MLP,相机那种快慢交叠的摆动很难表达;编码把它展开成一组不同频率的周期基底,高频运动交给高频项,低频漂移交给低频项,网络才有足够的表达能力。σ 的取值被 Sigmoid 限制在 [0.01, 0.20],输出头零初始化,让它在训练开始时对所有时刻取中间值 0.105,之后随运动快慢自行调节。整段轨迹因此是一个处处可微的全局函数,序列里任何一个时刻的位姿都落在函数上,都能被梯度触及,而不是像离散变量那样各管各的。

但把散点升级成函数还不够。事件监督是稀疏的,某一时刻往往只有少数像素给出信号;如果每个时刻的位姿还是独立地被这些稀疏信号拉扯,相邻时刻就会各跳各的,轨迹抖得像心电图。第二个组件 TCPI(Temporally Coupled Pose Integration,时序耦合位姿聚合)就是来治这个抖动的。

可以这样想:一支队伍沿着街道行进,每个人不是自己走自己的,而是参考前后几个人的位置,取一个加权平均位置来落脚,离得近的人权重高。队伍松的时候大家互相参考得多,走位平滑;队伍紧的时候每个人只信紧挨着的邻居,反应更快。TCPI 做的正是这件事:对查询时刻 τ_k,在它周围的一个局部窗口里取 M 个邻居位姿,按以 τ_k 为中心、尺度由 σ(τ_k) 自适应的截断高斯分布加权,把邻居的相对增量加权积分,得到耦合位姿。这些相对增量生活在 Lie 代数 se(3) 上,积分用 BCH 一阶近似完成,可以理解为把旋转的合成近似成小量相加,细节不必深究。为什么非要绕到李代数里做?因为位姿是旋转加平移,旋转不能像普通数值那样直接平均,硬平均会得到扭曲的中间旋转;先让每个邻居相对查询点的增量变成李代数里的"小量向量",加权求和后再映射回去,平均出来的位姿才是一个合法的位姿。

对应关系就在这里:窗口里的 M 个邻居位姿是队伍里的人,截断高斯权重是"离得近信得多",σ(τ) 是队伍的松紧程度,由网络按时间自行预测,运动慢时摊平、运动快时收紧,天然适配快慢交替的轨迹。而收益要顺着梯度往回看:因为每个时刻的耦合位姿依赖一整段局部轨迹,事件损失在拉扯某个时刻时,会顺着 TCPI 传导到整段邻居,位姿更新天然时序一致,而不是各自为政。这也解释了为什么 TCPI 的消融会成为全篇位姿精度最大的一跳,后面的数字会印证这一点。

这里还要拆掉一个表面相似:IncEventGS 也自称连续时间轨迹,但它只是 chunk 边界两个 SE(3) 位姿之间的对数线性插值,中间点全靠插值、不可被优化;CTPF 则是全程共享一个 MLP,处处可微、处处被监督。至于起点,论文先用 E2VID 把事件流重建为强度帧,再用 VGGT 从中估出粗略位姿与 3D 点,让 CTPF 预训练 2000 步拿到一个像样的出发点。此后位姿监督被移除,剩下的路全靠事件流自己说了算。 EGM

CTPF + TCPI

图注:EvTrajGS 整体框架:(a) 事件流经 E2VID+VGGT 初始化后,CTPF 把时间戳映射成连续的相机轨迹 T(τ);(b) TCPI 在局部窗口内按截断高斯分布加权邻居位姿,经 Log/Exp Lie 映射聚合出耦合位姿 T̂(τ_k);(c) 在两个时间戳处渲染并取对数差,与事件对齐构成监督,采样由 LRES 加权。EvTrajGS

没有完整图像,事件流凭什么当监督信号?

事件没有颜色,也没有绝对亮度,它只报告"这个像素的亮度变了多少"。凭什么拿它当考官?凭事件形成模型(EGM):一次事件在数学上等价于"该像素的对数亮度跨过了固定阈值 C"。于是把 [τ_k, τ_k'] 这个窗口里所有事件按极性(变亮记 +1、变暗记 −1)累加,再乘上阈值 C,得到的恰好就是这段时长内该像素对数亮度的总变化量 ΔL。渲染侧能算出一模一样的量:用 3DGS 在耦合位姿 T̂(τ_k) 和 T̂(τ_k') 上各渲染一张亮度图,取对数差 ΔL̂ = log Î(τ_k') − log Î(τ_k),让两者对齐。对应的事件损失 L_event 由 SSIM 项与 L1 项加权组成,权重 λ_ssim = 0.2 直接沿用原 3DGS 的 RGB 损失设定;阈值 C 在合成数据集 Replica 上取 0.1,在真实数据集 TUM-VIE 上取 0.2。仔细看这个对齐会发现,它只关心"两帧之间变没变、变了多少":两次渲染共享的乘性亮度偏置会在对数差里消去,所以监督对绝对亮度不敏感,对光照标定相当宽容。

这条通路巧妙在只问一件事:两个时刻之间,这个像素的亮度变化方向和幅度对不对。不需要颜色,不需要完整图像,而"变化"恰好是事件相机唯一输出的东西。考官于是成立,而且是个相当严苛的考官:渲染出的亮度变化如果跟事件流对不上,损失会精确地落在出错的像素上。

事件监督底座

图注:这是 Event3DGS 的 pipeline 架构图:事件流经累加器与采样策略变成事件帧,与 3DGS 渲染视图差分构成 L_event 监督,橙色箭头为梯度流。它演示了事件监督 3DGS 的共同底座;EvTrajGS 继承同一 EGM 思想,但不含渐进训练、模糊感知光栅化等模块。Event3DGS

剩下的问题是怎么省。先厘清一点:论文并没有把高效归功于「损失只在稀疏的事件像素上计算」——两端的亮度图是完整渲染的,对数差监督也在完整亮度图上进行;约 20 分钟的总耗时(E2VID 重建约 3 分钟 + VGGT 估位姿约 1 分钟 + CTPF 初始化约 1 分钟 + 联合优化约 15 分钟)在论文里归因于用 CTPF+TCPI 避免了 SLAM 式的增量 tracking 与稠密 BA,而不是像素级的稀疏计算。时间维度上的效率来自 LRES(Loss-Reweighted Event Sampling):事件流在时间上的信息量并不均匀,匀速段事件稀少,剧烈运动段事件密集;如果均匀采样时间段,优化资源会浪费在早就拟合好的段落上。LRES 的做法是先均匀采样 1000 步摸底,把整个时间跨度切成 100 段,统计每段的事件损失,这一步用 stop-gradient,只用来形成采样分布,不更新任何参数;再按 Softmax 加权重新采样,把优化资源向损失大的时间段倾斜。两个阶段交替进行:每摸底 1000 步就更新一次采样分布,再按新分布跑 1000 步;每次更新分布只花一两秒,开销可以忽略。举一个贴切的例子就是考试刷题:欠拟合的时间段是丢分题型,Softmax 重加权相当于优先练习丢分题,β = 1 是默认强度,β = 0 则退化成均匀采样。早期 Event3DGS 也做过稀疏感知采样,但那是给没有事件的像素补梯度,与 LRES 的资源重分配目标不同。Event3DGS

赢下精度和速度之后:它到底适合什么场景?

三件套的效果,用一组数字就能讲完。Replica 五个室内场景平均,EvTrajGS 的 PSNR 是 27.94 dB,SSIM 0.88,位姿误差 ATE 只有 0.129 cm。作为对照:SLAM 风格的 IncEventGS 是 23.32 dB 与 0.225 cm,相当于位姿误差被压低了 42.7%;固定位姿的 EventSplat† 是 21.57 dB;SLAM 系最新的 E2EGS 是 24.10 dB;连拿着真值位姿的 NeRF 类基线 Robust e-NeRF 也只有 17.73 dB。在真实数据 TUM-VIE 上,ATE 从 0.296 cm 降到 0.153 cm,降幅 48.3%。一句话概括:在它测过的场景里,它同时压过了"冻结位姿"和"SLAM 式 BA"两条老路,还顺手超了拿真值位姿的对手。EvTrajGS

这组对比里有一个反直觉的地方值得点破:事件流又稀疏、又没有颜色,信息量看起来远不如普通视频,但在这篇论文的室内基准(Replica、TUM-VIE)和这批异构基线的同场比较中,事件流配合这套优化设计,重建指标确实超过了包括真值位姿方法在内的一众对手。这个判断要限定在它真正成立的范围内:结果说明,在该基准和这些基线的设定下,把位姿和场景一起解稳的优化方式,让事件流的信息得到了更充分的利用,也因此拿到了更高的重建指标;至于传感器信息是否天然够用、瓶颈是否只在优化方式这些更广的问题,超出这些基准之外的表现论文没有评测,不应由这一组实验单独下结论。

方法(Replica 平均)范式PSNR ↑SSIM ↑ATE ↓
Robust e-NeRF(真值位姿)事件 NeRF17.730.70—
EventSplat†(固定位姿)离线联合优化21.570.74—
IncEventGS(SLAM 风格)滑动窗口 BA23.320.780.225 cm
E2EGS(SLAM 风格)SLAM 风格24.100.77—
EvTrajGS连续轨迹 + 邻域耦合27.940.880.129 cm

数字之外,更值得看的是消融的戏剧点。逐组件往上加:固定位姿的基线是 17.76 dB、ATE 1.197 cm;加事件损失后爬到 20.06 dB;换成直接联合优化(位姿当离散变量)22.22 dB、0.707 cm;加上 CTPF 到 24.10 dB、0.497 cm;加上 TCPI 一步跳到 27.08 dB、0.144 cm;最后加 LRES 收尾到 27.94 dB、0.129 cm。位姿精度最大的一跳来自 TCPI,恰好印证了上一章的直觉:把位姿连续化、让邻居互相牵制,才是稳定优化的主角,LRES 只是最后一层打磨。同样值得注意的是时间尺度 σ(τ):在去掉 LRES 的对照里,由网络自适应的 σ 胜过所有固定取值,说明"快慢自动切换松紧"确实让轨迹表达更灵活。

效率维度同样有说服力,因为它直接挑战了"准就要贵"的直觉。全套流水线约 20 分钟,其中 E2VID 重建约 3 分钟、VGGT 估位姿约 1 分钟、CTPF 初始化约 1 分钟、联合优化约 15 分钟,论文在单卡 RTX 3090 上自报约为 IncEventGS(约 136 分钟)的七分之一。更有意思的是同框架内的对照:稠密 BA(窗口 16)要 150 分钟、ATE 0.182 cm,而 CTPF+TCPI 只用 15 分钟、ATE 0.144 cm。连续轨迹替代 BA,在精度和速度上同时取胜,这是论文最强的一条证据。

轨迹对比

图注:Replica 上 5 个场景 × 5 种方法的轨迹对齐,虚线为参考真值,颜色映射逐点误差(红高蓝低)。最右列 EvTrajGS 的轨迹普遍呈蓝/青色,其余方法(DEVO、E2VID+COLMAP、E2VID+VGGT、IncEventGS)可见更多红黄色段。图内子图标注的 ATE 数值以正文表格为准。EvTrajGS

但 EvTrajGS 不是万能牌。它依赖 E2VID 加 VGGT 的初值:论文指出,E2VID 重建出的强度视频带有伪影,估计出的轨迹会因此存在局部不准确;而当事件极端稀疏、运动模糊严重或场景对比度太低时,初值质量大概率会下降(论文未评测此类退化条件,这是从 E2VID 依赖推出的推断),轨迹 MLP 可能收敛到坏的局部最优。它只评测了 Replica 合成场景和 TUM-VIE 室内序列,强动态、室外大尺度、极端 HDR 都不在测试范围内。全序列共享一个 MLP,也让它在运动剧烈、轨迹很长的序列上表示力受限,虽然自适应的 σ(τ) 能缓和一部分。这些边界意味着,它目前更像一个离线批量重建器,而不是能在陌生环境里长期运行的在线 SLAM 系统;后者还需要对从未见过的场景、恶劣的光照和长时间的漂移有鲁棒性,论文没有声称这些。

所以判断标准是场景化的:当你能拿到可接受的 E2VID 初值、场景偏静态、序列中等长度时,EvTrajGS 比冻结位姿更准,比 SLAM 式 BA 更快,是当下值得优先试的方案;当场景强动态、光线极端、事件稀疏到重建不出像样的强度帧时,它和所有依赖初值的方法一样会露怯。连续轨迹替代 BA 这条路一旦走通,下一步的自然问题,就是如何摆脱对 E2VID 这类"借来的图像"的依赖,让事件流真正全程自治。而把眼光放远一点,这场实验真正改变的是问题的摆放方式:相机位姿不再是一个需要单独求解的预处理步骤,而是场景优化的一个副产品。位姿从输入变成了输出,这个视角的转换,可能比任何一项指标都更值得记住。

想深入可以读原文:EvTrajGS: Accurate and Efficient 3D Gaussian Splatting from Unposed Event Streams — arXiv:2608.08585

参考文献

EvTrajGS:没有相机位姿,仅凭事件流就能重建 3D 场景?