File size: 3,240 Bytes
4a7b926
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8b37795
 
 
 
 
4a7b926
 
 
 
 
 
 
 
 
8b37795
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
---
license: cc-by-4.0
tags:
  - mesh-segmentation
  - part-segmentation
  - point-cloud
  - vehicle
  - onnx
  - 3d
  - qtmesheditor
library_name: onnx
pipeline_tag: other
---

# 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](https://github.com/fernandotonon/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](https://huggingface.co/fernandotonon/QtMeshEditor-mesh-segmentation-category)
and dispatches to this model for vehicles; siblings:
[body](https://huggingface.co/fernandotonon/QtMeshEditor-mesh-segmentation),
[vegetation](https://huggingface.co/fernandotonon/QtMeshEditor-mesh-segmentation-vegetation),
[building](https://huggingface.co/fernandotonon/QtMeshEditor-mesh-segmentation-building).
Aggregate download source used by the app:
[QtMeshEditor-models](https://huggingface.co/fernandotonon/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).