Keras.js представляет собой библиотеку для запуска предобученных моделей Keras непосредственно в браузере на базе JavaScript. Она поддерживает выполнение как на CPU, так и с использованием WebGL для ускорения вычислений. Vue.js, в свою очередь, предоставляет реактивный фреймворк для построения интерфейсов, что позволяет динамически отображать результаты работы моделей и управлять пользовательским вводом.
Ключевой аспект интеграции заключается в обеспечении синхронизации реактивного состояния Vue с процессами загрузки, инициализации и инференса модели Keras.js.
Для использования Keras.js в проекте Vue необходимо добавить библиотеку через npm или подключить через CDN:
npm install keras-js
Или в index.html:
<script src="https://cdn.jsdelivr.net/npm/keras-js@0.8.0/dist/keras.min.js"></script>
После установки создаётся экземпляр модели, указывая путь к весам
(.bin) и архитектуре (.json):
import KerasJS from 'keras-js';
const model = new KerasJS.Model({
filepath: 'model/model.json',
gpu: true
});
В Vue.js модель Keras.js удобно инициализировать в хукe жизненного
цикла mounted, чтобы она была готова к работе после
отрисовки компонента.
export default {
data() {
return {
model: null,
loading: true,
result: null,
error: null
};
},
async mounted() {
try {
this.model = new KerasJS.Model({
filepath: 'model/model.json',
gpu: true
});
await this.model.ready();
this.loading = false;
} catch (err) {
this.error = err;
}
},
methods: {
async predict(inputData) {
if (!this.model) return;
try {
this.result = await this.model.predict({ input: inputData });
} catch (err) {
this.error = err;
}
}
}
};
Vue обеспечивает автоматическое обновление интерфейса при изменении состояния. В случае работы с Keras.js это особенно важно для отображения прогресса инференса и результатов:
<div v-if="loading">Загрузка модели...</div>
<div v-else>
<input v-model="userInput" placeholder="Введите данные"/>
<button @click="predict({ input: userInput })">Предсказать</button>
<div v-if="result">Результат: {{ result }}</div>
<div v-if="error">Ошибка: {{ error.message }}</div>
</div>
Использование v-model и реактивных переменных
result, loading и error позволяет
полностью отказаться от ручного обновления DOM.
Для инференса нейронных сетей, работающих с изображениями, необходимо
подготовить данные в формате Float32Array и нормализовать
их:
function preprocessImage(imgElement, width, height) {
const canvas = document.createElement('canvas');
canvas.width = width;
canvas.height = height;
const ctx = canvas.getContext('2d');
ctx.drawImage(imgElement, 0, 0, width, height);
const imageData = ctx.getImageData(0, 0, width, height).data;
const data = new Float32Array(width * height * 3);
for (let i = 0; i < width * height; i++) {
data[i * 3] = imageData[i * 4] / 255.0; // R
data[i * 3 + 1] = imageData[i * 4 + 1] / 255.0; // G
data[i * 3 + 2] = imageData[i * 4 + 2] / 255.0; // B
}
return data;
}
Интеграция с Vue позволяет использовать реактивные элементы
<input type="file"> и сразу передавать изображения в
модель:
<input type="file" @change="onFileChange"/>
methods: {
onFileChange(event) {
const file = event.target.files[0];
const img = new Image();
img.onl oad = async () => {
const inputData = preprocessImage(img, 224, 224);
await this.predict({ input: inputData });
};
img.src = URL.createObjectURL(file);
}
}
Для предотвращения блокировки интерфейса при работе с большими моделями, Keras.js можно запускать в Web Worker. Vue обеспечивает удобный механизм передачи сообщений между компонентом и воркером:
worker.js:
importScripts('keras.min.js');
let model;
self.onmess age = async (event) => {
const { type, payload } = event.data;
if (type === 'init') {
model = new KerasJS.Model({ filepath: payload.path, gpu: true });
await model.ready();
postMessage({ type: 'ready' });
} else if (type === 'predict') {
const result = await model.predict(payload.input);
postMessage({ type: 'result', result });
}
};
Vue-компонент:
mounted() {
this.worker = new Worker('worker.js');
this.worker.postMessage({ type: 'init', payload: { path: 'model/model.json' } });
this.worker.onmess age = (event) => {
if (event.data.type === 'ready') this.loading = false;
if (event.data.type === 'result') this.result = event.data.result;
};
},
methods: {
predict(inputData) {
this.worker.postMessage({ type: 'predict', payload: { input: inputData } });
}
}
Такой подход значительно повышает отзывчивость интерфейса, особенно при работе с крупными нейронными сетями.
gpu: true.Для мультиклассовой классификации или генерации последовательностей Keras.js интегрируется с Vue через реактивные состояния и методы обратного вызова, что позволяет создавать интерактивные панели с отображением вероятностей классов, графиков и динамических визуализаций:
computed: {
topPrediction() {
if (!this.result) return null;
return Object.entries(this.result)
.sort((a, b) => b[1] - a[1])
.slice(0, 3);
}
}
Отображение в шаблоне:
<ul v-if="topPrediction">
<li v-for="([label, score], index) in topPrediction" :key="index">
{{ label }}: {{ (score * 100).toFixed(2) }}%
</li>
</ul>
Интеграция Keras.js с Vue.js строится на принципе реактивного управления состоянием модели и данных. Использование хуков жизненного цикла, Web Workers и WebGL позволяет создавать высокопроизводительные, отзывчивые и интерактивные интерфейсы для работы с нейронными сетями прямо в браузере. Правильная подготовка данных и их нормализация обеспечивает корректную работу модели, а реактивные вычисления Vue позволяют легко визуализировать результаты.