| name | sign-crop-labeler |
| description | Stage 2 Labeler: Annotates fuel rows, prices, and brand within cropped sign images.
This is the SECOND stage of a 2-stage labeling pipeline.
Input: Cropped sign images produced by the Stage 1 Finder model.
Output: Fuel row bounding boxes, price text, fuel types, brand classification.
Use this skill ONLY after the Finder model reaches mAP50 > 0.70.
DO NOT use this on full camera photos — use fuel-sign-labeler (Stage 1) instead.
|
Stage 2: Sign Crop Labeler
Prerequisites
DO NOT USE THIS SKILL until:
- The Finder model (Stage 1) reaches mAP50 > 0.70 on canonical_test_v2
- Cropped sign images have been generated by running the Finder on the training images
- The crops are saved to
data/crops/ (or similar staging directory)
Status: NOT YET ACTIVE. The Finder is at mAP50=0.517 (as of 2026-04-12). This skill is a placeholder documenting the planned labeling approach.
2-Stage Pipeline Context
Stage 1 (fuel-sign-labeler — ACTIVE):
Full photo → sign_board bbox → Train Finder
Stage 2 (THIS SKILL — NOT YET ACTIVE):
Finder crops → fuel row annotations → Train Price Reader + Fuel Type + Brand
What Stage 2 Annotates
The input is a cropped sign image (just the sign panel, ~300-500px). The agent annotates:
1. Brand Classification (1 per crop)
Classify the brand visible in the top portion of the crop.
Brands: shell, bp, ampol, caltex, seven_eleven, united, costco, liberty, puma, metro, mobil, otr, apco, eg, independent
2. Fuel Rows (3-6 per crop)
Each fuel row has two components:
fuel_label (left side of row)
The fuel type text. Bbox wraps the text label only.
Canonical fuel types: U91, E10, P95, P98, Diesel, LPG, AdBlue, E85
Mapping hints:
- "Unleaded" / "ULP" / "Unleaded 91" → U91
- "Unleaded E10" / "E10" / "Ethanol" → E10
- "Premium 95" / "Vortex 95" / "Amplify 95" → P95
- "Premium 98" / "V-Power" / "Ultimate 98" / "Vortex 98" → P98
- "Diesel" / "Vortex Diesel" / "Ultimate Diesel" → Diesel
- "LPG" / "Autogas" / "Gas" → LPG
fuel_price (right side of row)
The price digits. Bbox wraps the LED/printed digits only.
Format: XXX.X cents per litre (e.g., 189.9)
Range: 80.0–350.0 (40.0–150.0 for LPG)
3. Spatial Rules
Within the cropped sign:
┌──────────────────────────┐
│ [brand header - classify] │
├──────────────────────────┤
│ [fuel_label] [fuel_price]│ ← Row 1
│ [fuel_label] [fuel_price]│ ← Row 2
│ [fuel_label] [fuel_price]│ ← Row 3
│ [fuel_label] [fuel_price]│ ← Row 4
└──────────────────────────┘
- fuel_label must be LEFT of fuel_price (label.x2 < price.x1)
- Each label-price pair must be at the SAME Y position
- All bboxes in normalized [0,1] coordinates relative to the CROP (not original photo)
- Rows ordered top to bottom
4. Output Format
{
"prompt_version": "v7_stage2",
"crop_source": "gimg_caltex_qld_48c3b9d6_04.jpg",
"brand": "caltex",
"sign_type": "led",
"entries": [
{
"fuel_type": "U91",
"display_text": "Unleaded",
"price": 145.9,
"label_bbox": [0.05, 0.30, 0.40, 0.42],
"price_bbox": [0.55, 0.30, 0.95, 0.42]
},
{
"fuel_type": "Diesel",
"display_text": "Vortex Diesel",
"price": 127.9,
"label_bbox": [0.05, 0.45, 0.40, 0.57],
"price_bbox": [0.55, 0.45, 0.95, 0.57]
}
]
}
Key difference from Stage 1: All coordinates are relative to the crop, not the original photo. This is exactly what the Price Reader model will see.
Why Stage 2 Is Better Than Annotating Everything at Once
- Agent sees a zoomed-in crop — bbox estimation is 5x more accurate on a 400px sign vs a 20px sign in a 1080p photo
- No coordinate transformation — labels are in crop-space, which IS the model input space
- Faster feedback loop — Finder must work before Stage 2 matters
- Quality over quantity — Stage 2 labels are high-quality because the input is clean
- Independent datasets — Finder dataset and Reader dataset evolve separately
Activation Criteria
This skill becomes active when: