ONNX Runtime Web (ORT Web) предоставляет возможность выполнения моделей машинного обучения непосредственно в браузере с использованием JavaScript. Для задач оценки ключевых точек (pose estimation) это особенно важно, так как позволяет обрабатывать видеопоток или изображения в реальном времени без серверной стороны.
Для работы с ORT Web необходимо создать сессию модели. Основные шаги включают загрузку модели в формате ONNX, настройку сессии и подготовку входных данных.
import * as ort from 'onnxruntime-web';
// Создание сессии
const session = await ort.InferenceSession.create('pose_model.onnx', {
executionProviders: ['wasm'] // Использование WebAssembly для кросс-платформенной совместимости
});
Ключевые моменты:
Модели оценки поз обычно принимают изображения в формате тензора. Необходимые шаги включают:
Float32Array.import { createCanvas, loadImage } from 'canvas';
const image = await loadImage('person.jpg');
const canvas = createCanvas(256, 256); // Подгон под модель
const ctx = canvas.getContext('2d');
ctx.drawImage(image, 0, 0, 256, 256);
const imageData = ctx.getImageData(0, 0, 256, 256);
const data = Float32Array.from(imageData.data).map((v, i) => i % 4 !== 3 ? v / 255.0 : 0);
Особенности:
i % 4 !== 3) важно для
моделей, обученных на RGB.После подготовки входных данных необходимо выполнить инференс и интерпретировать результаты:
const inputTensor = new ort.Tensor('float32', data, [1, 3, 256, 256]);
const feeds = { input: inputTensor };
const results = await session.run(feeds);
const keypoints = results['output'].data; // 'output' зависит от конкретной модели
Замечания по результатам:
[1, num_keypoints, 3], где третья координата — confidence
score.Для проверки и отладки удобно визуализировать ключевые точки поверх изображения.
keypoints.forEach(([x, y, confidence]) => {
if (confidence > 0.5) {
ctx.beginPath();
ctx.arc(x * 256, y * 256, 3, 0, 2 * Math.PI);
ctx.fillStyle = 'red';
ctx.fill();
}
});
Особенности:
requestAnimationFrame для плавного отображения
видео.async function processFrame(videoFrame) {
const inputTensor = preprocess(videoFrame);
const results = await session.run({ input: inputTensor });
renderKeypoints(results['output'].data);
requestAnimationFrame(() => processFrame(nextVideoFrame));
}
ORT Web совместим с моделями, экспортированными в ONNX из PyTorch или TensorFlow. Для pose estimation часто используют:
Каждая модель имеет свои требования к форме входного тензора, нормализации и формату выходных ключевых точек.
Для работы с видеопотоком браузера:
const video = document.getElementById('video');
navigator.mediaDevices.getUserMedia({ video: true }).then(stream => {
video.srcObject = stream;
video.play();
});
video.addEventListener('loadeddata', () => {
function analyzeFrame() {
processFrame(video);
requestAnimationFrame(analyzeFrame);
}
analyzeFrame();
});
Важные моменты:
requestAnimationFrame.Эти подходы обеспечивают полнофункциональное использование ONNX Runtime Web для оценки ключевых точек, сочетая точность предсказаний и высокую производительность в браузере.