Skip to content

Crosswalk Phase 0 (#274): census, offset read, Vistas probe, Seattle aerial rating - #275

Open
jonfroehlich wants to merge 15 commits into
mainfrom
crosswalk-phase0
Open

jonfroehlich wants to merge 15 commits into
mainfrom
crosswalk-phase0

Conversation

@jonfroehlich

@jonfroehlich jonfroehlich commented Oct 29, 2026 •

Copy link
Copy Markdown
Member

Phase 0 of #274 (umbrella ProjectSidewalk/Planning#36), all three items, as scripts + committed tables + a doc with the aerial-imagery lookup per city. Items 1 and 2 are the comments already posted on #274; item 3 and the Seattle aerial rating are new here and posted on #274 with this PR. Nothing trains; no production write.

What it settles (docs/crosswalk_phase0_274.md):

  1. OSM crossing coverage across the 46 public cities is bimodal; in the 17 dense cities the crowd's Crosswalk label sits a median 1.17 m along / 1.00 m across the crossing from the OSM node, symmetric about zero: the crowd labels the centre and the OSM node is that centre. Santiago, Rancagua and São Paulo tag the junction node instead (bearing only there).
  2. Seattle aerial reference (AI first-pass rating of the 120-label sheet on King County 2023 3-inch ortho, to be spot-checked): a node tagged marked is painted 39/40, an untagged node with a confirmed crowd label 37/40, a node tagged unmarked 20/40. marked ∪ untagged is a usable positive set; unmarked is not a negative set. 92 of 117 labels within 5 m of the node on the crossing, 8 at an end, 17 off (13 of them the unmarked no-paint cases, where the crowd label often sits on a crossing OSM did not tag).
  3. Vistas probe, classes 8 + 23 on the 1024 parity rig. Amendment stated up front: the pinned splits (richmond, laurens_*) have an empty denominator, no benchmark pano there carries a crowd Crosswalk label; paterson (16 panos / 44 labels) and gainesville (18 / 23) do, so it ran there with the component and reading rules unchanged. recall@0.05 = 0.82 (55/67, Wilson 0.71–0.89; paterson 0.89, gainesville 0.70), chance floor 0.28 (p95 0.39), recall at the ramp radius 0.58. Clears the pinned 0.8 bar by one label: a usable Stage 1 extent filter, not a source and not a placer. Across all 554 panos of the five splits the union mask emits 0.2–0.3 components per pano in Laurens and 2.3–5.2 in Gainesville/Paterson/Richmond, tracking painted-crossing density.

Layout. scripts/analysis/crosswalk_phase0_274/ (stdlib census + offset read, the probe on top of scripts/model_comparison/equirect_tiling.py, the aerial-crop renderer, figures.py), analysis_out/crosswalk_phase0_274/ (census.json, offset_read.json, per-city offsets CSVs, the rating sheet unrated + AI-rated, the probe tables; ~1.5 MB, re-included in .gitignore), docs/crosswalk_phase0_274.md with a replication table and a where-each-number-lives paragraph, docs/figures/crosswalk_phase0_274/ (two PNGs). The raw pulls (~200 MB) and the licensed aerial crops are not committed.

Spot-check replay archive. Every tile and crop the spot-check page fetched while the 120 rows were rated (plus the sheet, rawLabels pull, verdict exports and an offline page) is kept off-repo on the lab share at /projects/makeabilitylab/RampNet/archives/crosswalk_phase0_274/aerial_spotcheck_seattle-wa/ (makelab1/makelab2, CSE-backed-up; sha256sum -c SHA256SUMS; README inside). archive_spotcheck.py writes it and aerial_spotcheck.py build --archive renders from it.

Review asks. (a) Spot-check a handful of rows of aerial_sample_seattle-wa.rated_ai.csv against the imagery (aerial_crops.py re-renders the sheets); (b) the probe's one departure from VistasDetector._raw_detect (reduce at 256×256, upsample the argmax map) is documented in the script docstring; (c) the item 3 split amendment.

🤖 Generated with Claude Code — Fable 5.1, claude-fable-5-1

…ating

Phase 0 of the crosswalk detector plan, run 2026-10-28, as scripts, committed
tables, a doc and two figures:

- Item 1 census (46 public cities): crowd Crosswalk/Signal labels vs OSM
  crossing/signal nodes; OSM coverage is bimodal; crossing:markings cannot be
  the positive set on its own.
- Item 2 offset read (17 dense cities, 16,762 labels): median 1.17 m along /
  1.00 m across the crossing from the node, symmetric about zero: the crowd
  labels the centre and the OSM node is that centre.
- Item 2 aerial reference: the 120-label Seattle sheet rated (AI first pass,
  King County 2023 3-inch ortho, crops not committed): marked 39/40 painted,
  untagged 37/40, unmarked 20/40, so `unmarked` is not a negative set.
- Item 3 Vistas probe (classes 8+23, 1024 parity rig): the pinned splits have
  an empty denominator, so it ran on paterson + gainesville with the rule
  unchanged: recall@0.05 0.82 (55/67; chance 0.28), a usable Stage 1 extent
  filter only. All-pano component rates per split in panos.csv.
- Aerial-imagery lookup per PS city (GSD, access) for the Phase 1 GT plan.

analysis_out/crosswalk_phase0_274/ is re-included in .gitignore for the small
tables; the raw rawLabels/OSM/way pulls (~200 MB) stay out and re-pull from the
cached-by-default scripts.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
jonfroehlich and others added 14 commits October 29, 2026 06:45
aerial_spotcheck.py build writes a self-contained page: one sheet row per screen, the 36 m crop
requested live from King County's 2023/2025 ortho export (no imagery in the repo), node, label and
2 m / 5 m rings drawn over it, the AI's two ratings pre-selected so Enter accepts and single keys
override. AI non-default rows come first. Verdicts persist in localStorage and export as JSON
(gt_gallery.py's pattern); `merge` folds them into the sheet as human_* columns and prints
agreement with the AI pass overall and per OSM class, plus the disagreement list.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…m 2)

The legend now shows each marker in its own pill (OSM crossing node,
Project Sidewalk crowd label, 2 m / 5 m rings) instead of a run of dots
that read ambiguously. The label-position buttons no longer quote
distance bands: the rater judges by position on the paint (centre /
off-centre / curb end / not this crossing), with a hint saying the
metres and rings are only aids. Stored verdict codes are unchanged, so
saved verdicts and the merge script carry over.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…ed row (#274 item 2)

"Next unrated" (key .) jumps forward in the current order to the next row
without a saved verdict, wrapping, and says so when every row is rated.
Save & next now lands on the next unrated row instead of the next row in
sequence, so walking back with the arrows no longer leaves the rater
re-visiting saved rows.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…em 2)

Question 2's buttons read "on the stripes, at/off-centre", which left a label a
few metres off the paint but in line with the middle of the crossing (placement
error, not a convention) with no honest option. The buttons now name the
decision: at the center / near the center (on or just off the paint, not toward
an end) / at a curb end / not this crossing, and each question carries a line
saying what it decides. Stored verdict keys are unchanged, so saved verdicts
and the merge step are unaffected. centre/metres -> center/meters on the page.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The node question carries the blue dot and the label question the red one,
matching the markers on the crop, so the rater sees which point each question
is about without reading the legend.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…m 2)

