Rychagov S.
👤 People Detection · YOLOv26 · Tracking

Детекция людей, трекинг и аналитика зон: техническое описание

Практический разбор системы people detection на Python + YOLOv26: от inference на видеопотоке до подсчёта входов/выходов, времени нахождения в зоне и realtime-алертинга.

TL;DR

Задача — детекция людей в видеопотоке, назначение уникальных ID (трекинг) и аналитика поведения: пересечение линий, время в зоне, подсчёт.

YOLOv26 для детекции + ByteTrack/BoT-SORT для трекинга. ONNX/TensorRT для realtime inference на GPU.

Line Crossing — детекция пересечения виртуальной линии с определением направления (вход/выход).

Zone Dwell Time — точный подсчёт времени нахождения каждого человека в зоне (полезно для retail: время на кассе, в очереди, у полки).

Система логирует все события в CSV/БД и отправляет realtime-алерты через webhook/Telegram при нарушениях.

Постановка задачи

Система должна в реальном времени обрабатывать видеопоток с IP-камер, детектировать людей, назначать им уникальные ID и формировать структурированную аналитику: кто вошёл, кто вышел, сколько времени провёл в зоне, были ли нарушения периметра.

Детекция

YOLOv26 (Ultralytics) — state-of-the-art детектор. Варианты: nano/small для edge, medium/large для серверов.

Трекинг

ByteTrack или BoT-SORT — назначение уникального ID каждому человеку и отслеживание между кадрами.

Аналитика зон

Line crossing (вход/выход), dwell time (время в зоне), crowd density (подсчёт людей в области).

Алертинг

Realtime-уведомления при intrusion, loitering, превышении порога людей в зоне.

Ключевой сценарий: retail-магазин: подсчёт входящих/выходящих, время на кассе, аналитика очередей, тепловые карты плотности — всё автоматически из видеопотока.

Architecture Pipeline

Camera (RTSP)
    ↓
Frame Reader (OpenCV / ffmpeg)
    ↓
YOLOv26 Inference (ONNX / TensorRT)
    ↓
Tracking (ByteTrack / BoT-SORT)
    ↓
Zone Engine (line crossing + dwell time)
    ↓
Event Logger (CSV / DB / webhook / Telegram)
    ↓
Dashboard / API

Каждый этап пайплайна независим: модель можно заменить, трекер переключить, аналитику зон настроить через конфиг — без изменения кода.

YOLOv26: детекция людей

YOLOv26 (Ultralytics) — основа системы. Модель принимает кадр (RGB, 640×640) и возвращает набор bounding box с confidence score и классом (person = class 0 в COCO).

Выбор модели зависит от железа и требований к FPS:

Модель Параметры FPS (RTX 5090)
YOLOv26n (nano)~2.6M~200+ FPS
YOLOv26s (small)~9.4M~150+ FPS
YOLOv26m (medium)~20.1M~100+ FPS
YOLOv26l (large)~25.3M~80+ FPS

Inference: PyTorch для разработки и отладки. ONNX или TensorRT для production — ускорение до 2–5x на GPU. Для edge-устройств (NVIDIA Jetson) — TensorRT обязателен.

Фильтрация: confidence threshold (по умолчанию 0.5), NMS IoU threshold (0.45), фильтрация по классу (только person), минимальный размер bbox (убирает ложные срабатывания на дальних планах).

Трекинг: ByteTrack / BoT-SORT

Трекинг превращает набор разрозненных bbox в связную историю перемещения каждого человека. Без трекинга невозможно считать входы/выходы или время в зоне.

ByteTrack — ассоциирует bbox между кадрами по IoU (Intersection over Union) и визуальному сходству. Каждый человек получает track_id, который сохраняется пока он в кадре.

BoT-SORT — улучшенная альтернатива: учитывает движение камеры и лучше работает при частичных перекрытиях. Рекомендуется для плотных сцен.

Параметры трекинга:

1) track_buffer — сколько кадров хранить потерянный трек (default: 30). При значении 30 при 15 FPS — трек «держится» 2 секунды после пропадания.

2) match_thresh — порог IoU для ассоциации (default: 0.8). Выше = строже matching.

3) Новый ID назначается при появлении нового объекта. Старые треки удаляются по истечении track_buffer.

Line Crossing: детекция пересечения линии

Line Crossing — определение момента, когда центр bbox человека пересекает виртуальную линию. Это основа для подсчёта входов и выходов.

Как работает:

1) На изображении задаётся виртуальная линия двумя точками: (x1, y1) и (x2, y2). Линия может быть любой ориентации — горизонтальная, вертикальная, диагональная.

2) Для каждого трека на каждом кадре проверяется положение центра bbox относительно линии. Используется cross product векторного произведения: если знак меняется между двумя кадрами — было пересечение.

3) Направление определяется по знаку cross product: положительный = пересечение слева направо (вход), отрицательный = справа налево (выход). Направления настраиваются через конфиг.

4) Каждое пересечение логируется: track_id, направление (in/out), таймстемп, координата пересечения, confidence bbox.

def check_line_crossing(prev_pos, curr_pos, line_start, line_end):
    d1 = cross_product(prev_pos, line_start, line_end)
    d2 = cross_product(curr_pos, line_start, line_end)
    
    if d1 * d2 < 0:  # знак изменился → пересечение
        direction = 'in' if d2 > 0 else 'out'
        return True, direction
    return False, None

Поддерживается несколько независимых линий на одном кадре — для разных входов/выходов, ворот и проходов.

