mirror of
https://github.com/azaion/detections.git
synced 2026-04-22 21:46:31 +00:00
50 lines
2.7 KiB
Markdown
50 lines
2.7 KiB
Markdown
# Acceptance Criteria
|
||
|
||
## Detection Accuracy
|
||
|
||
- Detections with confidence below `probability_threshold` (default: 0.25) are filtered out.
|
||
- Overlapping detections with containment ratio > `tracking_intersection_threshold` (default: 0.6) are deduplicated, keeping the higher-confidence detection.
|
||
- Tile duplicate detections are identified when all bounding box coordinates differ by less than 0.01 (TILE_DUPLICATE_CONFIDENCE_THRESHOLD).
|
||
- Physical size filtering: detections exceeding `max_object_size_meters` for their class (defined in classes.json, range 2–20 meters) are removed when ground sampling distance can be computed from camera settings.
|
||
|
||
## Video Processing
|
||
|
||
- Frame sampling: every Nth frame processed, controlled by `frame_period_recognition` (default: 4).
|
||
- Minimum annotation interval: `frame_recognition_seconds` (default: 2 seconds) between reported annotations.
|
||
- Tracking: new annotation accepted if any detection moved beyond `tracking_distance_confidence` threshold or confidence increased beyond `tracking_probability_increase`.
|
||
|
||
## Image Processing
|
||
|
||
- Images ≤ 1.5× model dimensions (1280×1280): processed as single frame.
|
||
- Larger images: tiled based on ground sampling distance. Tile physical size: 25 meters (METERS_IN_TILE). Tile overlap: `big_image_tile_overlap_percent` (default: 20%).
|
||
- GSD calculation: `sensor_width * altitude / (focal_length * image_width)` when `altitude` is provided.
|
||
|
||
## API
|
||
|
||
- `GET /health` always returns `status: "healthy"` (even if engine is unavailable — aiAvailability indicates actual state).
|
||
- `POST /detect` returns detection results synchronously. Errors: 400 (empty/invalid image), 422 (runtime error), 503 (engine unavailable).
|
||
- `POST /detect/{media_id}` returns immediately with `{"status": "started"}`. Rejects duplicate media_id with 409.
|
||
- `GET /detect/stream` delivers SSE events with `mediaStatus` values: AIProcessing, AIProcessed, Error.
|
||
- SSE queue maximum depth: 100 events per client. Overflow is silently dropped.
|
||
|
||
## Engine Lifecycle
|
||
|
||
- Engine initialization is lazy (first detection request, not startup).
|
||
- Status transitions: NONE → DOWNLOADING → (CONVERTING → UPLOADING →) ENABLED | WARNING | ERROR.
|
||
- GPU check: NVIDIA GPU with compute capability ≥ 6.1.
|
||
- TensorRT conversion uses FP16 precision when GPU supports fast FP16.
|
||
- Background conversion does not block API responsiveness.
|
||
|
||
## Logging
|
||
|
||
- Log files: `Logs/log_inference_YYYYMMDD.txt`.
|
||
- Rotation: daily.
|
||
- Retention: 30 days.
|
||
- Console: INFO/DEBUG/SUCCESS to stdout, WARNING+ to stderr.
|
||
|
||
## Object Classes
|
||
|
||
- 19 base detection classes defined in `classes.json`.
|
||
- 3 weather modes (Norm, Wint, Night) — total up to 57 class variants.
|
||
- Each class has: Id, Name, Color, MaxSizeM (max physical size in meters).
|