ONNX Runtime Web (ORT Web) предоставляет высокопроизводительную платформу для выполнения моделей машинного обучения непосредственно в браузере на JavaScript. Одним из практических применений является обработка изображений, включая изменение их размера без потери качества, что критически важно для задач компьютерного зрения, генеративного моделирования и веб-приложений с высокими требованиями к визуальной точности.
Для работы с ONNX Runtime Web требуется подключение библиотеки через npm или CDN:
import * as ort from 'onnxruntime-web';
Браузерная среда автоматически выбирает оптимальный движок выполнения (WebAssembly, WebGL), что позволяет использовать аппаратное ускорение при поддержке векторных операций.
Изменение размера изображений часто реализуется с помощью нейронных
сетей, таких как Super-Resolution (SR). ONNX модели для этой задачи
доступны в формате .onnx. Их загрузка выглядит следующим
образом:
const session = await ort.InferenceSession.create('super_resolution.onnx');
Особенности:
wasm,
webgl.Модель ONNX принимает входные данные в виде тензоров. Изображение необходимо конвертировать в тензор с нужными размерами и нормализацией:
function imageToTensor(imageElement, width, height) {
const canvas = document.createElement('canvas');
canvas.width = width;
canvas.height = height;
const ctx = canvas.getContext('2d');
ctx.drawImage(imageElement, 0, 0, width, height);
const imageData = ctx.getImageData(0, 0, width, height);
const data = new Float32Array(width * height * 3);
for (let i = 0; i < width * height; i++) {
data[i * 3 + 0] = imageData.data[i * 4 + 0] / 255.0;
data[i * 3 + 1] = imageData.data[i * 4 + 1] / 255.0;
data[i * 3 + 2] = imageData.data[i * 4 + 2] / 255.0;
}
return new ort.Tensor('float32', data, [1, 3, height, width]);
}
Ключевые моменты:
[0,1] или нормализация
в соответствии с требованиями модели.[N, C, H, W] — стандарт ONNX для
изображений.После подготовки входного тензора можно выполнить предсказание модели:
const inputTensor = imageToTensor(imageElement, 224, 224);
const feeds = { input: inputTensor };
const results = await session.run(feeds);
const outputTensor = results.output;
Особенности:
session.run возвращает объект с ключами,
соответствующими выходным узлам модели.[1, 3, H_out, W_out], готовые к конвертации обратно в
изображение.Для отображения результата в браузере необходимо преобразовать тензор
в объект ImageData:
function tensorToImageData(tensor, width, height) {
const data = tensor.data;
const imageData = new ImageData(width, height);
for (let i = 0; i < width * height; i++) {
imageData.data[i * 4 + 0] = Math.min(255, Math.max(0, data[i * 3 + 0] * 255));
imageData.data[i * 4 + 1] = Math.min(255, Math.max(0, data[i * 3 + 1] * 255));
imageData.data[i * 4 + 2] = Math.min(255, Math.max(0, data[i * 3 + 2] * 255));
imageData.data[i * 4 + 3] = 255;
}
return imageData;
}
Советы:
Math.min и Math.max
предотвращает артефакты переполнения.canvas с масштабированием
imageSmoothingEnabled = true.Модели ONNX часто требуют строго определённых каналов (RGB, BGR) и порядка данных. Для универсальности:
RGBA и
RGB.Эта методика обеспечивает эффективное изменение размеров изображений в браузере с использованием ONNX Runtime Web, сочетая гибкость JavaScript с мощью современных нейронных сетей для суперрезолюции и обработки визуальных данных.