ScanToNeutral: от первого Revolve до нейтральной модели, ML‑разметки, двух CAD и экспериментального слоя NVIDIA Nemotron
Задача звучит обманчиво просто: взять старый бумажный чертёж, отсканировать его и получить параметрическую 3D‑модель. На практике между «увидеть линии» и «понять деталь» лежит всё то, что инженер‑конструктор обычно делает почти автоматически: отличает контур от размерной линии, основной вид — от разреза, реальную длину — от изображения с разрывом, а одну деталь — от нескольких исполнений на одном листе.
ScanToNeutral вырос именно из этой разницы. Сейчас это уже не один алгоритм, а конвейер, в котором компьютерное зрение, OCR, правила, ручная проверка и CAD‑адаптеры разделены на самостоятельные уровни. Ниже — не история «нейросеть всё решила», а инженерный разбор того, что сработало, что не сработало и почему архитектура проекта стала важнее конкретной модели ML.
Коротко о проекте на текущий момент
Параметр | Состояние на момент подготовки статьи |
Цель и фокус | Скан/PDF → Neutral Schema → параметрическая модель; сейчас — тела вращения |
CAD (Программа проектирования) | Autodesk Inventor и КОМПАС-3D через отдельные адаптеры |
Dataset (База данных) | 229 активных чертежей; в текущем аудите 29 проверено, 200 ожидают проверки |
Исполнения и разрывы | 2 групповых чертежа и 2 таблицы исполнений; 5 чертежей с разрывами, 6 областей |
Working View Detector, baseline (детектор рабочей области и базовых линий) | mAP@0.50 = 0,7834; Recall@0.50 = 0,85; mean best IoU = 0,694 |
NVIDIA Nemotron (рассматривается как дополнение в проект) | R&D‑контур, не production |


Три вывода, к которым проект пришёл довольно быстро 1) чертёж приходится понимать иерархически; 2) результаты распознавания лучше хранить в CAD‑независимой Neutral Schema; 3) ML (машинное обучение) полезен там, где правила хрупкие, а инженерные ограничения и финальная проверка должны оставаться детерминированными. |
1. Главная проблема: чертёж — это не картинка из линий
Для человека (инженера‑конструктора) технический чертёж — язык. Для алгоритма на входе это растр: чёрные штрихи, текст, пятна, шум сканера. Ошибка первых версий была в том, что хотелось слишком рано перейти от пикселей к геометрии.
На листе одинаково «линейно» выглядят принципиально разные сущности:
контур детали;
осевая линия;
размерная и выносная линии;
штриховка разреза;
граница местного вида;
линия разрыва;
рамка таблицы или основной надписи.
Даже если OCR идеально прочитал «Ø30d11» и «L», остаётся вопрос: к какому виду и к какому исполнению относятся эти данные. Поэтому в Dataset появился объект WorkingView: у каждого вида есть роль, тип, геометрия, ось или центр и признак участия в восстановлении 3D.
Именно на этом уровне удобно объяснять систему неспециалисту: прежде чем «рисовать 3D», программа должна понять, на какую часть листа вообще стоит смотреть.

2. С чего всё начиналось: один профиль, одна ось и Revolve
Первый MVP был намеренно узким. Я не пытался распознавать «любые машиностроительные чертежи», а взял класс деталей, где путь к 3D понятен: тела вращения. Для втулки или ступенчатого вала можно восстановить половину продольного профиля относительно оси и выполнить вращение на 360°.
чертёж → ось → ступени профиля → замкнутый эскиз → Revolve → 3D |
Начальный прототип управлял Autodesk Inventor через API. Геометрия профиля поначалу была почти жёстко задана — это был способ проверить не ML, а конечную часть маршрута. И здесь обнаружился первый неприятный факт: CAD API сам по себе требует строгой инженерной дисциплины. Неправильно замкнутый профиль, неверная ориентация эскиза или неоднозначная операция ломают модель независимо от качества распознавания.
Отсюда выросло важное разделение: распознавание не должно напрямую «тыкать кнопки» CAD. Сначала оно формирует описание того, что поняло, и только потом другой модуль пытается построить модель.
3. Архитектурный перелом: CAD перестал быть центром системы
Когда появился второй целевой CAD — КОМПАС-3D, прежняя схема «распознали размер → сразу вызвали Inventor API» перестала масштабироваться. Так возник Neutral Schema: промежуточное описание детали, не привязанное к конкретному API.
В нейтральный слой постепенно попадают ось, профиль, отверстия, фаски, роли видов, исполнения, признаки разрывов и другие сущности. После этого два независимых адаптера строят модель в своих CAD (В дальнейшем этих адаптеров появится больше).
Это не только архитектурная аккуратность. Два адаптера дают полезный тест. Если одна и та же Neutral Schema приводит к разной геометрии в Inventor и КОМПАС-3D, ошибка локализуется намного быстрее: либо нейтральное описание неоднозначно, либо один из адаптеров интерпретирует его неверно.
Ключевой урок Не привязывать «понимание чертежа» к API конкретной CAD. CAD должен быть исполнителем уже проверенного инженерного описания, а не местом, где одновременно принимаются решения о семантике. |
4. Датасет оказался отдельным инженерным продуктом
После первых десятков размеченных листов выяснилось, что база ценнее очередной версии программы. Обновление приложения не должно перетасовывать train/val/test, перезаписывать исправленные аннотации или удалять «неудобные» примеры.
Поэтому база сделана постоянной и append‑only:
исходные raw не изменяются;
импорт использует SHA-256 для дедупликации;
исправления уходят в новую ревизию, а прошлое сохраняется в history;
сплиты остаются постоянными при добавлении новых данных;
ошибочно импортированный лист можно исключить логически, но его DRW‑ID не переиспользуется.
Последний пункт кажется мелочью, пока не приходится сравнивать метрики двух моделей, обученных с разницей в неделю. Если состав тестовой выборки тихо изменился, сравнение становится почти бессмысленным.
5. Почему один детектор не работает: метрики, refiners и fail‑safe gates
Первой ML‑задачей стала не «реконструкция детали», а поиск рабочих видов. Это хороший пример того, как сложную задачу лучше разрезать на проверяемые этапы.

