微信扫一扫,关注公众号

  • 科技行者

  • 算力行者

见证连接与计算的「力量」

首页 给三维重建找一副望远镜:T3lescope如何用一个模型拼出整座城市

给三维重建找一副望远镜:T3lescope如何用一个模型拼出整座城市

2026-11-11 18:05
分享至:
----..---.-...-/--...-.-......./-...-....-..--../-............-.- ----..---.-...-/--...-.-......./-...-....-..--../-............-.- ----..---.-...-/--...-.-......./-...-....-..--../-............-.- ----..---.-...-/--...-.-......./-...-....-..--../-............-.-
2026-11-11 18:05 • 科技行者

2026年的某一天,如果你把一组照片扔给一个三维重建系统,让它把一个花园、一辆卡车、甚至一整座城市街区变成三维网格,你会发现一件挺矛盾的事。

想让细节精细,模型就得盯着一小块地方死磕。想让覆盖范围大,就得牺牲清晰度。这不是哪个工程师偷懒,而是几乎所有生成式三维模型的通病:它们天生只会在一个固定分辨率的格子里工作,格子就那么大,要么装下整个场景但模糊一片,要么看清一个角落但其他地方全是黑。

这篇论文要解决的,就是这个"鱼和熊掌不可兼得"的老问题。研究者给自己的系统起名T3lescope,望远镜的意思很直白:你可以先看全局,再一层层拉近焦距,看清每一个细节,而且用的是同一副镜片,不用换设备。

**这件事难在哪**

先说说这个领域此前是什么状态。

三维重建大致有三条路子。第一条是逐场景优化,代表方法包括NeuS、2D高斯泼溅(2DGS)这些。

**2D高斯泼溅(2DGS)**:一种用大量椭圆形的二维高斯分布去拟合场景表面的技术,优点是渲染快、细节好,缺点是每换一个场景都要重新训练一遍。

这类方法在观测稠密的情况下效果确实好,但一旦视角稀疏,或者遇到玻璃、金属这种反光透明的表面,就容易翻车,因为它没有任何关于"世界长什么样"的先验知识,纯靠眼前这几张照片硬拟合。

第二条路是前馈预测,比如Depth Anything 3(DA3)、MapAnything这些方法,输入图像直接输出深度图或点云,不用逐场景训练,速度快。但问题在于,这些深度图是"图像对齐"的,也就是说每张照片各自预测各自的深度,最后要把它们拼接融合成一个完整网格,而不同视角之间的预测经常对不上,拼接时就容易出现空洞、重影、噪点。

第三条路是生成式重建,像TRELLIS.2、GenRecon这类方法。它们和前馈方法一样不用逐场景训练,但多了一层"学过的先验",就是说模型见过很多三维形状,知道一个杯子、一扇窗户大概应该长什么样,所以即使某个角度完全没拍到,它也能靠"脑补"把形状补全。这正是前两种方法都缺的能力。

但生成式方法的硬伤前面说过了:固定分辨率、固定空间范围。GenRecon想了个办法,把大场景切成一堆互相重叠的小格子,用一种叫MultiDiffusion的技术把这些格子拼起来生成。

**MultiDiffusion**:一种让多个相邻的扩散模型去噪过程互相融合的技术,具体做法是在每一步去噪时,把重叠区域的预测结果加权平均,从而让相邻区域看起来是连续的。

这个办法确实能让生成范围突破模型本身的格子大小限制,但代价是,离得远的两个格子之间几乎没有直接交流,只能靠中间那层层叠叠的重叠区域间接传话。打个比方,这就像让一百个工人分别在一堵长墙的不同区段上砌砖,相邻工人能看到彼此的砖缝对不对齐,但墙这头的工人完全不知道墙那头在砌什么。结果就是,墙的整体走向、每段的高度,很容易对不上,近处看着挺齐整,退远了看就歪歪扭扭。这就是GenRecon的根本局限:局部看着协调,全局未必一致。

**核心方法:从粗到细的级联**

T3lescope的解法听起来很朴素:先生成一个粗糙的全局版本,建立起整体骨架,再一层层往细了磨。

具体来说,系统会先用一个比较大的格子(比如覆盖整个花园)生成一版粗略的网格,这一版网格可能细节模糊,但大致的空间布局、物体位置、整体结构是对的。然后系统把格子边长砍半,在上一级网格的基础上继续生成,这次格子更小了,能看清更多细节,但它不是凭空生成的,而是"继承"了上一级的大致形状,再往里面填充新的细节。这个过程可以反复进行,格子越来越小,细节越来越丰富,直到你觉得够清楚为止。

