Работа с изображениями является одной из ключевых задач при использовании TensorFlow.js. Для большинства моделей глубокого обучения входными данными являются тензоры, представляющие изображение в числовом виде. Понимание процесса преобразования изображений в тензоры позволяет эффективно интегрировать визуальные данные в модели машинного обучения на JavaScript.
Изображения могут быть представлены в различных форматах: PNG, JPEG,
GIF и других. Для обработки в TensorFlow.js изображения необходимо
представить в виде тензоров rank-3 (для цветных
изображений) или rank-2 (для градаций серого). Цветные
изображения имеют форму [высота, ширина, каналы], где
каналы обычно равны 3 (RGB) или 4 (RGBA). Градации серого требуют одного
канала.
Ключевые моменты:
tf.tensor поддерживает
типы float32, int32 и bool. Для
изображений чаще всего используется float32 с нормализацией
значений от 0 до 1.[H, W, C] (высота, ширина, каналы), в отличие от некоторых
библиотек, где используется [C, H, W].Основной способ работы с изображениями в браузере — через элементы
<img>, <canvas> или
<video>. TensorFlow.js предоставляет функцию
tf.browser.fromPixels(), которая конвертирует изображение в
тензор.
Пример:
const imgElement = document.getElementById('myImage');
const tensor = tf.browser.fromPixels(imgElement);
console.log(tensor.shape); // [высота, ширина, 3]
Особенности использования:
fromPixels() поддерживает объекты
ImageData, HTMLImageElement,
HTMLCanvasElement, HTMLVideoElement.int32 по умолчанию. Для
большинства моделей требуется преобразование к float32 и
нормализация:const normalized = tensor.toFloat().div(tf.scalar(255));
tf.image.resizeBilinear():const resized = tf.image.resizeBilinear(normalized, [224, 224]);
Для загрузки изображений с локальной файловой системы используется
API FileReader. После чтения содержимого создаётся элемент
Image:
const input = document.getElementById('fileInput');
input.addEventListener('change', (event) => {
const file = event.target.files[0];
const reader = new FileReader();
reader.onl oad = () => {
const img = new Image();
img.src = reader.result;
img.onl oad = () => {
const tensor = tf.browser.fromPixels(img).toFloat().div(tf.scalar(255));
console.log(tensor.shape);
};
};
reader.readAsDataURL(file);
});
Преимущества такого подхода:
tfjs-node для серверной загрузкиДля Node.js существует модуль @tensorflow/tfjs-node,
который позволяет работать с изображениями напрямую из файловой системы
без HTML-элементов. Основные функции:
tf.node.decodeImage() — преобразует буфер изображения в
тензор.Пример:
const fs = require('fs');
const tf = require('@tensorflow/tfjs-node');
const imageBuffer = fs.readFileSync('image.jpg');
const tensor = tf.node.decodeImage(imageBuffer, 3).toFloat().div(tf.scalar(255));
console.log(tensor.shape); // [высота, ширина, 3]
Особенности:
3 указывает количество каналов
(RGB).tf.image.resizeBilinear() для
масштабирования.tf.tensor позволяет интегрировать тензор в
любые модели TensorFlow.js.Модели глубокого обучения часто требуют конкретной формы тензора. Общие шаги подготовки изображения:
const resized = tf.image.resizeBilinear(tensor, [224, 224]);
const normalized = resized.div(tf.scalar(255));
const batched = normalized.expandDims(0); // [1, 224, 224, 3]
Эти действия обеспечивают корректный ввод для большинства предобученных моделей, включая MobileNet, ResNet и EfficientNet.
tf.data для работы с потоками изображенийДля обучения моделей на множестве изображений используется API
tf.data. Основные возможности:
Пример:
const imagePaths = ['img1.jpg', 'img2.jpg', 'img3.jpg'];
const ds = tf.data.generator(function* () {
for (const path of imagePaths) {
const imgBuffer = fs.readFileSync(path);
const tensor = tf.node.decodeImage(imgBuffer, 3).toFloat().div(tf.scalar(255));
yield tensor;
}
}).batch(2);
ds.forEachAsync(batch => {
console.log(batch.shape);
});
tf.image.resizeBilinear() перед передачей в модель, чтобы
уменьшить потребление памяти.tf.tidy() для автоматического освобождения
ненужных тензоров:tf.tidy(() => {
const tensor = tf.browser.fromPixels(img).toFloat().div(tf.scalar(255));
const resized = tf.image.resizeBilinear(tensor, [224, 224]);
// работа с resized
});
tf.data или
Promise.all() при загрузке множества изображений.Загрузка изображений в тензоры в TensorFlow.js обеспечивает гибкость и совместимость с различными источниками данных, позволяя реализовать сложные модели компьютерного зрения как в браузере, так и на серверной платформе Node.js.