VoxelFix: Post-Hoc Semantic Correction of Completed 3D Voxel Maps
Organizations: Fraunhofer IVI · Hochschule Bonn-Rhein-Sieg · University of Bologna · FAU ·
Abstract
Semantic 3D maps are increasingly constructed automatically for aerial robotics by integrating learned semantic predictions into 3D representations. While this avoids costly manual 3D annotation, errors in the perception and mapping pipeline can persist in the resulting map, reducing its reliability for downstream autonomous tasks. Existing 3D semantic map refinement methods either rely on the original observations, treat occupancy as part of the prediction problem, or apply non-learned local regularization to completed maps. Instead, we study post-hoc semantic correction, asking whether semantic accuracy can be recovered directly from the completed map while keeping its geometry and occupancy fixed. We introduce \method, a graph-based model that corrects voxel labels based on local geometry and neighboring semantic information. To obtain training pairs, we corrupt contiguous regions of annotated OccuFly maps according to class confusions observed in upstream maps. We evaluate \method on completed OccuFly maps generated from predictions of four independently trained 2D segmentation models. \method consistently improves mIoU by 4.23--5.00 percentage points, with gains broadly distributed across the evaluated semantic classes and particularly strong improvements for tree, roof, and wall. Results on an independently reconstructed out-of-distribution aerial scene further suggest that the learned correction can transfer beyond the environments seen during training.
Figures & tables
| Method | No Obs. | No Pose | Map | Fixed | Learned |
| SemanticFusion [ 32 ] | ✗ | ✗ | ✗ | ✓ | ✗ |
| P2Net [ 33 ] | ✗ | ✗ | ✗ | ✓ | ✓ |
| OccFiner [ 37 ] | ✗ | ✗ | ✗ | ✗ | ✓ |
| ESSC-RM [ 54 ] | ✓ | ✓ | ✗ † | ✗ | ✓ |
| CRF (baseline) | ✓ | ✓ | ✓ | ✓ | ✗ |
| KNN (baseline) | ✓ | ✓ | ✓ | ✓ | ✗ |
| Method | mIoU | mIoU | Acc. | ECR | DR |
|---|---|---|---|---|---|
| Radix (input) | 25.80 | – | 60.46 | – | – |
| KNN | 26.14 | +0.34 | 60.89 | 5.12 | 2.64 |
| CRF | 26.19 | +0.39 | 61.19 | 10.65 | 5.75 |
| Geometry Heuristic | 28.60 | +2.80 | 66.27 | 24.51 | 6.41 |
| MinkUNet | 28.52 1.17 | +2.72 1.17 | 65.83 2.34 | 16.16 7.09 | 1.69 0.82 |
| VoxelFix (Ours) | 30.66 0.55 | +4.86 0.55 | 68.34 0.62 | 25.36 1.67 | 3.55 0.58 |
| Method | Road | Tree | Vehicle | Grass | Wall | Roof | Obstacle | Gravel | Person | Dirt | Bicycle | mIoU | Acc. |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Radix (input) | 68.53 | 42.85 | 42.41 | 40.25 | 18.18 | 52.97 | 9.37 | 6.83 | 0.00 | 2.43 | 0.00 | 25.80 | 60.46 |
| KNN | 69.50 | 42.49 | 43.75 | 40.75 | 18.16 | 53.38 | 10.28 | 6.91 | 0.00 | 2.36 | 0.00 | 26.14 | 60.89 |
| CRF | 71.24 | 41.39 | 44.71 | 40.68 | 17.14 | 53.53 | 11.31 | 6.71 | 0.00 | 1.42 | 0.00 | 26.19 | 61.19 |
| Geometry Heuristic | 70.73 | 66.17 | 31.89 | 49.07 | 17.21 | 52.56 | 12.02 | 12.27 | 0.00 | 2.71 | 0.00 | 28.60 | 66.27 |
| MinkUNet | 70.48 0.18 | 61.02 8.73 | 45.14 0.51 | 46.16 2.97 | 19.05 1.07 | 53.65 0.60 | 8.93 0.23 | 6.84 0.07 | 0.00 | 2.48 0.10 | 0.00 | 28.52 1.17 | 65.83 2.34 |
| Upstream model | Input mIoU | Corrected mIoU | mIoU |
|---|---|---|---|
| SegFormer-MiT-B3 | 25.80 | 30.66 0.55 | +4.86 0.55 |
| UPerNet-SwinV2-T | 22.64 | 27.25 0.74 | +4.61 0.74 |
| UPerNet-ConvNeXtV2-T | 24.88 | 29.11 0.47 | +4.23 0.47 |
| Mask2Former-Swin-T | 23.70 | 28.69 0.41 | +5.00 0.41 |
| Method | mIoU | mIoU | ECR | DR |
|---|---|---|---|---|
| Radix (input) | 30.95 | – | – | – |
| KNN | 31.98 | +1.04 | 11.95 | 1.65 |
| CRF | 31.95 | +1.00 | 25.88 | 3.72 |
| Geometry Heuristic | 31.10 | +0.16 | 7.01 | 1.87 |
| MinkUNet | 31.58 | +0.63 | 6.41 | 0.72 |
| VoxelFix (Ours) | 32.66 | +1.71 | 15.65 | 1.03 |
| Variant | mIoU | mIoU | ECR |
|---|---|---|---|
| w/o UNet embeddings (6D geometry only) | 27.43 1.43 | +3.18 0.36 | 12.31 2.01 |
| single-layer GAT | 27.65 1.43 | +3.39 0.21 | 13.79 1.60 |
| w/o geometric branch | 27.43 1.47 | +3.17 0.49 | 14.77 3.00 |
| w/o gated fusion | 27.88 1.47 | +3.63 0.39 | 15.81 2.68 |
| reversed noise curriculum (0.05 0.50) | 25.80 1.35 | +1.55 0.19 | 6.73 1.24 |
| low-noise curriculum (0.10 0.02) | 25.41 1.20 | +1.15 0.28 | 4.95 1.16 |
| Parameter | Value |
|---|---|
| Graph neighbors | 30 |
| Structure-tensor neighbors | 50 |
| Density radius | 3 m |
| Shared hidden dimension | 32 |
| GATv2 layers per branch | 2 |
| Attention heads per layer | 2 |
| Parameter | Value |
|---|---|
| Optimizer | AdamW |
| Initial learning rate | |
| Weight decay | |
| Epochs | 500 max., early stopping (patience 20) |
| LR scheduler | ReduceLROnPlateau ( , patience 5) |
| Batch / subgraph size | 1 scene graph / tile |
| Stage | Configuration / time |
|---|---|
| Hardware | 1 NVIDIA A100 80 GB |
| STPLS3D pretraining | 8 h |
| OccuFly fine-tuning | 1 h |
| VoxelFix training | 3 h per split |
| Parameter | Value |
|---|---|
| Sparse U-Net backbone | MinkowskiEngine sparse U-Net, additive skip connections |
| Input voxel features | 6D geometric descriptor (height, planarity, linearity, sphericity, verticality, density) |
| Encoder stages | 4 (1 stride-1 stem + 3 stride-2 blocks) |
| Channel configuration | (encoder), (decoder) |
| Output embedding dimension | 16 |
| Voxel size / quantization | 0.5 m |
| Parameter | Value |
|---|---|
| Training split | 60 / 6 / 1 scenes (train / val / test, random) |
| Number of classes | 8 (grouped) |
| Optimizer | AdamW |
| Learning rate | |
| Weight decay | |
| Number of epochs | 1000 max., early stop (patience 250) |
| Parameter | Value |
|---|---|
| Optimizer | AdamW |
| Learning rate | , cosine decay after 5-epoch warmup |
| Weight decay | |
| Number of epochs | 200 max., early stop (patience 40) |
| Loss | Cross-entropy |
| Class weighting | Effective-number ( ), clipped to |
| Parameter | Value |
|---|---|
| Connectivity / neighborhood definition | Euclidean ball around a random seed voxel (KD-tree radius query), not graph-connected growth |
| Minimum patch size | radius voxels ( m) |
| Maximum patch size | radius voxels ( m) |
| Patch-size distribution | radius , |
| Maximum patches per map | , |
| Overlapping patches allowed | Yes; patch centers sampled independently, no overlap exclusion |
| Dataset | unlabeled | road | dirt | gravel | rock | grass | vegetation | tree | ground-obstacle | animals | person | bicycle | vehicle | water | boat | building | roof | sky | drone | train-track | cable | cable-tower | wind-turbine-blade | wind-turbine-tower | walkway | bridge | airplanes |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| CART [ 24 ] | |||||||||||||||||||||||||||
| ICG [ 20 ] | |||||||||||||||||||||||||||
| OkutSwiss [ 38 ] | |||||||||||||||||||||||||||
| UAVid [ 31 ] | |||||||||||||||||||||||||||
| UDD [ 6 ] | |||||||||||||||||||||||||||
| VDD [ 3 ] |
| Method | Backbone | mIoU | |
|---|---|---|---|
| Val | Unseen | ||
| SegFormer [ 51 ] | MiT-B3 | 66.56 | 38.91 |
| UPerNet [ 50 ] | Swin-v2-T | 66.53 | 38.11 |
| UPerNet [ 50 ] | ConvNeXt-v2-T | 69.23 | 38.05 |
| Mask2Former [ 7 ] | Swin-T | 69.55 | 36.60 |
| Parameter | Value |
|---|---|
| Number of neighbors | 5 |
| Distance metric | Euclidean, in metres |
| Include query voxel | Yes (counted within ) |
| Distance weighting | None (uniform vote) |
| Number of iterations | 1 |
| Tie-breaking rule | Keep the voxel’s current label |
| Parameter | Value |
|---|---|
| Unary potential | Upstream scalar confidence on the input label, remaining mass uniform over the other 11 classes |
| Pairwise neighborhood | 30 (self excluded) |
| Spatial standard deviation | m |
| Edge weighting | Gaussian, , row-normalized |
| Pairwise weight (Potts) | |
| Compatibility term | Potts: class-independent, uniform penalty for unlike labels |
| Parameter | Value |
|---|---|
| Ground separation (CSF) | Cloth resolution , rigidness , classification threshold m, 2500 iterations |
| Ground correction | KNN majority vote over valid ground classes; , widened to when too few valid neighbors are found |
| Above-ground clustering | DBSCAN, m, minimum 5 samples |
| Cluster relabeling | Majority vote within each cluster; dense components merged into a single cluster |
| Parameter | Value |
|---|---|
| Architecture | Sparse U-Net (MinkowskiEngine), 4 stride-2 stages, 8 channels throughout, additive skips; 20,395 parameters |
| Input features | 12-D one-hot of the input label map only (no geometry, no embeddings) |
| Voxel size | m |
| Optimizer | AdamW |
| Learning rate | , ReduceLROnPlateau ( , patience 5) |
| Weight decay |
| Method | Road | Tree | Vehicle | Grass | Wall | Roof | Obstacle | Gravel | Person | Dirt | mIoU |
|---|---|---|---|---|---|---|---|---|---|---|---|
| Radix (input) | 76.57 | 5.65 | 23.07 | 87.41 | 34.92 | 54.92 | 21.68 | 0.00 | 5.00 | 0.28 | 30.95 |
| KNN | 78.75 | 6.52 | 26.33 | 88.50 | 35.75 | 56.32 | 23.25 | 0.00 | 3.95 | 0.47 | 31.98 |
| CRF | 80.35 | 8.91 | 30.56 | 90.31 | 32.38 | 57.84 | 19.13 | 0.00 | 0.00 | 0.00 | 31.95 |
| Geometry Heuristic | 78.94 | 5.14 | 25.90 | 85.67 | 33.68 | 56.50 | 19.94 | 0.00 | 5.00 | 0.27 | 31.10 |
| MinkUNet | 79.18 | 6.03 | 26.53 | 87.35 | 34.92 | 55.01 | 20.72 | 0.00 | 5.75 | 0.28 | 31.58 |
| Split | Training scenes | Validation scene | Fixed test scene |
|---|---|---|---|
| 1 | 1, 2, 7, 3, 9, 4, 5 | 6 | 8 |
| 2 | 6, 2, 7, 3, 9, 4, 5 | 1 | 8 |
| 3 | 6, 1, 7, 3, 9, 4, 5 | 2 | 8 |
| 4 | 6, 1, 2, 3, 9, 4, 5 | 7 | 8 |
| 5 | 6, 1, 2, 7, 9, 4, 5 | 3 | 8 |
| 6 | 6, 1, 2, 7, 3, 4, 5 | 9 | 8 |
3D Semantic Segmentation
3D semantic segmentation assigns meaning to points, voxels, meshes, or reconstructed scene elements for spatial understanding.
See all 137 papers