这里有个关键的技术动作,叫SDEdit。

**SDEdit**:一种图像编辑技术,原理是把一张已有的图片加一点噪声,然后让扩散模型从这个"半噪声"状态开始重新生成,而不是从纯噪声开始。因为起点离目标比较近,生成结果既能保留原图大致结构,又能加入新的细节。

T3lescope把这个思路搬到了三维网格上。每进入下一级更精细的格子,系统不是从一张白纸(纯噪声)开始生成,而是把上一级网格对应区域的形状编码出来,加一点噪声(论文里把这个噪声强度设为0.8,用符号ts表示),然后让生成模型从这个"半成品"状态继续去噪。

这个设计的精髓在于那个噪声强度的取值。如果ts设成1,相当于完全从随机噪声开始,不继承任何上一级信息,这时候每个格子各自为政,互不知道隔壁在生成什么。论文的实验证明了这事有多要命:在一个城市街区场景里,如果不继承上一级信息,建筑的屋顶会碎裂成好几块悬浮在半空中,因为屋顶从街面是看不到的,每个格子只能靠猜,猜出来的结果自然对不上。而一旦保留了父级信息,所有格子都从同一个粗略的建筑轮廓出发,屋顶就能乖乖待在该在的位置。

这就好比你让几个画师分别临摹一幅拼图的不同角落,如果完全不给他们看原画的草图,只告诉每个人"这里大概是个建筑",那画出来的建筑轮廓、层高、朝向大概率各画各的,拼起来缝都对不上。但如果先给每个人一张铅笔打好大致轮廓的底稿,让他们在底稿基础上着色加细节,最后拼出来的东西才会是一栋完整的楼,而不是七拼八凑的碎片。T3lescope的"继承父级再加噪去噪",干的就是发底稿这件事。

数据也印证了这个设计的必要性。在ScanNet++这个室内场景数据集上,32个输入视角的情况下,把ts从1降到0.8,倒角距离(衡量重建网格和真实网格之间的几何误差,数值越小越准)直接降低了5倍。但有意思的是,在观测比较密集的场景里(比如256个视角),ts=1反而能拿到更高的F分数,因为不受父级约束,细节层可以更自由地贴合图像证据。这说明这个参数其实是在"信任上一级的全局判断"和"相信这一级看到的局部证据"之间找平衡,论文最后统一取0.8,作为一个经验上的折中点,不针对具体场景调整。

**图像怎么喂给模型:多尺度瓦片库**

光有从粗到细的骨架还不够,因为每一级格子观察场景的"视力"是不一样的。粗格子看整个花园,自然看得粗;细格子看花园里的一朵花,自然要看得清。那问题来了:同一张照片,怎么同时伺候好一个覆盖80米的粗格子和一个只覆盖10米的细格子?

直接的想法是把原图裁剪缩放,针对每个格子单独处理。但这么做的代价很大,因为场景里格子的数量可能成百上千,每个格子都单独裁一次图、编码一次特征,计算量爆炸。

T3lescope的解法是造一个"瓦片金字塔"。

**瓦片金字塔**:把每张原始照片按不同缩放比例生成一系列版本(金字塔的每一层),再把每一层切成固定大小(512×512像素)的小方块,这些方块和三维格子没有任何绑定关系,是提前准备好的、谁都能拿来用的"素材库"。

每个三维格子在挑选参考图像时,会根据自己的"视力"去匹配金字塔里缩放比例合适的那一层,取覆盖自己投影区域的那几块瓦片。关键在于,这些瓦片只需要编码一次,存起来,不管后面有多少个格子、多少次去噪迭代要用它,都是直接查表取用,不用重复计算。

这就像一个图书馆提前把一本大部头按章节、按不同详细程度(摘要版、精读版、逐字版)都准备好,谁需要哪种详细程度直接去架子上取,而不是每次有人来借书都现场重新打印一份。如果不这么做,每来一个读者就现炒一份定制笔记,馆员会被累死,而且不同读者要的内容其实有大量重叠,重复劳动毫无意义。

除了瓦片库解决"该看哪张图的哪个尺度",T3lescope还设计了一种叫"体素查询图像注意力"的机制,用来解决"该怎么从图像里提取有用信息"的问题。

**体素查询图像注意力**:三维网格里的每一个小方块(体素)会把自己投影到每张参考照片上,然后去关注投影点附近一小片区域的图像特征,而不是简单地在一个固定网格上插值取一个点的值。

