logo

基于Vue3的前端人脸识别与活体检测实现指南

作者:demo2025.09.19 16:32浏览量:0

简介:本文详述了如何在Vue3项目中集成tracking.js、face.js与face-api.js,实现基础人脸识别及张嘴动作活体检测,涵盖技术选型、核心代码与优化策略。

一、技术选型与背景

在前端领域实现人脸识别与活体检测,需平衡性能、精度与浏览器兼容性。本文选择tracking.js(轻量级图像处理)、face.js(基础人脸检测)与face-api.js(基于TensorFlow.js的高级模型)组合,原因如下:

  1. tracking.js:提供基础的图像色彩追踪与边缘检测能力,适合预处理摄像头输入数据。
  2. face.js:轻量级库,可快速定位人脸关键点(如眼睛、鼻子),但功能有限。
  3. face-api.js:基于预训练的深度学习模型(如SSD、TinyFaceDetector),支持68点人脸关键点检测与动作识别,是活体检测的核心。

活体检测(如“张张嘴”)需通过分析面部动作变化判断是否为真实人脸,而非照片或视频。此方案通过连续帧分析关键点位移计算实现,无需后端支持,适合低安全要求的场景(如考勤、门禁)。

二、环境搭建与依赖安装

1. Vue3项目初始化

  1. npm init vue@latest face-detection-demo
  2. cd face-detection-demo
  3. npm install

2. 安装依赖库

  1. npm install tracking face.js face-api.js
  • tracking.js:用于基础图像处理。
  • face.js:作为备用或辅助检测工具。
  • face-api.js:核心人脸检测与关键点识别库。

3. 引入Webcam API

public/index.html中添加摄像头权限请求:

  1. <video id="video" width="640" height="480" autoplay playsinline></video>
  2. <canvas id="canvas" width="640" height="480"></canvas>

三、核心实现步骤

1. 初始化摄像头与画布

  1. // src/components/FaceDetection.vue
  2. import { onMounted, ref } from 'vue';
  3. import * as faceapi from 'face-api.js';
  4. export default {
  5. setup() {
  6. const videoRef = ref(null);
  7. const canvasRef = ref(null);
  8. onMounted(async () => {
  9. await loadModels();
  10. startVideo();
  11. });
  12. const loadModels = async () => {
  13. const MODEL_URL = '/models'; // 存放预训练模型的目录
  14. await faceapi.nets.tinyFaceDetector.loadFromUri(MODEL_URL);
  15. await faceapi.nets.faceLandmark68Net.loadFromUri(MODEL_URL);
  16. await faceapi.nets.faceRecognitionNet.loadFromUri(MODEL_URL);
  17. };
  18. const startVideo = () => {
  19. navigator.mediaDevices.getUserMedia({ video: {} })
  20. .then(stream => {
  21. videoRef.value.srcObject = stream;
  22. })
  23. .catch(err => console.error('摄像头访问失败:', err));
  24. };
  25. return { videoRef, canvasRef };
  26. }
  27. };

2. 人脸检测与关键点识别

使用face-api.jsTinyFaceDetectorfaceLandmark68Net模型:

  1. const detectFaces = async () => {
  2. const displaySize = { width: videoRef.value.width, height: videoRef.value.height };
  3. faceapi.matchDimensions(canvasRef.value, displaySize);
  4. const detections = await faceapi.detectAllFaces(videoRef.value,
  5. new faceapi.TinyFaceDetectorOptions())
  6. .withFaceLandmarks();
  7. const resizedDetections = faceapi.resizeResults(detections, displaySize);
  8. faceapi.draw.drawDetections(canvasRef.value, resizedDetections);
  9. faceapi.draw.drawFaceLandmarks(canvasRef.value, resizedDetections);
  10. // 提取嘴巴关键点(48-68点)
  11. resizedDetections.forEach(detection => {
  12. const mouthPoints = detection.landmarks.positions.slice(48, 68);
  13. // 计算嘴巴张开程度(示例:上下嘴唇垂直距离)
  14. const mouthOpenness = calculateMouthOpenness(mouthPoints);
  15. if (mouthOpenness > THRESHOLD) {
  16. console.log('张嘴动作检测成功');
  17. }
  18. });
  19. };
  20. // 在setInterval中循环调用detectFaces
  21. setInterval(detectFaces, 100);

3. 活体检测逻辑(张嘴动作)

