Розробка системи детекції об'єктів на відео в реальному часі
Детекція об'єктів на відео в реальному часі — завдання з жорсткими вимогами до latency. Поріг "реального часу": для систем відеоспостереження — 25+ FPS, для робототехніки — 30+ FPS з latency < 33ms. Продуктивність залежить від трьох факторів: архітектури моделі, апаратного прискорювача та ефективності inference pipeline.
Архітектура системи
Camera → Frame Capture → Preprocessing → Inference → Postprocessing → Output
↓ ↓
Frame Skipping TensorRT/ONNX Runtime
Resize/Normalize GPU batching
Для RTSP/IP-камер використовуємо GStreamer або FFmpeg для захоплення потоку з апаратним декодуванням (NVDEC на NVIDIA):
import cv2
# Hardware-accelerated RTSP capture
cap = cv2.VideoCapture(
'rtsp://camera_ip/stream?'
'pipeline='
'rtspsrc location=rtsp://camera_ip/stream !'
'rtph264depay ! h264parse ! nvh264dec !' # NVDEC
'videoconvert ! appsink',
cv2.CAP_GSTREAMER
)
Оптимізація моделі для real-time
TensorRT оптимізація дає 2–5x прискорення проти PyTorch:
from ultralytics import YOLO
model = YOLO('yolov8n.pt')
# Експорт у TensorRT FP16
model.export(
format='engine',
half=True, # FP16 precision
batch=1, # або batch=4 для batching
device=0,
workspace=4 # GB для оптимізації
)
YOLOv8n з TensorRT FP16 на T4: 280+ FPS при розрішенні 640×640.
Frame skipping — детектуємо не кожен кадр. При 30 FPS відео детекція на кожному 3-му кадрі (10 детекцій/сек) + трекинг для проміжних кадрів. Сприйнята якість зберігається.
Dynamic batching — групуємо кадри з кількох камер у батч для одного GPU-проходу:
class MultiCameraInference:
def __init__(self, model_path, num_cameras=8):
self.model = load_trt_model(model_path)
self.batch_size = num_cameras
def process_batch(self, frames: list[np.ndarray]) -> list[list]:
# Preprocessing batch
batch = preprocess_batch(frames) # [N, 3, H, W]
# Single GPU inference для всіх камер
results = self.model.infer(batch)
return postprocess_batch(results)
Багатокамерні системи
Для моніторингу з 8–32 камерами: один A100/H100 GPU обробляє до 32 потоків 1080p@30fps з YOLOv8n. Архітектура: спільний inference server (Triton) + окремі процеси захоплення для кожної камери.
Пропускна здатність:
- NVIDIA T4 (16GB): 8–12 камер 1080p з YOLOv8m
- NVIDIA A100: 24–32 камери 1080p з YOLOv8l
Оптимізація latency
Pipeline latency = capture + decode + preprocess + inference + postprocess + display
| Етап | Типовий час | Оптимізований |
|---|---|---|
| Захист кадра | 5 ms | 2 ms (NVDEC) |
| Препроцесінг | 8 ms | 1 ms (GPU preproc) |
| YOLOv8n інференс | 12 ms | 4 ms (TRT FP16) |
| Постпроцесінг + NMS | 5 ms | 2 ms |
| Всього | 30 ms | 9 ms |
Розгортання та моніторинг
Docker-контейнер з CUDA 12.x + TensorRT. Метрики: FPS per camera, inference latency, GPU utilization, detection count per class per minute. Alerting через Prometheus + Grafana.
| Масштаб системи | Хронологія |
|---|---|
| 1–4 камери, базова детекція | 2–3 тижні |
| 8–32 камери, користувацькі класи | 4–7 тижнів |
| 50+ камер, розподілена архітектура | 8–14 тижнів |







