Шумоподавляющий автоэнкодер

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

Модель, созданная в Keras (Python), экспортируется в формат JSON и веса в бинарный формат, которые затем подгружаются через Keras.js. Формат JSON содержит архитектуру сети, список слоёв, их параметры и функции активации. Бинарные веса соответствуют значениям весов слоёв, сохранённым в Keras.

Пример загрузки модели выглядит следующим образом:

const KerasJS = require('keras-js');

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

Флаг gpu: true активирует выполнение модели на графическом процессоре через WebGL, что критически важно для обработки больших изображений или видео в реальном времени.

Структура шумоподавляющего автоэнкодера

Шумоподавляющий автоэнкодер (Denoising Autoencoder) — разновидность автоэнкодеров, цель которых восстановление исходного сигнала из зашумлённого входа. Структура сети включает:

  • Входной слой: принимает зашумлённые данные.
  • Энкодер: последовательность слоёв, уменьшающих размерность и извлекающих скрытые представления. Чаще всего используются Dense или Conv2D слои с функциями активации ReLU или LeakyReLU.
  • Скрытое представление (latent space): компактная векторная форма данных, где шум минимизирован.
  • Декодер: слои, восстанавливающие данные из латентного пространства до исходной размерности, часто с использованием Conv2DTranspose или Dense слоёв.
  • Выходной слой: формирует окончательное восстановленное изображение или сигнал, обычно с функцией активации sigmoid для нормализованных данных.

Основная идея шумоподавляющего автоэнкодера — обучение сети выделять значимые признаки данных и игнорировать шум, что достигается путём добавления случайного шума к входным данным при обучении.

Подготовка данных для браузера

Перед подачей изображений в Keras.js требуется преобразовать их в формат, совместимый с массивами Float32Array. Для этого изображение нормализуется и, при необходимости, изменяется размер:

function preprocessImage(img, width, height) {
  const canvas = document.createElement('canvas');
  canvas.width = width;
  canvas.height = height;
  const ctx = canvas.getContext('2d');
  ctx.drawImage(img, 0, 0, width, height);
  const imageData = ctx.getImageData(0, 0, width, height).data;
  const floatData = new Float32Array(width * height * 3);
  
  for (let i = 0; i < width * height; i++) {
    floatData[i * 3] = imageData[i * 4] / 255.0;
    floatData[i * 3 + 1] = imageData[i * 4 + 1] / 255.0;
    floatData[i * 3 + 2] = imageData[i * 4 + 2] / 255.0;
  }
  
  return floatData;
}

Такой подход обеспечивает совместимость с моделями, обученными на нормализованных данных.

Применение модели для шумоподавления

После загрузки модели и подготовки данных выполняется предсказание:

const inputData = preprocessImage(imgElement, 128, 128);

model.ready().then(() => {
  model.predict({ input: inputData }).then(outputData => {
    const outputImage = postprocessOutput(outputData, 128, 128);
    document.body.appendChild(outputImage);
  });
});

Метод postprocessOutput преобразует массив предсказаний обратно в изображение. Обычно значения умножаются на 255 и формируются ImageData объекты для отображения на Canvas.

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

  • Использование gpu: true существенно ускоряет вычисления на больших изображениях.
  • Предварительное изменение размера входных данных до разумных значений (например, 128×128 или 256×256) снижает нагрузку на GPU и уменьшает задержку.
  • Кэширование моделей и бинарных весов через IndexedDB предотвращает повторную загрузку при обновлении страницы.
  • Пакетная обработка изображений позволяет подавать сразу несколько входов, что эффективнее для потоковых данных.

Практические рекомендации для шумоподавляющих автоэнкодеров

  • Добавление различных типов шума при обучении (соль-перец, гауссовский) улучшает обобщающую способность модели.
  • Регуляризация слоёв через Dropout помогает сети не переобучаться на конкретных шумовых паттернах.
  • Сравнение качества восстановления можно проводить через метрики MSE (Mean Squared Error) или PSNR (Peak Signal-to-Noise Ratio).

Использование Keras.js позволяет переносить сложные модели шумоподавления прямо в веб-приложения, обеспечивая интерактивное восстановление изображений без серверных вычислений и значительных задержек.