Для работы с Keras.js необходимо иметь модель, экспортированную из
Keras в формате JSON вместе с весами в бинарных файлах
.bin. Эти файлы загружаются в браузер и используются
для выполнения инференса на клиентской стороне. Подключение библиотеки
производится через <script> или через пакетный
менеджер:
<script src="https://cdn.jsdelivr.net/npm/keras-js@0.8.0/dist/keras.min.js"></script>
Инициализация модели выполняется следующим образом:
const model = new KerasJS.Model({
filepath: 'model.json',
gpu: true // использование WebGL для ускорения вычислений
});
await model.ready();
Флаг gpu: true позволяет использовать WebGL, что
значительно повышает производительность при работе с большими сетями. В
случае его отсутствия библиотека автоматически переключится на CPU.
Модель Keras.js ожидает данные в виде TypedArray.
Для изображений чаще всего используется формат Float32Array
с нормализованными значениями от 0 до 1. Преобразование изображения из
элемента <img> или <canvas> в
массив выполняется через CanvasRenderingContext2D:
const canvas = document.createElement('canvas');
canvas.width = 224;
canvas.height = 224;
const ctx = canvas.getContext('2d');
ctx.drawImage(imgElement, 0, 0, 224, 224);
const imageData = ctx.getImageData(0, 0, 224, 224);
const data = new Float32Array(224 * 224 * 3);
for (let i = 0; i < 224 * 224; i++) {
data[i * 3 + 0] = imageData.data[i * 4 + 0] / 255; // R
data[i * 3 + 1] = imageData.data[i * 4 + 1] / 255; // G
data[i * 3 + 2] = imageData.data[i * 4 + 2] / 255; // B
}
Важно правильно упорядочивать каналы и учитывать формат модели:
многие модели Keras используют channels_last (HWC).
После подготовки данных модель принимает объект, где ключи соответствуют именам входов, указанным в Keras:
const inputData = { input_1: data };
const outputData = await model.predict(inputData);
outputData — объект, где ключи соответствуют именам
выходов. Если модель имеет один выход, можно получить массив
вероятностей или значений напрямую.
Для задач классификации часто требуется отобразить вероятности классов или выбрать класс с максимальной вероятностью:
const classProbabilities = outputData['output_1'];
const maxIndex = classProbabilities.indexOf(Math.max(...classProbabilities));
console.log(`Предсказанный класс: ${maxIndex}`);
Для визуального представления можно использовать бар-графики, где высота колонок отражает вероятность:
const canvas = document.getElementById('chartCanvas');
const ctx = canvas.getContext('2d');
const width = canvas.width / classProbabilities.length;
classProbabilities.forEach((prob, i) => {
ctx.fillStyle = 'steelblue';
ctx.fillRect(i * width, canvas.height * (1 - prob), width - 2, canvas.height * prob);
});
Для моделей регрессии или генеративных моделей результат чаще всего представлен в виде массива значений, который можно отображать как график или изображение:
const outputArray = outputData['output_1'];
const imgCanvas = document.getElementById('outputCanvas');
const imgCtx = imgCanvas.getContext('2d');
const imgData = imgCtx.createImageData(28, 28);
for (let i = 0; i < 28 * 28; i++) {
const value = Math.floor(outputArray[i] * 255);
imgData.data[i * 4 + 0] = value;
imgData.data[i * 4 + 1] = value;
imgData.data[i * 4 + 2] = value;
imgData.data[i * 4 + 3] = 255;
}
imgCtx.putImageData(imgData, 0, 0);
Такой подход используется, например, для вывода сгенерированных рукописных цифр или картинок из генеративных моделей.
Для улучшения восприятия результатов можно объединить предсказания с взаимодействием пользователя, позволяя обновлять визуализацию в реальном времени при изменении входного изображения или параметров модели:
document.getElementById('inputImage').addEventListener('change', async (e) => {
const img = new Image();
img.src = URL.createObjectURL(e.target.files[0]);
img.onl oad = async () => {
const inputData = preprocess(img); // функция преобразования изображения
const outputData = await model.predict(inputData);
renderOutput(outputData); // функция отрисовки на canvas
};
});
async/await и
разделять обработку данных и визуализацию.Для сложной визуализации удобно комбинировать Keras.js с графическими библиотеками, такими как:
Правильная интеграция обеспечивает плавную работу интерфейса, отображение изменений в реальном времени и интерактивное исследование данных без необходимости обращения к серверной части.