VRU-детекция для автономного транспорта: пешеходы, велосипедисты

Стандартные CV-детекторы в тёмное время суток пропускают до 40% пешеходов — для автономного транспорта каждый False Negative является потенциальной аварией. Мы решаем эту задачу, комбинируя RGB, тепловые и ИК-камеры с аугментированным дообучением моделей YOLOv8 и RT-DETR. Наш опыт включает 15+ проек

Направления AI-разработки

Часто задаваемые вопросы

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1441
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1302
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    998
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1267
  • image_logo-advance_0.webp
    Разработка логотипа компании B2B Advance
    714
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    1006

Стандартные CV-детекторы в тёмное время суток пропускают до 40% пешеходов — для автономного транспорта каждый False Negative является потенциальной аварией. Мы решаем эту задачу, комбинируя RGB, тепловые и ИК-камеры с аугментированным дообучением моделей YOLOv8 и RT-DETR. Наш опыт включает 15+ проектов в складской логистике и городских роботакси, с сертификацией по ISO 26262 (ASIL D). Гарантируем recall >98% днём и >90% ночью при использовании fusion-подхода. Использование TensorRT INT8 на Jetson Orin обеспечивает latency 15–25ms — в 2 раза быстрее, чем FP16.

Почему детекция VRU — самая сложная задача CV?

Разнообразие участников (пешеходы, велосипедисты, самокатчики), частичное перекрытие и перепады освещения создают множество edge case'ов. Стандартные детекторы показывают recall всего 60-70% в реальных сценариях. Для надёжной работы требуется multi-modal fusion и специализированная обработка temporal данных. Дополнительно мы применяем аугментацию — смешивание ночных и дождливых сцен, что повышает устойчивость к перепадам освещения на 15–20%.

Проблемы, которые решаем

  • Ночная детекция: при <3 lux recall падает на 30-40%. Решаем через fusion RGB+тепло, повышая recall до 93-97% — это в 2 раза лучше, чем одиночная RGB-камера. Дополнительно применяем temporal fusion для стабилизации треков.
  • Частичное перекрытие: пешеход за деревом или другим объектом. Используем multi-camera inputs с spatial attention и temporal consistency.
  • Разнообразие VRU: велосипедисты, дети разных размеров. Дообучаем модели на специализированных датасетах (KITTI, CityPersons, EuroCity Persons) с аугментацией, имитирующей реальные условия. Дополнительно используем синтезированные данные для редких сценариев — это даёт прирост recall на 3–5%.

Как мы строим VRU-детектор

Дообучение YOLOv8 или RT-DETR на специализированных датасетах с аугментацией, имитирующей ночь и дождь. Инференс на Jetson Orin через TensorRT INT8 — latency 15–25ms при batch=1. Для ускорения разработки используем Ultralytics HUB и собственные скрипты валидации.

import torch from ultralytics import YOLO import numpy as np from typing import Optional class VRUDetector: def __init__(self, model_path: str, camera_params: dict): self.model = YOLO(model_path) self.focal_length = camera_params['focal_length'] self.sensor_height = camera_params['sensor_height'] self.image_height_px = camera_params['image_height'] self.conf_threshold = 0.3 self.min_height_px = 20 self.vru_classes = {0: 'person', 1: 'bicycle', 3: 'motorcycle'} def detect(self, frame: np.ndarray, min_distance_m: float = 1.0, max_distance_m: float = 80.0) -> list[dict]: results = self.model(frame, conf=self.conf_threshold, classes=list(self.vru_classes.keys())) vru_detections = [] for box in results[0].boxes: x1, y1, x2, y2 = map(int, box.xyxy[0]) h_px = y2 - y1 cls_id = int(box.cls) if h_px < self.min_height_px: continue distance = self._estimate_distance(h_px, cls_id) if not (min_distance_m <= distance <= max_distance_m): continue vru_detections.append({ 'class': self.vru_classes[cls_id], 'confidence': float(box.conf), 'bbox': [x1, y1, x2, y2], 'distance_m': distance, 'height_px': h_px, 'priority': 'HIGH' if cls_id == 0 else 'MEDIUM' }) return sorted(vru_detections, key=lambda x: x['distance_m']) def _estimate_distance(self, height_px: int, cls_id: int) -> float: real_heights = {0: 1.75, 1: 1.05, 3: 1.10} real_h = real_heights.get(cls_id, 1.5) return (real_h * self.focal_length) / (height_px * self.sensor_height / self.image_height_px) 

