当前位置:   article > 正文

vue2使用face-api.js实现,人脸识别

face-api.js

                由于开发需求要实现人脸识别,顺便在此记录一下,希望给各位前端爱好者带来帮助。

1、安装依赖

        首先,确保你已经安装了Vue.js,并且创建了一个Vue项目。然后,安装face-api.js及其相关依赖。由于face-api.js依赖于TensorFlow.js,你可能还需要安装这个库。可以通过npm或yarn来安装:

npm install face-api.js

这是我安装的版本

2、下载模型文件

face-api.js需要一些预先训练好的模型文件来执行人脸检测和识别。你需要从GitHub仓库中下载这些文件,并放置在项目的public目录下,或者配置一个正确的路径指向这些文件。可以从face-api.js的GitHub页面下载模型。

  1. 在这个页面上,你会看到多个模型文件,例如 ssd_mobilenetv1_model-weights_manifest.jsonface_landmark_68_model-weights_manifest.json 等。为了使用 face-api.js 的不同功能,如人脸检测、特征点定位、表情识别等,你需要下载相应的模型文件。

  2. 你可以手动下载,也可以直接克隆,你也可以私聊我一下我给你发。

    git clone https://github.com/justadudewhohacks/face-api.js.git

    3.克隆完之后你需要把模型文件放到 public下的models没有models自己创建,你也可以自己规定路径,只要路径正确就行。

到此准备工作就做完了,当然你需要配置好vue框架。

3、封装组件

        为了更好地组织代码并使其可复用,我们可以将人脸识别的功能封装成一个Vue组件。下面是一个更完善的示例,展示了如何创建一个名为FaceRecognition.vue的自定义组件,该组件负责处理视频流、人脸检测、以及展示检测结果。完整代码块在这

  1. <template>
  2. <div class="face-recognition">
  3. <video ref="video" width="640" height="480" autoplay></video>
  4. <canvas ref="canvas" width="640" height="480"></canvas>
  5. <div>当前人流量:{{ peopleCount }}</div>
  6. </div>
  7. </template>
  8. <script>
  9. import * as faceapi from 'face-api.js';
  10. export default {
  11. name: 'FaceRecognition',
  12. data() {
  13. return {
  14. isLoaded: false,
  15. lastDetections: [], // 上一帧检测到的人脸
  16. peopleCount: 0, // 当前人流量计数
  17. };
  18. },
  19. mounted() {
  20. this.loadModels();
  21. },
  22. methods: {
  23. async loadModels() {
  24. try {
  25. await Promise.all([
  26. faceapi.nets.faceRecognitionNet.loadFromUri('/models'),
  27. faceapi.nets.faceLandmark68Net.loadFromUri('/models'),
  28. faceapi.nets.ssdMobilenetv1.loadFromUri('/models'),
  29. ]);
  30. this.isLoaded = true;
  31. this.startVideo();
  32. } catch (error) {
  33. console.error('Failed to load models:', error);
  34. }
  35. },
  36. startVideo() {
  37. if (navigator.mediaDevices && this.isLoaded) {
  38. navigator.mediaDevices.getUserMedia({ video: true })
  39. .then(stream => {
  40. this.$refs.video.srcObject = stream;
  41. this.$refs.video.onloadedmetadata = () => {
  42. this.detectFaces();
  43. };
  44. })
  45. .catch(error => console.error('getUserMedia error:', error));
  46. }
  47. },
  48. async detectFaces() {
  49. const video = this.$refs.video;
  50. const canvas = this.$refs.canvas;
  51. const ctx = canvas.getContext('2d');
  52. const detectionOptions = new faceapi.SsdMobilenetv1Options({ minConfidence: 0.9 });
  53. let recentDetections = [];
  54. const detectionHistoryLength = 5;
  55. setInterval(async () => {
  56. if (video.readyState === video.HAVE_ENOUGH_DATA) {
  57. ctx.drawImage(video, 0, 0, canvas.width, canvas.height);
  58. const detections = await faceapi.detectAllFaces(video, detectionOptions).withFaceLandmarks();
  59. // console.log('查看获取帧',validDescriptors)
  60. // 确保只收集有效的面部描述符
  61. const validDescriptors = detections
  62. console.log('查看获取帧',validDescriptors)
  63. recentDetections.push(...validDescriptors.map(face => face.descriptor));
  64. // 限制历史长度并去重
  65. recentDetections = recentDetections.slice(-detectionHistoryLength);
  66. // console.log('查看获取帧',recentDetections)
  67. const uniqueDescriptors = Array.from(new Set(recentDetections));
  68. this.peopleCount = uniqueDescriptors.length; // 直接使用去重后的数组长度,因已排除undefined,无需JSON.stringify和parse
  69. faceapi.draw.drawDetections(canvas, detections);
  70. faceapi.draw.drawFaceLandmarks(canvas, detections);
  71. }
  72. }, 100);
  73. }
  74. },
  75. beforeDestroy() {
  76. // 清理视频流
  77. if (this.$refs.video.srcObject) {
  78. this.$refs.video.srcObject.getTracks().forEach(track => track.stop());
  79. }
  80. },
  81. };
  82. </script>
  83. <style scoped>
  84. .face-recognition {
  85. position: relative;
  86. }
  87. </style>

4、使用组件

创建文件直接引入组件然后注册使用即可

  1. <template>
  2. <div id="app">
  3. <FaceDetection />
  4. </div>
  5. </template>
  6. <script>
  7. import FaceDetection from '@/components/FaceDetection/FaceDetection.vue';
  8. export default {
  9. name: 'App',
  10. components: {
  11. FaceDetection,
  12. },
  13. };
  14. </script>

5、实现逻辑

  • mounted()生命周期钩子中,首先加载模型,然后启动视频流。
  • 创建一个方法如detectFaces()来周期性地从视频流中捕获帧,使用faceapi.detectAllFaces()来检测人脸,并绘制检测结果到<canvas>上。
  • 根据需要,你可以扩展此逻辑来实现更复杂的人脸识别功能,比如与已知人脸匹配等。

6、注意事项

  • 确保你的应用有访问用户媒体设备的权限。
  • 处理好异步加载模型和获取视频流的错误情况。
  • 由于浏览器的安全策略,你可能需要在HTTPS环境下运行此应用,或者在localhost上进行开发。
  • 考虑性能优化,避免频繁的重绘导致的性能问题。

7、实现效果

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/701539
推荐阅读
相关标签
  

闽ICP备14008679号