Детекция объектов — задача компьютерного зрения, направленная на определение наличия объектов на изображении, их классификацию и локализацию с помощью ограничивающих рамок (bounding boxes). TensorFlow.js позволяет реализовать детекцию объектов прямо в браузере или на сервере с использованием JavaScript, что открывает возможности для интерактивных веб-приложений и визуализаций.
Модели детекции объектов обычно строятся на основе сверточных нейронных сетей (CNN) и включают два основных подхода:
Одностадийные модели (One-Stage Detection) Примеры: YOLO, SSD. Отличие заключается в том, что модель сразу предсказывает координаты ограничивающих рамок и классы объектов без промежуточного этапа предложения регионов. Этот подход обеспечивает высокую скорость, что важно для веб-приложений и мобильных устройств.
Двухстадийные модели (Two-Stage Detection) Примеры: Faster R-CNN. Сначала генерируются предложения регионов, затем каждый регион классифицируется и уточняется. Двухстадийные модели обычно точнее, но медленнее.
TensorFlow.js поддерживает оба подхода через портированные модели из
TensorFlow и готовые модели, доступные в
@tensorflow-models.
TensorFlow.js предоставляет несколько готовых моделей детекции
объектов, среди которых coco-ssd и mobilenet.
Основные шаги:
import * as tf from '@tensorflow/tfjs';
import * as cocossd from '@tensorflow-models/coco-ssd';
async function detectObjects(imageElement) {
const model = await cocossd.load();
const predictions = await model.detect(imageElement);
predictions.forEach(prediction => {
console.log(`Объект: ${prediction.class}, вероятность: ${prediction.score}`);
console.log(`Координаты: x=${prediction.bbox[0]}, y=${prediction.bbox[1]}, width=${prediction.bbox[2]}, height=${prediction.bbox[3]}`);
});
}
Ключевые моменты:
cocossd.load() загружает предобученную модель
COCO-SSD.detect() принимает HTML-элемент
<img>, <video> или
<canvas> и возвращает массив объектов с полями
class, score и bbox.bbox — массив [x, y, width, height],
задающий ограничивающую рамку объекта.Для обучения собственной модели детекции объектов требуется:
tf.browser.fromPixels(image) для преобразования изображения
в тензор с формой [height, width, 3].[0, 1] или [-1, 1] в зависимости от
модели.Пример преобразования:
const imgTensor = tf.browser.fromPixels(imageElement).toFloat().div(255.0);
const batched = imgTensor.expandDims(0); // добавление батч-размера
Можно использовать сверточные слои с несколькими выходами: один для координат ограничивающей рамки, другой для вероятностей классов.
const model = tf.sequential();
model.add(tf.layers.conv2d({inputShape: [224, 224, 3], filters: 16, kernelSize: 3, activation: 'relu'}));
model.add(tf.layers.maxPooling2d({poolSize: 2}));
model.add(tf.layers.conv2d({filters: 32, kernelSize: 3, activation: 'relu'}));
model.add(tf.layers.flatten());
model.add(tf.layers.dense({units: 4, activation: 'linear'})); // координаты bbox
model.add(tf.layers.dense({units: numClasses, activation: 'softmax'})); // классы
Для детекции обычно комбинируют два типа потерь:
categoricalCrossentropy).const loss = (yTrue, yPred) => {
const locLoss = tf.losses.meanSquaredError(yTrue.bbox, yPred.bbox);
const clsLoss = tf.losses.softmaxCrossEntropy(yTrue.classes, yPred.classes);
return locLoss.add(clsLoss);
};
model.compile({optimizer: 'adam', loss: loss});
await model.fit(trainDataset, {
epochs: 50,
validationData: valDataset,
});
Для детекции объектов в реальном времени важно учитывать производительность:
tf.tidy() для очистки промежуточных тензоров
и уменьшения утечек памяти.tf.setBackend('webgl')).Для отображения bounding box на изображении удобно использовать
<canvas>:
const ctx = canvas.getContext('2d');
ctx.drawImage(imageElement, 0, 0);
predictions.forEach(prediction => {
ctx.strokeStyle = 'red';
ctx.lineWidth = 2;
ctx.strokeRect(prediction.bbox[0], prediction.bbox[1], prediction.bbox[2], prediction.bbox[3]);
ctx.fillStyle = 'red';
ctx.fillText(`${prediction.class} (${(prediction.score*100).toFixed(1)}%)`, prediction.bbox[0], prediction.bbox[1] - 5);
});
TensorFlow.js позволяет использовать детекцию объектов для:
Эта библиотека обеспечивает сочетание высокой производительности и гибкости, позволяя работать как с готовыми моделями, так и создавать собственные решения.