Танцы с 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
Без этого шага связывать с прайс-листом было бы невозможно — система просто не поняла бы, что искать.
Маппинг и расчёт
Когда у нас есть список «компонент — параметр — количество», пора переходить к экономике.
Мы сделали гибридный модуль:
Векторизуем описание (embedding номиналов, мощности, типа).
Делаем fuzzy-matching по базе закупок.
ML-классификатор ранжирует кандидатов.
Пример: «R1 10k ±5% 0.25W» сеть сопоставляет с конкретной строчкой в базе — «Резистор плёночный 10kΩ 0.25W ±5%, цена 0.03$».
Если совпадения нет, система показывает инженеру топ-3 варианта. В среднем 8 из 10 деталей подбираются автоматически. Оставшиеся 2 — уточняются вручную.
Что в итоге
Сегодня система выглядит так: вы загружаете чертеж, ждёте 30 секунд, и получаете на выходе Excel-спецификацию: что за детали, сколько штук и сколько это стоит по вашей закупочной базе.
Для инженера это минус один час рутинной работы на каждую схему. Для компании — меньше ошибок, больше прозрачности, быстрее запускаются проекты.
Планы на будущее
Мы уже готовим следующие шаги:
Поддержка 3D-моделей компонентов, чтобы работать не только со схемами, но и с полноценными проектами.
Автоматическая проверка схем на ошибки: замыкания, несоответствие стандартам.
Интеграция с ERP — чтобы спецификация сразу превращалась в заявку на закупку.
Немного философии
В начале проекта инженеры откровенно скептически улыбались: «Посмотрим, как ваш ИИ отличит резистор от таракана на скане».
Через пару месяцев те же люди радовались, что скучная рутина ушла в прошлое. Теперь они проектируют, а не считают одинаковые резисторы.
Мы же получили редкий опыт: когда ML-решение работает не ради красивой демки, а действительно облегчает жизнь в цеху.
Комментарии (4)
Kwentin3
26.09.2025 14:01Узнал про два новых, для себя, стека. Тут выше сомневались в целесообразность этого проекта, по мне - так молодцы, реализация-это в любом случае опыт, которые можно использовать в других кейсах.
Radon17
26.09.2025 14:01Автораспознавание бумажных схем звучит очень интересно. Это будет как-то релизнуто?
DarkTiger
Нескромный вопрос - а зачем? Какая была цель, если говорить про схему электрическую принципиальную Э3?
За последние 20 лет любой САПР генерит нормальный BOM (в 2010 или раньше можно было автоматом уже и линк компонента на Диджикей подвязать в Cadence). И даже в бумажном варианте старых разработок спецификация обязательно входит в комплект КД.
Если позаимствовать чужую разработку, заснятую камерой, разве что, но и в данном случае стоит сфокусироваться на переводе в формат САПР в первую очередь, а не на подсчете количества резисторов и выяснению их номинала.
Ну и в общем случае. Мне кажется, что 90-95% номиналов распознаются автоматом, а оставшиеся 5-10% лучше ручками добавить. Сразу про "10% - это иногда много": Э3 материнки на 200 страниц все равно пытаться распознавать смысла нет, вероятность ошибки будет недопустимо высока
werwolflg
Так у них, судя по всему, не просто принципиальные схемы, а технические схемы автоматизации, и часть которых сделана давно и осталась только на бумаге.