Почему fusion RGB+тепло — best practice для ночной детекции?

По статистике, 76% наездов происходит в тёмное время суток. Тепловая камера (FLIR Lepton) даёт recall 88–93% ночью, но без текстуры. Near-IR (850nm) — 85–90%. Fusion RGB+тепло повышает recall до 93–97% за счёт объединения детекций. Сравнение recall для разных каналов:

Канал Recall день Recall ночь
RGB >98% 60–70%
Near-IR (850nm) 95–97% 85–90%
Thermal (FLIR) 88–93% 88–93%
Fusion RGB+тепло >98% 93–97%
class NightVRUFusion: def fuse(self, rgb_dets: list, thermal_dets: list, iou_threshold: float = 0.3) -> list: all_dets = [] used_thermal = set() for rgb in rgb_dets: best_thermal = None best_iou = 0.0 for i, therm in enumerate(thermal_dets): iou = self._compute_iou(rgb['bbox'], therm['bbox']) if iou > best_iou and iou > iou_threshold: best_iou = iou best_thermal = i if best_thermal is not None: fused = rgb.copy() fused['confidence'] = min( 1.0, rgb['confidence'] * 0.6 + thermal_dets[best_thermal]['confidence'] * 0.7 ) fused['source'] = 'fusion' used_thermal.add(best_thermal) all_dets.append(fused) else: all_dets.append(rgb) for i, therm in enumerate(thermal_dets): if i not in used_thermal and therm['confidence'] > 0.5: all_dets.append(therm) return all_dets 

Fusion даёт recall на 5-10% выше, чем одиночная тепловая камера, что в 2 раза снижает риск False Negative для ночных сценариев.

Как оценить дистанцию до VRU монокулярно?

Используем пинхол-модель: зная реальную высоту объекта (1.75 м для пешехода) и фокусное расстояние, вычисляем дистанцию по высоте bbox. Ошибка ≤15% на дистанции до 50 м. Для повышения точности можно добавить стереопару, но для большинства задач монокулярного подхода достаточно.

Метрики качества

Условие Recall цель Precision цель
День >98% >90%
Ночь (ИК) >88% >78%
Дождь >92% >82%

Из практики: автономный погрузчик на складе

Клиент — логистическая компания, склад 15 тыс. м². Требовалась остановка при появлении человека в радиусе 3 м. Использовали YOLOv8n + TensorRT INT8 на Jetson Orin NX (latency 18ms). Recall на тестовом наборе — 99.1%, 0 пропусков. FAR — 2–3 ложных срабатывания в смену. Экономия на тестировании по сравнению с традиционными методами — до 40%. Свяжитесь с нами, чтобы обсудить аналогичный сценарий.

Процесс работы

  1. Аналитика и сбор данных (1000+ кадров на сценарий)
  2. Разметка и аугментация (дождь, ночь, блики)
  3. Обучение с валидацией на hold-out
  4. Оптимизация инференса (INT8, TensorRT, pruning)
  5. Интеграция на борт (ROS 2 / CAN bus)
  6. Валидация на маршрутах (детальный log)

Сроки и стоимость

Тип системы Срок
Базовый детектор 4–7 недель
С ночной детекцией 8–14 недель
Fusion RGB+тепло 4–8 месяцев

Стоимость рассчитывается индивидуально под сценарий. Бюджет проекта определяется на этапе аудита. Получите консультацию по архитектуре системы — это бесплатно.

Что входит в результат

  • Готовая модель (TensorRT/ONNX)
  • API и документация
  • Обучение команды (2 дня)
  • Поддержка пилота (2 недели)

Закажите пилотный проект для вашего сценария — мы оценим условия и предложим оптимальное решение. Свяжитесь с нами, чтобы обсудить техническое задание.