- BrainTools - https://www.braintools.ru -
«Нормально», — ответила мне нейросеть, когда я просил помочь с YOLO, а она вместо этого нарисовала помятый телефон (контекст был перегружен).
Я улыбнулся. В тот момент я и сам чувствовал себя таким помятым. Станки простаивали уже четвёртый месяц. Зарплата в простое была символической. Пришлось искать дополнительные источники финансирования — в ход пошли даже старые запасы «железа».
Я тогда продал последний монитор — просто чтобы дожить до пятницы.
И в этих условиях я решил: не ждать заказов, а создавать ценность самому. Так родился мой модуль компьютерного зрения [1] для контроля брака.
Платой за минимизацию неизбежного брака было многочасовое неотрывное наблюдение за процессом. Это выматывало.
Я работал в режиме «два через два». К тому моменту, как у меня созрела идея автоматизировать контроль, я уже два месяца трудился в таком ритме.
Мне казалось, что в случае успеха я смогу предложить систему заказчику или реализовать «страховочный» план — внедрить решение совместно с производителем промышленного оборудования, с которым уже был налажен контакт.
Я поделился мыслью с коллегами — и получил подтверждение:
«Такая штука сильно облегчила бы работу и сократила брак».
Опыта [2] в компьютерном зрении у меня не было. Я начал с основ: «С чего начать? Что это вообще такое?»
Оказалось, нужно собрать много фотографий, разметить их и обучить нейросеть.
В запасе был месяц — и я взялся за дело.
Сначала купил цилиндрический эндоскоп за 300 рублей — не подошёл из-за сложностей с угловой ориентацией.
Потом взял с рук Logitech C270 за 1000 рублей. Обнаружил на снимках муар.
Вспомнил поговорку «Скупой платит дважды» — и пошёл за новой камерой. Она работает до сих пор.
Спроектировал кронштейн и напечатал его на 3D-принтере. Закрепил камеру так, чтобы зона контроля была строго по центру. Четыре предыдущих варианта кронштейна отправились в корзину, прежде чем я добился нужного угла.
Освещала съёмку конструкция из 40-ваттной светодиодной лампы и прозрачного листа поликарбоната с защитной белой плёнкой в качестве рассеивателя из запасов на базе.
Захватывает изображение с внешней камеры в разрешении 1280×720,
Обрезает центральный квадрат 720×720,
Масштабирует до 320×320 — для обучения [3] YOLOv8,
Делает по одному снимку каждые 2 секунды,
Позволяет вручную задать выдержку (важно при ярком освещении или движении).
Я собрал 800 изображений — этого хватило для пилота.
Совет: даже небольшое увеличение датасета даёт прирост в точности. Не ленитесь снять лишние 50 кадров.
Сначала я потратил два дня, размечая брак на чёрно-белых изображениях — в расчёте на экономию памяти [4] и ускорение инференса.
Параллельно размечал всё в формате PASCAL VOC, как было по умолчанию в LabelImg.
Только потом осознал две вещи:
YOLOv8 работает с трёхканальным RGB-входом, даже если изображение монохромное;
Для обучения YOLO нужен формат TXT.
Вместо конвертации я решил снять новый датасет в цвете и сделать разметку заново в правильном формате. Это заняло время, но сэкономило дни отладки позже.
Мораль: предположения — это хорошо, но техническая документация [5] надёжнее.
Благодарен друзьям Андрею и Василию — их поддержка словом и делом в момент, когда ресурсов не хватало, помогла мне не бросить проект, а запустить следующий этап.
После обучения я конвертировал модель в ONNX, чтобы ускорить работу на слабом CPU.
Результаты:
mAP50 на валидационной выборке — 0.45
Для пилота и последующего ручного досмотра оператором этого оказалось достаточно.
Примерно 6% дефектов система не замечала при одном проходе. Но поскольку изделие проходит зону контроля несколько раз, общий уровень надёжности оказался приемлемым.
Для запуска на производстве подготовил скрипт, который:
Захватывает кадр с камеры (1280×720),
Обрезает центральный квадрат и ресайзит его до 320×320 (вход для модели),
Запускает YOLO-детекцию,
Фильтрует только три класса: 'Kr_Razr', 'Razr', 'Start',
При обнаружении брака — воспроизводит звуковой файл с именем, совпадающим с классом (например, Razr.mp [6]3),
Визуализирует bounding box прямо на оригинальном кадре (а не на уменьшенном),
Работает циклически с интервалом 2 секунды, чтобы не перегружать CPU и дать оператору время среагировать.
Система стабильно способна на 20 FPS на мини-ПК с N5095 (OpenVino) — этого более чем достаточно для контроля на конвейере. Для брака (на onnx было порядка 4 FPS ) тоже достаточно.
Я протестировал несколько вариантов:
BIGTREETECH Pi — у меня сгорел после третьего включения (возможно, проблема в блоке питания — не стал разбираться глубже, тем более что мой настрой на бюджетность был плохим ориентиром: эта платформа совсем не про работу с YOLO. И да, трава зелёная, вода мокрая).
Orange Pi RV5 (RISC-V + NPU) — тут меня зацепила NPU. Интересная архитектура, но на момент тестов поддержка ОС и библиотек была крайне ограниченной.
Raspberry Pi 5 — несмотря на заявленную производительность, в моих условиях не показал ожидаемой скорости инференса с YOLOv8. Учитывая его стоимость (около 9000 ₽ в комплекте) и дефицитность, я решил поискать более предсказуемое решение.
Мини-ПК на Intel N5095 обошёлся мне в 9000 ₽ — то есть сопоставим по цене с Raspberry Pi 5, но предоставил доступ к зрелой экосистеме OpenVINO и стабильной работе под Windows/Linux без «танцев с бубном».
Иногда лучшее решение — не «новейший одноплатник», а проверенный x86-чип, который уже умеет всё, что нужно.
Всё оборудование я подбирал с расчётом на «минимум, но чтобы работало».
Основные затраты составили:
Мини-ПК на Intel N5095 — 9000 ₽,
Камера Logitech (рабочая, без артефактов) — 2500 ₽,
Пластик на крепление (около 100 г) — 100 ₽,
Колонка для звуковых оповещений — 300 ₽,
Портативный дисплей — 3000 ₽ (система работает и без него — это опционально).
Итого — 14 900 ₽ (из них 11 900 ₽ — обязательные компоненты, 3000 ₽ — опциональный дисплей).
Экономический эффект: почему это того стоит
Расчёт экономии от сокращения брака я вёл на основе стоимости сырья и процентной доли брака от общего веса выпуска.
По моим оценкам, до 80% потерь можно предотвратить с помощью системы компьютерного зрения, что соответствует потенциальной экономии до 260–300 тыс. руб. в год (при среднестатистическом годовом объёме производства).
Конечно, это предварительные оценки, но они показывают, что даже пилотная версия модуля может принести значительную выгоду.
Система работает. Она ждёт сырья к станкам для запуска на линии.
Параллельно я начал сотрудничать с производителем промышленного оборудования: мы уже сняли демонстрационное видео, и скоро услуга по созданию модулей «под ключ» появится на их сайте как опция.
В планах — интеграция с ПЛК и завязка на реле для автоматической остановки конвейера.
Я не раскрываю специфику производства, но делюсь своим тернистым опытом. Теперь я отлично вижу свои лишние и ошибочные шаги. Полагаю, без этих набитых шишек у меня бы ничего не вышло.
На старте я понимал, что проект не на три дня, и не был уверен в успехе. Практика показала: методом итераций и экспериментов можно добиться работоспособного решения даже с минимальными ресурсами.
Пока эта система ждёт сырья к станкам для запуска на линии, мы уже тестируем следующее поколение модуля — теперь он не только ловит брак, но и ведёт подсчёт изделий в реальном времени.
Вместе с производителем конвейеров мы отсняли рабочий процесс: камера фиксирует каждый объект, отсеивает дефектные, а при обнаружении брака — звучит голосовое оповещение.
Благодаря улучшенной разметке, более глубокой архитектуре и доступу к современным вычислительным ресурсам, новая модель показывает значительно лучшие метрики — как по точности, так и по стабильности на разных скоростях конвейера.
Подумываю о возможности осветить события создания модульной системы второго поколения — в следующем посте.
Потому что это не магия. Это инженерия: камера, код, железо, ошибки [7], переделки.
И почти любой, у кого есть ноутбук, время и желание, может повторить.
Я читаю Хабр с 2011 года, но никогда не писал.
Этот пост — мой способ вернуть сообществу немного пользы за годы чтения.
Если у вас есть вопросы по реализации или идеи для улучшения — welcome в комментарии или личку. Буду рад обсудить!
С учетом NDA: я заменил реальные изделия на нейтральные, но оставил реальные bounding box и окно детекции из пилота — основной смысл останется понятен.
Автор: pincaglinch
Источник [9]
Сайт-источник BrainTools: https://www.braintools.ru
Путь до страницы источника: https://www.braintools.ru/article/21528
URLs in this post:
[1] зрения: http://www.braintools.ru/article/6238
[2] Опыта: http://www.braintools.ru/article/6952
[3] обучения: http://www.braintools.ru/article/5125
[4] памяти: http://www.braintools.ru/article/4140
[5] документация: https://docs.ultralytics.com/ru/
[6] Razr.mp: http://Razr.mp
[7] ошибки: http://www.braintools.ru/article/4192
[8] Эволюция: http://www.braintools.ru/article/7702
[9] Источник: https://habr.com/ru/articles/963244/?utm_campaign=963244&utm_source=habrahabr&utm_medium=rss
Нажмите здесь для печати.