Files
detections/_docs/02_document/data_model.md
T

158 lines
4.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Azaion.Detections — Data Model
## Entity-Relationship Diagram
```mermaid
erDiagram
AnnotationClass {
int id PK
string name
string color
int max_object_size_meters
}
Detection {
double x
double y
double w
double h
int cls FK
double confidence
string annotation_name
}
Annotation {
string name PK
string original_media_name
long time
bytes image
}
AIRecognitionConfig {
int frame_period_recognition
double frame_recognition_seconds
double probability_threshold
double tracking_distance_confidence
double tracking_probability_increase
double tracking_intersection_threshold
int big_image_tile_overlap_percent
int model_batch_size
double altitude
double focal_length
double sensor_width
}
AIAvailabilityStatus {
int status
string error_message
}
DetectionDto {
double centerX
double centerY
double width
double height
int classNum
string label
double confidence
}
DetectionEvent {
string mediaId
string mediaStatus
int mediaPercent
}
Annotation ||--o{ Detection : contains
Detection }o--|| AnnotationClass : "classified as"
DetectionEvent ||--o{ DetectionDto : annotations
```
## Core Domain Entities
### AnnotationClass
Loaded from `classes.json` at startup. 19 base classes × 3 weather modes = up to 57 entries in `annotations_dict`.
| Field | Type | Description |
|-------|------|-------------|
| id | int | Unique class ID (0-18 base, +20 for winter, +40 for night) |
| name | str | Display name (e.g. "ArmorVehicle", "Truck(Wint)") |
| color | str | Hex color for visualization |
| max_object_size_meters | int | Maximum physical size — detections exceeding this are filtered out |
### Detection
Normalized bounding box (0..1 coordinate space).
| Field | Type | Description |
|-------|------|-------------|
| x, y | double | Center coordinates (normalized) |
| w, h | double | Width and height (normalized) |
| cls | int | Class ID → maps to AnnotationClass |
| confidence | double | Model confidence score (0..1) |
| annotation_name | str | Back-reference to parent Annotation name |
### Annotation
Groups detections for a single frame or image tile.
| Field | Type | Description |
|-------|------|-------------|
| name | str | Unique name encoding media + tile/time info |
| original_media_name | str | Source media filename (no extension, no spaces) |
| time | long | Timestamp in ms (video) or 0 (image) |
| detections | list[Detection] | Detected objects in this frame |
| image | bytes | JPEG-encoded frame (set after validation) |
### AIRecognitionConfig
Runtime configuration for inference behavior. Created from dict (API) or msgpack (internal).
### AIAvailabilityStatus
Thread-safe engine lifecycle state. Values: NONE(0), DOWNLOADING(10), CONVERTING(20), UPLOADING(30), ENABLED(200), WARNING(300), ERROR(500).
## API DTOs (Pydantic)
### DetectionDto
Outward-facing detection result. Maps from internal Detection + AnnotationClass label lookup.
### DetectionEvent
SSE event payload. Status values: AIProcessing, AIProcessed, Error.
### AIConfigDto
API input configuration. Same fields as AIRecognitionConfig with defaults.
### HealthResponse
Health check response with AI availability status string.
## Annotation Naming Convention
Annotation names encode media source and processing context:
- **Image**: `{media_name}_000000`
- **Image tile**: `{media_name}!split!{tile_size}_{x}_{y}!_000000`
- **Video frame**: `{media_name}_{H}{MM}{SS}{f}` (compact time format)
## Serialization Formats
| Entity | Format | Usage |
|--------|--------|-------|
| Detection/Annotation | msgpack (compact keys) | `annotation.serialize()` |
| AIRecognitionConfig | msgpack (compact keys) | `from_msgpack()` |
| AIAvailabilityStatus | msgpack | `serialize()` |
| DetectionDto/Event | JSON (Pydantic) | HTTP API responses, SSE |
## No Persistent Storage
This service has no database. All data is transient:
- `classes.json` loaded at startup (read-only)
- Model bytes downloaded from Loader on demand
- Detection results returned via HTTP/SSE and posted to Annotations service
- No local caching of results