py-feat 2.1.3 (AU→mesh PLS v6) — v0.8.29 - #87
Merged
Merged
Conversation
py-feat 2.1.3 pairs the AU→mesh visualization PLS with the v2.8 detector weights. 2.1.2 shipped v2.8 weights but still defaulted the PLS to v5, which was fit on the v2.5c AU space, so plot_face_mesh() / predict_face_mesh() mapped v2.8 AU values through a model fit on a different detector's AU distribution. The v6 PLS is fit on 602,427 CelebV-HQ frames scored with the exact checkpoint shipped as face_multitask_v28.safetensors. Held-out R² 0.4725 vs v5's 0.3620. No API change and nothing outside the face-mesh visualization path is affected — detection, AU, emotion, gaze, pose and blendshape outputs are unchanged. pyfeat-generator has its own PLS geometry head and is not touched by this. The sidecar lock is updated surgically rather than recompiled: py-feat 2.1.2 and 2.1.3 have byte-identical dependency metadata (22 requirements each), so only the py-feat entry and its two hashes move. A full `uv pip compile` would have drifted every other pin, which is exactly what the verify-runtime-lock guard warns against. Verified with the same dry-run the CI guard performs (uv pip install --dry-run --require-hashes, macOS arm64, py3.12): the lock resolves 82 packages including py-feat==2.1.3, and the pre-edit lock resolves identically apart from that one package. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0134bZ9eANmH4hYyuVoH4r9U
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Picks up py-feat 2.1.3.
Why
py-feat 2.1.2 ships the v2.8 multitask weights but still defaulted the AU→mesh visualization PLS to v5, which was fit on the v2.5c AU space — so
plot_face_mesh()/predict_face_mesh()mapped v2.8 AU values through a model fit on a different detector's AU distribution. 2.1.3 defaults to v6, fit on v2.8.The v6 PLS is fit on 602,427 CelebV-HQ frames / 33,920 videos scored with the exact checkpoint shipped as
face_multitask_v28.safetensors. Held-out R² 0.4725 ± 0.0045 (5-fold GroupKFold by video) vs v5's 0.3620.Scope
No API change. Nothing outside the face-mesh visualization path is affected — detection, AU, emotion, gaze, pose and blendshape outputs are unchanged, so
/analyzeresults are bit-identical.pyfeat-generatorcarries its own PLS geometry head (models/pls_torch.pt) and does not consumepy-feat/au_to_mesh, so the generate path is untouched by this bump.Lock handling
The sidecar lock is updated surgically rather than recompiled. py-feat 2.1.2 and 2.1.3 publish byte-identical dependency metadata (22 requirements each), so only the
py-featentry and its two hashes move — every other pin is untouched. A fulluv pip compilewould have drifted every dependency that published a release since the last compile, which is precisely what theverify-runtime-lockheader warns against.Verification
Ran the same dry-run the CI guard performs (
uv pip install --dry-run --require-hashes, macOS arm64, Python 3.12):py-feat==2.1.3,pyfeat-generator==0.1.1,torch==2.12.1.(Note
MACOSX_DEPLOYMENT_TARGET=14.0is needed to reproduce locally from Linux — uv'saarch64-apple-darwintarget defaults to macOS 13, below torch 2.12.1'smacosx_14_0_arm64floor. The macOS runner in CI is already 14+, so this affects local reproduction only, not the guard.)Changes
requirements.txt,sidecar/runtime/requirements.in—py-feat==2.1.2→2.1.3sidecar/runtime/requirements.txt— py-feat entry + hashestauri/src-tauri/{Cargo.toml,Cargo.lock,tauri.conf.json}—0.8.28→0.8.29🤖 Generated with Claude Code