TensorFlow.js предоставляет мощные средства для обработки изображений и видео в браузере с использованием моделей машинного обучения. Две важные модели для распознавания анатомических особенностей человека — HandPose и FaceMesh. Они позволяют детектировать руки и лицо в режиме реального времени, что используется в приложениях дополненной реальности, жестового управления и анализа выражений лица.
Для работы с моделями необходимо подключить библиотеку TensorFlow.js и соответствующие модели через CDN или npm.
// Подключение TensorFlow.js
<script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@latest"></script>
// Подключение HandPose
<script src="https://cdn.jsdelivr.net/npm/@tensorflow-models/handpose"></script>
// Подключение FaceMesh
<script src="https://cdn.jsdelivr.net/npm/@tensorflow-models/facemesh"></script>
Для проектов на Node.js используется установка через npm:
npm install @tensorflow/tfjs @tensorflow-models/handpose @tensorflow-models/facemesh
После установки модули импортируются:
import * as tf from '@tensorflow/tfjs';
import * as handpose from '@tensorflow-models/handpose';
import * as facemesh from '@tensorflow-models/facemesh';
Модель HandPose обучена распознавать 21 ключевую точку руки, включая суставы пальцев и ладонь. Основная последовательность загрузки:
const model = await handpose.load();
console.log("HandPose модель загружена");
FaceMesh использует 468 ключевых точек для моделирования лица с высокой точностью. Загрузка модели выполняется аналогично:
const model = await facemesh.load();
console.log("FaceMesh модель загружена");
Для детекции необходимо передать в модель видеопоток с камеры:
const video = document.createElement('video');
async function setupCamera() {
const stream = await navigator.mediaDevices.getUserMedia({ video: true });
video.srcObject = stream;
return new Promise((resolve) => {
video.onloadedmetad ata = () => {
video.play();
resolve(video);
};
});
}
await setupCamera();
async function detectHands(video, model) {
const predictions = await model.estimateHands(video);
if (predictions.length > 0) {
predictions.forEach((hand) => {
hand.landmarks.forEach((point, i) => {
console.log(`Точка ${i}: [${point[0]}, ${point[1]}, ${point[2]}]`);
});
});
}
}
landmarks — массив координат [x, y, z], где
x и y — пиксели на видео, z —
глубина относительно камеры.
async function detectFace(video, model) {
const predictions = await model.estimateFaces({ input: video });
predictions.forEach((face, index) => {
face.scaledMesh.forEach((point, i) => {
console.log(`Точка ${i}: [${point[0]}, ${point[1]}, ${point[2]}]`);
});
});
}
scaledMesh — массив координат с масштабированием под
размер изображения.
Использование HTML Canvas позволяет отобразить результаты предсказания в реальном времени.
const canvas = document.createElement('canvas');
const ctx = canvas.getContext('2d');
document.body.appendChild(canvas);
function drawKeypoints(points) {
ctx.clearRect(0, 0, canvas.width, canvas.height);
points.forEach((point) => {
ctx.beginPath();
ctx.arc(point[0], point[1], 3, 0, 2 * Math.PI);
ctx.fillStyle = 'red';
ctx.fill();
});
}
Для HandPose и FaceMesh необходимо передавать соответствующие массивы
landmarks и scaledMesh.
await tf.setBackend('webgl');
| Модель | Количество точек | Основное применение | Производительность |
|---|---|---|---|
| HandPose | 21 | Жестовое управление, VR/AR руки | Высокая |
| FaceMesh | 468 | Мимика, AR маски, трекинг лица | Средняя |
Эти модели можно комбинировать для комплексного взаимодействия с пользователем, например, управление объектами с помощью жестов рук при сохранении отслеживания лица для реакций или AR-фильтров.