open-standards/wai/live-conformance/avatar-face
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Transaction Science 950ae477d1 avatar-face corpus: the mask's table pinned by its digest and entries
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]>
2026-10-22 12:35:35 -04:00
..
identities avatar-face corpus, its second implementation, and the tool that trained its generator 2026-10-22 10:57:20 -04:00
tracks avatar-face corpus, its second implementation, and the tool that trained its generator 2026-10-22 10:57:20 -04:00
generator.wfg avatar-face corpus, its second implementation, and the tool that trained its generator 2026-10-22 10:57:20 -04:00
README.md avatar-face corpus: the mask's table pinned by its digest and entries 2026-10-22 12:35:35 -04:00
seeded.wfg avatar-face corpus, its second implementation, and the tool that trained its generator 2026-10-22 10:57:20 -04:00
seeded.wfi avatar-face corpus, its second implementation, and the tool that trained its generator 2026-10-22 10:57:20 -04:00
training.json avatar-face corpus, its second implementation, and the tool that trained its generator 2026-10-22 10:57:20 -04:00
vectors.json avatar-face corpus: the mask's table pinned by its digest and entries 2026-10-22 12:35:35 -04:00

live-conformance/avatar-face — faces from keypoints

The corpus of 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