feat: reveal all hidden shapes with Shift+H, release SAM3 VRAM on idle and on demand (REQ-191, REQ-192)
This commit is contained in:
1 parent
f5be7880b0
commit
fd608848bf
16 files changed
+290
-20
No files matched your search
+10
-2
@@ -116,7 +116,7 @@ box.
|
||||
|
||||
| Module | Role | Status |
|
||||
|---|---|---|
|
||||
| `sam3_engine.py` | SAM3 singleton, `open_state`/`apply_prompts`/`segment_at` | reused, plus a `release()` for REQ-065 |
|
||||
| `sam3_engine.py` | SAM3 singleton, `open_state`/`apply_prompts`/`segment_at` | reused, plus `release_engine()` for REQ-065 and the idle-unload watcher (REQ-192): a daemon thread, started on first `get_engine()`, that takes the non-blocking `gpu_lock` and releases after `SAM3_IDLE_UNLOAD_S` seconds without use |
|
||||
| `labeling.py` | per-frame detection + cross-class greedy NMS with per-class IoU override and the container containment carve-out (REQ-031, REQ-184) | reused; the folder-walking half went with the old flow |
|
||||
| `exporters.py` | ~~YOLO label writing~~ | **deleted** — `dataset.py` writes labels, `mask_to_polygons` moved to `review.py` |
|
||||
| `sessions.py` | ~~exemplar/tap interaction~~ | **deleted** — see below |
|
||||
@@ -158,6 +158,7 @@ namespaces stay distinguishable.
|
||||
|
||||
```
|
||||
GET /api/health REQ-073
|
||||
POST /api/sam3/release # free SAM3's VRAM now; 409 while the GPU is busy (REQ-192)
|
||||
|
||||
GET /api/projects REQ-001
|
||||
POST /api/projects REQ-001,002,004,005
|
||||
@@ -379,7 +380,7 @@ rejection. Parsing is `parseClassYaml` in the same file — a strict subset read
|
||||
what Copy emits, no YAML dependency, all-or-nothing with a `line N: …` error. Because
|
||||
`ClassParamsTable` is shared, the mass modal carries both buttons too.
|
||||
|
||||
**Review sidebar class rows (REQ-180, REQ-183, REQ-185).** Each class row's frame-clear `×`
|
||||
**Review sidebar class rows (REQ-180, REQ-183, REQ-185, REQ-191).** Each class row's frame-clear `×`
|
||||
(REQ-180) gains an eye toggle in front of it: session-only `Set` state in `ReviewPage`, so it
|
||||
survives frame changes, resets when the review page is left, and never touches stored data.
|
||||
Hidden shapes are never handed to `AnnotationCanvas` — not drawn, not clickable, not
|
||||
@@ -393,6 +394,13 @@ keeps its real per-frame count. Creating a shape while its class is hidden (draw
|
||||
copy) auto-overrides it so the user sees what they just made; reclassing into a hidden class
|
||||
dims it unless it already carries an override; toggling a class eye clears that class's overrides.
|
||||
|
||||
A third, independent piece of state is `revealAll` (REQ-191): a boolean **overlay** in
|
||||
`ReviewPage`, toggled by `Shift+H`, that makes `isShapeVisible` answer "yes" for every shape.
|
||||
It reads neither Set and writes neither Set, which is what makes the second `Shift+H` restore
|
||||
the previous hidden state exactly; a plain `H` while it is on only clears the overlay, so the
|
||||
keystroke edits the real hidden state from then on. The sidebar shows a `revealing hidden` chip
|
||||
in the "Shapes on this frame" header while it is on (REQ-191).
|
||||
|
||||
**Exemplar-driven labeling in review (REQ-173, REQ-174, REQ-175).** In `draw` mode a drag on
|
||||
`AnnotationCanvas` is an exemplar, not a rectangle: `onExemplar(box, positive)` where
|
||||
`positive` is `!event.shiftKey`. `hooks/useExemplarPool.js` keeps the pool in a ref as well
|
||||
|
||||
Reference in new issue
Block a user