File size: 4,681 Bytes
1c0c94d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# AVIS — Build Roadmap

Strategy: **vertical slice first.** Get one violation (helmet, Tier A) flowing end-to-end
— upload → detect → graph → rule → annotate → store → see it on the dashboard — before
adding breadth. A thin working pipeline beats six half-built stages at demo time. Each
phase ends with something runnable and verifiable.

Mapping to the problem statement's required tasks is noted as `[PS: …]`.

---

## Phase 0 — Skeleton (≈2h)
- FastAPI app, `POST /images` (upload) + `GET /violations` + `GET /violations/{id}`.
- `core/schemas/` Pydantic models for every stage payload (image, detection, graph,
  candidate, violation).
- SQLite via SQLModel; `storage/` abstraction (metadata + image file save/load).
- Health check + a stub pipeline that just stores the image. `pytest` green, `ruff`/`mypy` clean.
- **Verify:** upload an image via Swagger UI, see a record in SQLite.

## Phase 1 — Vertical slice: helmet end-to-end (≈5h)  `[PS: Detection, Violation Detection, Classification, Evidence]`
- Stage 3 **Detect**: Ultralytics YOLO (COCO) → person/motorcycle/etc.
- Stage 4 **Scene Graph**: rider↔motorcycle association by geometry; graph builder + tests.
- Stage 5 **Helmet** attribute (fine-tuned YOLO/classifier on rider crops).
- Stage 6 **Rule Engine**: `helmet_rule()` pure function + unit tests.
- Stage 10 **Evidence Composer**: annotated image (boxes + label) saved to filesystem.
- Minimal dashboard: upload + results table + annotated image view.
- **Verify:** upload a no-helmet image → violation row + annotated image on the dashboard.

## Phase 2 — Breadth on Tier A + plates (≈5h)  `[PS: Vehicle/Road-User Detection, License Plate Recognition]`
- Triple-riding rule (count `rides` edges) + tests.
- Vehicle classification surfaced from detector classes.
- **fast-alpr** plate detection + OCR + Indian-plate regex correction; attach plate to graph.
- **Verify:** triple-riding image flagged; plate text shown and regex-validated.

## Phase 3 — Confidence routing + VLM verification (≈5h)  `[PS: Classification + confidence scores]`
- Stage 7 **Fuse + Route**: tier-aware thresholds from config; abstain path.
- `core/llm/` provider-agnostic client → **Gemini Flash free tier**; strict JSON contract.
- Stage 8 **VLM Verify** on routed candidates; cache by `evidence_hash`; quota-safe fallback.
- Confidence + reason persisted on every violation.
- **Verify:** an ambiguous case hits the VLM and returns reason+confidence; a clear Tier-A
  case auto-confirms without a VLM call (check the cache/logs).

## Phase 4 — Tier C (calibration) + legal + robustness (≈5h)  `[PS: Preprocessing, Evidence]`
- Stage 1 **Quality gate** (blur/exposure) → `undeterminable` abstain path.
- Stage 2 **Preprocess** (CLAHE, denoise, low-light).
- Traffic-light state + per-camera calibration (`configs/`): stop-line / no-parking
  polygons via `shapely`; stop-line & illegal-parking + red-light **candidate** rules.
- Stage 9 **Legal map**: static violation→section→fine table.
- Wrong-side: low-confidence candidate only.
- **Verify:** calibrated sample image yields a stop-line candidate routed to review with
  the correct legal section; a blurry night image abstains.

## Phase 5 — Analytics, search, review queue (≈4h)  `[PS: Analytics & Reporting]`
- Dashboard: violation trends/charts (Chart.js), searchable records, summary export.
- Human-review queue UI for low-confidence/Tier-C cases (approve/reject → audit trail).
- **Verify:** stats reflect stored data; a reviewer can resolve a queued case.

## Phase 6 — Evaluation harness (≈4h)  `[PS: Performance Evaluation]`
- Scripts: component P/R/F1/mAP on public datasets; end-to-end confusion matrix +
  per-image false-positive rate; latency/throughput; auto/VLM/human split + ablation.
- **Verify:** `python -m eval.run` prints the metrics table used in the pitch.

## Phase 7 — Polish & demo (≈4h)
- One-command `docker compose up`; pre-cache VLM responses for demo images.
- 3–4 curated demo images (incl. one the system deliberately abstains on).
- Pitch deck from `docs/DESIGN.md` §14; README with screenshots.

---

## Definition of done (every phase)
`pytest -q` green · `ruff check` + `mypy` clean · the phase's **Verify** step demonstrated
with real output · no fabricated results on the demo path (stub explicitly and say so).

## Cut-scope order if time runs short
Drop in this order: optional RAG → wrong-side (Tier D) → analytics polish → seatbelt
(Tier B) → calibration (Tier C). **Never cut** the helmet/triple-riding vertical slice,
confidence routing, or the abstain path — those are the demo and the thesis.