Skip to content

Qualitative failure taxonomy: bucket each model's FP/FN from cached detections #46

Description

@jonfroehlich

Motivation

The P/R/F1 table tells us that the challengers fail; it doesn't tell us how. The chat VLMs are "FP-heavy" (119–293 FP vs RampNet's 9) — but we don't know how much of that flood is genuine hallucination vs measurement artifact. Several confounds could be inflating FP (and FN) without the models being as wrong as the numbers imply:

  • Box→center + tight radius double-penalizes loose localization: a correct-but-loose box whose center lands >0.022 from the GT point is scored as an FP and the ramp as an FN — one miss, counted twice.
  • Hood/nadir (pitch_deg=-30 → ~⅓ of every view is vehicle hood + black cap; GDINO's top box is the hood — see companion nadir-mask issue).
  • Cross-view dedup double-counting at tile seams (360 pano seam: curb ramps split across the left/right edge get double-counted in GT scoring #43).

What to build

A script over .model_cache/ that, for each model + city, classifies every FP and FN against the derived GT (rampnet/detection_eval.py):

  • FP buckets: on-hood/nadir · near-GT-but-outside-match-radius (localization) · cross-view dedup duplicate · on driveway / crosswalk paint / stairs · genuine hallucination (far from anything).
  • FN buckets: small/distant · occluded · seam-truncated (360 pano seam: curb ramps split across the left/right edge get double-counted in GT scoring #43) · inside the hood region.
  • Output: per-model bucket counts + a worst-cases gallery, reusing the dump_detections.py overlay machinery.

Why it's cheap and high-value

  • No model re-runs — cached detection points + derived GT already contain everything the geometric buckets need (the gallery also needs the local pano images).
  • Turns "119 FPs" into "40 localization / 25 hood / 30 driveway / 24 real," which is what tells us whether the RampNet lead is as clean as it looks — and lets us qualify the paper's numbers precisely.
  • De-risks the cascade (Experiment: hybrid RampNet + open VLM (Qwen3-VL) — ensemble / cascade / distillation #35): if OWLv2's ~8,800 FPs are mostly obvious junk (hood/driveway), an arbiter kills them trivially; if they're ambiguous concrete, the arbiter struggles too. The taxonomy sets the cascade's ceiling before we build it.

Refs #39, #43, #35.

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions