CityGo: Lightweight Urban Modeling and Rendering with Proxy Buildings and Residual Gaussians
ShanghaiTech University
一句话总结
CityGo 用”带纹理的代理建筑网格 + 残差高斯 + 环境高斯”的混合表达来重建并渲染大规模航拍城市场景,把建筑规则几何交给轻量网格、把高频细节和周边环境交给稀疏 3D 高斯,从而在移动 GPU 上实现实时渲染,同时显著压缩模型体积、缩短训练时间。
研究背景
大规模城市建模与渲染是城市规划、自动导航、智慧城市数字孪生的基础技术,其中建筑物的建模尤为关键。无人机航拍相比地面影像能覆盖屋顶和空间布局,是可扩展城市建模的理想数据源;但同时对边缘设备(无人机、手机、AR 眼镜)的实时轻量渲染提出了内存、功耗、时延的严格约束。现有路线各有短板:
- 传统几何方法(SfM、MVS、纹理映射)在弱纹理、反射表面、复杂几何处易产生破碎点云和噪声网格,稠密网格内存开销大,纹理映射还会出现接缝、鬼影等伪影。
- NeRF 类神经方法 渲染质量高,但训练慢、运行时性能有限,隐式体表达难以压缩、编辑和部署到受限设备。
- 3D Gaussian Splatting(3DGS) 显式高效,但用它建模整座城市可能需要上亿个高斯、占用数十 GB 显存,远超移动平台承受能力;且高频纹理往往要靠稠密高斯堆叠,在简单几何区域造成冗余和模糊。
CityGo 的出发点是:城市中大量建筑其实是规则的多面体几何,用网格表达远比堆高斯高效;只需把网格搞不定的高频外观和不规则环境元素交给稀疏高斯补充。
方法
整体是一个混合表达管线:先由航拍图像生成全场景稠密点云并初始化零阶球谐(SH=0)高斯,再借助 GIS 建筑分割把场景拆成”建筑”与”周边环境”两部分分别处理。建筑用”代理网格 + 残差高斯”,环境用下采样的稀疏高斯,最后联合优化。
flowchart TD
A[航拍多视图] --> B[SfM/MVS 稠密点云]
B --> C[初始化 SH=0 全场景高斯]
C --> D{GIS 建筑分割}
D -->|建筑| E[BPCC 点云补全]
E --> F[网格提取 FPP+KSR]
F --> G[3DGS 合成视图纹理映射 + UV 微调]
D -->|建筑高频| H[残差高斯 CRM 引导采样]
D -->|周边环境| I[重要性下采样环境高斯]
G --> J[混合联合优化]
H --> J
I --> J
J --> K[移动 GPU 实时渲染]
建筑点云补全(BPCC)
MVS 得到的单栋建筑点云常因遮挡、重复纹理、表面反射而残缺,妨碍后续网格提取与纹理映射。作者受层式代理几何方法启发,对稠密点云沿竖直方向切成一系列水平层 \(L = \{L_1, \cdots, L_n\}\),逐层把该层及以上的点投影到当前层平面得到投影点集,再由轮廓构造代理几何、采样补洞。
相比原始做法,作者做了三点改进以适应稀疏噪声的 SfM/MVS 点云与复杂建筑(凹形布局、双子塔等):
- 用稠密点云而非稀疏点云作为输入;
- 对每层投影的 2D 点做聚类(DBSCAN)后再分簇求轮廓;
- 用 alpha-shape 算法替代凸包,得到更贴合的轮廓。
处理方向也从自顶向下改为自底向上:从最底层 \(L_n\) 聚类求初始主导轮廓集合 \(S\),向上逐层继承下层聚类结果并重新聚类。当满足以下任一条件时引入新的主导轮廓——(1) 某簇分裂为多簇,或 (2) 仍为单簇但其 alpha-shape 轮廓面积相对下层显著缩小,即
\[\frac{\mathrm{Area}(\hat{C}^k_i)}{\mathrm{Area}(\hat{S}^k_{i+1})} \le \gamma\]
其中 \(\gamma\) 为固定阈值。若两条件都不满足则沿用下层轮廓。这样自底向上逐层处理,得到更忠实的层式代理几何,并据此采样点填补建筑底面与侧面的缺洞。
网格提取与纹理映射
对补全后的无洞点云,先用拟合平面基元(FPP)算法以平面近似点云,其目标函数为
\[U(x) = w_f U_f(x) + w_s U_s(x) + w_c U_c(x)\]
其中 \(U_f、U_s、U_c\) 分别为保真度、平滑度、完整度项,权重 \(w_f=w_s=w_c=1\)。得到的平面基元再输入动力学形状重建(KSR)方法,将空间划分为内外区域并生成代理建筑几何。
纹理映射上,直接用航拍原图会因跨视图色差和邻近建筑遮挡产生接缝、黑斑、错位。作者改用单栋建筑的 3D 高斯模型渲染合成图作为受控输入——可精确控制虚拟相机位姿,清晰呈现门窗、结构轮廓并减少遮挡。每栋建筑渲染 28 个视图(竖直三层,仰角 20°–90°;水平 8 个视点绕建筑均布 0°–360°,另加 4 个顶视),纹理分辨率按包围盒大小在 1024–4096 之间动态取值。
UV 微调:通过可微光栅化进一步修正代理几何渲染与真值的差异。标准光栅化下 UV 图按重心坐标一一采样,每次迭代只更新少量 UV 像素会导致椒盐噪声。作者对 UV 图做平滑变换
\[T_{smooth} = \mathrm{cov}(T, g)\]
其中 \(g\) 为固定卷积核,用于优化过程中平滑纹理,从而得到更锐利真实的颜色渲染。
残差高斯
代理建筑擅长表达简单多面几何,但难以刻画高频细节与复杂外观。作者引入残差 3D 高斯作为互补分量,与代理建筑组成混合表达。残差高斯从初始高斯集里稀疏采样,采样受色彩残差图(CRM)引导,CRM 量化代理渲染纹理与真值外观之差:
\[c_{res} = |c_{GT} - c_m|\]
其中 \(c_m\) 为代理网格渲染出的颜色。为隔离建筑本身的误差,把代理建筑投影到真值图上生成建筑掩膜,只在建筑区域计算 CRM。
给定三角网格 \(M = \{V, F, T\}\)(顶点、面、UV 坐标),对某视点穿过像素 \(m\) 的光线 \(r_m\),光栅化产出从 UV 图采样的颜色 \(c_m\) 和 z-buffer 深度 \(d_m\):
\[d_m, c_m = R(M, r_m)\]
由于 UV 图走表面渲染范式,其不透明度固定为 1.0,使网格被视作光线上最终交点面。网格深度是 3DGS 训练早期可靠的弱监督信号。作者引入保护区间 \(d_g\),在混合渲染时只激活深度 \(d < d_m + d_g\) 的高斯,把高斯约束在网格表面附近。最终混合颜色由激活高斯与网格表面累积得到:
\[c_h(x) = \sum_{k=1}^{K} T_k \alpha_k c_k + T_m c_m, \quad T_m = \prod_{k=1}^{K}(1-\alpha_k)\]
其中 \(\alpha_k\) 为第 \(k\) 个高斯的不透明度,\(T_k\) 为其透射率。为选出有意义的残差高斯,基于 CRM 计算每个高斯在视点 \(\gamma\) 下的得分:
\[E^\gamma_k = \max_{r \in P_\gamma} c_{res}(r)\, \alpha_k(r)\, T_k(r)\]
其中 \(P_\gamma\) 是视点 \(\gamma\) 所有像素对应的采样光线集合。为消除视角偏差,取跨所有训练视图的最大得分:
\[E_k = \max_{\gamma \in \Gamma} E^\gamma_k\]
得分高于预设阈值的高斯被选为残差高斯,阈值可按可接受的像素误差灵活调整。
环境高斯
道路、车辆、树木等周边细粒度元素难用传统 MVS 准确重建,常被过度简化。作者直接用 3D 高斯表达周边环境,且不用建筑分割剩下的高斯,而是从初始全场景高斯里下采样一个稀疏子集。采用基于重要性的采样:第 \(k\) 个高斯的重要性定义为其在所有光线上的累积混合权重
\[I_k = \sum_{i=1}^{N} w_{k,i}\]
据此给每个高斯分配采样概率以保证空间分布均匀:
\[P_k = \frac{I_k}{\sum_{j=1}^{K} I_j}\]
由此得到轻量的环境高斯集,与建筑表达(代理网格 + 残差高斯)合并成统一城市模型。在后续混合优化阶段联合细化环境高斯的位置、尺度、不透明度和外观,其中位置用较低学习率更新以保持空间一致性。
实验结果
在三个真实城市数据集上评测:作者自采的两个航拍数据集 Area-H(密集商业区高层建筑,8047 张图,各覆盖约 1.5 km²)、Area-L(住宅区低层建筑,6192 张图),以及公开的 UrbanBIS 数据集。对比方法包括 3DGS、2DGS、OctreeGS、CityGS-V1、CityGS-V2,实验主要在 NVIDIA RTX A6000 上进行。
UrbanBIS 数据集上的对比:
| 方法 | PSNR↑ | Size(MB)↓ | #GS(M)↓ | Time(h)↓ | FPS↑ |
|---|---|---|---|---|---|
| 3DGS | 18.20 | 356 | 2.27 | 1.6 | 189.11 |
| 2DGS | 16.85 | 147 | 0.93 | 2.5 | 12.83 |
| OctreeGS | 17.39 | 55 | 1.87 | 2.52 | 73.10 |
| CityGS-v1 | 18.38 | 404 | 1.71 | 3.5 | 130.90 |
| CityGS-v2 | 17.98 | 88 | 0.562 | 5.5 | 58.65 |
| Ours | 18.48 | 117 | 0.72 | 1.4 | 253.86 |
Area-H / Area-L 大场景对比(节选):
| 方法 | Area-H PSNR↑ | Area-H Size(MB)↓ | Area-H FPS↑ | Area-L PSNR↑ | Area-L Size(MB)↓ | Area-L FPS↑ |
|---|---|---|---|---|---|---|
| 3DGS | 22.44 | 6319 | 33.60 | 25.00 | 6986 | 30.93 |
| 2DGS | 22.19 | 4127 | 4.59 | 24.41 | 3849 | 5.09 |
| CityGS-v2 | 21.04 | 1140 | 5.27 | 23.95 | 1335 | 6.19 |
| Ours | 21.93 | 741 | 161.14 | 23.97 | 624 | 196.00 |
- 速度与体积:在 UrbanBIS 上取得最高 PSNR(18.48)的同时,训练时间最短(1.4h)、FPS 最高(253.86),模型体积约为 3DGS 的 1/8。大场景 Area-H/Area-L 上 FPS 达 161/196,远超各基线,模型体积和训练时间也最小。
- 质量折中:PSNR 相比 3DGS 最多下降约 1.03 dB,作者认为效率的大幅提升使其仍具竞争力。
- 移动端实测:在 NVIDIA Jetson AGX Orin、720p(车载典型分辨率)下,CityGo 在三个数据集上分别达 20/24/51 FPS,而 3DGS 仅 5/6/29 FPS,可对最大 1.5 km² 的城市场景实现至少 20 FPS 实时渲染。
- 代理网格压缩:Area-H 上代理网格相比 MVS 网格体积压缩约 61.7×(53.96 MB vs 3329.24 MB,面数 5.7 万 vs 2846 万)。
- 视觉表现:缓解了 3DGS 在场景表面产生的漂浮高斯问题,并消除了分块训练在大场景合并时的块间色差。
消融(UrbanBIS):去掉 UV 微调会需要更多残差高斯来补偿外观差异,导致模型变大(Size 从 112 升到 126,#GS 从 0.72 升到 0.81);去掉 CRM 采样改用随机采样则降低渲染质量并引入明显的高斯漂浮物。
亮点与局限
亮点:
- 按几何复杂度分工的混合表达:规则建筑用轻量带纹理网格、高频细节用残差高斯、不规则环境用稀疏高斯,从表征层面消除了纯 3DGS 在简单几何上堆高斯的冗余。
- 用合成渲染图做纹理映射:以单栋建筑的 3D 高斯渲染合成图替代原始航拍图,规避了跨视图色差与邻近建筑遮挡带来的纹理伪影。
- CRM 引导 + 深度保护区间:残差高斯只放在代理渲染与真值差异大的区域,并被约束在网格表面附近,兼顾保真与紧凑。
- 真正落到边缘设备:在移动 GPU 上实测实现大规模城市场景实时渲染,训练时间和显存显著下降。
局限:
- 系统高度依赖准确的代理几何。起重机、标识牌等非建筑结构可能被误分类为建筑。
- 纹理不透明度固定为 1.0,使 3DGS 无法纠正这类误分类误差,导致伪影和 PSNR 下降。
- 作者指出未来将探索语义感知建模与自适应透明度来缓解上述问题。
延伸思考
- 固定不透明度 1.0 是当前误差无法自愈的根源,若引入可学习的网格透明度或语义门控,或许能在保持网格紧凑性的同时让高斯层”接管”误分类区域。
- “按几何复杂度分配表征预算”的思路(规则→网格、高频→残差、杂乱→稀疏高斯)具有普适性,是否可迁移到室内场景、工业设施等同样存在大量规则结构的场景。
- BPCC 与代理提取依赖 GIS 建筑分割作为先验,若分割不可得或不准确,管线的鲁棒性如何,是否可用自监督的几何规则性检测替代外部先验值得探索。