Вывод модели с ONNX.js в чистом приложении JavaScript
Как разработчик JS, вы когда-нибудь задумывались, как запустить модные модели глубокого обучения в своем одностраничном приложении? … при этом вы не хотите пачкать руки кодами Python… или, что еще лучше, без каких-либо серверных сервисов.
Я надеюсь, что это простое руководство по ONNX.js будет полезным.
Что такое ONNX?
ONNX (Open Neural Network Exchange) — это открытый формат, созданный для представления моделей машинного обучения.
С ONNX разработчики ИИ имеют свободу выбора правильных комбинаций инструментов и фреймворков для своего проекта и не беспокоятся о том, как разрабатываемые модели должны быть развернуты на разных платформах. ONNX поддерживается сообществом партнеров, включая Microsoft, Facebook OpenSource, Intel AI и т. д.
Что такое ONNX.js?
ONNX.js — это JS-библиотека с открытым исходным кодом, разработанная Microsoft для запуска моделей ONNX непосредственно в браузерах, которая обеспечивает различные преимущества сокращения взаимодействия между сервером и клиентом и защиты конфиденциальности пользователей, а также предлагает не требующую установки и кросс-платформенную поддержку. опыт машинного обучения в браузере.
ONNX.js поддерживает вывод как на CPU, так и на GPU. По сравнению с другими JS-библиотеками для запуска моделей глубокого обучения в браузере, такими как TensorFlow.js, она работает намного быстрее, особенно на процессоре. Это связано с тем, что ONNX.js использует WebAssembly для выполнения моделей с почти естественной скоростью, а также использует Web Workers для обеспечения многопоточной среды для распараллеливания обработки данных.
Как готовятся модели и изображения для этого урока?
В одном из моих школьных проектов мы разработали классификатор выражения лица на TensorFlow, который принимает изображения лица в качестве входных данных и классифицирует выражение лица по одной из пяти категорий: нейтральное, удивленное, счастливое, грустное или злое. Затем эта модель была преобразована в формат ONNX с помощью инструмента tf2onnx и использована в этом руководстве.
Изображения лиц ищутся и загружаются из Google Image. Затем с помощью face-api.js на изображении определяются лица. Как исходное изображение, так и координаты лиц ограничивающей рамки будут предоставлены в качестве входных данных для методов, описанных в этом руководстве.
Приступаем к взлому…
Прежде всего, добавьте необходимые зависимости в свой JS-проект. Помимо onnxjs, мы также используем ndarray для управления многомерными массивами, что является JS-эквивалентом массива numpy в Python.
npm i onnxjs ndarray ndarray-ops ndarray-resize
Перед выводом мы должны предварительно обработать изображение лица в соответствии с входными спецификациями нашей модели и сохранить обработанные данные в объекте Tensor. В нашем руководстве исходное изображение загружается на холст HTML, а ограничивающая рамка лица на холсте передается в качестве аргумента функции в формате (x, y, ширина, высота). Функция предварительной обработки скопирует изображение лица в ndarray, изменит его размер до 197x197, преобразует его из формата RGBA в формат BGR и завернет в объект Tensor.
Теперь нам нужно создать InferenceSession, чтобы выполнить нашу модель. Объект сеанса инкапсулирует среду, в которой работает ONNX.js. Метод конструктора принимает необязательный объект конфигурации со свойствами backendHint и profiler.
session = new InferenceSession({ backendHint, profiler });
Свойство backendHint указывает предпочитаемую серверную часть для выполнения модели, а свойство profiler указывает конфигурации профилировщика. Доступные серверные подсказки: cpu (CPU), wasm (WebAssembly) и webgl (GPU). Если не указано, серверная часть определяется базовой платформой.
Наш файл модели ONNX доступен как общедоступный ресурс нашего веб-приложения, поэтому сеанс логического вывода может загрузить его по относительному URL-адресу: ./onnx/facial-expression-vggface.onnx
Как только модель завершит загрузку, вывод будет выполняться по подготовленному нами входному тензору. Результатом нашей модели является 5-элементный массив вероятностей для пяти категорий выражений. Метка выражения с максимальной вероятностью будет возвращена в качестве вывода этой функции.
Наконец, чтобы представить результат вывода, я использую простую функцию рисования, чтобы аннотировать холст ограничивающими рамками лиц и соответствующими метками выражений.
КОНЕЦ
Это довольно просто, верно? Пожалуйста, поделитесь, если вы найдете этот урок полезным. Ваше здоровье!