docs(decision): pace medians, and the packshot-OCR rejection
The pacing claim rested on single runs. Medians of three 12 s runs per pace, through the shipped server: send 67% coverage / 88% precision, result 63% / 86%, 0 wrong in all six. The two paces are within 4 pp, so the sensitivity the audit measured is gone and what is left is run-to-run noise. The architecture sketch said the text signature was 'name + OCR of its packshot'. The code scores the name alone, deliberately: adding the packshot's own OCR is how l09 used to win l10's facings, because l09's packshot prints l10's actual name. The sketch now says what the code does and why.
This commit is contained in:
parent
3fa82eec37
commit
3eddc9eafc
8 changed files with 8619 additions and 1 deletions
|
|
@ -233,7 +233,8 @@ frame / native crop
|
|||
│
|
||||
├─ text lane: OCR (upsampled ×2 when crop height < 200 px)
|
||||
│ ─► bigram similarity to every catalog row's text signature
|
||||
│ (name + OCR of its packshot), including rows with no image
|
||||
│ (the row's name only, including rows with no image; adding
|
||||
│ the packshot's own OCR was tried and rejected - see below)
|
||||
│
|
||||
▼
|
||||
decision: P(correct | local, text) from a small calibrated model
|
||||
|
|
@ -691,6 +692,19 @@ The 12 s numbers are within run-to-run noise; the short clip is where the
|
|||
pacing sensitivity lived, and it is now flat across pacings. Precision stays
|
||||
100% and 0 unknowns are accepted at every pacing.
|
||||
|
||||
Re-measured 2026-09-29 as medians of three 12 s runs per pace, through the
|
||||
shipped server with the calibrated accept lines
|
||||
(`data/evaluations/2026-09-29-session/pace-medians/`):
|
||||
|
||||
pace coverage (3 runs) median precision (3 runs) median wrong
|
||||
send 63 / 70 / 67 % 67 % 77 / 88 / 97 % 88 % 0
|
||||
result 63 / 63 / 70 % 63 % 86 / 83 / 90 % 86 % 0
|
||||
|
||||
The two paces land within 4 pp of each other on coverage and 2 pp on precision,
|
||||
with 0 wrong labels in all six runs. The pacing sensitivity the audit measured
|
||||
is gone, and the spread across runs is now the run-to-run noise the audit said
|
||||
the 12 s numbers were inside.
|
||||
|
||||
**The stream path now has a G1 number.** `code/score_stream.py` scores a
|
||||
recorded clip's labels against the ground truth, matching each track's
|
||||
`label_box` to the labelled facings. Three defects in the first version of
|
||||
|
|
@ -820,6 +834,14 @@ with text, 55% at 81% without (2 false accepts against 8). The lane still adds
|
|||
11 pp of coverage while raising precision by 14 pp, so the answer is unchanged
|
||||
and the margin is wider than the audit's.
|
||||
|
||||
**Name-only signatures, and why.** The architecture sketch above originally
|
||||
said the text signature was "name + OCR of its packshot". That was tried and
|
||||
rejected: it is how l09 used to win l10's facings. l09's packshot prints
|
||||
"マヨネーズ", which is l10's actual name, so a row with a photographed packshot
|
||||
could explain a sibling's text better than the sibling's own name could. Every
|
||||
row in the catalog has a name, so the packshot adds nothing but that confusion,
|
||||
and `TextLane.scores_from_text` scores against the name alone.
|
||||
|
||||
**E-2 answered.** `LocalLane` is RootSIFT-only; ORB and BRISK survive only in
|
||||
the `matcher` baseline lane, so there is nothing to drop from the shipped path.
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue