QtMeshEditor β Mesh Category Classifier
A tiny point-cloud category classifier (PointNet: per-point MLP + max-pool + linear head, ~0.1 MB) that decides whether a mesh is a body (character/creature), vegetation, vehicle, or building β exported to ONNX for local inference via ONNX Runtime.
This is the Auto dispatcher for QtMeshEditor's category-specialised mesh
part-segmentation family (epic #818, Track B2): the editor samples the mesh
into a point cloud, runs this classifier, then dispatches to the matching
specialist β
body,
vegetation,
vehicle,
building.
When this model is unavailable the editor falls back to the body model
(its pre-#818 behaviour). Aggregate download source used by the app:
QtMeshEditor-models
(segment/meshseg_category.onnx).
Model
- Input: a sampled point cloud
float32 [1, N, 3](normalised to a centred unit box; +Y up). - Output: logits
float32 [1, 4]over (body, vegetation, vehicle, building); argmax β category.
Training data & license
Trained from scratch on the same permissive corpus as the segmentation
family: procedurally generated synthetic bodies / trees / vehicles /
buildings we own (category labels are free β they come from which generator
produced the cloud), plus CC0 rigged characters (Quaternius packs) mined as
extra real body samples. Weights released under CC-BY-4.0; please
credit QtMeshEditor.
Evaluation
- Held-out validation accuracy: 97.5% (4-way, on the v1.1 hardened data: full-random yaw + detached-part augmentation β a strictly harder task than v1.0's 99.1% near-canonical set).
- Robustness probe (20 trials each, synthetic cars): detached wheels 20/20 (v1.0: 18), detached + 45Β° yaw 19/20 (v1.0: 5), detached + 90Β° yaw 20/20 (v1.0: 3); no regression on any category at random yaw.
Reproducing
scripts/export-meshseg-onnx.py --category classifier --real-data <mined/>
in the QtMeshEditor repo (one-time, offline; the app never runs Python).
Strategy + decision record (why several specialists + a classifier instead
of one multi-category softmax): docs/MESH_SEGMENTATION_STRATEGY.md.
Versions
- v1.1.0 (current) β yaw-invariance + detached-part robustness: every
training cloud is spun by a full random yaw (category is a yaw-invariant
question; v1.0 inherited the segmenters' near-canonical augmentation), and
minority-part clusters are randomly offset (real exports drop wheels/parts
as separate nodes β the verified real-world failure: a car with detached
wheels classified as
body). - v1.0.0 β initial release (#818 Track B2).