过去常见的做法是把体素投影到图像上,双线性插值取一个特征值,这样做的问题是图像编码器(这里用的是DINOv3)每个特征格子本身就覆盖16×16像素的一大片区域,插值再怎么插也补不出比这更细的信息,相当于你透过一块磨砂玻璃看东西,再怎么调焦也看不清玻璃纹理之后的细节。T3lescope让体素用注意力机制去"看"投影点周围的几个特征块,并且把体素到每个特征块中心的精确像素偏移也编码进注意力分数里,这样哪怕图像特征本身比较粗,模型依然能感知到子像素级别的位置信息。更进一步,为了捕捉比16像素还细的纹理,论文还加了一个用ConvNeXt网络提取的轻量级特征分支,专门负责像素级的细节,比如头发丝、衣服的褶皱、纽扣这种小东西。

论文里有个很直观的对比实验:在一个多人合影的场景里,不用这套注意力机制的基线方法会把人物的头发、鼻子、衣服褶皱全都抹平成光滑的一片,而加上体素查询注意力后能看到发丝的走向,再加上ConvNeXt细节分支后,连衣服上的纽扣都能看清楚。

**训练怎么做到一套权重打天下**

这里还有个值得琢磨的地方。T3lescope的生成模型只有一套,粗格子和细格子用的是同一组参数,没有像某些层级化方法(比如XCube、SCube)那样针对每一层单独训练一个模型。这是怎么做到的?

答案在于训练时就没有给模型"分层"的概念。训练数据是从各种场景里,按不同的边长(比如1米、2米、4米,或者1.5米、3米、6米这样的尺度阶梯)随机切出来的独立格子,每个格子被统一映射到相同的坐标系统和相同分辨率的网格里,模型看到的输入形式永远一样,体素间距(也就是格子边长除以网格分辨率)不一样而已,但这个间距信息本身不直接告诉模型。这意味着模型学到的是一种"不管你这个格子代表现实中多大的范围,我都按同样的套路去理解图像和生成形状"的能力,而不是死记硬背某个固定尺度下的规律。

这个设计直接带来一个好处:推理的时候,你想用几层级联、每层格子多大、格子摆在哪,这些全都是运行时才决定的,不用重新训练模型。这就好比一台相机的镜头,如果出厂时就被焊死只能拍某个焦段,你以后想拍远景近景都得换一台新相机。但T3lescope更像一个变焦镜头,推理时现场调焦距就行,背后驱动镜头的"马达"(也就是那套神经网络权重)是同一套。

**实验结果说了什么**

光讲道理不够,数字才是硬通货。论文在三个场景上做了系统评测:室内场景数据集ScanNet++、室内外混合的Tanks and Temples,以及论文团队自己收集的城市街区数据集。

在ScanNet++上,32视角和256视角两种设置下,T3lescope的最细一级在MAE(深度误差的平均绝对值)、法线角度误差、完整度等多个二维指标,以及倒角距离、F分数、法线一致性等三维指标上,全面超过了生成式基线GenRecon。有意思的是,T3lescope在32视角和256视角下的表现几乎没有太大差距,而对比的逐场景优化方法(比如2DGS)在视角从256降到32时性能明显下滑,F分数从0.53掉到0.48。这说明生成式先验确实在观测稀疏时发挥了作用,少看几眼也能靠"脑补"补回来,而纯优化方法没有这个本事,看得少就是看得少,没法靠想象力弥补。

在Tanks and Temples上,情况稍微复杂一些。逐场景优化方法在稠密视角下F分数更高,这不难理解,因为这些方法本质上是在逐像素拟合输入图像,只要图像够多够密,拟合精度自然高。但T3lescope在倒角距离这个指标上几乎全面占优,而且在卡车(truck)这个场景里,所有对比方法都没能把那些透明反光的车窗重建成封闭完整的表面,只有T3lescope靠着生成式先验把这些棘手的材质补全了。

城市街区数据集是最能体现T3lescope威力的地方。这些场景的拍摄距离从几米到上百米不等,街拍照片近处是人行道的砖缝,远处是几十层楼的屋顶,这种尺度跨度对所有基线方法都是灾难。论文里给出的数字相当直白:所有基线的倒角距离都在5米左右,而T3lescope跑到四层级联后能把误差压到0.645米,提升接近一个数量级。这不是渐进式的改进,是质变。

| 方法 | 倒角距离(米)↓ | F@10↑ | 法线一致性↑ |

|---|---|---|---|

| 2DGS | 4.858 | 0.076 | 0.174 |

