"""Smoke test py-feat AU + emotion detection on bundled sample faces. Verifies py-feat installs cleanly on macOS, downloads its model weights, and returns AU intensities that look sane for the labelled sample faces (e.g. Happy.png should fire AU 6 / AU 12). Run from repo root: `uv run python scratch/smoke_pyfeat.py` """ from __future__ import annotations import sys from pathlib import Path ROOT = Path(__file__).parent.parent def main() -> None: from feat import Detector detector = Detector( face_model="retinaface", landmark_model="mobilefacenet", au_model="xgb", emotion_model="resmasknet", facepose_model="img2pose", device="cpu", ) images_dir = ROOT / "images" samples = sorted( p for p in images_dir.glob("*.png") if p.stem not in {"LMLLOGO", "LMLOBS"} ) for sample in samples: print(f"\n=== {sample.name} ===") try: result = detector.detect_image(str(sample)) except Exception as exc: print(f" FAILED: {exc}") continue aus = result.aus() emotions = result.emotions() if aus.empty: print(" no face detected") continue au_row = aus.iloc[0].sort_values(ascending=False) top_aus = au_row[au_row > 0.5].head(6) print(" top AUs (>0.5):") for au, score in top_aus.items(): print(f" {au:>6} {score:.2f}") emo_row = emotions.iloc[0] ranked = emo_row.sort_values(ascending=False) print(" emotions:") for emo, p in ranked.items(): print(f" {emo:<10} {p:.3f}") if __name__ == "__main__": main()