--- license: cc-by-4.0 tags: - point-cloud - classification - mesh-segmentation - onnx - 3d - qtmesheditor library_name: onnx pipeline_tag: other --- # 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](https://huggingface.co/fernandotonon/QtMeshEditor-mesh-segmentation), [vegetation](https://huggingface.co/fernandotonon/QtMeshEditor-mesh-segmentation-vegetation), [vehicle](https://huggingface.co/fernandotonon/QtMeshEditor-mesh-segmentation-vehicle), [building](https://huggingface.co/fernandotonon/QtMeshEditor-mesh-segmentation-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](https://huggingface.co/fernandotonon/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 ` 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).