rename STRATEGY=auto to STRATEGY=adaptive; keep auto as alias
AUTO_MODE (batch/unattended) and STRATEGY=auto (diversity algorithm) shared the same word for unrelated concepts. Renaming the strategy value to 'adaptive' eliminates the ambiguity. The old value is kept as a silent alias so existing configs continue to work. Interactive menu updated from "Auto (Objective Diversity)" to "Adaptive Diversity". README AUTO_MODE description clarified to emphasise unattended batch processing, not selection strategy.
This commit is contained in:
@@ -53,7 +53,7 @@ Immich library
|
|||||||
• Farthest Point Sampling → fill remaining slots with maximally spread picks
|
• Farthest Point Sampling → fill remaining slots with maximally spread picks
|
||||||
• Hard example weighting — low-confidence detections get a distance boost
|
• Hard example weighting — low-confidence detections get a distance boost
|
||||||
so unusual angles and harder looks are preferred over easy frontals
|
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
|
selected (distance threshold = 20 % of median pairwise distance for
|
||||||
faces, 10 % for objects)
|
faces, 10 % for objects)
|
||||||
│
|
│
|
||||||
@@ -179,10 +179,10 @@ In scheduled mode the process (and loaded models) stays resident between runs. T
|
|||||||
| Variable | Default | Description |
|
| Variable | Default | Description |
|
||||||
| :--- | :--- | :--- |
|
| :--- | :--- | :--- |
|
||||||
| `TRAINING_MODE` | `face` | `face` — upload crops to Frigate; `object` — save crops to disk |
|
| `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` |
|
| `LIMIT` | *(unset)* | Exact image count — overrides `STRATEGY` |
|
||||||
| `OBJECT_CLASS` | `dog` | Target class for object mode (any YOLO class: `dog`, `cat`, `car`, etc.) |
|
| `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) |
|
| `VERBOSE` | `false` | Enable DEBUG-level console output (log file is always DEBUG) |
|
||||||
|
|
||||||
### People Filtering
|
### 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.
|
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.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
+4
-3
@@ -20,7 +20,7 @@ logger = logging.getLogger(__name__)
|
|||||||
|
|
||||||
# Strategy presets: (limit, mode_name)
|
# Strategy presets: (limit, mode_name)
|
||||||
STRATEGY_PRESETS = {
|
STRATEGY_PRESETS = {
|
||||||
"1": ("auto", "Auto Diversity"),
|
"1": ("auto", "Adaptive Diversity"),
|
||||||
"2": (30, "Standard (30)"),
|
"2": (30, "Standard (30)"),
|
||||||
"3": (100, "Broad (100)"),
|
"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"
|
model_name = "InsightFace" if entity_type == "face" else "SigLIP"
|
||||||
|
|
||||||
if has_embedding:
|
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(" [dim]• Dynamically selects images until redundancy starts[/dim]")
|
||||||
rprint(" [bold]2.[/bold] Standard (30 images)")
|
rprint(" [bold]2.[/bold] Standard (30 images)")
|
||||||
rprint(" [bold]3.[/bold] Broad (100 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"
|
return int(custom_limit), "smart"
|
||||||
|
|
||||||
strategy_map = {
|
strategy_map = {
|
||||||
"auto": ("auto", "smart"),
|
"adaptive": ("auto", "smart"),
|
||||||
|
"auto": ("auto", "smart"), # legacy alias for adaptive
|
||||||
"standard": (30, "smart"),
|
"standard": (30, "smart"),
|
||||||
"broad": (100, "smart"),
|
"broad": (100, "smart"),
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user