Танцы с YOLO, OCR и пятнами от кофе

Когда думаешь о «цифровой трансформации» в промышленности, в голове обычно всплывают роботы, датчики, большие экраны и дроны, которые сами разносят детали по цеху. В реальности всё часто упирается в куда более прозаичные вещи.

Например — технические схемы. Представьте: целые шкафы с папками, где вперемешку свежие CAD-чертежи и сканы пожелтевших листов А3 с подписями от руки: «Смотри сюда», «замени резистор». Чтобы собрать спецификацию и посчитать стоимость, инженеру приходилось садиться с карандашом и Excel — и часами переписывать резисторы, транзисторы, конденсаторы, их номиналы и количество. Ошибся в одной букве или не заметил мелкий элемент — и вся цепочка снабжения поехала.

В какой-то момент мы, как разработчики, задали себе вопрос: «А почему в 2025 году до сих пор человек должен глазами считать резисторы на сканах, если есть компьютерное зрение и OCR?» Так и стартовал проект: сделать систему, которая за полминуты превратит «кривой скан схемы из прошлого века» в таблицу компонентов с готовой сметой.

Как мы подошли к задаче

Мы решили собрать полноценный ML-пайплайн: сначала детектим элементы на схеме, потом распознаём их подписи, далее нормализуем параметры и связываем всё с прайс-листом поставщика.

То есть по сути у нас должно было получиться:
[скан] → [YOLO детектит компоненты] → [OCR вытаскивает текст] → [маппинг текста к компонентам] → [смета с ценой].

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

Подводные камни

Проект быстро отрезвил наши радужные ожидания.

Во-первых, мелкие элементы. YOLO не любит микроскопические «палки» среди сотен линий. Пришлось искусственно увеличивать их долю в обучающей выборке.

Во-вторых, фотографии. В архивах попадались такие ракурсы, что схема выглядела как абстрактная живопись. Здесь спасли алгоритмы deskew и perspective transform — научили систему выпрямлять кривые сканы.

И наконец, человеческий фактор. Один из инженеров зачем-то подписал рядом с резистором «Привет, Петя». OCR честно распознал, классификатор запутался, и мы долго смеялись. В итоге добавили правило: если в строке нет чисел или единиц измерения — это комментарий, а не спецификация.

Ниже  рассказываем подробнее. 

Детекция компонентов: YOLO против чернильных пятен

Для распознавания графических элементов мы взяли YOLOv8. Ставка была на её скорость (на RTX 3090 мы получали ~35 FPS даже на больших схемах) и умение видеть маленькие объекты.

Датасет.
Мы собрали около 15 тысяч фрагментов схем. Разметку делали вручную — прямоугольники вокруг резисторов, диодов, транзисторов. Самая больная часть — старые чертежи. На одном листе мы всерьёз спорили: «Это проводка или это след от кружки?». В итоге размечали даже «анти-примеры» — кружки и пятна шли в отдельный класс «мусор», чтобы модель перестала путаться.

Аугментации.
Чтобы сеть меньше пугалась реальных сканов:

  • крутили схемы под разными углами,

  • добавляли Gaussian noise и blur,

  • инвертировали цвета (многие фото были сняты на телефон с черным фоном).

Метрики.
На первых итерациях mAP@0.5 был ~0.82. На бумаге неплохо, но recall на реальных схемах падал — мелкие элементы терялись. Мы применили oversampling на редкие классы (например, крошечные конденсаторы) и докрутили гиперпараметры (augment=0.6, mosaic=0.5). Итог — mAP@0.5 ~0.91, recall ~0.88.

Проблема масштаба: как подать большие схемы в YOLO.

YOLO «любит» картинки до 640–1280 px. Схема А1 или А0 туда не влезет, и просто уменьшить — значит потерять мелкие элементы. Решение → резка на тайлы: схему бьем на тайлы фиксированных размеров, делаем overlap (обычно 10–20%), чтобы объект на границе точно попал хотя бы в один тайл полностью.

Объекты на стыках.

Типичный баг: резистор попал на разрез → YOLO видит только половинку и теряет его. Мы дублируем разметку: если объект оказался на границе тайла, его метка копируется в оба тайла (но с урезанной частью). На инференсе, когда собираем предсказания обратно в «большую схему», используем NMS на глобальном уровне (по всей схеме). Дубликаты схлопываются. Если объект полностью распилило и он оказался меньше min_size — мы его удаляли из разметки на этом тайле (иначе сеть учится на «половинках»).

Баланс классов.

Редкие элементы (например, конденсаторы 1 мм) почти всегда «теряются». Использовали oversampling редких классов при тренировке. Иногда помогал copy-paste augmentation — вырезаем редкий компонент и вставляем в разные места схемы, но аккуратно (чтобы не получилось «нереалистично»).

