Шумоподавление

ConvNetJS — это чисто клиентская JavaScript-библиотека для построения и обучения нейронных сетей, в том числе сверточных (CNN). Она реализует как прямое распространение, так и обратное распространение ошибки, поддерживает различные слои, функции активации и оптимизаторы. Основная особенность библиотеки — возможность работы непосредственно в браузере, без серверной части, что позволяет экспериментировать с нейронными сетями в интерактивной среде.

В основе ConvNetJS лежит модель слоя за слоем, где каждый слой может быть свёрточным, подвыборочным, полностью связанным или нелинейным. Слои соединяются в цепочку, формируя вычислительный граф, по которому происходит распространение данных и ошибок.


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

Шумоподавление в ConvNetJS реализуется как задача регрессии или восстановления сигнала. Исходный шумный сигнал или изображение подается на вход сети, а целевой сигнал — это “чистая” версия данных. Задача сети — минимизировать разницу между восстановленным и эталонным сигналом.

Подготовка данных

Для работы с шумоподавлением данные необходимо представить в виде тензоров (Vol). Каждый Vol содержит трехмерные массивы: ширина, высота и глубина (channels).

Пример подготовки изображения для сети:

var x = new convnetjs.Vol(width, height, depth);
for (var i = 0; i < width * height * depth; i++) {
    x.w[i] = noisyImageData[i];
}
  • width, height — размеры изображения.
  • depth — количество каналов (1 для grayscale, 3 для RGB).
  • x.w — одномерный массив с пиксельными значениями.

Для обучения необходимо иметь два набора данных: входные с шумом и чистые эталонные изображения.


Архитектура сети

Эффективные модели шумоподавления используют сверточные слои без подвыборки, чтобы сохранить пространственную информацию. Типичная архитектура:

  1. Conv Layer: фильтры малого размера (3x3 или 5x5), количество фильтров 16–64, stride=1, padding=same.
  2. ReLU Layer: нелинейная активация для повышения способности сети выявлять сложные закономерности.
  3. Conv Layer: фильтры 3x3, stride=1, padding=same.
  4. ReLU Layer.
  5. Conv Layer: фильтры 3x3, stride=1, padding=same, выходной канал = количество каналов исходного изображения.

Для регрессии используется L2 Loss Layer, минимизирующая среднеквадратичное отклонение между предсказанием и эталонным сигналом:

var layer_defs = [];
layer_defs.push({type:'input', out_sx:width, out_sy:height, out_depth:depth});
layer_defs.push({type:'conv', sx:3, filters:32, stride:1, pad:1, activation:'relu'});
layer_defs.push({type:'conv', sx:3, filters:32, stride:1, pad:1, activation:'relu'});
layer_defs.push({type:'conv', sx:3, filters:depth, stride:1, pad:1});
layer_defs.push({type:'regression', num_neurons:width*height*depth});

Настройка и обучение

Оптимизация выполняется с помощью Trainer:

var net = new convnetjs.Net();
net.makeLayers(layer_defs);

var trainer = new convnetjs.Trainer(net, {
    method: 'adam',
    learning_rate: 0.001,
    l2_decay: 0.0001
});

Особенности обучения для шумоподавления:

  • Размер батча: обычно 16–64, чтобы ускорить обучение и стабилизировать градиенты.
  • Шум: для генерализации модель обучается на разнообразных уровнях шума.
  • Сохранение сети: после обучения структура и веса сохраняются в JSON, что позволяет загружать их для применения без повторного обучения.
var json = net.toJSON();

Применение сети

Для подавления шума на новом изображении:

var inputVol = new convnetjs.Vol(width, height, depth);
inputVol.w = noisyImageData;

var outputVol = net.forward(inputVol);
var denoisedImageData = outputVol.w;
  • forward — выполняет прямое распространение по сети.
  • outputVol.w содержит восстановленные пиксельные значения.

Если нужно получить изображение для отображения, значения нормализуются или преобразуются в диапазон 0–255.


Тонкости и рекомендации

  • Паддинг: для шумоподавления важно сохранять размер изображения, поэтому используется padding = 1 для 3x3 фильтров.
  • Количество фильтров: увеличение числа фильтров повышает способность сети выявлять детали, но требует больше памяти.
  • Глубина сети: более глубокие сети справляются с более сложными шумами, но обучение замедляется.
  • Регуляризация: L2 decay и Dropout можно использовать осторожно, чтобы сеть не теряла способность к точному восстановлению.
  • Данные: генерация искусственного шума на чистых изображениях позволяет получить практически неограниченный набор обучающих примеров.

Расширенные подходы

  1. Сквозные соединения (skip connections) повышают точность восстановления, позволяя сети передавать высокочастотную информацию напрямую между слоями.
  2. Субпиксельные слои (upsampling) для шумоподавления изображений разного масштаба.
  3. Смешение L1 и L2 loss помогает уменьшить размытие на границах.

Использование этих приемов в ConvNetJS требует ручной настройки архитектуры, но позволяет строить сети, сравнимые с простыми вариантами U-Net в браузерной среде.


Шумоподавление с ConvNetJS — это комбинация тонкой настройки архитектуры сверточной сети, грамотного выбора функции потерь и подготовки данных, что позволяет решать задачи восстановления сигналов и изображений полностью на стороне клиента.