AVIS / devdocs /schema_design.md
X2-0's picture
HF Clean Deploy
1c0c94d
|
Raw
History Blame Contribute Delete
3.66 kB
# Schema Design
AVIS strictly types all internal data passing between pipeline stages. The core schema is the `EvidenceGraph`, built using Pydantic, which transforms raw machine learning detections into explainable geometric and semantic relationships.
## 1. The Evidence Graph Data Model
The `EvidenceGraph` is not a flat list of objects; it is a typed graph.
### Nodes
Every physical entity detected in the image is represented as a node. Nodes contain their spatial bounds (`BBox`) and ML confidence score.
- **`Vehicle`**: Represents cars, motorcycles, trucks, buses, or bicycles. Stores a `type`, `bbox`, and `confidence`. Also tracks which calibration zones it sits inside (`in_zones`).
- **`Person`**: Represents humans. Includes a `role` enum (`rider`, `driver`, `pedestrian`). Can carry attribute scores (e.g., `helmet: bool`, `seatbelt: bool`).
- **`Light`**: A traffic light. Tracks its `state` (`red`, `amber`, `green`, `unknown`).
- **`Plate`**: A cropped license plate. Tracks `text` (OCR output) and `regex_ok` (whether it matches standard Indian plate formats).
- **`Zone`**: A geometric area derived from the camera calibration file. Can be a `stop_line`, `no_parking`, or `lane` zone. Defined by a `polygon`.
### Edges
Edges define the relationships between nodes. A violation is essentially a small subgraph.
- **`rides`**: `Person` β†’ `Vehicle:motorcycle`. Links a rider to a bike. Used for helmet and triple-riding rules.
- **`drives`**: `Person` β†’ `Vehicle:car`. Links a driver to a car. Used for seatbelt rules.
- **`has_plate`**: `Vehicle` β†’ `Plate`. Links OCR text to a specific vehicle.
- **`located_in`**: `Vehicle` β†’ `Zone`. Determines if a vehicle has breached a calibration polygon.
- **`governed_by`**: `Vehicle` β†’ `Light`. Links a vehicle to the specific traffic light dictating its allowed movement.
## 2. Violation Representation
When the Rule Engine identifies a violation subgraph, it generates structured records.
### `Candidate`
An intermediate object representing a potential violation before routing or VLM verification.
- `type`: E.g., `TRIPLE_RIDING`.
- `tier`: The evidence sufficiency tier (`A`, `B`, `C`, `D`).
- `subjects`: A list of node IDs involved in the violation (e.g., `["motorcycle_1", "rider_1", "rider_2", "rider_3"]`).
- `rule_score`: Mathematical confidence of the rule logic.
### `Violation`
The final output payload, destined for the database and e-challan generation.
- Inherits the `Candidate` data but adds the final ruling:
- `evidence_sufficiency`: `sufficient`, `candidate`, or `insufficient`.
- `scores`: A fused object containing `detection`, `rule`, `vlm`, and `fused` scores.
- `route`: How the decision was made (`auto_confirmed`, `vlm_confirmed`, `human_review`).
- `reason`: A human-readable, single-sentence justification.
- `legal`: A dictionary containing the `act`, `section`, and `fine` amount.
- `evidence_hash`: A SHA-256 hash of the original image to prove no tampering occurred.
## 3. Database Schema (PostgreSQL)
Because the `EvidenceGraph` is highly variable and deeply nested, AVIS does not use a strict relational schema for detections. Instead, it utilizes **JSONB columns** in PostgreSQL via SQLModel.
This provides:
1. **Relational Integrity**: Metadata (timestamp, camera ID, status) is stored in standard relational columns for fast indexing and queue management.
2. **Flexible Storage**: The entire `EvidenceGraph` and the resulting `Violation` JSON are dumped into a JSONB column. This allows querying the database for specific graph conditions using Postgres JSON operators while allowing the schema to evolve without heavy migrations.