Only Save wrote anything, so a note typed and then a reload (or a detour with
the arrows) lost it. Button changes, the flag and the note are now kept per row
in a draft store beside the verdicts and restored when the row is shown, with
a status line saying so; Save and Clear drop the draft.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…ano facts (#274 item 2)

Rating #68 on the 2023 ortho alone read "no paint"; the 2025 ortho shows a
zebra and the crop the crowd labeled (Feb 2023) shows a ladder crosswalk. So:

- both King County years are shown side by side with the same overlay (the T
  toggle is gone), so a crossing painted or removed between flights is seen;
- a third panel shows the label's street-level crop from Project Sidewalk
  (/cropImage/<type>/<id>/metadata hands out a short-lived signed URL; CORS is
  open, so the page fetches it live and caches it per label), red ring = the
  label; a Street View link opens the pano itself;
- build --rawlabels joins the census's cached rawLabels pull to add the pano
  capture month, the label date and human agree/disagree counts to the facts;
- a "rows I rated no / unclear" order for revisiting those verdicts with the
  new evidence; each saved verdict now records imagery:"2023+2025+crop".

The AI first pass was rated on 2023 alone; its no/unclear rows need the same
revisit before the agreement table is read.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…fold (#274 item 2)

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…rge (#274 item 2)

A recurring case: the OSM node is an unpainted pedestrian crossing and the crowd's
Crosswalk label sits on the green bike crossing beside it. The code is no + 4, but
the sub-case matters on its own (a paint detector fires on green bike markings
exactly as the crowd did, and the OSM tag was right), so it gets a tag instead of
free text. merge writes human_bike and a per-class column; a note mentioning
"bike" from before the tag existed counts too.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…crossing' (#274 item 2)

An unmarked pedestrian crossing is still a crossing; what is missing is the painted
extent the position question is asked against. Stored key unchanged.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
… offline replay (#274 item 2)

- aerial_verdicts_seattle-wa.json: the human export (120/120 rows, exported
  2026-10-31T14:19Z); aerial_sample_seattle-wa.rated.csv: merge output. 93 rows
  were judged on the 2023 ortho alone (before the 2025 + crop panels); 11 of
  those are no/unclear and get a revisit -- hence the new "no / unclear saved
  before the 2025 + crop panels" order. Numbers are provisional until then.
- archive_spotcheck.py saves every network fetch the page makes (both years,
  36 m and 18 m tiles, every label crop + metadata, the sheet, the rawLabels
  pull, the export, the page) with sha256 + url + time in manifest.json, so
  the rating can be replayed if the services go away. Imagery stays out of
  the repo (King County "view only", Google pixels in the crops).
- build --archive <dir> renders the page from that archive, no network.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…an order (#274 item 2)

aerial_spotcheck_review_rows.json names 21 first-pass rows whose verdict predates a
rule settled later (1 m off the paint = 2; bike crossing = N + 4 + B; paint in
either year or the crop = Y; one rule for faded paint) or was judged on 2023 alone,
with the reason. build --review embeds it; the row shows the reason, and the
're-examine' order walks those rows plus any no/unclear verdict without the
2023+2025+crop imagery stamp.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…it (#274 item 2)

Instead of a second page (which would get its own verdict store and a second
export), the page opens in the re-examine order whenever rows are pending, Save
drops the row from the list and moves to the next pending one, and it says when
the list is empty. A row counts as done once its verdict is saved after the
list's made_utc.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…#274 item 2)

The Seattle aerial spot-check archive (tiles, crops, sheet, verdicts, offline page) cannot
live in the repo, so the scripts' docstrings and the Phase 0 doc's Replication table now
name its backed-up home on makelab1/makelab2:
/projects/makeabilitylab/RampNet/archives/crosswalk_phase0_274/aerial_spotcheck_seattle-wa/
and the SHA256SUMS check that verifies a copy.

Co-Authored-By: Claude Fable 5.1 <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.

1 participant