DeepChoice
DeepChoice is a lightweight multi-view fusion framework for image-guided 3D semantic segmentation.
For each 3D point, the preprocessing pipeline gathers the visible images, computes geometric and radiometric visibility criteria, attaches per-view 2D semantic scores, and the model learns one weight per view before fusing the evidence into a final 3D prediction.
This repository contains:
the DeepChoice training, evaluation, and inference code
preprocessing pipelines for GridNet-HD and Cultural Heritage
two DeepChoice backbones:
DeepChoiceTransformer
DeepChoiceMLP
a 2D image baseline used to export per-image logits / softmax scores
public config files and released checkpoints
Citation
If you use this repository, please cite:
1 @article{Carreaud2026DeepChoice,
2 title={DeepChoice: Learning View Weighting for Image-Guided 3D Semantic Segmentation},
3 author={Antoine Carreaud and Digre Frinde and Shanci Li and Jan Skaloud and Adrien Gressin},
4 year={2026},
5 url={https://cspaper.org/openprint/20260331.0001v1},
6 journal={OpenPrint:20260331.0001v1}
7 }
Repository Layout
1 .
2 ├── main.py
3 ├── configs/
4 ├── dataset/
5 ├── dataset_generation/
6 ├── experiments/
7 ├── image_baseline/
8 ├── model/
9 ├── scripts/
10 ├── train/
11 ├── utils/
12 └── weights/
Main directories:
dataset_generation/: preprocessing and batch generation
dataset/: PyTorch datasets for training and evaluation
model/: DeepChoice backbones
train/: training, testing, and inference logic
image_baseline/: 2D segmentation baseline used to export image scores
experiments/: reusable experiment runners
scripts/: small utilities for figure generation or format conversion
weights/: released checkpoints
Public Config Files
DeepChoice configs:
configs/config_deepchoice_base.yaml
configs/config_gridnet_hd_transformer.yaml
configs/config_gridnet_hd_mlp.yaml
configs/config_cultural_heritage_transformer.yaml
configs/config_cultural_heritage_mlp.yaml
Dataset generation configs:
configs/config_gridnet_hd_dataset_generation.yaml
configs/config_cultural_heritage_dataset_generation.yaml
Released Checkpoints
DeepChoice:
weights/deepchoice/gridnet_hd_transformer_best_model.pt
weights/deepchoice/gridnet_hd_mlp_best_model.pt
weights/deepchoice/cultural_heritage_transformer_best_model.pt
weights/deepchoice/cultural_heritage_mlp_best_model.pt
Image baseline:
weights/image_baseline/gridnet_hd_best_model.pth
weights/image_baseline/cultural_heritage_best_model.pth
Main Results
The tables below summarize the main quantitative results reported in the paper.
GridNet-HD test split
Method mIoU (%) Params Hard vote 66.78 60 M Mean-probability fusion 69.37 60 M DeepChoice-MLP 70.52 60 M + 0.09 M DeepChoice-Transformer 70.63 60 M + 0.02 M AnyView oracle 84.33 -
On the full GridNet-HD benchmark, DeepChoice-Transformer improves over hard voting by +3.85 mIoU points and over mean-probability fusion by +1.26 mIoU points.
Cultural Heritage (3_SS)
Method mIoU (%) mF1 (%) Hard vote 65.66 73.87 Mean-probability fusion 66.73 74.81 DeepChoice-MLP 66.35 74.54 DeepChoice-Transformer 67.21 75.49 AnyView oracle 86.92 92.83
On Images&PointClouds Cultural Heritage, DeepChoice-Transformer improves over hard voting by +1.55 mIoU points and over mean-probability fusion by +0.48 mIoU points.
Environment
Reference environment used during development:
Component Version OS Ubuntu 24.04 Python 3.12 PyTorch 2.7 CUDA 12.x JAX 0.6 laspy 2.x
Installation:
1 git clone https://huggingface.co/heig-vd-geo/DeepChoice
2 cd DeepChoice
3
4 conda create -n deepchoice python = 3.12
5 conda activate deepchoice
6
7 pip install --upgrade pip
8 pip install -r requirements.txt
The repository includes a .gitattributes file configured for Git LFS so released .pt and .pth checkpoints can be pushed cleanly.
GridNet-HD Preprocessing
The GridNet-HD preprocessing pipeline expects, for each tile:
a LAS point cloud
oriented images
camera poses and intrinsics / extrinsics
per-image logits or softmax scores exported by the 2D baseline
Configuration:
configs/config_gridnet_hd_dataset_generation.yaml
The GridNet-HD preprocessing config expects the official split file distributed with the dataset at ./data/gridnet_hd/public/split.json.
Compute normals:
python scripts/compute_normals.py --config configs/config_gridnet_hd_dataset_generation.yaml
Generate DeepChoice batches:
python scripts/run_batch_generation.py --config configs/config_gridnet_hd_dataset_generation.yaml
For each visible (point, image) pair, the pipeline computes:
incidence angle
distance
local contrast
blur response
signal-to-noise ratio
saturation
Generated batches are written under:
artifacts/gridnet_hd/batches/train
artifacts/gridnet_hd/batches/val
artifacts/gridnet_hd/batches/test
Each .pt batch contains:
visibility: [N, max_views, num_features]
logits: [N, max_views, num_classes]
mask: [N, max_views]
target: [N]
coords_int
coords_scale
coords_offset
coords_tile_offset
Cultural Heritage Preprocessing
Configuration:
configs/config_cultural_heritage_dataset_generation.yaml
Compute normals:
python scripts/compute_normals_cultural_heritage.py --config configs/config_cultural_heritage_dataset_generation.yaml
Generate batches:
python scripts/run_batch_generation_cultural_heritage.py --config configs/config_cultural_heritage_dataset_generation.yaml
This setup is useful for internal experiments and custom split protocols. Exact reproduction of a paper-specific Cultural Heritage protocol may require additional split management.
DeepChoice Training
Main DeepChoice entry point:
Supported modes:
Base config:
configs/config_deepchoice_base.yaml
Example single-process training:
python main.py --config configs/config_deepchoice_base.yaml --mode train
Example distributed training:
torchrun --standalone --nproc_per_node=4 main.py --config configs/config_deepchoice_base.yaml --mode train
Useful config sections:
data: batch roots and split-specific overrides
dataset: selected visibility features and normalization ranges
model: backbone choice and architecture hyperparameters
training: optimizer, scheduler, dataloading, and DDP settings
test: evaluation and inference split settings
Important training options:
training.file_batch_size
training.eval_file_batch_size
training.train_limit_files
training.randomize_train_limit_each_epoch
training.val_split
Evaluation
Example evaluation with baselines:
1 python main.py \
2 --config configs/config_deepchoice_base.yaml \
3 --mode test \
4 --weights_path /path/to/best_model.pt \
5 --split test
The test pipeline reports:
model mIoU and mF1
hard_vote
mean_prob_vote
anyview
Inference and LAS Export
Standard inference:
1 python main.py \
2 --config configs/config_deepchoice_base.yaml \
3 --mode infer \
4 --weights_path /path/to/best_model.pt \
5 --split test \
6 --inference_output /path/to/output_dir
Inference with an additional comparison model:
1 python main.py \
2 --config /path/to/transformer_config.yaml \
3 --mode infer \
4 --weights_path /path/to/transformer_best_model.pt \
5 --comparison_config /path/to/mlp_config.yaml \
6 --comparison_weights_path /path/to/mlp_best_model.pt \
7 --comparison_field_name best_mlp \
8 --split test \
9 --inference_output /path/to/output_dir
Generated outputs:
pred_batch_*.pt
one LAS file per tile
Each LAS may contain:
classification: primary model prediction
ground_truth
best_transformer
best_mlp
mean_prob_vote
hard_vote
Image Baseline
The repository also contains the 2D image segmentation baseline used to export per-image semantic scores:
Provided configs:
image_baseline/configs/gridnet_hd.yaml
image_baseline/configs/cultural_heritage.yaml
Train:
python image_baseline/main.py --config image_baseline/configs/gridnet_hd.yaml --mode train
Validate:
1 python image_baseline/main.py \
2 --config image_baseline/configs/gridnet_hd.yaml \
3 --mode val \
4 --weights_path /path/to/best_model.pth
Export logits / softmax scores:
1 python image_baseline/main.py \
2 --config image_baseline/configs/gridnet_hd.yaml \
3 --mode export_logits \
4 --weights_path /path/to/best_model.pth
The exported arrays are stored as .npy files following the dataset-relative image structure.
Experiment Runners
Reusable experiment runners:
experiments/run_weekend_experiments.py
experiments/run_validation_experiments.py
Paper-related plans included in the repository:
experiments/weekend_vislogits_nobalanced_plan.yaml
experiments/weekend_vislogits_maxviews_plan.yaml
experiments/test_vislogits_best_plan.yaml
experiments/weekend_vislogits_cultural_heritage_plan.yaml
experiments/test_vislogits_cultural_heritage_best_plan.yaml
Typical launch:
1 python experiments/run_weekend_experiments.py \
2 --base-config configs/config_deepchoice_base.yaml \
3 --plan /path/to/weekend_plan.yaml \
4 --output-root /path/to/output_root \
5 --continue-on-error
GridNet-HD input ablation:
1 python experiments/run_weekend_experiments.py \
2 --base-config configs/config_deepchoice_base.yaml \
3 --plan experiments/weekend_vislogits_nobalanced_plan.yaml \
4 --output-root /path/to/output_root \
5 --continue-on-error
GridNet-HD max-views ablation:
1 python experiments/run_weekend_experiments.py \
2 --base-config configs/config_deepchoice_base.yaml \
3 --plan experiments/weekend_vislogits_maxviews_plan.yaml \
4 --output-root /path/to/output_root \
5 --continue-on-error
GridNet-HD final test evaluation:
1 python experiments/run_validation_experiments.py \
2 --base-config configs/config_deepchoice_base.yaml \
3 --plan experiments/test_vislogits_best_plan.yaml \
4 --output-root /path/to/output_root
Cultural Heritage experiment:
1 python experiments/run_weekend_experiments.py \
2 --base-config configs/config_deepchoice_base.yaml \
3 --plan experiments/weekend_vislogits_cultural_heritage_plan.yaml \
4 --output-root /path/to/output_root \
5 --continue-on-error
Cultural Heritage evaluation of the released best models:
1 python experiments/run_validation_experiments.py \
2 --base-config configs/config_deepchoice_base.yaml \
3 --plan experiments/test_vislogits_cultural_heritage_best_plan.yaml \
4 --output-root /path/to/output_root
Utility Scripts
Currently kept in scripts/:
scripts/compute_normals.py
scripts/compute_normals_cultural_heritage.py
scripts/run_batch_generation.py
scripts/run_batch_generation_cultural_heritage.py
scripts/make_visibility_paper_figure.py
scripts/convert_cultural_heritage_txt_to_las.py