基于 TensorFlow.js 和 Face API 的实时人脸检测

摘要

随着计算机视觉技术的发展,人脸识别已成为众多应用程序中的核心功能。本文将介绍如何利用 TensorFlow.js 和 Face API 创建一个简单的实时人脸检测项目。通过访问用户的摄像头,实时识别并绘制面部特征,为用户提供直观的反馈。

项目概述

本项目的目标是在浏览器中实现实时人脸检测,能够自动识别用户面部特征。用户通过摄像头访问该应用,实时查看检测到的面部框、特征点以及可能的面部表情。此项目展示了前端技术与机器学习的结合,极大地增强了用户体验。

项目效果

传送门

技术栈

  • TensorFlow.js :TensorFlow.js是一个强大的机器学习库,可以在浏览器中运行。它支持模型的训练和推断,使得我们能够在前端环境中实现深度学习功能。
  • Face API :Face API 是一个基于 TensorFlow.js 的库,专门用于面部检测和分析。它提供了一系列的工具和模型,能够检测面部位置、提取特征点以及识别面部表情。
  • Vite :Vite 是一个现代的前端构建工具,可以快速搭建项目。它支持快速热重载和高效的构建流程,使得开发过程更加流畅。
  • HTML5 & CSS :使用 HTML5 和 CSS 构建用户界面,展示视频流和绘制检测结果的 Canvas。
  • JavaScript :使用 JavaScript 控制逻辑和用户交互,包括访问摄像头、调用模型、处理检测结果等。

创建项目

步骤 1:初始化 Vite 项目

  1. 打开终端,运行以下命令来创建一个 Vite 项目:
bash 复制代码
npm create vite@latest face-detection --template vanilla
cd face-detection
npm install
  1. 安装 face-api.js:
bash 复制代码
npm install face-api.js

步骤 2:项目结构 确保项目目录结构如下:

arduino 复制代码
face-detection/
│
├── index.html
├── main.js
├── package.json
├── public/
│   └── models/  (放置人脸检测模型)
└── vite.config.js

步骤 3:下载模型

你可以从 face-api.js 模型仓库 下载模型文件,将这些 .bin 文件和 manifest.json 放到 public/models 文件夹中。

好了,到这里我们已经具备了最基础的一个开发环境,下面让我们来一起实现它。

实现逻辑

1. 加载模型

在页面加载时,通过 loadModels 函数加载所需的面部检测模型,包括 TinyFaceDetector、FaceLandmark68Net 和 FaceRecognitionNet。

2. 设置摄像头

通过 setupCamera 函数访问用户的摄像头,并将视频流呈现在 HTML 的 元素中。

3. 开始检测

使用 startDetection 函数监听视频的播放事件。在视频播放时创建一个 Canvas 元素,以便在其上绘制检测结果。

4. 实时检测

使用 setInterval 定时器每 100 毫秒执行一次面部检测,调用 faceapi.detectAllFaces 方法。检测到的人脸会返回面部位置和特征点等信息,并通过 faceapi.resizeResults 函数调整结果的尺寸。

5. 绘制检测结果

清除 Canvas 上的旧绘图,使用 faceapi.draw.drawDetections 绘制检测到的面部框,使用 faceapi.draw.drawFaceLandmarks 绘制面部特征点。

6. 用户交互

用户在浏览器中实时看到面部检测的结果,展示检测到的面部特征框和点。

项目示例代码

javaScript 复制代码
import * as faceapi from 'face-api.js';

async function loadModels() {
    const MODEL_URL = '/models';
    // 加载必要的模型
    await faceapi.nets.tinyFaceDetector.loadFromUri(MODEL_URL);
    await faceapi.nets.faceLandmark68Net.loadFromUri(MODEL_URL);
    await faceapi.nets.faceRecognitionNet.loadFromUri(MODEL_URL);
    console.log('Models loaded successfully!');
}

async function setupCamera() {
    const video = document.getElementById('video');
    const stream = await navigator.mediaDevices.getUserMedia({ video: {} });
    video.srcObject = stream;
}

function startDetection() {
    const video = document.getElementById('video');
    video.addEventListener('play', () => {
        const canvas = faceapi.createCanvasFromMedia(video);
        document.body.append(canvas);

        const displaySize = { width: video.width, height: video.height };
        faceapi.matchDimensions(canvas, displaySize);
        setInterval(async () => {
            const detections = await faceapi.detectAllFaces(
                video,
                new faceapi.TinyFaceDetectorOptions()
            ).withFaceLandmarks().withFaceDescriptors(); // 也获取面部特征描述符

            const resizedDetections = faceapi.resizeResults(detections, displaySize);

            // 清除 canvas
            canvas.getContext('2d').clearRect(0, 0, canvas.width, canvas.height);

            // 绘制检测到的面部
            faceapi.draw.drawDetections(canvas, resizedDetections);

            // 绘制面部特征点
            faceapi.draw.drawFaceLandmarks(canvas, resizedDetections);

            // 绘制面部特征描述符
            faceapi.draw.drawFaceExpressions(canvas, resizedDetections); // 可选,绘制表情
        }, 100);
    });
}

(async () => {
    await loadModels();
    await setupCamera();
    startDetection();
})();

结果展示

通过上述代码,用户可以在浏览器中实时看到摄像头捕捉到的人脸,以及识别出的面部特征。项目不仅可以用于基础的人脸检测,还可以作为后续更复杂应用的基础,例如面部表情识别或身份验证。

总结

通过本项目,我们可以了解到如何结合 TensorFlow.js 和 Face API 实现实时人脸检测。该项目仅仅是前端技术与深度学习结合的冰山一角,让我们继续挖掘它的强大之处吧!

相关推荐
@PHARAOH20 分钟前
WHAT - Vite 8(Rolldown 底层构建引擎升级)
前端·架构
阿Q的AI笔记23 分钟前
从ReAct到GRPO、从OpenHands到SWE-agent:Agent完整知识体系全拆解
前端·react.js·前端框架
计算机魔术师28 分钟前
从六个月路线图到JIT规划:代码评审不只是审代码
前端
迅猛龙办公室34 分钟前
Python实现PM空气质量提醒
服务器·前端·python
ydjs678899-bot1 小时前
您的Next.js中间件匹配器配置可能会跳过您认为它保护的路由
开发语言·javascript·中间件
Chengbei111 小时前
JsOwl|AI 赋能 JS 敏感信息扫描器,AST + 正则、source‑map 源码还原、登录态爬虫输出交互式 HTML 报告
开发语言·javascript·网络·人工智能·爬虫·网络安全·自动化
鬼手点金2 小时前
模型即 Agent:当模型本身成为产品
开发语言·前端·人工智能·python·机器学习
kiracrimson2 小时前
npm 入门:包管理器、依赖与 npx
前端·npm·node.js
ShineWinsu2 小时前
对于JavaScript:初识JavaScript以及输入输出
java·开发语言·前端·javascript·css·面试·html