惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

GbyAI
GbyAI
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
IT之家
IT之家
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
N
News | PayPal Newsroom
Cloudbric
Cloudbric
Webroot Blog
Webroot Blog
www.infosecurity-magazine.com
www.infosecurity-magazine.com
Simon Willison's Weblog
Simon Willison's Weblog
Spread Privacy
Spread Privacy
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
V
Vulnerabilities – Threatpost
Attack and Defense Labs
Attack and Defense Labs
C
Cyber Attacks, Cyber Crime and Cyber Security
Cisco Talos Blog
Cisco Talos Blog
C
Cybersecurity and Infrastructure Security Agency CISA
H
Hackread – Cybersecurity News, Data Breaches, AI and More
P
Proofpoint News Feed
阮一峰的网络日志
阮一峰的网络日志
S
Secure Thoughts
T
Tor Project blog
Latest news
Latest news
aimingoo的专栏
aimingoo的专栏
V2EX - 技术
V2EX - 技术
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
S
Securelist
T
Tenable Blog
N
Netflix TechBlog - Medium
Google Online Security Blog
Google Online Security Blog
博客园 - Franky
T
Troy Hunt's Blog
量子位
大猫的无限游戏
大猫的无限游戏
T
Threat Research - Cisco Blogs
T
The Exploit Database - CXSecurity.com
MongoDB | Blog
MongoDB | Blog
H
Heimdal Security Blog
D
Docker
W
WeLiveSecurity
Stack Overflow Blog
Stack Overflow Blog
G
Google Developers Blog
博客园 - 叶小钗
腾讯CDC
The Hacker News
The Hacker News
WordPress大学
WordPress大学
人人都是产品经理
人人都是产品经理
Project Zero
Project Zero
Martin Fowler
Martin Fowler