Zone Dwell Time: время нахождения в зоне

Zone Dwell Time — подсчёт суммарного времени, которое каждый человек провёл внутри заданной области. Ключевая метрика для retail (время на кассе, у полки, в очереди) и производства (время в опасной зоне).

Как считается:

1) Зона задаётся как полигон (массив точек) или прямоугольник на кадре. Одна камера может иметь несколько зон.

2) На каждом кадре проверяется: находится ли центр bbox трека внутри полигона (point-in-polygon test).

3) Если трек в зоне — добавляется delta_time (1/FPS секунд) к аккумулятору dwell_time для данного track_id в данной зоне.

4) При выходе из зоны или потере трека — событие «dwell complete» логируется с track_id, zone_id, total_dwell_time.

if point_in_polygon(center, zone_polygon):
    dwell_tracker[track_id][zone_id] += 1.0 / fps
else:
    if track_id in dwell_tracker:
        total = dwell_tracker[track_id].pop(zone_id)
        log_event('dwell_complete', track_id, zone_id, total)

Практические применения:

Retail: время на кассе — среднее dwell time у касс = среднее время обслуживания. Рост dwell time = нехватка кассиров.

Retail: аналитика очередей — dwell time в зоне очереди + количество людей в зоне = предсказание времени ожидания.

Производство: опасные зоны — превышение dwell_time порога = alert. Человек находится в опасной зоне дольше допустимого.

Склады: время погрузки — dwell time в зоне ворот = время загрузки/разгрузки машины. Аналитика эффективности.

Алертинг и логирование

Система генерирует структурированные события четырёх типов:

Тип события Триггер Данные
line_crossПересечение виртуальной линииtrack_id, direction, timestamp, line_id
dwell_completeВыход из зоныtrack_id, zone_id, dwell_time
dwell_alertПревышение порога dwell_timetrack_id, zone_id, current_time, threshold
intrusionПоявление в restricted zonetrack_id, zone_id, timestamp
crowd_alertПревышение порога людей в зонеzone_id, count, threshold, timestamp

Каналы доставки: CSV (по умолчанию) — для аналитики и отчётов. PostgreSQL / SQLite — для production. Webhook (HTTP POST) — для интеграции с ERP/helpdesk. Telegram Bot API — realtime-уведомления ответственному лицу. MQTT — для IoT/edge-интеграций.

Технологический стек

Компонент Технология
ДетекцияYOLOv26 (Ultralytics) + ONNX/TensorRT
ТрекингByteTrack / BoT-SORT
Обработка видеоOpenCV (Python), ffmpeg
ВидеопотокRTSP (Hikvision, Dahua, ONVIF)
ЛогированиеCSV, SQLite, PostgreSQL
АлертингWebhook, Telegram Bot API, MQTT
GPUNVIDIA CUDA, TensorRT

Типичные ошибки внедрения

1) Считать входы/выходы без трекинга — каждый новый bbox = новый «человек», счёт задваивается при перекрытиях.

2) Не настраивать confidence threshold под освещение — слишком много false positives ночью или false negatives при контровом свете.

3) Использовать одну линию для двунаправленного прохода без учёта направления — вход и выход складываются в одну цифру.

4) Не учитывать «пропадания» трека при перекрытиях — человек за колонной теряет ID и получает новый, dwell time сбрасывается.

5) Считать dwell time без привязки к FPS — при переменном FPS accumulator даёт неточное время.

6) Не фильтровать мелкие bbox на дальнем плане — детекция на заднем фоне создаёт шум в статистике.

FAQ

Какая модель YOLO лучше для детекции людей?

YOLOv26s — оптимальный баланс точности и скорости для большинства задач. Для edge (Jetson) — YOLOv26n. Для максимальной точности — YOLOv26l с TensorRT.

Сколько камер обрабатывает один GPU?

Зависит от модели. YOLOv26s + TensorRT на RTX 5090: до 16 потоков при 15 FPS. На Jetson Orin Nano: 2–4 потока при 10 FPS.

Как считается время на кассе?

Зона кассы задаётся полигоном. Когда трек человека входит в зону — начинается отсчёт. При выходе — логируется dwell_time. Среднее по всем посетителям = среднее время обслуживания.

Что происходит при перекрытии людей?

Трекер (BoT-SORT) удерживает ID в течение track_buffer кадров (default: 30). Если человек вышел из перекрытия за это время — ID сохраняется. Если нет — назначается новый.

Можно ли отличить сотрудников от посетителей?

По детекции YOLO — нет, все люди одного класса. Разделение делается на уровне бизнес-логики: по зоне появления, по времени суток, по PPE-маркерам или по дополнительной модели классификации.

Key Takeaways

1) YOLOv26 + ByteTrack = надёжная связка для people detection и трекинга в realtime.

2) Line Crossing через cross product — простой и точный метод подсчёта входов/выходов.

3) Zone Dwell Time — аккумулятор по FPS, привязанный к track_id и zone_id. Ключевая метрика для retail.

4) TensorRT обязателен для production: 2–5x ускорение inference без потери точности.

5) Правильная фильтрация (confidence, min bbox, track_buffer) критичнее, чем выбор модели.

Кому подходит

ML-инженерам, CV-разработчикам, командам видеонаблюдения, аналитикам retail, специалистам по безопасности и всем, кто строит системы подсчёта людей, аналитики очередей и мониторинга зон.

Связаться в Telegram