GS4City: Hierarchical Semantic Gaussian Splatting via City-Model Priors
April 23, 2026 · View on GitHub
Qilin Zhang, Jinyu Zhu, Olaf Wysocki, Benjamin Busam, Boris Jutzi
Introduction
GS4City is a hierarchical semantic Gaussian Splatting method that incorporates city model priors for urban scene understanding.
This project builds upon the following prior works:
The experiments in this project are conducted on the TUM2TWIN dataset.
Preprocessing
Before running the pipeline, complete the following three preprocessing steps.
Structure-from-Motion (SfM)
Use an SfM tool to reconstruct a sparse scene from multi-view images. The following files must be generated:
sparse/0/cameras.bin
sparse/0/frames.bin
sparse/0/images.bin
sparse/0/points3D.bin
3D Gaussian Splatting Pretraining
Train a 3DGS model using the original Gaussian Splatting implementation. Place the trained model under:
model/<pretrained_model_name>/
CityGML Semantic Data Preparation
Prepare semantic data from CityGML using the preprocessing pipeline provided in CityGML2Mask
Place the result files under:
gml_mask/(per-view.npymasks)gml_mask_vis/(visualization images)city_semantics.jsonid_mapping.json
Project Structure
The project directory should follow this structure:
your_project/
├─ dataset/
│ └─ <scene_name>/
│ ├─ images/
│ ├─ gml_mask/
│ ├─ gml_mask_vis/
│ ├─ sparse/
│ │ └─ 0/
│ │ ├─ cameras.bin
│ │ ├─ frames.bin
│ │ ├─ images.bin
│ │ └─ points3D.bin
│ ├─ city_semantics.json
│ └─ id_mapping.json
├─ model/
├─ weight/
├─ output/
Requirements
- Files in
images/,gml_mask/, andgml_mask_vis/must correspond one-to-one (same filename, different extensions).
Mask Preparation
1.SAM Mask Generation
python get_sam_mask.py --scene <scene_name> --gml --clip --visualize
Outputs:
dataset/<scene_name>/raw_sam_mask/dataset/<scene_name>/raw_sam_mask_vis/
Key Parameters:
--scene: scene identifier--gml: enable filtering using CityGML masks--clip: enable CLIP-assisted classification--visualize: save visualization results
Default Configuration:
mask/config.json
2.Cross-View Mask Association
python associate.py --scene <scene_name> --model <pretrained_model_name> --visualize --clip
Outputs:
dataset/<scene_name>/sam_mask/dataset/<scene_name>/sam_mask_vis/
Key Parameters:
--scene: scene identifier--model: pretrained 3DGS model name--visualize: enable visualization--clip: enable CLIP-based matching
Default Configuration:
mask/config.jsonarguments.py
3.Mask Fusion and CLIP Feature Extraction
python fuse_masks.py --scene <scene_name>
Outputs:
dataset/<scene_name>/fused_mask/dataset/<scene_name>/fused_mask_vis/dataset/<scene_name>/object_clip_index.npz
Key Parameters:
--scene: scene identifier
Semantic Training
Training
python train.py \
--scene <scene_name> \
--model <pretrained_model_name> \
--output <output_name> \
--resolution 8 \
--iterations 10000
Outputs:
-
output/<output_name>/cfg_argspoint_cloud/iteration_xxx/classifier.pth- checkpoints (optional)
Notes:
- The training pipeline prioritizes
fused_mask/; if unavailable, it falls back tosam_mask/.
Rendering
python render.py --output_name <output_name> --render_video
Outputs:
output/<output_name>/train/ours_<iter>/output/<output_name>/test/ours_<iter>/
GUI Visualization
The GUI integrates CityGML semantic knowledge with CLIP-based open-vocabulary features, enabling interactive exploration and querying of the reconstructed 3D scene.
python main_gui.py \
-s dataset/<scene_name> \
--model_path output/<output_name> \
--iteration 10000 \
--gui_width 1024 \
--gui_height 768
Required Inputs
dataset/<scene_name>output/<output_name>
Required Files (copy into output directory)
city_semantics.jsonid_mapping.jsonobject_clip_index.npz
View Mode Switching
Switch between different visualization modes: RGB mode, Segmentation mode and Overlay mode.
Hierarchical Semantic Interaction
Interact with the scene using hierarchical semantics derived from CityGML:
- building → surface → part
- enables structured understanding of urban elements
Semantic Attribute Retrieval
Click on any object in the scene to retrieve its corresponding CityGML semantic information.
Semantic Search
Perform hybrid semantic queries combining:
- structured labels (e.g., building components from CityGML)
- open-vocabulary queries (via CLIP for non-building elements)
Configuration Files
mask/config.json: preprocessing parameters (SAM, CLIP, projection)config/train.json: training parametersarguments.py: shared configuration