95% точности в лабораторном датасете — это мусор, когда речь идет про распознавание номеров контейнеров и вагонов на гейте терминала. Один перепутанный символ означает неверную стивидорную операцию. Контейнер уезжает не в тот штабель, фура встает, а терминал ловит демередж от 10 до 60 тысяч рублей в сутки за бокс. Мое мнение: если ваш ИИ просто читает буквы и верит им на слово, вы не автоматизировали въезд, а автоматизировали генерацию убытков.
«Ой, да ладно, это же обычный OCR. Номера машин давно читают на любой парковке, в чем проблема прочесть ящик?» — типичное возражение от интеграторов, которые никогда не стояли на въездной рампе в ноябре. Контейнер — не автономер. Автономер плоский, чистый, светоотражающий и висит в ожидаемом месте. Номер на сорокафутовом боксе может быть размазан ржавчиной, закрашен граффити, заклеен грязью, нанесен на гофру с искажением перспективы и продублирован на трех гранях по-разному. И это всё в дождь, ночью, под углом.
ISO 6346: почему ИИ нельзя пускать в прод без математики
Здесь мы сталкиваемся с реальностью, где хайп ломается о бизнес-логику. В Morana Labs наш подход категоричен: голая нейросеть не имеет права принимать решение на гейте. Контейнерный номер стандарта ISO 6346 — это 4 буквы кода владельца, 6 цифр серийного номера и одна контрольная цифра. Эта цифра считается по модулю 11 от суммы весов предыдущих символов.
Если распознавание ISO 6346 нейросеть выдает как HLXU 123456 7, мы не отправляем это сразу в базу. Мы прогоняем чек-сумму.
def validate_iso6346(container_number: str) -> bool:
if len(container_number) != 11:
return False
chars = container_number[:10]
check_digit = int(container_number[10])
total = 0
for i, char in enumerate(chars):
# Буквы конвертируются в числа (A=10, B=12... исключая кратные 11)
val = char_to_int(char) if char.isalpha() else int(char)
total += val * (2 ** i)
return (total % 11) % 10 == check_digitОшибка? Мы не выкидываем кадр и не зовем человека, а используем логику восстановления: перебираем вероятные ошибки детекции (буква O вместо цифры 0, B вместо 8) и ищем валидный хэш. Только так работает полноценная замена Navis OCR, а не студенческая поделка.
Edge vs Server: где гонять инференс, чтобы шлагбаум не тупил
«Западные TOS под санкциями, лицензий на Navis N4 нет, железо дорогое — как это вообще интегрировать?»
Западный софт ушел, и это отличный повод перестать платить за монолиты, которые требовали переписывания всей учётки. Замена строится прагматичнее. Нам не нужно менять вашу 1С, ERP или самописный софт. Мы берем RTSP-потоки с уже висящих на рамках камер.
Пайплайн суров и линеен: детекция зоны (найти ящик) → OCR (прочитать символы) → чек-сумма ISO 6346 → кросс-сверка. Последнее — критично. Если валидация прошла, мы лезем в гейт-лист или букинг на сегодня. Нет такой машины в ожидании? Режем ложное срабатывание.
Дальше физика. Оператор вбивает номер руками за 15-20 секунд (если не ошибся). Распознавание должно укладываться в миллисекунды, потому что фура не будет стоять и ждать, пока кластер в облаке переварит тяжелое видео. У нас есть жесткий бюджет на кадр и латентность шлагбаума. Где крутить веса?
Edge-вычисления на рампе: ставим промышленные железки прямо в шкаф у гейта. Плюсы: сеть терминала может лечь, а шлагбаум продолжит работать. Минусы: дорого масштабировать на 20 полос, тяжело охлаждать летом.
Локальный GPU-сервер: оптика от камер сводится в серверную. Один жирный сервер тянет инференс со всех линий. Никакого облака — данные не покидают периметр порта.
Мы чаще разворачиваем локальный сервер, если сеть позволяет гнать RTSP без потерь. Это банально дешевле в поддержке.
Экономика: когда окупается автоматизация въезда контейнеровоза
«Это всё игрушки ИТ-отдела, мне нужно резать косты».
Согласен. Давайте считать. Типовой сухой порт пропускает сотни машин в сутки. Ручной ввод — это время оператора. Но главная цена не в зарплате тальмана, а в цене ошибки. Внедряя OCR номеров вагонов, терминал срезает сразу три слоя убытков:
- Время простоя фуры из-за ручных разборок на гейте.
- Штрафы за неверную погрузку на фитинговую платформу.
- Демередж за потерянный в штабелях контейнер.
Замена ручного труда на инференс окупается за 4-8 месяцев. Целевая метрика успешного внедрения — это не абстрактная «точность распознавания», а конкретная доля автопроезда без участия оператора. Target-значение, под которым мы подписываемся — 80–95%. Оставшиеся 5-20% — это убитые в хлам, заржавевшие номера, не читаемые даже человеческим глазом. Они уходят на ручной разбор.
Пилот под ключ разворачивается за 4–6 недель. Вы даете RTSP или видеоархив с вашего гейта — мы прогоняем детекцию на ваших реальных данных со всем снегом и грязью, и выдаем расчет окупаемости.