【face-api.js】前端实现,人脸捕获、表情识别、年龄性别识别、人脸比对、视频人脸追踪、摄像头人物识别

face-api.js


效果展示

在这里插入图片描述在这里插入图片描述


准备工作

  • 官网看下简介,在线预览看下效果
  • 官方的github文件拷下来
  • npm i face-api.js
  • 把模型文件拷进你的项目
    項目目录结构

主要布局

主要是在图片或视频元素上,盖一个相同大小的canvas

<template>
  <div>
    <!--  图片/视频 捕获区  -->
    <div class="detectBox">
      <img
        v-show="!trackVideoFaces && !trackCameraFaces"
        :src="base64"
        alt=""
        width="500"
        ref="img"
        id="myImg"
        @load="detectFactory"
      >

      <video
        v-if="trackVideoFaces"
        width="500"
        ref="video"
        id="myVideo"
        muted
        playsinline
        preload
        loop
        @durationchange="$refs.video.play()"
        @play="videoStatus = 1"
        @pause="videoStatus = 0"
      >
        <source src="./media/shylock.mp4" type="video/mp4">
        抱歉,您的浏览器不支持嵌入式视频。
      </video>

      <video
        v-if="trackCameraFaces"
        @loadedmetadata=""
        ref="video"
        id="myVideo"
        autoplay
        muted
        playsinline
        @play="videoStatus = 1"
        @pause="videoStatus = 0"
      />

      <canvas ref="canvas" />
    </div>
  </div>
</template>

加载训练模型

import * as faceapi from 'face-api.js';

export default {
	methods: {
	  	// 加载模型
	    init() {
	      const toast = this.$createToast({
	        txt: '模型加载中...',
	        mask: true
	      })
	
	      toast.show();
	
	      // 加载训练好的模型
	      // ageGenderNet:          年龄、性别识别模型,大约420KB
	      // faceExpressionNet:     人脸表情识别模型,识别表情,开心,沮丧,普通,大约310KB
	      // faceLandmark68Net:    68个点人脸地标检测模型(默认模型),大约350KB
	      // faceLandmark68TinyNet:68个点人脸地标检测模型(小模型),大约80KB
	      // faceRecognitionNet:    人脸识别模型,可以比较任意两个人脸的相似性,大约6.2MB
	      // ssdMobilenetv1:       SSD 移动网络 V1,大约5.4MB,准确的最高,推理时间最慢
	      // tinyFaceDetector:      微型人脸检测器(实时人脸检测器),与 SSD Mobilenet V1 人脸检测器相比,它速度更快、体积更小且资源消耗更少,但在检测小人脸方面的表现略逊一筹。移动和网络友好
	      // mtcnn                  大约2MB
	      // tinyYolov2             识别身体轮廓的算法,不知道怎么用
	      Promise.all([
	        faceapi.nets.faceRecognitionNet.loadFromUri('./models'),
	        faceapi.nets.faceLandmark68Net.loadFromUri('./models'),
	        faceapi.nets.faceLandmark68TinyNet.loadFromUri('./models'),
	        faceapi.nets.ssdMobilenetv1.loadFromUri('./models'),
	        faceapi.nets.tinyFaceDetector.loadFromUri('./models'),
	        faceapi.nets.mtcnn.loadFromUri('./models'),
	        faceapi.nets.faceExpressionNet.loadFromUri('./models'),
	        faceapi.nets.ageGenderNet.loadFromUri('./models'),
	        // faceapi.nets.tinyYolov.loadFromUri('./models')
	      ])
	          .then((res) => {
	            this.entryFaces();
	            toast.hide();
	          })
	    },
	},
	mounted () {
    this.init();
  }
}

人脸识别

先是录入一些图片的描述信息,然后比较描述信息,判断人脸的相似度

    /**
     * @description 录入人脸数据
     *
     * 大脸照、黑白照可能识别不出来,可以修改配置,降低人脸的置信度
     * */
    async entryFaces() {
      const imgs = document.querySelectorAll('.faceCompare img');

      for (const img of imgs) {
        /** 注意:这里不能传options,不然会报错 */
        const singleResult = await faceapi
            .detectSingleFace(img)
            .withFaceLandmarks()
            .withFaceDescriptor()
        ;

        this.faces = [
          ...this.faces,
          new faceapi.LabeledFaceDescriptors(
              img.alt,
              [singleResult.descriptor]
          )
        ]
      }
    },

   // 比较相似度
    async compareFaces() {
      const detection1 = await faceapi.detectSingleFace('reference').withFaceLandmarks().withFaceDescriptor();
      const detection2 = await faceapi.detectSingleFace('toCompare').withFaceLandmarks().withFaceDescriptor();

      if (detection1 && detection2) {
        this.similarity = Math.round(faceapi.utils.round(1 - faceapi.euclideanDistance(detection1.descriptor, detection2.descriptor)) * 100);
      } else {
        this.similarity = 0;
      }
    }

人脸检测器