| CityGaussianV2 | 5.155 | 0.112 | 0.228 |

| DA3 | 5.184 | 0.015 | 0.048 |

| Murre | 9.998 | 0.001 | 0.010 |

| T3lescope(L0,80米) | 0.872 | 0.245 | 0.269 |

| T3lescope(L1,40米) | 0.714 | 0.296 | 0.315 |

| T3lescope(L2,20米) | 0.662 | 0.351 | 0.350 |

| **T3lescope(L3,10米)** | **0.645** | **0.367** | **0.361** |

这张表里每一级都在稳步进步,没有哪一级是在退步的,说明级联结构确实在持续加料,而不是某一层白忙活。

**这个方法也不是万能的**

论文自己也承认了一个挺有意思的失败案例。既然格子的位置和大小都能在推理时自由设置,理论上你应该能把格子摆到离相机很远的地方,去重建那些看不太清的远景,比如一片森林背后的山,或者雕像后面的草坪。

论文真试了这个想法,在ignatius和caterpillar这两个场景里,用四层级联,把格子摆到了比相机远八倍的地方。结果是,模型对这些远处物体的重建效果并不好,地面和背景树木基本是一团糟。作者猜测这可能是训练数据多样性不够导致的,而且他们也坦承,这套方法从设计上就没法处理无穷远处的物体,毕竟格子终究是有限大小的,你不可能用有限的格子去覆盖无限的空间。

这个坦诚挺难得的,很多论文会把负面结果藏起来,但这里明明白白写出来了,说明作者清楚这条路还没走到头。

**写在后面**

读完这篇论文,我对"分辨率"这个词的理解被重新刷新了一下。我们平时说一张图片的分辨率,想到的是像素格子有多密,但三维重建里的分辨率其实有两层含义混在一起:格子本身有多细,和格子覆盖的范围有多大。大部分方法把这两者焊死在一起,焊死之后你就只能在"细而窄"和"粗而宽"之间二选一。T3lescope做的事其实挺简单,就是把这两者解耦了,让"细不细"和"看多宽"变成两个可以独立调节的旋钮,这个思路听起来朴素,但真正落地需要解决图像怎么喂、父子级怎么传递信息这些一堆琐碎又关键的工程细节,论文花了大半篇幅在讲这些细节,也说明这事远没有听起来那么容易。

还有一点挺触动我的,是那个"继承父级再加噪去噪"的设计。它本质上是在说,生成模型不需要每次都从零开始,它可以带着一个不完美但大致正确的草稿去工作,这和人类画画、写文章的习惯其实是一致的,先打草稿,再精修,而不是一上来就抠细节。论文用一个参数ts就把这个"精修力度"量化了出来,数值越小越保守,越大越激进,这种把直觉显式参数化的做法,是我觉得这篇论文里最值得玩味的一个小设计。

那个城市街区重建失败案例,我反而觉得比成功案例更有价值。一个方法在哪里失灵,往往比它在哪里成功更能说明这个方法的真实边界在哪儿。远处物体重建不好这件事,提醒我们生成式先验终究是从训练数据里学出来的某种"常识",一旦场景超出了这种常识的覆盖范围,模型就会露怯。这其实也是所有依赖学习先验的方法共同的软肋,只是这篇论文把它摆在了明面上。

Q&A

Q1:T3lescope是什么?

A:T3lescope是一种从多张照片直接生成高精度三维网格的技术,不需要针对每个场景单独训练,而是用同一个固定分辨率的生成模型,通过从粗到细的级联方式,把单个物体到整座城市街区的场景都重建出来。

Q2:T3lescope和GenRecon这类方法相比有什么不同?

A:GenRecon把大场景切成很多重叠小格子用MultiDiffusion拼接,但格子之间只能靠重叠区域间接交流,容易出现整体不一致的问题。T3lescope先生成一个粗略的全局版本确立整体结构,再逐级细化,每一级都继承上一级的信息,所以全局一致性更好。

Q3:T3lescope在城市街区重建上表现如何?

A:效果提升非常明显,所有对比的基线方法(如2DGS、DA3)在城市街区场景里倒角距离都在5米左右,而T3lescope用四层级联后能把误差降到0.645米,性能提升接近一个数量级。

分享至
0赞

好文章,需要你的鼓励

推荐文章
----..---.-...-/--...-.-......./-...-....-..--../-............-.- ----..---.-...-/--...-.-......./-...-....-..--../-............-.- ----..---.-...-/--...-.-......./-...-....-..--../-............-.- ----..---.-...-/--...-.-......./-...-....-..--../-............-.-