Inkvec

Results, 2026-09-15

Committed copy of the measurement tables the top-level README.md quotes. The scripts write their full output under out/, which is gitignored (regenerate locally with the commands below); this file holds the exact numbers cited publicly, with their source and how to reproduce them.

Cross-tracer comparison, 21 cases

Source: out/crosscompare-competitors-2026-09-15/summary.md, produced by bench/crosscompare_competitors.py, which reuses the case set from bench/crosscompare_current.py. 21 cases, fixed before tracing from the selection seed crosscompare-2026-09-15-v1: 14 hash-selected real icons (2 per family across lucide, material-icons, simple-icons, twemoji, noto-emoji, openmoji and fluent-emoji), 4 hand-picked synthetic probes (prim_circle, mosaic_pie6, gradient_linear, gradient_radial), and 3 real brand logos. Each engine's SVG is scored against the source render at 1024px with CIEDE2000 (colour), SSIM, DISTS and DINOv3.

Provenance caveat: 3 of the 21 cases are real brand logos drawn from an external brand dataset that is not part of this repository. bench/crosscompare_current.py (whose select() the comparison scripts reuse) picks them up only when that dataset is present, and warns when it is absent. So the tables below are 21 cases with the external dataset and 18 cases from a clean clone; the 18-case subset is fully reproducible from the repo.

# Inkvec vs competitors -- summary (21 cases, 2026-09-15)

| Engine | Version | n_ok | mean dE00 | median dE00 | mean SSIM | mean DISTS | mean DINO | mean geom_ratio | mean coords | mean paths | mean seconds |
|---|---|---|---|---|---|---|---|---|---|---|---|
| inkvec | 0.1.1 release build | 21/21 | 0.132 | 0.054 | 0.9920 | 0.0236 | 0.991 | 1.402 | 446 | 8.48 | 1.17 |
| vtracer-default | 0.6.15 (PyPI) | 21/21 | 1.303 | 0.598 | 0.965 | 0.0508 | 0.9633 | 9.06 | 1943 | 20.1 | 0.04 |
| vtracer-1.0-default | 1.0.0-alpha.4 | 21/21 | 1.303 | 0.598 | 0.965 | 0.0508 | 0.9633 | 9.06 | 1943 | 20.1 | 0.05 |
| vtracer-1.0-simplify | 1.0.0-alpha.4 + --simplify 1.5 --hierarchical cutout | 21/21 | 1.264 | 0.579 | 0.966 | 0.0636 | 0.9538 | 4.96 | 1239 | 20.1 | 0.06 |
| trazor-auto | PhenX/Trazor MIT, cloned commit | 21/21 | 0.518 | 0.227 | 0.986 | 0.0479 | 0.9711 | 7.63 | 1172 | 6.5 | 2.19 |

Timings measured on a machine with other CPU-bound work (Rust build + CPU inference)
running concurrently; treat as approximate, not definitive.

RasterTrace, a WASM tracer sometimes compared separately, is VTracer 1.0 compiled to WebAssembly, not a fifth algorithm — no separate row for it is meaningful.

Two notes on reading the table. vtracer-default (0.6.15) and vtracer-1.0-default (1.0.0-alpha.4) are the same engine at its defaults: the two releases emit byte-different files but near-identical geometry (per-case dE00 0.0001–0.0012), so they are one engine, not two independent confirmations. And the coordinate counts are not like-for-like across engines — a <circle>, <ellipse> or <rect> is counted as 2 coordinates while a cubic segment is counted as 6 (bench/crosscompare_current.py), which favours engines that emit primitives. The geom_ratio column (geometry parameters ÷ the artist file's own geometry parameters; Inkvec 1.402 here) is the like-for-like comparison. n = 21, with no error bars or significance test. The inkvec row is re-measured on the 0.1.1 release build; the competitor rows are unchanged because their binaries reproduce exactly.

Excluded historical comparison

The earlier four-way comparison (Covecto and color-trace) and its two supporting images were produced by the unreproducible pre-release build. They are not release claims and are intentionally excluded until every engine is rerun against the pinned 0.1.1 Inkvec binary under a recorded protocol. The release-verified comparison is the table and distributions above.

Damaged input: restorer

Inkvec ships an optional trained restorer that removes compression and decode damage before tracing. It is off by default (--restore off; --restore auto enables it only when the input looks damaged). The weights that ship — restorer.onnx from Logolabs/inkvec-denoiser-001, pulled on first use or via tools/pull_model.py — have no published benchmark in this repository, and no LPIPS or ablation figure for them is reported anywhere here. The figures that previously appeared in this section were measured during development on a different checkpoint (restorer_resid_flat_512mix, not the shipped weights) and are not reproduced for the shipped weights; the VectorArk and StarVector numbers were those projects' own published results, measured under their protocols, not here.

Regression corpus

246 icons from lucide, material-icons, simple-icons, noto-emoji, openmoji and twemoji — the set CI gates on. Committed at bench/gate/baseline.json (not gitignored, so it needs no snapshot here): mean dE00 0.29889, parameter ratio 1.4571x the artist's file, mean anchor turning 0.04265. Regenerate with python bench/ci_gate.py --exe <path-to-inkvec>.

That mean is a family macro-average and is outlier-driven, so the distribution is quoted beside it (measured read-only on the released build over the same 246 icons): median (per-item) 0.125, p10 0.024, p90 0.612, worst 5.72, and 13 of the 246 cases above dE00 1.0. The typical icon sits at ~0.125; the mean is roughly 2.4× the median because a small tail pulls it up.