Цифры здесь важны не сами по себе. Recall@0.50 = 0,85 означает, что базовый детектор в тестовой выборке находит около 85% целевых видов при достаточно мягком критерии совпадения. Это уже полезно для предразметки, но ещё недостаточно для безусловной автоматической передачи в CAD.
Как менялся подход
Подход | Что выяснилось | Что осталось в системе |
Геометрические эвристики | Быстро работают, но ломаются на вариативных листах | Проверки и fallback‑логика |
Один bbox‑детектор | Вид находит, но края длинных деталей определяет неточно | Baseline + независимая оценка |
Универсальный BBox Refiner | Может улучшить validation и одновременно ухудшить test | Только через fail‑safe gate |
Специализированный axial refiner | Лучше соответствует длинным телам вращения | Отдельный экспериментальный профиль |
Полный автомат | Ошибки слишком дороги на CAD‑этапе | Confidence + очередь оператора |
Самый полезный результат этих экспериментов — не конкретная прибавка IoU, а привычка не доверять validation в одиночку. Несколько refiners выглядели лучше на validation, но хуже на независимом test. Поэтому эксперимент может получить статус rejected_on_test и не имеет права автоматически заменить baseline.
6. Два случая, которые ломают наивное распознавание: исполнения и разрывы
Групповой чертёж показывает, почему «один лист = одна деталь» неверно. На одном листе могут находиться базовое исполнение, таблица вариантов и несколько геометрических отличий. В Dataset пришлось добавить drawing_scope, execution_definition, execution_ids, область execution_table и связи между видами.
Разрыв ломает другую наивную гипотезу: «длина объекта на картинке пропорциональна длине детали». Волнистые или зигзагообразные линии означают, что середина длинной детали на листе опущена. Для будущей 3D‑реконструкции это не графический шум, а семантический признак.

Сейчас разрыв хранится как отдельный ViewFeature: wave_break или zigzag_break, привязка к конкретному WorkingView и флаг affects_3d. Это позволяет отличить реальный смысловой разрыв от локального графического элемента, который не должен менять модель.

На момент подготовки статьи база содержит 229 активных аннотированных чертежей. В текущем цикле проверки обработано 29. Найдено 2 групповых чертежа с 2 таблицами исполнений и 5 чертежей с разрывами; размечено 6 областей разрыва, из них 5 влияют на восстановление 3D. Валидатор при этом отдельно показывает один незаполненный execution_ids — то есть статус не просто считает прогресс, а указывает конкретную структурную проблему.

7. Экспериментальный слой: NVIDIA Nemotron как семантический диспетчер
Важно На данный момент Nemotron — архитектурный эксперимент, а не production‑контур ScanToNeutral. Он не участвует в построении CAD‑модели без промежуточной проверки. |
После CV/OCR остаются вопросы, которые плохо выражаются одним bbox: какой размер относится к какому исполнению, какой вид считать базовым, является ли отличие геометрии вариантом детали или локальным разрезом, какие признаки можно безопасно передать в Neutral Schema. Здесь большой мультимодальной модели потенциально есть работа — не «рисовать деталь», а связывать уже найденные факты.
Для эксперимента интересен NVIDIA Nemotron 3 Nano Omni 30B A3B: NVIDIA позиционирует его как открытую мультимодальную модель для текста, изображений, аудио и видео, в том числе задач document intelligence. Но в ScanToNeutral роль намеренно ограничена: модель формирует гипотезу, а не CAD‑команду.
Пример входа после специализированных детекторов:
{ |
Ожидаемый выход — тоже только структурированный:
{ |
Дальше начинается обычная инженерия: JSON проходит схему, проверку допустимых связей и геометрические ограничения. Если гипотеза противоречит данным или confidence недостаточен, она не попадает в Neutral Schema и возвращается оператору.
Отдельно рассматривается nemotron‑parse для таблиц и структуры документов. Здесь есть существенное ограничение: в текущем описании NVIDIA для модели заявлена поддержка английского языка. Поэтому для русскоязычных советских и российских чертежей её нельзя считать готовым OCR‑решением без отдельного теста; практичнее проверять её как вспомогательный layout/table parser и подавать уже распознанный русский текст другим способом.
8. Модуль работает, пользователь — нет: зачем ML‑проекту E2E‑тесты
Один из самых полезных багов проекта оказался почти комичным. После добавления Break Detection структура данных уже существовала, статус BDS был задуман, но команда BD не была зарегистрирована в основном меню. Внутренний модуль есть — пользователь получает Unknown menu choice: BD.

После этого тестировать только функцию стало явно недостаточно. Для новых возможностей теперь важен полный маршрут:
1. патч устанавливается поверх предыдущей версии;
2. команда видна в меню и CLI;
3. открывается правильная очередь;
4. разметка сохраняется;
5. повторный статус видит новые данные;
6. старый Dataset при этом не перезаписывается.
Для ML‑проекта это особенно важно: можно получить отличный detector.py, который фактически не добавляет ни одного полезного примера в Dataset.
9. Где проект находится сейчас: отдельно production, отдельно R&D
Работает сейчас | R&D / следующий этап |
• постоянный Dataset и ревизии аннотаций | • автоматический детектор разрывов после накопления примеров |
• WorkingView, оси и SheetRegions | • более глубокое восстановление профиля, отверстий, фасок, пазов и резьбы |
• baseline‑детектор рабочих видов | • производственная семантика: материал, шероховатость, допуски, технические требования |
• ручная проверка групповых чертежей и исполнений | • Nemotron как семантический слой и сравнение с чистым CV‑конвейером |
• разметка break_marker и affects_3d | • расширение от втулок/валов к более разнообразным телам вращения |
• Neutral Schema и генерация в Inventor/КОМПАС для поддержанных тел вращения |
|
Главная ближайшая задача — не добавить ещё одну модель «потому что можно», а закончить ревизию текущей базы. Для break detector четыре‑шесть положительных областей — это демонстрация схемы, а не датасет. Нужны десятки и затем сотни подтверждённых примеров, причём вместе с отрицательными.
10. Что я вынес из проекта
Если свести опыт к одной формуле, получается не «чем больше нейросеть, тем лучше», а:
Иерархия семантики + строгая валидация + удобная разметка Сначала понять структуру листа и роли видов, затем извлечь геометрию, после этого проверить инженерные ограничения — и только потом вызывать CAD. ML ускоряет неопределённые этапы, но не должен скрывать ошибку за красивым confidence. |
Ещё один вывод — интерфейс разметки является частью ML‑системы. Если оператору неудобно работать с A1/A0, долго переключать режимы или непонятно, что уже проверено, база перестаёт расти. Поэтому GD/GDS, BD/BDS, переход по DRW‑ID, zoom, работа с осями и отдельные аудит‑очереди важны не меньше, чем выбор backbone.
И наконец, отрицательный результат — тоже результат. Экспериментальный refiner, отвергнутый на test, чертёж без разрыва и hotfix после забытой команды — всё это остаётся в истории проекта. Так меньше шансов через месяц снова пройти тот же тупик.
Что дальше
Идеальный пользовательский сценарий по‑прежнему очень простой: загрузить PDF или фотографию чертежа, увидеть, что система поняла, подтвердить спорные места и выбрать CAD. Но под этой простой кнопкой должен находиться длинный проверяемый конвейер — от WorkingView до Neutral Schema и CAD‑валидатора.
В ближайших итерациях я хочу довести текущую разметку исполнений и разрывов, расширить поддерживаемую геометрию тел вращения и только после этого сравнить специализированный CV‑конвейер с вариантом, где Nemotron помогает связывать семантику. Критерий простой: не «насколько красиво модель объясняет ответ», а насколько меньше ошибок остаётся в Neutral Schema и сколько ручных исправлений экономит оператор.
Если вы занимались computervision для технической документации, CADAPI или пробовали мультимодальные модели на реальных чертежах — буду рад сравнению подходов в комментариях. Особенно интересен практический опыт локального запуска и квантизации Nemotron 3 NanoOmni, а также разбор таблиц и русскоязычных технических документов.

