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.