Все публикации подряд на Хабре

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет Midjourney в 2026? Мой немного грустный разбор этого шикарного инструмента Никто не любит писать тесты, но ИИ может исправить это IPv8 выглядит как мечта. Поэтому почти наверняка не взлетит Производители вернули в продажу материнки с DDR3. Что происходит? Управление агентом с телефона через Telegram теперь в KodaCode От координации к лидерству: как меняется роль руководителя разработки Я сделала родителям бизнес вместо пенсии: зарабатываем 70 тысяч, мама не даёт продать В три раза быстрее приемка товара и оптимизация трудозатрат на 73%: как «РСТ-Инвент» помог Gulliver Group ИИ-шечный мир победил? О влиянии искусственного интеллекта на игропром Кремль снижает давление на Телеграмм пока Европа строит интернет по паспорту Как CEO, CTO и CIO за 8 часов собрали ИИ-директора, который умеет держать позицию под давлением Как (не) потерять домен за выходные Вместо 8 разных VPS: как я организовал практику студентам на одном сервере Почему твой Open Source проект не замечают? R&D: искусство управления неопределенностью в разработке AI-дефляция: вакансий для разработчиков больше, а рост зарплат — худший за 15 лет Мы отдали управление роботами OpenClaw. Что из этого вышло Галактический ID: система идентификации для всех форм разумной жизни Шесть основ бизнес-анализа: начинаем с вопроса «Кто в игре?» Код-ревью, в котором дело не в коде Данные переехали. Команда — нет Системной подход к сдаче OSWE в 2025 Почему комната управления реактором покрашена в цвет морской пены 4 YAML-файла вместо PySpark: как аналитикам строить пайплайны без разработчиков LLM-агент для поиска свободных доменов: автоматизируем подбор Когда, зачем и как правильно начинать новую сессию в Claude Code? Как я заставил нейросеть писать макросы для FreeCAD Анатомия ИИ‑агента для подбора персонала. От тысячи резюме к топ‑10 за минуты Опыт разработчика как экономика внимания Автономность как точка невозврата: кто будет субъектом в цифровом будущем Обучение ИИ в «диких» условиях: как рутинные действия превращаются в датасеты Как измерить LLM для задач кибербеза: обзор открытых бенчмарков Где хранить код? Сравнение GitHub, GitLab и Bitbucket Математика объясняет, почему нормальное распределение встречается повсюду Почему ваш FinOps не работает: 12 тезисов от практиков Как подписать проектную документацию УКЭП с использованием бесплатных лицензий Pilot Адаптивное администрирование Sigla Vision Я грузил уран в бочки, а потом 20 лет строил ИТ в атомной отрасли Чем позвонить с Эвереста? История и обзор спутниковой связи. Часть 2 Как языковая модель помогает контролировать качество инструктажей по охране труда в металлургии Как не передать на desktop свой IP в РКН Анатомия SAP Privileges: как устроено управление правами в macOS MoneyDev: Сказка про три главных слова Обновлённый токенизатор видео K-VAE 2.0 от Сбера Как сделать диспетчеризацию дома на 1284 квартиры почти бесплатно Как мы разогнали железную дорогу Мы дали агентам рутину. Теперь надо решить — что делать с освободившимся временем Токсичный контент, промпт-хакинг и защита ИИ — всё о Guardrails для LLM Умный город начинается с точного взгляда: как «Фалькон Тех» меняет пространство к лучшему Навайбкодил приложение для анализа графов Почему Дюну так интересно читать? Упрощаем работу с рутиной или как стать Гендальфом Белым Деконструкция Go: CPU, RAM и что там происходит. Go Assembler база. Часть 1.1 Какие профессии исчезнут из-за ИИ, а какие появятся? И что с этим делать Как мы построили IT-отдел, где хочется расти: архитектурные встречи, прозрачные метрики и книжные подарки Rufler: Делаем из Claude Code автономный рой через один YAML-конфиг Sing-box и белый список приложений Как построить надёжный обмен сообщениями в микросервисах: лучшие практики для enterprise OpenAI строит MLM-пирамиду, а McKinsey и Accenture помогают ей в этом Дом, который не построил Фишер (Часть 2) «Сверхзвуковой математик» против «Вдумчивого логиста»: битва алгоритмов 3D-упаковки Мультимодальные модели – грубый и дорогой инструмент Разговоры ничего не стоят. Код тоже Проверки физических лиц: с кого начнет ФНС Топ-10 бесплатных нейросетей для создания видео в 2026 году Первые слои кода: как наши решения сегодня определяют архитектуру ИИ на десятилетия Разработка нового статического анализатора: PVS-Studio JavaScript Поиск уязвимостей ПО: базовый минимум или роскошный максимум Почему оценка персонала не работает как инструмент управления Как мы разработали ИИ-ассистента и сократили рутину продуктовой команды на 50% Как я ушел из найма, нажарил косточек и продал на маркетплейсах на 168 млн в год Когда 1С:ERP уже внедрена, а нормального производственного плана всё ещё нет Как я сделал Claude мультимодальным, подключив к нему Qwen Omni Как приглашение на вакансию мечты превращается в атаку Infrastructure as Code: философия и лучшие практики IaC Тестируем Yandex Code Assistant на задаче, в которой нужно хранить секреты nxs-universal-chart v3.0: новое поколение универсального Helm-чарта Callback Injection: Техника, которая отправила Microsoft Defender в глухой нокаут «Все идеи на стол»: митап как способ вывести проект из тупика Сегодня я узнал нечто новое о GPU благодаря багу в своей игре Как заставить LLM ̶ ̶г̶а̶л̶л̶ю̶ ̶ эволюционировать Карта событий как фундамент аналитики: практический кейс для E-commerce Что выбрать для AI: x86, ARM или RISC-V? Дайджест железа за март Роль соматических мутаций в развитии аутоиммунных заболеваний: путь к избирательной терапии Mythos от Anthropic — тревожный сигнал для всех, а не только для банков Guardrails для LLM на Java: как приручить промпт‑инъекции и токсичные ответы Green-VLA: как мы собрали VLA-модель для реального антропоморфного робота и не потеряли обобщение Финансовая гонка вооружений: почему умные люди добровольно в ней участвуют Эра ИИ-агентов наступила: выбираем лучшего цифрового сотрудника # Практический опыт внедрения WinCC Redundancy на производственном предприятии Сделал MVP за 3 дня, а потом неделю прикручивал оплату. Оно того стоило? Физика против Маска: почему Starship V3 может оказаться ещё одной катастрофой Нефть Венесуэлы: крупнейшие запасы в мире, но не крупнейшая нефтяная держава JPA 4. Переосмысление Hibernate Почему зеркальная фотокамера Nikon D5 десятилетней давности идеально подошла для миссии «Артемида-2» Проект «Уровень-Спутник» или как мы сделали платформу для гидрологов «Замедлиться, чтобы ускориться»: почему ИИ повышает цену ошибок в требованиях и архитектуре Как с нуля поднять трафик IT-компании на 1657% при бюджете 55 тыс. и выжить Pixel-perfect Downsampling — идеальная отрисовка 50 миллионов точек без потерь
Извлечение параметров из 2D-чертежей: 6 YOLO-моделей, кастомный OCR и стрелочная логика
Нейрокиркоров · 2026-05-11 · via Все публикации подряд на Хабре

