diff --git a/README.md b/README.md index 290be65..bb8b32f 100644 --- a/README.md +++ b/README.md @@ -203,14 +203,14 @@ In scheduled mode the process (and loaded models) stays resident between runs. T | :--- | :--- | :--- | | `MAX_AUTO_IMAGES` | `80` | Maximum training images per person in Frigate | | `QUALITY_REPLACEMENT` | `true` | When at cap, swap a weaker tracked image for a better candidate. With Frigate scoring active, targets the most redundant image (highest pre-upload recognize score); otherwise uses blur score. Never touches manually added Frigate files. Set `false` to skip people at cap | -| `ENABLE_FRIGATE_SCORES` | `true` | Call Frigate's recognize endpoint pre-upload to store diversity scores used for quality replacement. Adds ~200 ms per upload. Disable to use blur-score replacement only | #### Advanced Tuning *(calibrated — do not adjust)* -These defaults are tuned for Frigate's ArcFace requirements. If you change them and run into issues, support will not be provided. +These defaults are tuned for Frigate's ArcFace requirements. winnow will warn on launch if any are set. Image quality issues caused by non-default values will not be investigated. | Variable | Default | Description | | :--- | :--- | :--- | +| `ENABLE_FRIGATE_SCORES` | `true` | Call Frigate's recognize endpoint pre-upload to store diversity scores used for quality replacement. Adds ~200 ms per upload. Disabling also disables the below-cap novelty gate | | `FRIGATE_SCORE_CEILING` | *(unset)* | Below-cap novelty gate. Unset: dynamic — skips candidates whose Frigate score exceeds the most-redundant tracked file's score, auto-calibrates each run. `0`: disable entirely. Positive value (e.g. `0.85`): fixed hard ceiling | | `MIN_FACE_WIDTH` | `90` | Minimum face crop width in pixels | | `FACE_MARGIN` | `0.15` | Padding around bounding box crop (fraction of face size) | diff --git a/winnow/cli.py b/winnow/cli.py index 169b49f..a88ee4e 100644 --- a/winnow/cli.py +++ b/winnow/cli.py @@ -130,6 +130,18 @@ def _handle_duplicate_people(people: list[dict]) -> list[dict]: return people +_UNSUPPORTED_VARS = [ + "ENABLE_FRIGATE_SCORES", + "FRIGATE_SCORE_CEILING", + "MIN_FACE_WIDTH", + "FACE_MARGIN", + "ENABLE_FACE_ALIGNMENT", + "USE_FULL_RESOLUTION", + "MIN_CONFIDENCE", + "BLUR_THRESHOLD", +] + + def main() -> None: """Entry point for winnow CLI.""" try: @@ -145,6 +157,17 @@ def main() -> None: [dim]Immich -> Frigate Training Data Curator[/dim] """) + set_unsupported = [v for v in _UNSUPPORTED_VARS if os.environ.get(v)] + if set_unsupported: + console.print( + f"[bold yellow]⚠ Advanced tuning vars set: " + f"{', '.join(set_unsupported)}[/bold yellow]" + ) + console.print( + "[dim] These defaults are calibrated for Frigate's ArcFace requirements. " + "Image quality issues caused by non-default values will not be investigated.[/dim]\n" + ) + ConfigManager.get().interactive_setup() try: