Разработка системы детекции объектов на видео в реальном времени
Детекция на видео в реальном времени — задача с жёсткими требованиями к 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 for optimization
)
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. Архитектура: shared 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 недель |