Средний

8 мин

10K

На машиностроительном производстве расчет стоимости детали начинается с чертежа. Входящий запрос выглядит так: PDF и строчка «нужно 50 штук». Чтобы назвать цену, технолог открывает чертеж и вручную снимает параметры: тип детали, габариты, квалитеты, шероховатости, резьбы, материал, массу. Один чертеж — от 5 до 15 минут. При потоке в несколько десятков запросов в день это основная нагрузка на технолога.

Кейс извлечения параметров из чертежей для расчета стоимости

Кейс извлечения параметров из чертежей для расчета стоимости

Система распознавания 2D чертежей

Система распознавания 2D чертежей

Мы разобрали, из чего эта нагрузка состоит. Технолог последовательно делает девять операций:

  1. Определяет тип детали — тело вращения (вал, втулка) или призматика (плита, корпус): от этого зависит, токарный нужен станок или фрезерный;

  2. Снимает габаритные размеры — они определяют заготовку и оборудование;

  3. Считает общее число размеров — влияет на трудоёмкость;

  4. Находит квалитет самого точного размера: IT6 — шлифовка, IT14 — черновое фрезерование, разница в цене может быть пятикратной;

  5. Определяет минимальную шероховатость: Ra 0.8 и Ra 12.5 требуют разных операций;

  6. Считает резьбы — каждая резьба это отдельный переход;

  7. Извлекает материал из штампа — сталь 45 и титан ВТ-6 обрабатываются по‑разному;

  8. Берёт массу детали;

  9. Фиксирует наличие и количество сечений — по ним судят о внутренней геометрии.

Все эти параметры нужны расчётной системе на входе. Задача была автоматизировать их извлечение из PDF‑чертежа.

Как устроен пайплайн

На вход система получает PDF с чертежом — это может быть экспорт из CAD или скан бумажного оригинала. Дальше: растеризация, детекция областей, размеров и символов, контуров, OCR, технический анализ — на выходе JSON. Схема выглядит линейно, но за каждым шагом своя механика.

Детекция — это шесть отдельных YOLO‑моделей, не одна. OCR кастомный, обученный на инженерных шрифтах по ГОСТ. Контуры извлекаются через разделение линий по толщине. Габариты определяются через стрелочную логику, а не прямым чтением чисел. Постобработка — несколько слоёв регулярных выражений.

Регулярки в итоге заняли примерно столько же кода, сколько вся детекция. Это не план — так получилось, когда начали разбирать реальные чертежи.

Проблема масштаба: чертеж А1 не влезает в YOLO

Чертеж А1 при растеризации в 288 DPI даёт картинку 5000×7000 пикселей. YOLO обучена на 640×640 пикселях. Простое уменьшение убивает мелкие размеры и символы. Нарезка на фрагменты — стандартный путь, но объекты на границах фрагментов детектируются плохо.

Вместо этого — детекция на нескольких масштабах параллельно. Чертеж прогоняется на DPI 10, 20, 50, 70. На DPI 10 весь А1 — это ~170×240 пикселей: штамп, который на полном разрешении занимает 3% площади, на этом масштабе детектируется стабильно. Координаты масштабируются обратно к оригиналу. Каждый следующий масштаб добавляет только то, чего не нашли на предыдущем — дедупликация через IoU.

Шесть моделей на один чертеж

