Уявіть: ваше судно йде в густому тумані, радар показує десятки цілей, але ви не знаєте, які з них — дрібні буї, а які — великі танкери. Кожна секунда затримки в розпізнаванні загрози — ризик зіткнення. Стандартні системи (радар + 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-автономії для вашого судна. Отримайте детальний аналіз та комерційну пропозицію.







