A frame rarely reads the table at 0, so the frames alone did not catch a table without §7.6's clamp (the second implementation passed with it). The corpus now states the table's SHA-256 and its entries at nine values, and both implementations check them. Co-Authored-By: Claude Opus 5.5 <[email protected]>
67 lines
5 KiB
Markdown
67 lines
5 KiB
Markdown
# live-conformance/avatar-face — faces from keypoints
|
||
|
||
The corpus of [`extensions/avatars.md`](../../extensions/avatars.md) §12: `vectors.json`, the
|
||
inputs it reads, and the two files its generator writes beside it.
|
||
|
||
| file | what | written by |
|
||
|---|---|---|
|
||
| `generator.wfg` | the registered generator (§7.2), `WFG1` | `tools/wai_avatar_face_train.py` |
|
||
| `identities/face1.wfi`, `identities/face2.wfi` | identity priors (§7.3) of two faces held out of the generator's training | the same tool |
|
||
| `tracks/face1.json`, `tracks/face2.json` | their keypoint tracks: `{"identity", "keypoints"}`, each frame `K` pairs `[x, y]` in sixteenths of a pixel | the same tool |
|
||
| `training.json` | the tool's report: its arguments, seeds and losses, the generator's digest, and §7.9's measurement | the same tool |
|
||
| `seeded.wfg`, `seeded.wfi` | a generator of three keypoints at 16 × 16 drawn from SHA-256 of a label, trained on nothing, and a picture that is an integer function of a label | `wai_avatar_face_vectors gen` |
|
||
| `vectors.json` | the vectors | `wai_avatar_face_vectors gen` |
|
||
|
||
`vectors.json` names every input and written file with its SHA-256, and holds:
|
||
|
||
- `mask_table`: the SHA-256 of §7.6's table (each entry a 16-bit little-endian signed
|
||
integer, `T[0]` first) and, in `at`, its entries at some values `v`, each `[v, T[v + 32768]]`;
|
||
- `forms`: files of §7.2 to §7.4, each `{"name", "form", "hex", "outcome"}` with, where it reads,
|
||
`read` (the header's fields; for an identity its keypoints and the SHA-256 of its picture; for a
|
||
segment its fields and every frame's keypoints in sixteenths of a pixel) and, where it is
|
||
refused, `reason`;
|
||
- `frames`: each `{"name", "generator", "identity", "keypoints"}`, the files by name and the
|
||
driving keypoints in sixteenths of a pixel, with the SHA-256 of the warped picture
|
||
(`warped_sha256`), of the keypoint maps (`maps_sha256`: each value a 16-bit little-endian
|
||
unsigned integer, in `[K][h][w]` order) and of the frame (`frame_sha256`), each picture RGB8 with
|
||
rows top to bottom; for the seeded generator also `warped` and `frame` in hexadecimal. The
|
||
registered generator's frames are those of every frame of both tracks, each keypoint rounded to
|
||
a multiple of 4 sixteenths, ties up, as the cases' segments carry them;
|
||
- `cases`: each a case of §9.1: its `policy` (`dual_layer`, `assistive` and `second_layer`,
|
||
synthesis §11.1's, and `generation`); its records as JSON texts, list by list (`identities`,
|
||
`tracks`, `claims`, `reviews`, `label_policy`, `player`); the `objects` it holds, each a `WAI1`
|
||
envelope in hexadecimal; and the `generators` and `priors` it holds, each `{"file"}` naming a
|
||
file of this directory or `{"hex"}`.
|
||
|
||
**Face-equivalence.** For each vector, a conforming implementation reaches what it states: a
|
||
form's reading or refusal code; a frame's three digests (and samples); a case's `outcome`, and
|
||
refused, its `reason` and where, `at` (`["identity", i]`, `["track", i]`, or `["synthesis", …]`
|
||
with synthesis's own place), accepted, the `statements` of §9.3 (`identities`, `tracks`,
|
||
`claims`, `labels`, `reviews_presented`, `visual_icon`). An implementation that reaches another
|
||
does not conform.
|
||
|
||
**Provenance.** No picture, recording or footage from outside this repository is in the corpus or
|
||
was used to train its generator. `tools/wai_avatar_face_train.py` draws every face it trains on and
|
||
every face of this corpus from a seeded parameter set with a renderer of its own (a shaded head,
|
||
hair, eyes with lids and pupils, brows, a nose, a mouth with lips and teeth, a background), and
|
||
places the sixteen keypoints the parameters put on each picture exactly. Its run with seed
|
||
20261022, `--identities 6000` and its defaults otherwise (a 64 × 64 generator of widths 24, 48
|
||
and 64, `gauss` 1024, `bg` 6554) trained the generator; a second run over the same output
|
||
directory with `--measure-only` trained the keypoint detector, measured, and wrote the identity
|
||
priors, the tracks and the report. The training is in floating point and is not claimed to
|
||
regenerate the same bytes on another machine; the inputs' bytes are what is pinned.
|
||
`wai_avatar_face_vectors gen` writes the rest from fixed seeds: every key is SHA-256 of a label
|
||
and an index, every time is a constant, and Ed25519 signing is deterministic.
|
||
|
||
**Licences.** Everything here is this repository's work, under its licence (Apache-2.0): the
|
||
renderer, the generated faces and tracks, and the generator trained on them. No third-party
|
||
weights, data or code were downloaded to make it. Before choosing to train one, the open
|
||
keypoint-driven face-reenactment generators were surveyed with their licences (extensions/avatars.md
|
||
§7.9): of those surveyed, the networks whose weights carry a permissive licence need operators
|
||
`wai-ops/1` does not define, and the rest carry a non-commercial licence, grant no licence, or
|
||
state none for their weights.
|
||
|
||
```
|
||
python3 -I ../avatar_face_verify.py .
|
||
cargo run --release --no-default-features --features avatar_face --bin wai_avatar_face_vectors -- verify . # from wai/wai-rs, with this directory's path
|
||
```
|