Штрихпунктирная ось и индекс допуска высотой 10 пикселей — слишком разные объекты по масштабу и контексту, чтобы одна модель одинаково хорошо видела оба. Детекция разбита на шесть специализированных YOLO:

  • Области — проекции (виды детали) и штамп с метаданными; это первый шаг, без него непонятно, где искать все остальное

  • Размеры — числовые значения размеров, верхние и нижние индексы допусков

  • Метаданные — четыре поля штампа: название детали, код, материал, масса

  • Оси вращения — штрихпунктирные линии через центр тел вращения; порог уверенности намеренно низкий — 0.1, потому что штрихпунктир слабо контрастен на любом DPI

  • Шероховатости — символы Ra; отдельная модель, потому что символ Ra визуально не похож ни на размер, ни на текст штампа

  • Сечения — различает одиночную букву на линии разреза (А) и заголовок сечения (А‑А); нужно для определения главного вида

  • Стрелки — размерные линии; по ним определяются габаритные размеры через стрелочную логику

Толстая линия против тонкой

Задача: внутри проекции выделить контур детали и отсечь размерные линии, выносные линии и текст. Без этого непонятно, какая стрелка идёт снаружи детали, а какая проходит через неё.

По ГОСТ контур детали — толстая линия (0.5–1.4 мм), размерные и выносные — тонкая (0.25–0.7 мм). Разница в толщине — единственный машиночитаемый признак, по которому их можно разделить:

  1. Бинаризация изображения.

  2. Distance transform — расстояние от каждого пикселя линии до ближайшего фона. В центре толстой линии оно больше.

  3. Скелетизация по Zhang‑Suen — все линии к толщине 1 пиксель.

  4. Значения distance transform на скелете дают полутолщину каждой линии.

  5. Порог Otsu по этим значениям разделяет два кластера толщин.

После отсечения тонких линий берётся наибольшая непрерывная область — это контур детали.

На 288 DPI толстая и тонкая линия отличаются на 1–2 пикселя — порог Otsu там нестабилен. Поэтому контуры извлекаются на 1200 DPI, где толстая линия — 5–7 пикселей, тонкая — 2–3. Каждая проекция обрабатывается отдельно в ThreadPoolExecutor, resize с GPU при наличии CUDA.

Стрелки: как найти габаритный размер

Габаритная стрелка на чертеже всегда идёт снаружи контура детали. Стрелки внутренних размеров — через него. Это и есть способ их различить.

Для цилиндрической детали: находим ось на главном виде, ищем стрелку параллельную оси, которая не пересекается с контуром и по длине близка к нему. Найденная стрелка сопоставляется с ближайшим числовым значением размера.

Для прямоугольной: горизонтальная и вертикальная стрелки с длиной, совпадающей с шириной и высотой контура. Третий габарит — с соседней проекции.

Если подходящая стрелка не найдена, запускается цепочка запасных сценариев: поиск на связанном сечении → максимальный размер параллельный оси → максимальный на главном виде → максимальный на любой проекции. Каждый следующий шаг менее точен. Без этой цепочки часть чертежей выпадала из обработки целиком.

OCR: семь попыток на каждый текст

Взяли PaddleOCR с кастомной моделью на инженерных шрифтах по ГОСТ.

Стандартная модель не справлялась: текст на чертеже стоит под 0°, 90°, 270° и промежуточными углами, индексы допусков — 10–15 пикселей высотой, символы ∅, ±, °, Ra, линии проходят вплотную к тексту или через него. Каждый блок прогоняется под семью углами: −90°, −45°, 0°, 45°, 90°, 180°, 270°.

Совпадающие результаты получают бонус, угол 0° — небольшой дополнительный: горизонтальный текст встречается чаще всего.

Индексы допусков и значения Ra перед распознаванием масштабируются до 64 пикселей по высоте. На исходном размере OCR на них ошибается.

Отдельная проблема: индекс допуска стоит вплотную к размеру. OCR читает «∅50+0.025−0.016» как одну строку вместо «∅50». Перед распознаванием основного размера индексы закрашиваются цветом фона.

Сечения: А и А‑А — не одно и то же

На чертеже сечение обозначается парой: одиночные буквы (А...А) на линии разреза главного вида и заголовок А‑А над проекцией‑сечением. Модель различает два класса — одиночная буква и двойная. Заголовок А‑А должен находиться в верхних 7% проекции или непосредственно над ней — по этому условию они связываются.

Зачем это нужно: сечения исключаются при определении главного вида. Главный вид — проекция с максимальным числом размеров среди не‑сечений. При равном количестве — приоритет у проекции выше и левее: по ГОСТ главный вид в верхнем левом углу.

