Repository navigation
Vistas 1024 parity arm on all fourteen splits (stacked on #261) - #267
Conversation
Mask2Former Vistas (curb cut, 1024) detections for clovis, morgantown, laurens_mapillary, juneau, laurens_gsv, budapest_district5, sao_paulo, bayonne and manual_gold, run on makelab2 (A40) 2026-10-20 and verified 9/9 identical to the producing cache. Nine paid:false usage rows, the run logs and env, the launcher, and the regenerated scoreboard. Docs, tests and derived artifacts follow. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The parity arm now scores in the pooled headline (F1 0.519, P 0.380, R 0.836; 0.274 behind RampNet). Regenerated laurens_paired_151 (one new leg; curb-probe values unchanged, labeler_commit now the checkout it was derived from) and cascade_cost_35/summary.json (the eight new pairs listed as gaps, not run). Docs: an 'All fourteen splits' section in vistas_transfer_126.md with the per-split table, cost and provenance; scoreboard prose (finding 3's recall claim, partial-leg counts, worst-city counts, the manual_gold scatter, PR-curve items); replication counts (209 files, 28.2 MB); roster note; findings caveat. Tests: the 5/9 coverage pin and the above-RampNet-recall set updated, a new test checks every row of the new doc table against the scorer, and the laurens rows hash pin moved. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…_gsv has no op_cache) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… (223) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
jonfroehlich
left a comment
There was a problem hiding this comment.
Independent review (head 806e1d6): ready, after a few fixes
No blockers. Every number re-derived matches. Verified independently:
- Coverage. All 9 new files cover every pano in their split's
records.jsonl: 0 missing, 0 extra, 0 uncached. - One leg. All 14 files of the 1024 arm share one signature and
published_as. The 384 and+curbarms are untouched. - Cache.
export_model_cache.py --verifyagainst the producing cache: 9/9 identical. - Re-scoring. An independent re-score matches every P/R/F1/AP and tp/fp/fn in all 14 doc rows, the PR body and the
compare.pylogs. - Pooled. Vistas macro P 0.380 / R 0.836 / F1 0.519 / AP 0.488, against RampNet 0.953 / 0.686 / 0.793.
- Recall. Vistas out-recalls RampNet at 0.55 on all 9 pooled cities, and on 4 of 5 held-out splits (manual_gold is the exception, 0.825 vs 0.873). RampNet's 0.05-floor curve stays above the Vistas curve at every recall: micro recall 0.862 vs 0.830, minimum precision margin +0.373.
- Budapest. Vistas is the strongest challenger there: 0.527, against Opus 5.5's 0.451.
- Ledger. 9
paid: falserows, append-only (origin/main's 285 lines are a byte-identical prefix), totalling 2,708 s wall-clock. - Bayonne. No arm masks the nadir band, so this run matches the others.
- Regeneration.
check_all.py --ci: 22 passed.eval_protocol_150223 cells, 0 differing. - Tests. Updated honestly, none weakened.
Should-fix
- The ledger append is missing from the run instructions (
docs/vistas_transfer_126.mdrun section,scripts/analysis/vistas1024_all_splits.shheader). The commands write to$W/usage_log.jsonl, but the append intoanalysis_out/usage_log.jsonlis never written down. Add the exact command and a 9-row check. - The GPU-utilisation figures have no source. "0% utilisation" and "9% during clovis" appear in no committed log. Either say they were ad-hoc
nvidia-smireads that weren't logged, or drop them. - The mixed-environment caveat should sit beside the pooled number.
- The 14 files come from two environments: makelab2 A40 with torch 2.13/cu130, and klone L40S with torch 2.6/cu126.
- Both used the same signature, the same snapshot and transformers 5.15.0.
- Name the mix in one sentence, and point to the #163 same-checkpoint env control ("within one detection out of 523") as the expected size of the effect.
Nits
- PR body.
- It still says "Stacked on #261 … retarget to main". Both are done.
- The cost table's 1.337 s/pano is detect-only (2581.3/1930), but there is no detect column, so it reads as inconsistent with 1.403. Label it.
model_scoreboard.md:241. "Highest pooled recall of any model above the open detectors" can be misread as beating them. Write "apart from the two open detectors".model_scoreboard.md:389, a pre-existing claim this PR edited. "RampNet's curve dominates" doesn't strictly hold for YOLO11x: at recall 0.088–0.090 YOLO11x is 0.0016 higher. Soften or qualify it.- Figures.
- In
scoreboard_pr_curves.pngthe Vistas curve is the same grey as the "grey dots emit no confidence" convention. Give it its own colour. - In
scoreboard_generalization.pngthe thin "P" marker is hidden under YOLO26's label.
- In
imagery_verify.logheader. It has none (command, host, timestamp).export_verify.loghas one.- Carried over from the #262 review:
fig_headline's footer says "single-split legs", but the partial legs include 8/9 and 5/9.- Now that the arm has full coverage, it has no label-nudge entry in the scatter figures.
Fixes follow, then a re-review. This PR and #262 both regenerate the scoreboard figures, so whichever merges second will merge main and regenerate.
🤖 Generated with Claude Code — Opus 5.5, claude-opus-5-5
- docs/vistas_transfer_126.md and the vistas1024_all_splits.sh header: the append of the run's nine usage rows into analysis_out/usage_log.jsonl, with a nine-row byte-for-byte check. The command used on 2026-10-20 was not recorded; the docs say so and the check verifies its result. - The GPU-utilisation figures are labelled as unlogged nvidia-smi reads. - Mixed-environment caveat beside the pooled number (makelab2 A40 torch 2.13/cu130 vs klone L40S torch 2.6/cu126), pointing to the #163 env control. - model_scoreboard.md: "apart from the two open detectors"; the curve claim names YOLO11x's -0.0016 at recall 0.087-0.090. - scoreboard_figures.py: the Vistas curve gets violet (slot 7) instead of the scoreless-dot grey; label nudges for the arm in both scatters; fixes for the overlapping labels in the generalization and PR-curve figures; fig_headline's partial-leg footer counted off the board; headline figure widened so its title is not clipped. - imagery_verify.log gets a provenance header. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Review fixes pushed in 0dd0b1d. Every finding is addressed. Checks:
Next: a final independent re-review. 🤖 Generated with Claude Code — Opus 5.5, claude-opus-5-5 |
…test #163's control changed GPU and transformers major version; this mix changes GPU and torch with transformers fixed, so it is the nearest measurement, not a control of the same change. Both docs now say so. Adds a test for _partial_footer, whose doctest nothing ran. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Final re-review (head 0dd0b1d): Ready to mergeNo blockers and no should-fix items. Verified independently:
Two nits applied in 6ad0dd8:
Two optional nits were not applied, being cosmetic and outside this PR's claims:
#262 also regenerates these figures. Whichever merges second will merge 🤖 Generated with Claude Code — Opus 5.5, claude-opus-5-5 |
…#267 Conflicts, and how each was resolved: Generated artifacts (regenerated, never hand-merged): - analysis_out/scoreboard.json, docs/figures/scoreboard_by_split.png, docs/figures/scoreboard_f1.png, and the generated blocks of docs/model_scoreboard.md (partial table, by-split matrix) and docs/model_comparison.md (per-split "Also scored" lines): scoreboard.py. The board is 23 legs: 15 full-coverage (Vistas 1024 now among them, 0.519) and 8 partial (y11x_tiles 7/9 at 0.667, claude-opus-5 low 8/9, six one-split legs). The six y11x_tiles seed legs stay off_scoreboard. - analysis_out/eval_protocol_150/reproduction.json: eval_protocol_150.py. 233 scoreboard cells (main's 224 + the 9 Vistas cells), 23 legs, 2,330 fields; 30 benchmark_eval cells; 0 differing, 0 unchecked. - analysis_out/cascade_cost_35/summary.json: cascade_cost_35.py --summary. The gaps list now has both sides' "pair was not run" rows (Vistas 1024 on its new splits, and the seven y11x_tiles legs). Hand-written prose and tests, with counts recomputed from the regenerated board: - docs/model_scoreboard.md: "Eight legs have not run every pooled split - six of them only one" (main said nine with Vistas at 5/9; the PR said seven without y11x_tiles), in the section opener and the "What is missing" bullet. That bullet keeps the PR's wording (Vistas 1024 is in the headline) and main's y11x_tiles/seed-leg prose. The Vistas budapest sentence now quotes the four YOLO arms' 0.221-0.319, since y11x_tiles is at the top of that range. - docs/replication.md: 273 files, 31.3 MB (MiB, the doc's convention) in benchmark/model_detections/ (main's 264 + the 9 Vistas files). The breakdown table already sums to 273. - tests/test_scoreboard.py: kept both sides. The PR's test_the_vistas_parity_arm_is_pooled and test_partial_footer_counts_the_board, and main's by_split_rows/held_out_footer tests and test_seed_legs_are_named_but_not_scored. The coverage map had already auto-merged correctly (y11x_tiles 7/9, no Vistas 1024). Stale counts outside the conflicts, fixed the same way: - docs/eval_protocol_150.md: 224 -> 233 cells, 2,240 -> 2,330 fields, and the PR's update note says 233 (was 224) with 23 legs (it said 223 and 22). - docs/README.md: twenty-two -> twenty-three model legs. - docs/claude_newest_ids.md: Opus 5.5 is no longer "the only" full-coverage model besides the open detectors with pooled recall above RampNet's. Vistas 1024 (0.836) joined the pool. "Highest pooled recall apart from the two open detectors" in model_scoreboard.md still holds. - docs/vistas_transfer_126.md: the YOLO budapest range is 0.221-0.319. #262's Gemini manual_gold note in model_scoreboard.md is unchanged. Checks: scoreboard.py --check, eval_protocol_150.py --check, pytest (3360 passed, 7 skipped), check_all.py --ci (22 passed, 3 skipped). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… spacing Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Merge of main (c46ff35) and its re-review: Ready to merge
Prose outside the conflicts that the merge made stale is also fixed:
Independent re-review of the merge commit:
Its three findings are fixed in d746c70:
🤖 Generated with Claude Code — Opus 5.5, claude-opus-5-5 |
Conflicts resolved: - usage_log.jsonl: main's file plus this branch's four open-rig-258 rows. - laurens_paired_151: rebuilt from main's JSON with its curb probe; now carries both the Vistas row and the laurens_gsv GSV side (rows_sha256 6b1376d1, pin updated). - docs/laurens_paired_151.md, docs/eval_protocol_150.md: both dated notes kept; ours quotes the post-merge counts (233 cells, 13 op_cache cells). check_all --ci and the affected tests pass. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Completes the Mask2Former Vistas parity arm (
vistas:curb-cutat--vistas-input-size 1024 1024, published asmask2former-vistas-curb-cut-1024x1024) on the nine splits it had not run: clovis, morgantown, laurens_mapillary, juneau, laurens_gsv, budapest_district5, sao_paulo, bayonne and manual_gold. It now covers all fourteen splits and scores in the pooled headline ofdocs/model_scoreboard.md. The 384 arm and the+curbunion arm were deliberately not extended; they stay richmond-only.Result
Pooled over the nine US cities (macro): P 0.380 / R 0.836 / F1 0.519 / AP 0.488, against RampNet's 0.953 / 0.686 / 0.793. "Transfers but does not compete" stands on every split.
The pooled number mixes two environments. richmond, clovis, morgantown, laurens_mapillary and juneau (five of the nine pooled cities), and all five held-out splits, ran on makelab2 (A40, torch 2.13.0+cu130). bend, paterson, gainesville and annapolis ran on klone (L40S, torch 2.6.0+cu126). Both used the same detection signature and transformers 5.15.0, and the two runs that record a checkpoint snapshot both loaded
4772b6bf…. The expected size of the effect is the #163 same-checkpoint environment control: the 384 arm, re-run in a different environment, landed within one detection out of 523 of the published run. No split was run in both environments for the 1024 arm.† held out of the pool. The full fourteen-row table (with AP and tp/fp/fn) is in
docs/vistas_transfer_126.md§ "All fourteen splits", and a new test checks every row of it against the scorer.Claims that changed:
test_the_newest_ids_legs_are_pooled) are updated.manual_goldscatter. Its pooled-minus-manual_goldis −0.13, against ±0.08 for the zero-shot models, and the gain is all precision. Two candidate readings are written up; neither is measured.Where it ran, and what it cost
Run on makelab2 (one A40) on 2026-10-20, from a scratch worktree at
ece4fc4with a private--cache-dirand an offline load of checkpoint snapshot4772b6bf…, the same snapshot the #35 klone run loaded. Before any GPU time, all nine splits' panoramas passedimagery_manifest.py --verify. juneau's panoramas were copied up from the Windows checkout, and bayonne's came from the #159 worktree on makelab2; neither is on HF.export_model_cache.py --verifygave 9/9 pairs identical to the producing cache (1,930 shards).Each
compare.pyprocess held the A40 for its whole wall-clock, so GPU time equals wall-clock. Each process wrote onepaid: falserow to the run's ownusage_log.jsonl, and those nine rows were then appended toanalysis_out/usage_log.jsonl. The ledger's last nine lines are byte-identical to the run's file, and the 285 before them are main's ledger unchanged. The append command and a nine-row check are now written into the run instructions. makelab2 has no Slurm, so there are nocompute_log.jsonlrows, perdocs/compute_cost.md.s/pano is detect seconds over panoramas, and excludes model load (the difference between the two seconds columns). The end-to-end run took 45 min 32 s. The GPU was shared: another process held 9.2 GB at the start and the end of the run (both in
run.log). Utilisation was not logged. Twonvidia-smireads taken by hand during the run, and not recorded, showed 0% at the start and 9% during clovis, which points to CPU-side reprojection as the bound. The per-split seconds are wall-clock on a shared GPU, so they are an upper bound.What else moved
analysis_out/laurens_paired_151.{json,md}anddocs/laurens_paired_151.md: one new leg row. No earlier row changed and the curb-probe values are identical. The recordedlabeler_commitmoved from 29dc605 to 39afcd4, the labeler checkout the regeneration ran from, and that field is insiderows_sha256, so the test pin moved with it.analysis_out/cascade_cost_35/summary.json: eight of the nine new (split, parity arm) pairs are listed undergapsas "published detections exist but this pair was not run". The ninth,laurens_gsv, has no op_cache and is not listed.analysis_out/eval_protocol_150/reproduction.json: the proof now covers 223 scoreboard cells, with 0 differing and 0 unchecked. This artifact is not incheck_all; its CI test caught it.docs/replication.md(209 files, 28.2 MB; the 1024 row is now 14), therampnet/roster.pynote,docs/model_comparison.md(a coverage paragraph for the three Vistas arms, plus the generated footnotes),docs/rampnet1_findings.md(the "one split" caveat),docs/README.mdandscripts/analysis/README.md.scoreboard_pr_curves.pngthe Vistas curve has its own colour (violet, palette slot 7) rather than the grey of the scoreless dots. The scatter figures have label nudges for the arm, and the headline figure is wider so its title is no longer clipped. These figures will conflict with figures: pooled-mean column on the by-split heatmap, rows sorted by it #262 (figures/scoreboard-heatmap-aggregate); whichever lands second should merge main and regenerate them, not merge the PNGs.Review fixes (review 5593166337)
docs/vistas_transfer_126.md(Provenance, step 3) and thevistas1024_all_splits.shheader. The command used on 2026-10-20 was not recorded. The docs say so, and say that the check verifies its result.docs/vistas_transfer_126.mdand beside the pooled number indocs/model_scoreboard.md.model_scoreboard.md: "apart from the two open detectors", and the curve-dominance claim now names the one exception: YOLO11x is 0.0016 higher at recall 0.087–0.090.fig_headline's footer, which now reads "7 legs that cover 1–8 of the nine pooled splits", counted off the board.imagery_verify.loghas a header with the command, the host and worktree, and the time bound. The exact time was not recorded, and the header says so.Not run
null_recall.py) and the Experiment: hybrid RampNet + open VLM (Qwen3-VL) — ensemble / cascade / distillation #35 cascade grid on the nine new splits. All three are CPU-only re-reads of the published files, exceptcascade_gate.py.Housekeeping
The makelab2 scratch worktree
/homes/gws/jonf/wt-vistas1024is still there: detached atece4fc4, registered in/homes/gws/jonf/RampNet's worktree list, holding the run outputs, the tarball and a 287 MB copy of the juneau panoramas. It is pending cleanup once Jon clears makelab2 contact:git -C /homes/gws/jonf/RampNet worktree remove --force /homes/gws/jonf/wt-vistas1024. The.model_cacheshards are also inD:\Git\RampNet\.model_cache.Checks
At
0dd0b1d, on Windows (.venv, Python 3.12):scripts/analysis/scoreboard.py --check: all three generated outputs current.python -m pytest -qon the touched tests (test_scoreboard.py,test_laurens_paired_151.py,test_docs.py,test_cascade_cost_35.py,test_cascade_gate.py,test_complementarity.py,test_export_model_cache.py): 250 passed. At806e1d6the full suite was 3353 passed, 7 skipped.scripts/check_all.py --ci: 22 passed, 0 failed, 3 skipped (the slow entry and the two that need local data).export_model_cache.py --verifyfor the nine new files: 9/9 identical to the producing cache (docs/data/vistas1024_all_splits/export_verify.log).🤖 Generated with Claude Code — Opus 5.5, claude-opus-5-5