Вывод модели с 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-элементный массив вероятностей для пяти категорий выражений. Метка выражения с максимальной вероятностью будет возвращена в качестве вывода этой функции.

Наконец, чтобы представить результат вывода, я использую простую функцию рисования, чтобы аннотировать холст ограничивающими рамками лиц и соответствующими метками выражений.

КОНЕЦ

Это довольно просто, верно? Пожалуйста, поделитесь, если вы найдете этот урок полезным. Ваше здоровье!