QtMeshEditor β Vegetation Part Segmentation
A point-cloud part-segmentation network (PointNet++-style) that labels each
point of a tree / plant mesh as trunk, branch, foliage, root, or
flower (fruit), exported to ONNX for local inference via ONNX Runtime.
One of the category-specialised segmentation models built for
QtMeshEditor (epic #818,
Track B2) β a free, open-source 3D mesh & animation editor. The app
auto-detects the mesh category with a companion
point-cloud classifier
and dispatches to this model for vegetation; the
body model
covers characters, with
vehicle
and
building
siblings. The aggregate download source used by the app is
QtMeshEditor-models
(segment/meshseg_vegetation.onnx).
Model
- Input: a sampled point cloud
float32 [1, N, 3](normalised to a centred unit box; +Y up). - Output: per-point class logits over 6 channels
(
unknown, trunk, branch, foliage, root, flower); argmax β label, scattered back to mesh vertices/faces by nearest sampled point. - Architecture: shared per-point MLP + two kNN local-aggregation blocks
(in-graph
cdist+topk, ONNX-exportable) + a global max-pooled feature; ~0.78 MB. Trained at the app's inference sample size (4096 points).
Training data & license
Trained from scratch, 100% on procedurally generated synthetic trees we own (no third-party data at all): parametric broadleaf / pine / palm / dead-tree / bush regimes with surface-sampled capsule trunks and branches, canopy-vs-per-tip foliage blobs, surface roots, and flower/fruit clusters β labels are exact by construction. Weights released under CC-BY-4.0; please credit QtMeshEditor.
Evaluation
- Held-out synthetic validation accuracy: 93.8% (per-point, unknown masked). Real-world CC0 vegetation packs are the planned next data slice (mined via material/submesh-name labels).
Reproducing
scripts/export-meshseg-onnx.py --category vegetation in the QtMeshEditor
repo (one-time, offline; the app never runs Python). Strategy + roadmap:
docs/MESH_SEGMENTATION_STRATEGY.md.
Versions
- v1.0.0 (current) β initial synthetic-only release (#818 Track B2).