LabVIEW + ONNX Runtime

Простейшие вопросы в области инженерной разработки
Ответить
Аватара пользователя
IvanLis

Activity Professionalism Tutorials Gold Man of the year 2012
Автор
guru
guru
Сообщения: 5685
Зарегистрирован: 02 дек 2009, 17:44
Награды: 7
Версия LabVIEW: 2015, 2016
Откуда: СССР
Благодарил (а): 35 раз
Поблагодарили: 126 раз

LabVIEW + ONNX Runtime

Сообщение IvanLis »

На днях нужно было сделать ИНС для поиска определенных объектов на изображении.
В моем случае это монеты РФ (coin), т.е. получается у нас задача детекции объектов на изображении, т.к. класс всего один ({0: 'coin'}).
Обучение делал в Python с использованием PyTorch. В качестве базовой ИНС была выбрана YOLOv8n. Но обучение это отдельная задачка, по этому оставим ее под капотом.

ИНС работала, выполняла свою задачу нормально и в принципе этого было достаточно.
Но мне захотелось в качестве эксперимента попробовать использовать ее в LabVIEW.

После поиска информации и ознакомления с путями ее интеграции, остановился на ONNX Runtime.
Остальные решения, по крайней мере из тех, что мне попадались, были либо слишком избыточны, либо ограничения не позволяли запустить их нормально в Linux (про это я забыл написать :wink: ).
В результате сделал некоторую обертку над ONNX Runtime позволяющую использовать библиотеку в двух OS: Unix64bit и Windows64bit. Конкретно тестировал на Ubuntu 24.04lts и Windows 10. При запуске на Windows может потребоваться установка Microsoft Visual C++ Redistributable.
Ну и сразу сделал возможность запуска нескольких ИНС и их отдельный контроль (выгрузка / загрузка и т.д.)

ИНС натренирована на изображениях 1024*1024, по этому в папке image_for_test изображения именно такого разрешения. Если Вы хотите попробовать на других изображениях, то их необходимо привести к требуемому разрешению.
На выходе мы получаем информацию о входах и выходах ИНС, классах и пр.
Ну и есть возможность передать ей изображение (преобразованное и нормализованное) и отобразить результат.
ИНС на возвращает данные в своей структуре и в зависимости от типа используемой ИНС, количества классов и пр. структура пакета может изменяться.
Перед отображением я прогнал обнаруженные box через алгоритм NMS (Non-Maximum Suppression), чтобы оставить "ведущих".
Снимок экрана от 2026-03-24 18-48-42.png
Не забудьте, перед запуском, указать актуальные пути к модели (ONNX model path -> coins_detection.onnx -> в папке data) и изображению (BMP file path -> папка image_for_test).
Сам проект можно забрать здесь (LabVIEW 2017): https://github.com/IvanLisRus/LabVIEW-ONNX_Runtime

Если по размерам проекта, то дела обстоят примерно так:
- coins_detection.onnx (~12.5Mb)
- unix64 (~22.5Mb)
- win64 (~16.9Mb)
- LabVIEW code (~152kb)
Аватара пользователя
IvanLis

Activity Professionalism Tutorials Gold Man of the year 2012
Автор
guru
guru
Сообщения: 5685
Зарегистрирован: 02 дек 2009, 17:44
Награды: 7
Версия LabVIEW: 2015, 2016
Откуда: СССР
Благодарил (а): 35 раз
Поблагодарили: 126 раз

LabVIEW + ONNX Runtime

Сообщение IvanLis »

Добавил в пример еще две ИНС

Логика работы следующая:
1 этап детекция (ИНС YOLOv8n):
- преобразование изображения [1024, 1024] в тензор [1, 3, 1024, 1024] и подача его на вход ИНС
- преобразование полученных от ИНС данных в читаемый вид, фильтрация по порогу и NMS
- отображение результата детектирования
2 этап компенсация угла поворота (ИНС самодельная):
- сегментация изображения (по результатам 1 этапа)
- изменение размера изображения [х.з] -> [512, 512]
- преобразование изображения [512, 512] в тензор [1, 3, 512, 512] и подача его на вход ИНС
- преобразование полученных от ИНС данных [sin, cos] в угол и его компенсация
- отображение результата (сегментация, масштабирование, поворот)
3 этап идентификация (ИНС EfficientNet-B4):
- изменение размера [512, 512] -> [380, 380]
- преобразование изображения [380, 380] в тензор [1, 3, 380, 380] и подача его на вход ИНС
- преобразование полученных от ИНС данных в вероятности для каждого из двух классов [Avers, Revers]
- отображение результата
FP_win.png
BD_win.png
Скачать исходники LabVIEW 2017: https://github.com/IvanLisRus/LabVIEW-ONNX_Runtime

Аватара пользователя
IvanLis

Activity Professionalism Tutorials Gold Man of the year 2012
Автор
guru
guru
Сообщения: 5685
Зарегистрирован: 02 дек 2009, 17:44
Награды: 7
Версия LabVIEW: 2015, 2016
Откуда: СССР
Благодарил (а): 35 раз
Поблагодарили: 126 раз

Re: LabVIEW + ONNX Runtime

Сообщение IvanLis »

Сделал родительский класс ONNX.
И сделал два примера его использования.
BD_Class_YOLO.png
BD_Class_EfficientNet.png
Ответить
  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Для чайников»