| --- |
| 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 <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). |
|
|