Skip to content

Pre-register the YOLO-baseline evaluation & checkpoint-selection protocol (#71) - #80

Merged
jonfroehlich merged 1 commit into
mainfrom
docs/preregister-yolo-protocol-71
Jul 29, 2026
Merged

Pre-register the YOLO-baseline evaluation & checkpoint-selection protocol (#71)#80
jonfroehlich merged 1 commit into
mainfrom
docs/preregister-yolo-protocol-71

Conversation

@jonfroehlich

Copy link
Copy Markdown
Member

Closes #71.

Why now, specifically

The five YOLO recovery runs (jobs 37745358363) are still training on ckpt-g2, and no YOLO checkpoint has been scored on any benchmark bundle — the only numbers anyone has seen are the internal val-split curves already committed in the training record and mirrored in #51''s status comments. Pre-registration only counts if it lands before test numbers exist, so this was a race against those jobs finishing.

What this adds

A "Pre-registered evaluation & checkpoint-selection protocol" section in scripts/model_comparison/yolo_baseline/README.md (the training record), fixing in writing:

  1. Checkpoint selection: best-val, never test. best.pt exactly as Ultralytics saves it (best val fitness = 0.1·mAP50 + 0.9·mAP50-95, patience=20). This refines the issue''s draft wording ("best val mAP50") to the artifact the runs actually keep — and the two rules pick the same epoch (1) on all five committed curves, verified from runs/*/results.csv. RampNet parity stated: its published checkpoint was likewise selected on val (best validation loss, stage_two/train.py), never a benchmark number.
  2. Config/headline selection on val only, with the honest caveat that tiles vs pano val sets differ — so the choice controls emphasis only; every trained config''s benchmark row is reported regardless.
  3. Benchmark eval through the identical path as the whole roster: compare.py yolo provider → box centers → rampnet/detection_eval.py matcher at radius 0.022, 0.05 cache floor; tiles configs through the same perspective rig as the VLMs (imgsz 1024), pano configs whole-pano (imgsz 1280).
  4. Operating point fixed in advance, not tuned on test: headline F1 at conf 0.25 — Ultralytics'' own default predict confidence, i.e. the "configure the baseline the way its authors recommend" choice. The sweep is still printed with its best-F1 row flagged as tune-on-test, as the harness already does.
  5. AP with the truncation caveat vs RampNet''s committed 0.5-peak extraction (the low-floor RampNet curve is the Lower the deployment operating point (peak threshold 0.55 → ~0.25–0.35): a free, recall-first lever #54/Experiment: flip-TTA at deployment operating points — the evaluated config used it, deployed inference doesn't #78 line of work).
  6. Unstable-run rule: an instability-affected best.pt is reportable only as a lower bound, superseded by the Rerun the collapsed YOLOv11 pano baselines with a stabilized (larger physical batch) config #70 stabilized rerun evaluated under this same protocol, unchanged.
  7. Seeds aspirational (≥3 seeds of headline configs if ckpt capacity allows; all current runs are seed 0).

Cross-references added per the issue''s deliverable list: compare.py''s module docstring points at the protocol, and docs/model_comparison.md''s baseline-in-progress note now links to the committed section instead of just citing #71. The paper''s appendix "Baseline protocol" paragraph is the section, condensed.

pytest -q: 188 passed.

🤖 Generated with Claude Code (claude-fable-5)

)

Committed before any benchmark evaluation of any YOLO checkpoint — the five
recovery runs (jobs 37745358-363) are still training on ckpt-g2 and the only
numbers observed anywhere are the internal val-split curves already in this
record. That timing is the whole point: selection rules written down first,
test bundles touched once.

The protocol section in the training record fixes, in writing:

1. Checkpoint selection: best.pt as Ultralytics saves it (best val fitness,
   0.1*mAP50 + 0.9*mAP50-95, patience=20) — refines #71's "best val mAP50"
   draft to the artifact the runs actually keep; verified both rules pick the
   same epoch (1) on all five committed curves. RampNet parity noted: its
   checkpoint was likewise best-val (loss), never a benchmark number.
2. Config/headline selection on val only; controls emphasis only — every
   trained config's benchmark row is reported regardless.
3. Benchmark eval through the identical compare.py path as the whole roster
   (boxes -> centers -> detection_eval matcher, radius 0.022, 0.05 cache
   floor; tiles via the perspective rig at 1024, pano whole-pano at 1280).
4. Headline operating point fixed in advance: F1 at conf 0.25, Ultralytics'
   own default — not tuned on test. Sweep still reported with the
   tune-on-test flag as usual.
5. AP with the standing truncation caveat vs RampNet's 0.5-peak extraction.
6. Instability-affected best.pt is reportable only as a lower bound,
   superseded by the #70 rerun under this same protocol, unchanged.
7. Seeds aspirational (all runs seed=0).

Cross-referenced from compare.py's module docstring and from the
baseline-in-progress note in docs/model_comparison.md, per the issue's
deliverable list.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Pre-register the YOLO-baseline evaluation & checkpoint-selection protocol

1 participant