Нормализация входных данных для изображений

Основы нормализации

Нормализация входных данных — ключевой этап подготовки изображений для нейронных сетей. Она обеспечивает:

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

В TensorFlow.js изображения обычно представлены как тензоры с типом данных tf.Tensor. Пиксели могут быть в диапазоне [0, 255] для формата Uint8Array или [0, 1] для нормализованных данных с плавающей точкой (float32).

Приведение пикселей к диапазону [0, 1]

Наиболее распространённая техника — деление каждого значения пикселя на 255:

const tf = require('@tensorflow/tfjs');

// Загрузка изображения
const img = tf.browser.fromPixels(document.getElementById('image'));

// Приведение к диапазону [0,1]
const normalized = img.toFloat().div(tf.scalar(255));
  • toFloat() конвертирует данные из int в float32.
  • div(tf.scalar(255)) делит каждый элемент тензора на 255.

Это важно для активаций типа sigmoid или relu, где большие значения пикселей могут вызывать нестабильность градиентов.

Центрирование и стандартизация

Для некоторых архитектур полезно не только масштабировать данные, но и центрировать их вокруг нуля. Стандартная формула:

[ x_{} = ]

где μ — среднее значение пикселя по всему датасету, а σ — стандартное отклонение.

Пример реализации в TensorFlow.js:

const mean = tf.scalar(0.5);
const std = tf.scalar(0.5);

const standardized = normalized.sub(mean).div(std);

Если данные изначально в диапазоне [0,1], вычитание 0.5 и деление на 0.5 приводит значения к диапазону [-1, 1]. Такой диапазон удобен для свёрточных сетей, особенно при использовании функций активации tanh.

Нормализация при пакетной обработке (batch normalization)

Когда изображения подаются в модель пакетами, важно, чтобы нормализация применялась пакетно, чтобы каждый батч имел одинаковую шкалу. Например, при обучении можно использовать tf.batchNorm или слои BatchNormalization в модели:

const model = tf.sequential();
model.add(tf.layers.conv2d({
    inputShape: [128, 128, 3],
    filters: 32,
    kernelSize: 3,
    activation: 'relu'
}));
model.add(tf.layers.batchNormalization());
  • BatchNormalization корректирует активации на каждом слое, снижая влияние различий в диапазонах входных данных.
  • Этот подход особенно полезен для глубоких сетей с множеством свёрточных и полносвязных слоёв.

Аугментация с нормализацией

Часто нормализация используется совместно с аугментацией изображений — поворотами, отражениями, изменением яркости. Важно применять нормализацию после аугментации, чтобы пиксели оставались в ожидаемом диапазоне:

const augmented = tf.image.flipLeftRight(normalized);

Если нормализация проведена до аугментации, операции изменения яркости или контраста могут привести к выходу за пределы [0,1] или [-1,1], что негативно сказывается на обучении.

Использование предобученных моделей

Многие предобученные модели, например MobileNet или ResNet, требуют конкретной нормализации:

  • MobileNet: диапазон [-1, 1]
  • ResNet: стандартная нормализация по каналам с конкретными средними и стандартными отклонениями

Для TensorFlow.js предобученные модели обычно предоставляют функцию preprocessInput:

import * as mobilenet from '@tensorflow-models/mobilenet';

const imgTensor = tf.browser.fromPixels(imageElement);
const processed = mobilenet.preprocessInput(imgTensor);

Эта функция автоматически приводит изображение к правильному диапазону, упрощая интеграцию с моделью.

Выводы по нормализации

  • Деление на 255 — базовый и обязательный шаг.
  • Центрирование и стандартизация повышают эффективность обучения глубоких сетей.
  • Batch normalization внутри модели помогает контролировать распределение активаций.
  • Аугментацию нужно применять до нормализации, если она предполагает изменение значений пикселей.
  • Предобученные модели требуют специфической нормализации для корректного прогнозирования.

Эффективная нормализация является фундаментом работы с изображениями в TensorFlow.js и напрямую влияет на точность и стабильность обучения нейросетей.