OCR: расшифровка инженерных каракулей

Дальше нужно было «прочитать», что написано рядом с компонентами. Тут оказалось, что OCR — это отдельный ад.

Мы прогнали три движка:

  • Tesseract — быстро, но путал «О» и «0»;

  • EasyOCR — хорошо с латиницей, но хуже с кириллицей;

  • PaddleOCR — неожиданно отлично справился с инженерными шрифтами и не терял точек и запятых.

Выбрали PaddleOCR.

Ассоциатор текста и объектов.
OCR возвращает просто куски строк. Чтобы привязать «10k» к конкретному резистору R1, мы строили граф: каждая bbox-рамка текста и каждый найденный элемент — вершины. Связывали их по правилу «ближайший сосед + приоритет справа/сверху». Если рядом несколько подписей — выбирали ту, что содержит числовое значение или стандартные единицы (Ом, В, µF).

Нормализация параметров

Инженеры любят креативить в обозначениях. На схемах мы встречали «10k», «10к», «R=10k», «10kOhm», «10K0». Для компьютера это пять разных строк, для инженера — одно и то же.

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

  • 10k → 10000 Ω

  • 0.1uF → 1e-7 F

  • 47мкФ 16В → 47e-6 F, 16 V

Без этого шага связывать с прайс-листом было бы невозможно — система просто не поняла бы, что искать.

Маппинг и расчёт

Когда у нас есть список «компонент — параметр — количество», пора переходить к экономике.

Мы сделали гибридный модуль:

  1. Векторизуем описание (embedding номиналов, мощности, типа).

  2. Делаем fuzzy-matching по базе закупок.

  3. ML-классификатор ранжирует кандидатов.

Пример: «R1 10k ±5% 0.25W» сеть сопоставляет с конкретной строчкой в базе — «Резистор плёночный 10kΩ 0.25W ±5%, цена 0.03$».

Если совпадения нет, система показывает инженеру топ-3 варианта. В среднем 8 из 10 деталей подбираются автоматически. Оставшиеся 2 — уточняются вручную.

Что в итоге

Сегодня система выглядит так: вы загружаете чертеж, ждёте 30 секунд, и получаете на выходе Excel-спецификацию: что за детали, сколько штук и сколько это стоит по вашей закупочной базе.

Для инженера это минус один час рутинной работы на каждую схему. Для компании — меньше ошибок, больше прозрачности, быстрее запускаются проекты.

Планы на будущее

Мы уже готовим следующие шаги:

  • Поддержка 3D-моделей компонентов, чтобы работать не только со схемами, но и с полноценными проектами.

  • Автоматическая проверка схем на ошибки: замыкания, несоответствие стандартам.

  • Интеграция с ERP — чтобы спецификация сразу превращалась в заявку на закупку.

Немного философии

В начале проекта инженеры откровенно скептически улыбались: «Посмотрим, как ваш ИИ отличит резистор от таракана на скане».

Через пару месяцев те же люди радовались, что скучная рутина ушла в прошлое. Теперь они проектируют, а не считают одинаковые резисторы.

Мы же получили редкий опыт: когда ML-решение работает не ради красивой демки, а действительно облегчает жизнь в цеху.

Комментарии (4)


  1. DarkTiger
    26.09.2025 14:01

    Чтобы собрать спецификацию и посчитать стоимость, инженеру приходилось садиться с карандашом и Excel — и часами переписывать резисторы, транзисторы, конденсаторы, их номиналы и количество.

    Нескромный вопрос - а зачем? Какая была цель, если говорить про схему электрическую принципиальную Э3?
    За последние 20 лет любой САПР генерит нормальный BOM (в 2010 или раньше можно было автоматом уже и линк компонента на Диджикей подвязать в Cadence). И даже в бумажном варианте старых разработок спецификация обязательно входит в комплект КД.
    Если позаимствовать чужую разработку, заснятую камерой, разве что, но и в данном случае стоит сфокусироваться на переводе в формат САПР в первую очередь, а не на подсчете количества резисторов и выяснению их номинала.
    Ну и в общем случае. Мне кажется, что 90-95% номиналов распознаются автоматом, а оставшиеся 5-10% лучше ручками добавить. Сразу про "10% - это иногда много": Э3 материнки на 200 страниц все равно пытаться распознавать смысла нет, вероятность ошибки будет недопустимо высока


    1. werwolflg
      26.09.2025 14:01

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


  1. Kwentin3
    26.09.2025 14:01

    Узнал про два новых, для себя, стека. Тут выше сомневались в целесообразность этого проекта, по мне - так молодцы, реализация-это в любом случае опыт, которые можно использовать в других кейсах.


  1. Radon17
    26.09.2025 14:01

    Автораспознавание бумажных схем звучит очень интересно. Это будет как-то релизнуто?