The Probe Is the Bottleneck: Zero-Shot Round-Trip Recovery Does Not Yet Certify Emotion Controllability in Text-to-Image Generation
Paper · Colab · Preregistration · Benchmark
Can emotion conditioning steer what a generated image conveys? Not measurably yet: under a protocol built to catch self-deception, no conditioning tier beats chance, and the apparent lift vanishes once the probe's measured error is corrected for.
- Detect the emotion in a sentence (DistilRoBERTa), ground it in valence and arousal.
- Condition a prompt on it, tier by tier; generate with SD-Turbo on paired seeds.
- Recover the emotion from the image with a swappable probe; a match is recovery.
- Bound every number: chance floor, scene ceiling, shuffled-label null, probe-error correction.
- Ship AffectBench plus the harness to score any generator or probe under the same rules.
- Report the pilot as it came out: a guarded null. The probe fails its own gate, so no number is a controllability score yet.
flowchart LR
T[text] --> E["detect emotion<br/>DistilRoBERTa"] --> V["ground valence, arousal<br/>circumplex prior + lexicon"]
V --> P["condition prompt<br/>raw · naive · emotion · affect"] --> G["generate<br/>SD-Turbo, paired seeds"]
G --> R["recover emotion<br/>swappable probe"] --> C{"matches intent?"}
C -. bounded by .-> B["chance floor · scene ceiling · shuffled-label null · probe-error correction"]
- Valence maps to palette: warm golden above +0.33, cool blue-grey below -0.33.
- Arousal maps to lighting: dramatic high contrast above 0.66, soft and calm below 0.33.
CPU pilot: SD-Turbo generator, CLIP ViT-B/32 probe, 256 px, n = 14 per tier. Read it as a calibration of the instrument, not a controllability score. The naive tier postdates the committed pilot, so it has no committed numbers yet.
xychart-beta
title "Recovery accuracy by tier (chance = 0.143)"
x-axis ["raw", "emotion", "affect", "scene"]
y-axis "accuracy" 0 --> 0.35
bar [0.143, 0.214, 0.214, 0.286]
| Recovery accuracy vs chance | Raw-tier confusion: the collapse |
|---|---|
![]() |
![]() |
- Probe collapse: 2 of 7 labels used, neutral 90% of the time.
- Rogan-Gladen probe-error correction: 0.214 falls back to 0.165, chance.
- Holm across tiers: nothing survives, adjusted p = 0.27.
- Paired contrasts: emotion +0.071 over raw (Cohen's h = 0.19, p = 0.26); affect adds nothing.
- Chance equals the majority baseline, 0.143: a collapsed probe scores it whatever the image shows.
All confusion matrices and the valence-arousal map:
| Emotion tier | Affect tier |
|---|---|
![]() |
![]() |
| Scene ceiling | Valence, arousal by emotion |
|---|---|
![]() |
![]() |
Full write-up: paper/paper.pdf. The records and derived metrics are drift-locked by make repro-check in CI; the tables here are rendered snapshots of the same artifacts (make paper).
One per failure mode, in the style of an instrument audit:
Probe gate. A probe must read real images before its verdict on generated ones counts:
| Probe | Faces | Scenes (EmoSet) | Verdict |
|---|---|---|---|
| CLIP ViT-B/32 (pilot) | 29.0% | 40.3% | fails the gate |
| CLIP ViT-L/14 | 37.5% | 45.5% | candidate (McNemar p = 0.038 / 0.040) |
Reproduce the committed numbers, no GPU, seconds:
make setup && make test && make repro-check # 204 tests, then re-derive the committed metricsTry the app:
make setup-ml && make app # http://127.0.0.1:8000, make serve-prod BIND=0.0.0.0:8000 to exposeNo local setup: reproduce.ipynb runs clone, install, test, reproduce in Colab.
| Main interface | Emotion analysis |
|---|---|
![]() |
![]() |
make reproduce DIFFUSION_MODEL=<hf-id> # any Hugging Face diffusion model, frozen protocol
make validate-probe-scene # gate a candidate probe on EmoSet
make submission SYSTEM="name" # schema-validated, numbers copied from results| System | Track | raw | emotion | affect | scene | Cleared shuffled-label? |
|---|---|---|---|---|---|---|
| SD-Turbo + CLIP ViT-B/32 (pilot) | content | 0.143 | 0.214 | 0.214 | 0.286 | no, a guarded null |
Submissions validate against benchmark/submission.schema.json. Also useful: make power (sample size), make correct-recovery (probe-error correction), make compare-probes (the paper's McNemar p-values), make validate-probe-hf (non-CLIP probe).
- Russell (1980): the circumplex model, the valence and arousal axes.
- Demszky et al. (2020): GoEmotions, the text source AffectBench is built from.
- Radford et al. (2021): CLIP, the default probe, treated as an instrument to validate.
- Sauer et al. (2023): adversarial diffusion distillation, the SD-Turbo generator.
- Yang et al. (2023): EmoSet, the in-domain set the probe ceiling is measured on.








