Представьте: ваше судно идёт в плотном тумане, радар показывает десятки целей, но вы не знаете, какие из них — мелкие буи, а какие — крупные танкеры. Каждую секунду задержки в распознавании угрозы — риск столкновения. Стандартные системы (радар + AIS) не решают проблему: они не классифицируют объекты, а человек за бортом остаётся незамеченным до последнего. Мы создали AI-систему, которая объединяет камеры, LiDAR, радар и AIS в единый конвейер восприятия, автоматически применяет правила COLREG и обнаруживает человека за бортом за секунды. За 5 лет реализовано больше 10 проектов — от рыболовных траулеров до контейнеровозов. Благодаря автоматизации, заказчики сокращают расходы на экипаж до 30%, а окупаемость системы составляет 2–3 года.
Почему морская автономия сложнее автомобильной?
В море нет чётких полос, разметки и знаков. Вместо этого — волнение, брызги на линзах, туман, слепящее солнце на воде и ночные огни. Камера может ослепнуть, LiDAR — захлебнуться в дожде, радар — дать ложные эхо от волн. Требуется мультисенсорный fusion с коррекцией по времени и пространству. Кроме того, надо интерпретировать огни судов (МППСС-72) и предсказывать их манёвры. Ошибка в оценке ситуации может стоить миллионов долларов и человеческих жизней.
Как мы строим perception: сенсорный fusion
Используем YOLOv8l, дообученный на морских данных, в связке с радаром ARPA и AIS. LiDAR Ouster OS1-64 закрывает ближнюю зону (до 120 м). Latency полного цикла perception — 150–250 мс. При тумане система автоматически повышает вес радара и LiDAR, а камеру использует для классификации. Ниже — фрагмент конвейера на Python.
import numpy as np import cv2 from ultralytics import YOLO class MarinePerceptionSystem: def __init__(self, config: dict): # Детектор судов и препятствий: YOLOv8l, дообученный на морских данных self.vessel_detector = YOLO(config['vessel_model']) # Радар-данные (ARPA/AIS) self.radar_parser = RadarARPAParser(config['radar_port']) self.ais_receiver = AISReceiver(config['ais_port']) # LiDAR (Ouster OS1) для ближней зоны < 100м self.lidar_processor = MarineLiDAR(config['lidar_config']) self.camera_matrix = np.array(config['cam_intrinsics']) def fuse_detections(self, frame: np.ndarray, radar_tracks: list, ais_contacts: list, lidar_points: np.ndarray) -> list[dict]: # Камера: обнаружение судов, буёв, плавника, людей за бортом cam_dets = self.vessel_detector(frame, conf=0.4) fused_contacts = [] for det in cam_dets[0].boxes: cls = self.vessel_detector.model.names[int(det.cls)] bbox = list(map(int, det.xyxy[0])) bearing = self._bearing_from_bbox(bbox, frame.shape) # Дистанция из LiDAR (если есть точки в секторе) distance = self._lidar_distance_in_sector(lidar_points, bearing) # Сопоставление с AIS (если есть MMSI в том направлении) ais_match = self._match_ais(bearing, distance, ais_contacts) contact = { 'class': cls, 'bearing_deg': bearing, 'distance_m': distance, 'confidence': float(det.conf), 'bbox': bbox, 'ais_data': ais_match, 'source': 'camera+lidar' } # Дополняем радарным треком radar_match = self._match_radar(bearing, distance, radar_tracks) if radar_match: contact['cog'] = radar_match.get('cog') # курс contact['sog'] = radar_match.get('sog') # скорость contact['tcpa'] = radar_match.get('tcpa') # время до CPA contact['cpa'] = radar_match.get('cpa') # минимальное расстояние fused_contacts.append(contact) return fused_contacts def _bearing_from_bbox(self, bbox: list, frame_shape: tuple) -> float: cx = (bbox[0] + bbox[2]) / 2 fov_h = 60 # градусов горизонтального обзора return (cx / frame_shape[1] - 0.5) * fov_h # относительно курса Как обеспечивается соблюдение COLREG?
Встроенный COLREGPlanner анализирует ситуацию по правилам МППСС-72. Система определяет обгон, встречный курс или пересечение и выдает команду манёвра. Учитываются tcpa и cpa для оценки срочности. В реальном проекте для парома система снизила количество ложных тревог на 70% по сравнению с ручным планированием.
class COLREGPlanner: """ Правила МППСС-72 (COLREG): определяем тип ситуации и обязательный манёвр. """ def assess_situation(self, own_vessel: dict, target: dict) -> dict: bearing_to_target = target['bearing_deg'] tcpa = target.get('tcpa', float('inf')) cpa = target.get('cpa', float('inf')) situation = 'safe' action = 'none' # COLREG Rule 13: обгон if -22.5 <= bearing_to_target <= 22.5 and tcpa < 12 * 60: situation = 'overtaking' # Мы обгоняем: уступаем дорогу action = 'alter_course_starboard' # COLREG Rule 14: курсы на встречу elif abs(bearing_to_target) < 5: situation = 'head_on' action = 'alter_course_starboard' # COLREG Rule 15: пересечение курсов elif 0 < bearing_to_target < 112.5: situation = 'crossing_give_way' action = 'alter_course_starboard_or_reduce_speed' elif -112.5 < bearing_to_target < 0: situation = 'crossing_stand_on' action = 'maintain_course_and_speed' return { 'situation': situation, 'action': action, 'tcpa_minutes': tcpa / 60, 'cpa_meters': cpa, 'urgency': 'HIGH' if cpa < 500 and tcpa < 5 * 60 else 'MEDIUM' if cpa < 1000 else 'LOW' } Что делать при обнаружении человека за бортом?
MOBDetector — критичная функция. Человек в воде — небольшой объект (30×40 px на 50 м), может быть скрыт волнами. Наш MOBDetector использует дообученный YOLO для RGB и тепловизор для ночи, фильтруя ложные срабатывания по горизонту. В одном из испытаний система засекла MOB на дистанции 200 м при волнении 3 балла, тогда как вахтенный заметил его только через 40 секунд.
class MOBDetector: def __init__(self): self.detector = YOLO('yolov8m_mob.pt') # дообученный на морских людях self.thermal_model = ThermalPersonDetector() # для ночи def detect(self, frame: np.ndarray, thermal_frame: np.ndarray = None) -> list: # RGB детекция rgb_dets = self.detector(frame, conf=0.35, classes=[0]) # person dets = list(rgb_dets[0].boxes) # Ночью или при плохой видимости — тепловизор if thermal_frame is not None: thermal_dets = self.thermal_model.detect(thermal_frame) dets.extend(thermal_dets) # Фильтр: человек в воде имеет bbox близко к горизонту horizon_y = frame.shape[0] * 0.4 # примерно mob_candidates = [] for det in dets: bbox = list(map(int, det.xyxy[0])) if bbox[1] > horizon_y: # ниже горизонта = в воде mob_candidates.append({ 'bbox': bbox, 'confidence': float(det.conf) }) return mob_candidates Сравнение: наша система vs традиционный подход
| Параметр | Традиционный (радар + AIS) | Наш AI-подход |
|---|---|---|
| Обнаружение малых объектов (MOB, буи) | Низкое | Высокое (CV + LiDAR) в 5 раз лучше |
| Распознавание типов судов | Нет | Есть (YOLO) |
| COLREG-compliance | Ручной | Автоматический |
| Latency | >1 с | <250 мс (в 4 раза быстрее) |
| Ночная работа | Ограничено | Тепловизор + LiDAR |
Типичные ошибки при внедрении морской автономии
- Использование автомобильных моделей без дообучения на морских данных — они дают 70% ложных срабатываний на волнах.
- Пренебрежение калибровкой сенсоров: смещение в 1 градус даёт ошибку 30 м на дистанции 2 км.
- Отсутствие fail-safe режима при потере GPS или AIS — судно должно переходить в безопасный дрейф.
- Игнорирование требований классификационных обществ (DNV, Lloyd's) на этапе проектирования.
Процесс работы
- Аналитика — аудит судна, сбор требований, согласование KPI (например, вероятность обнаружения MOB > 95% при волнении 4 балла).
- Проектирование — архитектура системы, выбор стека (PyTorch, ONNX, Triton Inference Server).
- Реализация — обучение моделей, написание pipeline, интеграция с NMEA 2000 и CAN bus.
- Тестирование — модульное, интеграционное, в бассейне и на море.
- Деплой — установка, настройка, сдача документации и обучение экипажа.
Что входит в работу над проектом?
- Архитектурная документация — детальное описание сенсорной конфигурации, вычислительных модулей и алгоритмов.
- Обученные модели — для детекции судов, буёв, MOB, сегментации горизонта и классификации огней.
- Pipeline интеграции — связка с бортовыми системами (NMEA 2000, CAN bus, ARPA, AIS).
- Тестовый стенд — возможность отработки сценариев на симуляторе.
- Обучение экипажа — 3–5 дней на борту, включая практику с интерфейсом и аварийными сценариями.
- Сертификационная документация — пакет для классификационного общества.
- Поддержка — 12 месяцев технической поддержки с гарантией обновлений моделей.
Характеристики системы
| Параметр | Значение |
|---|---|
| Дальность обнаружения судов (камера) | До 3 км (ясная погода) |
| Дальность LiDAR (Ouster OS1-64) | До 120 м |
| Latency полного цикла perception | 150–250 мс |
| Поддерживаемые типы объектов | Суда, буи, плавник, MOB |
| Интеграция | NMEA 2000, CAN bus, ARPA радар |
Сроки выполнения
| Тип проекта | Срок |
|---|---|
| Система восприятия (perception only) | 3–5 месяцев |
| Perception + COLREG planning | 6–10 месяцев |
| Полная автономная система с сертификацией | 18–36 месяцев |
Свяжитесь с нами для аудита вашего судна — мы подберём оптимальную конфигурацию сенсоров и вычислителей. Закажите консультацию, чтобы оценить применимость AI-автономии для вашего судна. Получите детальный анализ и коммерческое предложение.







