Архитектура VGG в Keras.js

VGG (Visual Geometry Group) — это семейство сверточных нейронных сетей, разработанных для задач распознавания изображений. Основная особенность архитектуры заключается в использовании последовательных сверточных слоев с маленькими фильтрами размером 3×3 и постоянным увеличением глубины сети при сохранении структуры. VGG доказала высокую точность на ImageNet, что делает её популярной для переносного обучения и экспериментов в браузере с Keras.js.

Основные принципы архитектуры

  1. Последовательность сверточных блоков

    • Каждый блок состоит из нескольких сверточных слоев с фильтрами 3×3, за которыми следует слой активации ReLU.
    • После каждого блока применяется слой подвыборки MaxPooling размером 2×2 для уменьшения пространственных размеров и выделения значимых признаков.
  2. Увеличение глубины сети

    • Начальная глубина сети обычно составляет 64 фильтров в первом блоке.
    • По мере углубления количество фильтров удваивается: 64 → 128 → 256 → 512 → 512.
    • Такой подход позволяет сети постепенно захватывать сложные и абстрактные признаки.
  3. Полносвязные слои в конце

    • После сверточных блоков изображение выпрямляется в одномерный вектор.
    • Используются два больших полносвязных слоя по 4096 нейронов с ReLU, завершающий слой классификации с количеством нейронов, равным числу классов, и функцией активации softmax.

Работа с Keras.js

Keras.js позволяет запускать модели, обученные в Python Keras, непосредственно в браузере с использованием WebGL для ускорения вычислений. Модель VGG необходимо сначала экспортировать в формат JSON с весами в бинарных файлах.

Подготовка модели
  1. Обучение модели VGG в Python Keras:
from keras.applications import VGG16

model = VGG16(weights='imagenet')
model.save('vgg16.h5')
  1. Конвертация модели в формат Keras.js:
kerasjs-converter vgg16.h5 vgg16_kerasjs_model/

После конвертации появляется каталог с файлом model.json и бинарными файлами весов, готовый для использования в браузере.

Загрузка модели в JavaScript
const KerasJS = require('keras-js');

const model = new KerasJS.Model({
  filepaths: {
    model: 'vgg16_kerasjs_model/model.json',
    weights: 'vgg16_kerasjs_model/weights.buf'
  },
  gpu: true
});

await model.ready();
Подготовка данных
  • Входной формат изображений для VGG16: 224×224×3, тип float32.
  • Необходимо нормализовать значения пикселей, приведя их к диапазону [0, 1] или по формуле x/255.0.
  • Пример преобразования изображения:
function preprocessImage(image) {
  // image — HTMLImageElement
  const canvas = document.createElement('canvas');
  canvas.width = 224;
  canvas.height = 224;
  const ctx = canvas.getContext('2d');
  ctx.drawImage(image, 0, 0, 224, 224);
  const imgData = ctx.getImageData(0, 0, 224, 224).data;
  const data = new Float32Array(224 * 224 * 3);
  for (let i = 0; i < 224 * 224; i++) {
    data[i * 3 + 0] = imgData[i * 4 + 0] / 255;
    data[i * 3 + 1] = imgData[i * 4 + 1] / 255;
    data[i * 3 + 2] = imgData[i * 4 + 2] / 255;
  }
  return data;
}
Прогон изображения через модель
const inputData = preprocessImage(image);

const outputData = await model.predict({ input_1: inputData });

console.log('Распознанный класс:', outputData);

Оптимизация производительности

  • Использование GPU через WebGL значительно ускоряет работу модели.
  • Для браузеров с ограниченными ресурсами можно использовать VGG16 без полносвязных слоев, оставляя только сверточную часть для извлечения признаков.
  • Размер входного изображения влияет на скорость: уменьшение до 128×128 снижает нагрузку, но может ухудшить точность.

Практические сценарии

  • Классификация изображений в реальном времени в веб-приложениях.
  • Экстракция признаков для последующего использования в других алгоритмах машинного обучения.
  • Переносное обучение с дообучением верхних слоев VGG на собственных наборах данных.

Архитектура VGG в Keras.js обеспечивает мощный инструмент для веб-разработчиков, позволяя интегрировать сложные нейронные сети прямо в браузер без необходимости серверного выполнения. Основная ценность заключается в простоте структуры слоев и высоком качестве извлекаемых признаков.