feat: per-class exemplar preview, class hide toggle, container NMS flag (REQ-182, REQ-183, REQ-184)

This commit is contained in:
asus committed 2026-10-02 11:11:33 +07:00
1 parent 1a99f2ffe4
commit 96a00267d9
18 files changed
+537 -124

No files matched your search

+53
View File
@@ -1268,6 +1268,59 @@ failure modes to the counting path. The saving was always on the browser side.
strings present). Browser click-test of the override tables is NOT automated — manual
click-test pending.
## Task — Per-class accumulating exemplar preview (REQ-172, REQ-182) `[DONE]`
1. Exemplar pools keyed by class and a per-class accumulating preview in the auto-annotate
modal — switching the active class swaps pools and a frame change clears them all
(REQ-172); a redraw re-runs only the touched class against its own pool, the canvas unions
every exemplared class, classes without examples contribute nothing while any example
exists, clearing the last example falls back to the full-set preview, no examples at all →
the unchanged full-set request (REQ-182) → verify: **[DONE]** `cd frontend && npm run
build` passes (✓ 536 ms, 69 modules); `wc -l` caps hold —
`frontend/src/components/AutoAnnotateModal.jsx` (400) and
`frontend/src/hooks/useExemplarPools.js` (100) both ≤ 400; rebuilt Docker frontend
bundle carries the `pools` marker (`grep -c pools dist/assets/*.js` → 1) and serves
HTTP 200 on :9000; browser drag/undo/clear across two classes is NOT automated —
manual click-test pending.
## Task — Per-class hide toggle in review editor (REQ-183) `[DONE]`
1. Eye button on each sidebar class row — a hidden class's shapes leave the canvas, the
"Shapes on this frame" list and every selection path while the row keeps its real
per-frame count and eye state; the choice is session-only (survives frame changes, resets
when the review page is left, stored data untouched) → verify: **[DONE]** `cd frontend &&
npm run build` passes (✓ 535 ms, 69 modules); `wc -l` caps hold —
`frontend/src/components/Icons.jsx` (172) and
`frontend/src/components/ReviewSidebar.jsx` (129) ≤ 400,
`frontend/src/pages/ReviewPage.jsx` (666) exempt (pre-existing over the 400 cap, not
split by this task); rebuilt Docker frontend serves the new bundle (HTTP 200 on :9000,
`aria-pressed` present in the shipped JS); browser click-test of the eye toggle is NOT
automated — manual click-test pending.
## Task — Container class flag (REQ-184, REQ-031) `[DONE]`
1. `project_classes.container` (`INTEGER NOT NULL DEFAULT 0`), the `containers` patch on
`PATCH /api/projects/{id}` beside the prompts patch, and the Container checkbox in both
auto-annotate modals' overrides table → verify: **[DONE]** migration
`PRAGMA table_info(project_classes)` lists `container`, a second `db.migrate()` run is
a no-op; API round-trip on project 5 sets `truck → container 1` and clears it back
(`curl -X PATCH :9010/api/projects/5 -d '{"containers":{"2":true}}'` →
`[(0,'sack',0),(1,'box',0),(2,'truck',1)]`, revert → all 0);
`cd frontend && npm run build` passes (✓ 536 ms);
`wc -l frontend/src/components/ClassParamsTable.jsx` = 115 ≤ 400; both modals stay at
400 / 347.
2. Cross-class NMS reads the stored flag — preview and batch job build the same container-id
set → verify: **[DONE]** scripted NMS check 6/6 (`uv run python`, pasted in
`t3-report.md`, re-run at T5): containment ≥ 90 % keeps both boxes for the container
class only (one direction), no blanket exemption below 0.9 (IoU 0.802 / containment
0.890 → dropped), `iou <= 0` never drops, within-class pass unchanged, per-class IoU
override consulted on cross pairs; `uv run ruff check backend/` → 409 errors, all
+13 being pre-existing categories (UP006/UP035/UP045) on the new signature lines.
The REQ-031 amendment rides on this entry: cross-class greedy NMS with the per-class IoU
override and the containment carve-out is only real once the flag exists and both live sites
read it.
## Known open points
- *Not closed by any task, by choice:* **any rebuild kills the running job.** Task 14's resume