关键点位移分析

  1. 提取嘴巴区域的17个关键点(48-68点)。
  2. 计算上下嘴唇中点的垂直距离变化:
    1. const calculateMouthOpenness = (points) => {
    2. const upperLip = points[13]; // 上嘴唇中点(约52点)
    3. const lowerLip = points[19]; // 下嘴唇中点(约58点)
    4. return lowerLip.y - upperLip.y; // 距离越大,张嘴越明显
    5. };
  3. 设定阈值(如20像素),连续3帧超过阈值则判定为有效动作。

4. 优化与性能调优

  • 模型选择TinyFaceDetectorSSD更快,适合移动端。
  • 检测频率:降低setInterval间隔(如100ms→200ms)减少CPU占用。
  • Web Worker:将人脸检测逻辑移至Web Worker,避免阻塞UI线程。
  • 模型量化:使用TensorFlow.js的量化模型减小体积。

四、完整代码示例

  1. <template>
  2. <div>
  3. <video ref="video" width="640" height="480" autoplay playsinline></video>
  4. <canvas ref="canvas" width="640" height="480"></canvas>
  5. <p v-if="isMouthOpen">张嘴动作检测成功!</p>
  6. </div>
  7. </template>
  8. <script>
  9. import { onMounted, ref } from 'vue';
  10. import * as faceapi from 'face-api.js';
  11. export default {
  12. setup() {
  13. const videoRef = ref(null);
  14. const canvasRef = ref(null);
  15. const isMouthOpen = ref(false);
  16. const MOUTH_THRESHOLD = 20;
  17. let consecutiveFrames = 0;
  18. const loadModels = async () => {
  19. const MODEL_URL = '/models';
  20. await Promise.all([
  21. faceapi.nets.tinyFaceDetector.loadFromUri(MODEL_URL),
  22. faceapi.nets.faceLandmark68Net.loadFromUri(MODEL_URL)
  23. ]);
  24. };
  25. const startVideo = () => {
  26. navigator.mediaDevices.getUserMedia({ video: {} })
  27. .then(stream => videoRef.value.srcObject = stream)
  28. .catch(err => console.error(err));
  29. };
  30. const detectFaces = async () => {
  31. const displaySize = { width: videoRef.value.width, height: videoRef.value.height };
  32. faceapi.matchDimensions(canvasRef.value, displaySize);
  33. const detections = await faceapi.detectAllFaces(videoRef.value,
  34. new faceapi.TinyFaceDetectorOptions())
  35. .withFaceLandmarks();
  36. const resizedDetections = faceapi.resizeResults(detections, displaySize);
  37. faceapi.draw.drawDetections(canvasRef.value, resizedDetections);
  38. faceapi.draw.drawFaceLandmarks(canvasRef.value, resizedDetections);
  39. resizedDetections.forEach(detection => {
  40. const mouthPoints = detection.landmarks.positions.slice(48, 68);
  41. const mouthOpenness = calculateMouthOpenness(mouthPoints);
  42. if (mouthOpenness > MOUTH_THRESHOLD) {
  43. consecutiveFrames++;
  44. if (consecutiveFrames >= 3) {
  45. isMouthOpen.value = true;
  46. }
  47. } else {
  48. consecutiveFrames = 0;
  49. isMouthOpen.value = false;
  50. }
  51. });
  52. };
  53. const calculateMouthOpenness = (points) => {
  54. const upperLip = points[13];
  55. const lowerLip = points[19];
  56. return lowerLip.y - upperLip.y;
  57. };
  58. onMounted(async () => {
  59. await loadModels();
  60. startVideo();
  61. setInterval(detectFaces, 200);
  62. });
  63. return { videoRef, canvasRef, isMouthOpen };
  64. }
  65. };
  66. </script>

五、部署与注意事项

  1. 模型文件:将face-api.js的模型文件(如tiny_face_detector_model-weight.bin)放入public/models目录。
  2. HTTPS:摄像头访问需在安全上下文(HTTPS或localhost)中运行。
  3. 移动端适配:测试不同设备的性能,必要时降低分辨率。
  4. 错误处理:添加摄像头访问失败的用户提示。

六、总结与扩展

本文通过Vue3集成tracking.jsface.jsface-api.js,实现了前端人脸识别与张嘴动作活体检测。核心步骤包括:

  1. 摄像头初始化与画布绑定。
  2. 加载预训练模型(TinyFaceDetector、FaceLandmark68Net)。
  3. 连续帧分析嘴巴关键点位移。
  4. 阈值判定与状态反馈。

扩展方向

  • 增加眨眼、摇头等动作检测。
  • 结合后端API实现高安全级别验证。
  • 使用WebAssembly优化模型推理速度。

此方案适合快速搭建轻量级人脸识别功能,开发者可根据实际需求调整模型精度与检测逻辑。

相关文章推荐

发表评论