人脸检测器有两种,SSDTiny两种,SSD较大,Tiny用于动态视频检测,精度可能没SSD高,但推算速度快,帧率也高,如果检测不到人脸,可以切换检测器,或者修改配置

	data() {
	return {
		cascadeData: [
	        {
	          value: 'SSD',
	          text: 'SSD',
	          children: [
	            { text: '0.1', value: 0.1 },
	            { text: '0.2', value: 0.2 },
	            { text: '0.3', value: 0.3 },
	            { text: '0.4', value: 0.4 },
	            { text: '0.5', value: 0.5 },
	            { text: '0.6', value: 0.6 },
	            { text: '0.7', value: 0.7 },
	            { text: '0.8', value: 0.8 },
	            { text: '0.9', value: 0.9 },
	          ]
	        },
	        {
	          value: 'Tiny',
	          text: 'Tiny',
	          children: [
	            { text: '0.1', value: 0.1, children: [{ text: '128', value: 128 }, { text: '160', value: 160 }, { text: '224', value: 224 }, { text: '320', value: 320 }, { text: '416', value: 416 }, { text: '512', value: 512 }, { text: '608', value: 608 }] },
	            { text: '0.2', value: 0.2, children: [{ text: '128', value: 128 }, { text: '160', value: 160 }, { text: '224', value: 224 }, { text: '320', value: 320 }, { text: '416', value: 416 }, { text: '512', value: 512 }, { text: '608', value: 608 }] },
	            { text: '0.3', value: 0.3, children: [{ text: '128', value: 128 }, { text: '160', value: 160 }, { text: '224', value: 224 }, { text: '320', value: 320 }, { text: '416', value: 416 }, { text: '512', value: 512 }, { text: '608', value: 608 }] },
	            { text: '0.4', value: 0.4, children: [{ text: '128', value: 128 }, { text: '160', value: 160 }, { text: '224', value: 224 }, { text: '320', value: 320 }, { text: '416', value: 416 }, { text: '512', value: 512 }, { text: '608', value: 608 }] },
	            { text: '0.5', value: 0.5, children: [{ text: '128', value: 128 }, { text: '160', value: 160 }, { text: '224', value: 224 }, { text: '320', value: 320 }, { text: '416', value: 416 }, { text: '512', value: 512 }, { text: '608', value: 608 }] },
	            { text: '0.6', value: 0.6, children: [{ text: '128', value: 128 }, { text: '160', value: 160 }, { text: '224', value: 224 }, { text: '320', value: 320 }, { text: '416', value: 416 }, { text: '512', value: 512 }, { text: '608', value: 608 }] },
	            { text: '0.7', value: 0.7, children: [{ text: '128', value: 128 }, { text: '160', value: 160 }, { text: '224', value: 224 }, { text: '320', value: 320 }, { text: '416', value: 416 }, { text: '512', value: 512 }, { text: '608', value: 608 }] },
	            { text: '0.8', value: 0.8, children: [{ text: '128', value: 128 }, { text: '160', value: 160 }, { text: '224', value: 224 }, { text: '320', value: 320 }, { text: '416', value: 416 }, { text: '512', value: 512 }, { text: '608', value: 608 }] },
	            { text: '0.9', value: 0.9, children: [{ text: '128', value: 128 }, { text: '160', value: 160 }, { text: '224', value: 224 }, { text: '320', value: 320 }, { text: '416', value: 416 }, { text: '512', value: 512 }, { text: '608', value: 608 }] },
	          ]
	        }
	      ]
		}
	}

 	// 配置人脸检测器参数
    getFaceDetectorOptions() {
      const { selectedValue } = this;

      return selectedValue[0] === 'SSD'
          ? new faceapi.SsdMobilenetv1Options({
            minConfidence: selectedValue[1]
          })
          /**
           * @param inputSize?: number
               处理图像的大小,越小越快
               在检测较小的人脸时, 必须被32整除
               常见的大小有128、160、224、320、416、512、608 ,
               用于通过网络摄像头进行人脸跟踪我建议使用较小尺寸的,例如128、160
               用于检测较小的人脸使用较大尺寸的,例如512、608
               默认值: 416
             *  @param scoreThreshold?: number
               最小置信阈值
               默认值:0.5
           *
           * @desc inputSize和scoreThreshold的不同配置,都会影响返回结果的数量
           * */
          : new faceapi.TinyFaceDetectorOptions({
            scoreThreshold: selectedValue[1],
            inputSize: selectedValue[2]
          })
    },

略…

懒得写了,把实现代码拷下来看吧


本地开启https

因为 navigator.mediaDeviceshttp://域名下无法使用,你可以用http://localhost过渡,但是如果想要在手机上预览效果,就需要配置https


手机当电脑的摄像头

手机、电脑下载iVCam

  • 7
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
worker.js 是一个 JavaScript 文件,用于在浏览器中运行后台任务。而 face-api.js 则是一个 JavaScript 库,用于进行人脸识别人脸检测等相关操作。 在 worker.js 中使用 face-api.js,可以通过下面的步骤进行: 1. 首先,需要将 face-api.js 导入到 worker.js 中。可以通过 `<script>` 标签或动态加载脚本的方法进行导入。例如,可以使用 importScripts() 函数将 face-api.js 导入到 worker.js。 2. 导入完成后,可以使用 face-api.js 提供的各种方法和函数进行人脸识别人脸检测等操作。例如,可以使用 faceapi.detectAllFaces() 函数来检测图片中的人脸,并返回相应的人脸信息。 3. 在使用 face-api.js 进行人脸识别人脸检测时,需要提供相应的参数和输入数据。例如,如果要检测一张图片中的人脸,需要将该图片传递给 faceapi.detectAllFaces() 函数进行处理。 4. 在人脸检测或人脸识别完成后,可以使用 face-api.js 提供的其他方法和函数对人脸进行进一步的处理。例如,可以使用 faceapi.drawLandmarks() 函数在检测到的人脸上绘制关键点和轮廓。 总结起来,worker.js 中使用 face-api.js 主要涉及到导入 face-api.js、调用 face-api.js 提供的方法和函数、传递相应的参数和输入数据以及对人脸结果进行进一步处理。通过这些步骤,我们可以在 worker.js 中使用 face-api.js 进行人脸识别人脸检测等相关操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值