QtMeshEditor — Vehicle Part Segmentation
A point-cloud part-segmentation network (PointNet++-style) that labels each
point of a vehicle mesh (car / truck / plane / helicopter) as
vehicle_body, wheel, window, wing, or rotor (propeller), 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 vehicles; siblings:
body,
vegetation,
building.
Aggregate download source used by the app:
QtMeshEditor-models
(
segment/meshseg_vehicle.onnx).
Model
- Input: a sampled point cloud
float32 [1, N, 3] (normalised to a centred
unit box; +Y up, vehicle nose facing +Z).
- Output: per-point class logits over 6 channels
(
unknown, vehicle_body, wheel, window, wing, rotor); 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 vehicles we
own (no third-party data at all): parametric cars/trucks (body + cabin +
proud window panes + 4–6 wheels), planes (fuselage, main/tail wings, vertical
fin, optional nose prop + landing gear + canopy), and helicopters (body +
tail boom, main/tail rotors, skids, canopy) — labels are exact by
construction. Weights released under CC-BY-4.0; please credit
QtMeshEditor.
Evaluation
- Held-out synthetic validation accuracy: 92.8% (per-point, unknown
masked; v1.1's harder detached-part-augmented data — v1.0 scored 93.5% on
the easier all-attached set). Real-world CC0 vehicle packs are the planned
next data slice (mined via submesh/material-name labels — "Wheel_FL",
"glass", …).
Reproducing
scripts/export-meshseg-onnx.py --category vehicle in the QtMeshEditor repo
(one-time, offline; the app never runs Python). Strategy + roadmap:
docs/MESH_SEGMENTATION_STRATEGY.md.
Versions
- v1.1.0 (current) — detached-part robustness: wheel/part clusters are
randomly offset during training (real exports often ship wheels as
separate nodes below the hull — the verified real-world failure case), so
detached wheels still label as
wheel.
- v1.0.0 — initial synthetic-only release (#818 Track B2).