diff --git a/README.md b/README.md index 5e077ad..3a186e1 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,7 @@ Immich library • Farthest Point Sampling → fill remaining slots with maximally spread picks • Hard example weighting — low-confidence detections get a distance boost so unusual angles and harder looks are preferred over easy frontals - • Auto mode: stops when the next candidate is too similar to those already + • Adaptive mode: stops when the next candidate is too similar to those already selected (distance threshold = 20 % of median pairwise distance for faces, 10 % for objects) │ @@ -179,10 +179,10 @@ In scheduled mode the process (and loaded models) stays resident between runs. T | Variable | Default | Description | | :--- | :--- | :--- | | `TRAINING_MODE` | `face` | `face` — upload crops to Frigate; `object` — save crops to disk | -| `STRATEGY` | `auto` | `auto` (embedding-based adaptive), `standard` (30 images), `broad` (100 images) | +| `STRATEGY` | `adaptive` | `adaptive` — embedding-based diversity selection, stops when candidates become redundant; `standard` — fixed 30 images; `broad` — fixed 100 images | | `LIMIT` | *(unset)* | Exact image count — overrides `STRATEGY` | | `OBJECT_CLASS` | `dog` | Target class for object mode (any YOLO class: `dog`, `cat`, `car`, etc.) | -| `AUTO_MODE` | *(auto)* | Force non-interactive mode in a terminal; auto-detected otherwise | +| `AUTO_MODE` | *(auto)* | Skip interactive prompts and process all people unattended — auto-detected when no TTY is present (Docker, cron); set `true` to force in a terminal | | `VERBOSE` | `false` | Enable DEBUG-level console output (log file is always DEBUG) | ### People Filtering @@ -255,7 +255,7 @@ uv run winnow Requires Python 3.13+ and [uv](https://astral.sh/uv). An NVIDIA, AMD, or Intel GPU is recommended — CPU mode works but embedding computation is slower. -When run with a terminal attached, winnow starts an interactive session: select which people to process and choose a strategy (auto, standard, broad, or a custom count) per person. Without a TTY — Docker, cron, or `AUTO_MODE=true` — it processes all people automatically using the configured defaults. +When run with a terminal attached, winnow starts an interactive session: select which people to process and choose a strategy (adaptive, standard, broad, or a custom count) per person. Without a TTY — Docker, cron, or `AUTO_MODE=true` — it processes all people unattended using the configured defaults. --- diff --git a/winnow/jobs.py b/winnow/jobs.py index fda3fd8..bd8ce3a 100644 --- a/winnow/jobs.py +++ b/winnow/jobs.py @@ -20,7 +20,7 @@ logger = logging.getLogger(__name__) # Strategy presets: (limit, mode_name) STRATEGY_PRESETS = { - "1": ("auto", "Auto Diversity"), + "1": ("auto", "Adaptive Diversity"), "2": (30, "Standard (30)"), "3": (100, "Broad (100)"), } @@ -31,7 +31,7 @@ def _get_strategy_choice(has_embedding: bool, entity_type: str) -> tuple[int | s model_name = "InsightFace" if entity_type == "face" else "SigLIP" if has_embedding: - rprint(" [bold]1.[/bold] Auto (Objective Diversity) [green][Recommended][/green]") + rprint(" [bold]1.[/bold] Adaptive Diversity [green][Recommended][/green]") rprint(" [dim]• Dynamically selects images until redundancy starts[/dim]") rprint(" [bold]2.[/bold] Standard (30 images)") rprint(" [bold]3.[/bold] Broad (100 images)") @@ -77,7 +77,8 @@ def _resolve_strategy(strategy: str, has_embedding: bool) -> tuple[int | str, st return int(custom_limit), "smart" strategy_map = { - "auto": ("auto", "smart"), + "adaptive": ("auto", "smart"), + "auto": ("auto", "smart"), # legacy alias for adaptive "standard": (30, "smart"), "broad": (100, "smart"), }