OCR на буквах сечений стабильно путает кириллицу с латиницей: А/A, В/B, С/C. Добавили таблицу нормализации — не совсем красиво, но это был оптимальный вариант из возможных на тот момент.

Извлечение метаданных из таблицы

Штамп содержит четыре поля: название детали, код, материал, масса. YOLO находит боксы этих полей, PaddleOCR распознаёт все текстовые блоки в области штампа. Дальше нужно связать одно с другим — через IoU между боксом поля и текстовыми блоками.

Порог IoU намеренно низкий: текст может частично выходить за границы бокса, особенно если название разбито на две строки.

Поле материала разваливается чаще остальных — длинный текст, часто многострочный, с номером ГОСТ. Для него три запасных сценария, последний — поиск по слову «ГОСТ» среди всех текстов штампа. Плюс нормализация типовых OCR‑ошибок: «ГСТАЛЬ» → «СТАЛЬ», «ГСПЛАВ» → «СПЛАВ».

Технический анализ

Все, что нашли детекторы и OCR, собирается в структурированный результат.

Тип детали определяется в три шага. Сначала ищем ключевые слова в названии и материале: «труба», «вал», «втулка», «фланец» — цилиндрическое. Если ключевых слов нет — проверяем, есть ли ось вращения на главном виде, пересекающая его пополам. Нет оси — прямоугольное по умолчанию. Три уровня, каждый страхует предыдущий.

Подсчет размеров нетривиальный.

Текст «4 отв. M6×1» — это четыре отверстия, а не одно. Множители из таких записей разбираются регулярками, остальное считается как есть. При этом Ra, маркеры резьб и аннотации в счёт не идут — иначе цифра раздувается. Два перекрывающихся бокса с IoU больше 50% объединяются в один: размер, попавший в два бокса, должен считаться один раз.

Шероховатость — место, где ошибка OCR напрямую меняет стоимость детали. «Ra 1.6» и «Ra 16» — это разные операции и разная цена. Все значения проверяются по стандартному ряду ГОСТ: 0.1, 0.2, 0.4, 0.8, 1.6, 3.2, 6.3, 12.5, 25, 50, 100. Типовые ошибки исправляются автоматически: 16 → 1.6, 32 → 3.2 — потерялась точка, 6.35 → 6.3 — лишний знак от OCR.

Шероховатости собираются из трёх мест одновременно: YOLO‑модель для символов Ra, текстовый поиск паттерна «Ra + число» в размерных блоках и отдельная детекция в правом верхнем углу листа — там по ГОСТ ставится общая шероховатость для всего чертежа. Результаты трёх источников объединяются с дедупликацией через IoU, чтобы одна шероховатость не попала в итоговый список дважды.

Что получилось по цифрам

Результат работы всего пайплайна — JSON с параметрами детали. Из одного чертежа система извлекает:

  • общее число размеров

  • шероховатости с количеством вхождений каждого значения

  • квалитет самого точного размера

  • количество резьб

  • все диаметры

  • название, код, материал, масса из штампа

  • тип детали: цилиндрическое, прямоугольное, труба, шестигранник

  • габаритные размеры: длина, ширина, высота

  • наличие оси вращения

  • количество и метки сечений

Этот JSON идет в калькулятор стоимости. Там он разворачивается в цену: материал по весу и марке, станко‑часы по квалитету и шероховатости, отдельные операции по резьбам и сечениям. Технолог получает цифру, не открывая чертеж.

Стек

  • YOLO (Ultralytics) — 6 моделей детекции для разных типов объектов

  • PaddleOCR — детекция текста + кастомная модель распознавания

  • OpenCV (с CUDA) — предобработка, контурный анализ, морфология

  • Python — пайплайн, постпроцессинг

Вместо заключения

Пайплайн, который мы описали, — результат сотен экспериментов на реальных чертежах.

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

Система работает в производственном потоке. Нестандартные штампы, кривые сканы, карандашные правки поверх печати — всё это до сих пор требует ручной проверки, и мы это не скрываем.

Если делали что‑то похожее или есть вопросы по реализации — пишите в комментариях.

Мы приняли участие в подкасте АЛРИИ с этим кейсом

Мы приняли участие в подкасте АЛРИИ с этим кейсом