Масштабирование, кадрирование и нормализация входных данных

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


Масштабирование изображений

Масштабирование применяется для приведения изображений к фиксированным размерам, необходимым для конкретной модели. В ml5.js большинство моделей, особенно те, что основаны на TensorFlow.js, требуют одинаковых размеров входного тензора. Например, модели классификации изображений (MobileNet, KNNClassifier) работают с изображениями размером 224×224 пикселя.

Пример:

let img = createImg('cat.jpg', () => {
  img.size(224, 224); // масштабирование изображения
});

Ключевые моменты при масштабировании:

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

Кадрирование изображений

Кадрирование позволяет выделить интересующую область изображения, удаляя лишние части, которые могут создавать шум для модели. В ml5.js кадрирование чаще всего выполняется через Canvas API:

let canvas = createGraphics(224, 224);
canvas.image(img, 0, 0, 224, 224, 50, 50, 200, 200); 
// первые 224,224 — размер на канвасе, 
// последние 200,200 — область исходного изображения для кадрирования

Принципы кадрирования:

  • Центральное кадрирование используется, если объект находится в центре изображения.
  • Адаптивное кадрирование полезно при детекции объектов, когда область интереса определяется алгоритмом (например, bounding box).

Нормализация данных

Нормализация приводит значения пикселей к диапазону, который лучше воспринимается нейронной сетью. В ml5.js стандартной практикой является приведение значений в диапазон [0, 1] или [-1, 1], что улучшает сходимость моделей.

Пример нормализации изображения перед подачей в модель:

function normalizeImage(img) {
  img.loadPixels();
  for (let i = 0; i < img.pixels.length; i += 4) {
    img.pixels[i] = img.pixels[i] / 255;     // R
    img.pixels[i + 1] = img.pixels[i + 1] / 255; // G
    img.pixels[i + 2] = img.pixels[i + 2] / 255; // B
    // альфа-канал оставляем без изменений
  }
  img.updatePixels();
}

Важные моменты нормализации:

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

Масштабирование и нормализация числовых данных

Для текстовых или табличных данных, используемых в ml5.js (например, с помощью ml5.neuralNetwork), нормализация и масштабирование не менее важны. Все входные признаки следует привести к единому масштабу, чтобы градиенты при обучении не смещались из-за большой разницы величин.

Пример Min-Max нормализации для числового признака:

function minMaxNormalize(value, min, max) {
  return (value - min) / (max - min);
}

Для стандартной нормализации с нулевым средним и единичной дисперсией (z-score):

function zScoreNormalize(value, mean, std) {
  return (value - mean) / std;
}

Применение этих методов обеспечивает:

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

Потоковые данные и динамическая нормализация

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

Пример с классификацией видео:

const video = createCapture(VIDEO);
video.size(224, 224);

function gotFrame() {
  normalizeVideo(video); // кастомная функция для нормализации
  classifier.classify(video, gotResult);
}

function gotResult(error, results) {
  if (error) {
    console.error(error);
    return;
  }
  console.log(results);
  gotFrame(); // продолжаем поток
}

gotFrame();

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


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