Предобработка пикселей

Основные принципы

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

Предобработка пикселей включает в себя несколько обязательных шагов:

  1. Нормализация значений
  2. Центрирование данных
  3. Изменение размерности изображений
  4. Форматирование в структуры ConvNetJS

Нормализация значений

Изображения обычно имеют пиксели с целочисленными значениями от 0 до 255. Для нейронных сетей такие значения слишком велики, что может замедлять обучение и вызывать проблемы с градиентным спуском. В ConvNetJS используется следующая практика:

function normalizeImage(imgData) {
    let normalized = [];
    for (let i = 0; i < imgData.length; i++) {
        normalized.push(imgData[i] / 255.0);
    }
    return normalized;
}

Ключевой момент: значения пикселей должны быть приведены к диапазону [0, 1] или [-1, 1] в зависимости от активационной функции сети. Для сигмоидальных функций лучше использовать [0, 1], для тангенса гиперболического — [-1, 1].

Центрирование данных

Центрирование — это вычитание среднего значения пикселей, что позволяет ускорить сходимость обучения:

function centerImage(imgData) {
    let mean = imgData.reduce((sum, val) => sum + val, 0) / imgData.length;
    return imgData.map(val => val - mean);
}

Пояснение: если использовать только нормализацию, значения будут в допустимом диапазоне, но распределение может быть смещено. Центрирование устраняет смещение и делает данные более «нейтральными» для сети.

Изменение размерности изображений

ConvNetJS оперирует с объектами Vol, которые представляют собой многомерные тензоры: ширина × высота × глубина (channels). Для обычного RGB-изображения это будет (width, height, 3).

Преобразование происходит следующим образом:

let Vol = require('convnetjs').Vol;

function imageToVol(normalizedData, width, height) {
    return new Vol(width, height, 3, 0.0, normalizedData);
}

Особенности:

  • width и height — размеры изображения. ConvNetJS требует, чтобы все изображения в батче имели одинаковые размеры.
  • depth — количество каналов: 1 для grayscale, 3 для RGB.
  • Vol позволяет хранить данные с возможностью последующей передачи через слои сети.

Форматирование в структуры ConvNetJS

После нормализации, центрирования и изменения размерности пиксели преобразуются в тензор Vol. Этот объект затем используется для создания батчей и подачи на вход сети.

Пример формирования батча изображений:

let images = [img1, img2, img3]; // массив с пиксельными данными
let batch = images.map(img => {
    let normalized = normalizeImage(img.data);
    let centered = centerImage(normalized);
    return imageToVol(centered, img.width, img.height);
});

Ключевой момент: каждый элемент батча должен быть экземпляром Vol с одинаковой размерностью. Это обеспечивает корректную работу всех слоев ConvNetJS, включая сверточные и полносвязные.

Дополнительные техники предобработки

  • Аугментация данных: вращение, масштабирование, отражение, добавление шумов. В ConvNetJS можно вручную изменять матрицы пикселей перед преобразованием в Vol.
  • Преобразование в grayscale: уменьшает глубину Vol до 1, экономит ресурсы и часто повышает стабильность сети.
  • Стандартизация: вычитание среднего и деление на стандартное отклонение для каждого канала отдельно. Это улучшает обучение глубоких сетей.
function standardizeImage(imgData) {
    let mean = imgData.reduce((sum, val) => sum + val, 0) / imgData.length;
    let variance = imgData.reduce((sum, val) => sum + (val - mean) ** 2, 0) / imgData.length;
    let std = Math.sqrt(variance);
    return imgData.map(val => (val - mean) / std);
}

Влияние предобработки на обучение

Правильная предобработка пикселей напрямую влияет на:

  • Скорость сходимости: центрированные и нормализованные данные позволяют градиентам изменяться в более удобном диапазоне.
  • Стабильность: избегается проблема «взрывного» или «затухающего» градиента.
  • Качество модели: стандартизированные изображения помогают сети лучше распознавать особенности без смещения к яркости или контрасту.

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