Аугментация изображений

Аугментация изображений — это процесс искусственного увеличения объёма тренировочного датасета путём применения разнообразных трансформаций к исходным изображениям. В TensorFlow.js аугментация может применяться как на этапе подготовки данных, так и динамически во время обучения модели, что позволяет повышать её устойчивость к вариациям входных данных и улучшать обобщающую способность.

Работа с TensorFlow.js и изображениями

Для работы с изображениями в TensorFlow.js основными структурами данных являются tf.Tensor и tf.data.Dataset. Изображения чаще всего представлены в виде тензоров размерности [высота, ширина, каналы], где каналы соответствуют компонентам цвета (RGB).

Загрузка изображений выполняется с помощью tf.browser.fromPixels(), которая конвертирует HTML-элемент <img> или <canvas> в тензор. Например:

const imgElement = document.getElementById('image');
const imgTensor = tf.browser.fromPixels(imgElement).toFloat().div(tf.scalar(255));

Нормализация значений в диапазон [0, 1] является стандартной практикой для работы с нейронными сетями.

Геометрические преобразования

Геометрическая аугментация включает изменения положения, ориентации и размера изображения. Основные операции:

  1. Поворот (Rotation) Используется функция tf.image.rotateWithOffset, позволяющая вращать изображение на произвольный угол (в радианах).

    const radians = Math.PI / 6; // 30 градусов
    const rotated = tf.image.rotateWithOffset(imgTensor, radians, 0, 0);
  2. Масштабирование и изменение размера (Resize, Zoom) Функции tf.image.resizeBilinear и tf.image.resizeNearestNeighbor позволяют изменять размеры изображений с сохранением пропорций или с обрезкой.

    const resized = tf.image.resizeBilinear(imgTensor, [128, 128]);
  3. Отражение и перевороты (Flip, Mirror)

    • tf.image.flipLeftRight — горизонтальное отражение
    • tf.image.flipUpDown — вертикальное отражение
    const flipped = tf.image.flipLeftRight(imgTensor);
  4. Сдвиг (Translation) Для сдвига изображения применяются операции tf.image.translate через аффинные матрицы. Это позволяет сдвигать изображение по X и Y координатам без потери данных.

Цветовые преобразования

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

  1. Изменение яркости (Brightness)

    const brighter = tf.image.adjustBrightness(imgTensor, 0.2);
  2. Контраст (Contrast)

    const contrastImg = tf.image.adjustContrast(imgTensor, 1.5);
  3. Насыщенность (Saturation)

    const saturated = tf.image.adjustSaturation(imgTensor, 2.0);
  4. Гамма-коррекция (Gamma) Для нелинейной коррекции яркости:

    const gammaAdjusted = tf.pow(imgTensor, tf.scalar(0.8));

Комбинирование аугментаций

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

function augmentImage(imgTensor) {
  return tf.tidy(() => {
    let result = imgTensor;
    result = tf.image.flipLeftRight(result);
    result = tf.image.adjustBrightness(result, Math.random() * 0.3 - 0.15);
    result = tf.image.adjustContrast(result, 0.5 + Math.random());
    const angle = (Math.random() - 0.5) * Math.PI / 4;
    result = tf.image.rotateWithOffset(result, angle, 0, 0);
    return result;
  });
}

Использование tf.tidy() освобождает память после выполнения каждой трансформации, что критично при работе с большим количеством изображений.

Динамическая аугментация на этапе обучения

Для повышения эффективности аугментация выполняется на лету во время обучения через tf.data.Dataset.map():

const dataset = tf.data.generator(imageGenerator)
  .map(({xs, ys}) => {
    return {xs: augmentImage(xs), ys};
  })
  .batch(32);

Это позволяет создавать неограниченное количество вариаций изображений без необходимости хранить их на диске.

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

  • Аугментация должна соответствовать реальным вариациям данных: например, переворот по вертикали для изображений лиц не всегда уместен.
  • Комбинирование нескольких методов увеличивает разнообразие данных, но слишком агрессивные преобразования могут исказить признаки и ухудшить обучение.
  • Для контроля качества и отладки полезно визуализировать результаты аугментации перед подачей в модель.

Вывод

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