TensorFlow.js предоставляет мощные инструменты для работы с
потоковыми данными, включая аудио и видео, через модуль
tf.data. Использование tf.data позволяет
создавать эффективные конвейеры обработки данных, минимизируя задержки и
оптимизируя использование памяти при обучении моделей в браузере или на
сервере с Node.js.
Для работы с микрофоном и веб-камерой данные поступают в реальном времени. Основная задача — превратить поток мультимедиа в тензоры, с которыми может работать TensorFlow.js.
Аудио:
navigator.mediaDevices.getUserMedia({ audio: true }).AudioBuffer, который затем
можно конвертировать в Float32Array.tf.tensor или
tf.data.generator для создания датасета из непрерывного
потока данных.Видео:
navigator.mediaDevices.getUserMedia({ video: true })
создается видеопоток.<canvas> для получения данных пикселей.[height, width, channels].tf.data.Dataset из микрофонаИспользование tf.data.generator позволяет превратить
аудиопоток в потоковой датасет.
function* audioGenerator(stream) {
const audioContext = new AudioContext();
const source = audioContext.createMediaStreamSource(stream);
const processor = audioContext.createScriptProcessor(1024, 1, 1);
source.connect(processor);
processor.connect(audioContext.destination);
processor.onaudioproc ess = (event) => {
const inputData = event.inputBuffer.getChannelData(0);
yield tf.tensor(inputData);
};
}
const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
const audioDataset = tf.data.generator(() => audioGenerator(stream));
Особенности:
.batch():const batchedAudio = audioDataset.batch(32);
tf.data.Dataset из веб-камерыДля видео применяется аналогичный подход, только кадры поступают из
HTML <video> элемента.
async function* videoGenerator(videoElement) {
const canvas = document.createElement('canvas');
const ctx = canvas.getContext('2d');
canvas.width = videoElement.videoWidth;
canvas.height = videoElement.videoHeight;
while (true) {
ctx.drawImage(videoElement, 0, 0, canvas.width, canvas.height);
const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
const tensor = tf.browser.fromPixels(imageData).toFloat().div(tf.scalar(255));
yield tensor;
await tf.nextFrame(); // синхронизация с кадрами
}
}
const video = document.createElement('video');
video.autoplay = true;
const stream = await navigator.mediaDevices.getUserMedia({ video: true });
video.srcObject = stream;
const videoDataset = tf.data.generator(() => videoGenerator(video));
Особенности:
tf.browser.fromPixels для конвертации
пикселей в тензор.div(tf.scalar(255))) для
перевода значений в диапазон [0, 1]..map():const augmentedVideo = videoDataset.map(frame => tf.image.flipLeftRight(frame));
Для мультимодальных моделей часто требуется объединять данные с
микрофона и веб-камеры. В TensorFlow.js это реализуется через
tf.data.zip.
const multimodalDataset = tf.data.zip({ audio: batchedAudio, video: augmentedVideo });
Преимущества:
multimodalDataset.forEachAsync(({ audio, video }) => {
const prediction = model.predict([audio, video]);
});
Буферизация: Использование .prefetch()
уменьшает задержки при обучении:
const optimizedDataset = videoDataset.batch(16).prefetch(2);
Асинхронная генерация: Генераторы должны быть асинхронными, если требуется ждать новых кадров или аудио-буферов.
Очистка ресурсов: После завершения работы важно останавливать потоки:
stream.getTracks().forEach(track => track.stop());
Использование tf.data позволяет обучать модели на живом
потоке данных:
Потоковые данные интегрируются напрямую в
model.fitDataset(), что позволяет обучать модели на данных
в реальном времени без предварительного сохранения датасета на диск:
await model.fitDataset(multimodalDataset, {
epochs: 10,
batchesPerEpoch: 100
});
tf.data.generator — основной инструмент для потоковой
обработки мультимедиа.batch, map, zip,
prefetch — ключевые методы для управления потоками и
оптимизации.Работа с микрофоном и веб-камерой через tf.data в
TensorFlow.js открывает возможности для создания интерактивных,
динамических моделей прямо в браузере или Node.js, сохраняя высокую
производительность и гибкость обработки данных.