热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

基于faceapi.js的人脸实时跟踪

疫情期间,公司选择让员工进行远程办公,却又难以监督员工保证他们的工时。所以老板想出了通过摄像头配合人脸识别算法,计算一天内员工在电脑面前的时间占比。项目的Github地址通过浏览器

疫情期间,公司选择让员工进行远程办公,却又难以监督员工保证他们的工时。所以老板想出了通过摄像头配合人脸识别算法,计算一天内员工在电脑面前的时间占比。

项目的Github地址

通过浏览器开启摄像头

这部分代码是在网上找的,需要兼容多种浏览器:

if (navigator.mediaDevices === undefined) { navigator.mediaDevices = {};}if (navigator.mediaDevices.getUserMedia === undefined) { avigator.mediaDevices.getUserMedia = function (constraints) { // 首先,假如有getUserMedia的话,就取得它 var getUserMedia = navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia; // 少量浏览器根本没实现它 - 那么就返回一个error到promise的reject来保持一个统一的接口 if (!getUserMedia) { return Promise.reject(new Error('getUserMedia is not implemented in this browser')); } // 否则,为老的navigator.getUserMedia方法包裹一个Promise return new Promise(function (resolve, reject) { getUserMedia.call(navigator, constraints, resolve, reject); }); }}const cOnstraints= { video: true, audio: false};let promise = navigator.mediaDevices.getUserMedia(constraints);promise.then(stream => { let v = document.getElementById('v'); // 旧的浏览器可能没有srcObject if ("srcObject" in v) { v.srcObject = stream; } else { // 防止再新的浏览器里使用它,应为它已经不再支持了 v.src = window.URL.createObjectURL(stream); } v.Onloadedmetadata= function (e) { v.play(); };}).catch(err => { console.error(err.name + ": " + err.message);})

人脸识别

人脸识别使用的是Github上的一个人脸识别库 face-api.js 。face-api.js可以识别出视频流中人脸的轮廓和表情,调整识别精度等,Github上有详细的使用教程。

// 初始化faceapi.nets.ssdMobilenetv1.loadFromUri(dir),// faceapi.nets.tinyFaceDetector.loadFromUri(dir),faceapi.nets.faceLandmark68Net.loadFromUri(dir),// faceapi.nets.faceRecognitionNet.loadFromUri(dir),// faceapi.nets.faceExpressionNet.loadFromUri(dir) var video = document.getElementById('video');let canvas = faceapi.createCanvasFromMedia(video);document.body.append(canvas);faceapi.matchDimensions(canvas, displaySize);// const optiOns= new faceapi.TinyFaceDetectorOptions({ scoreThreshold: 0.2, inputSize: 608 });const optiOns= new faceapi.SsdMobilenetv1Options({ minConfidence: 0.5, maxResults: 3 });let detectiOns= await faceapi.detectAllFaces(video, options).withFaceLandmarks();// 在画面中显示人脸轮廓描边const resizedDetectiOns= faceapi.resizeResults(detections, displaySize);canvas.getContext('2d').clearRect(0, 0, canvas.width, canvas.height);faceapi.draw.drawDetections(canvas, resizedDetections);faceapi.draw.drawFaceLandmarks(canvas, resizedDetections);

实现实时跟踪

实现实时跟踪的思路就是,通过定时器,每隔1秒钟对当前的图像进行人脸识别并描边,这样间接实现了对视频的实时人脸跟踪,假如想要跟踪速度更加灵敏一点,可以把时间间隔改成0.1秒。

video.addEventListener('play', () => { console.log('play lisetner') canvas = faceapi.createCanvasFromMedia(video); document.body.append(canvas); faceapi.matchDimensions(canvas, displaySize); takePhoto(); setInterval(takePhoto,1000);});async function takePhoto(){ if (!faceapiReady) { return; } let detectiOns= await detect(); draw(detections);}async function detect() { // const optiOns= new faceapi.TinyFaceDetectorOptions({ scoreThreshold: 0.2, inputSize: 608 }); const optiOns= new faceapi.SsdMobilenetv1Options({ minConfidence: 0.5, maxResults: 3 }); const detectiOns= await faceapi.detectAllFaces(video, options).withFaceLandmarks(); return detections;}function draw(detections) { const resizedDetectiOns= faceapi.resizeResults(detections, displaySize); canvas.getContext('2d').clearRect(0, 0, canvas.width, canvas.height); faceapi.draw.drawDetections(canvas, resizedDetections); faceapi.draw.drawFaceLandmarks(canvas, resizedDetections);}

最后,程序会每分钟发送一次识别结果到服务器,服务器最终会计算每个人在一天内第一次的识别时间和最后一次识别时间作为上下班打卡时间,而后计算一天内识别到人脸的比例,可以作为在岗率的参考。

参考资料

  • justadudewhohacks/face-api.js

文章标题:基于浏览器的人脸实时跟踪
文章作者:Ciel Ni
文章链接:http://www.cielni.com/2020/03/07/brower-face-detect/
有问题或者建议欢迎与我联络探讨,转载或者引用希望标明出处,感激不尽!


推荐阅读
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • SpringBoot uri统一权限管理的实现方法及步骤详解
    本文详细介绍了SpringBoot中实现uri统一权限管理的方法,包括表结构定义、自动统计URI并自动删除脏数据、程序启动加载等步骤。通过该方法可以提高系统的安全性,实现对系统任意接口的权限拦截验证。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 预备知识可参考我整理的博客Windows编程之线程:https:www.cnblogs.comZhuSenlinp16662075.htmlWindows编程之线程同步:https ... [详细]
  • 使用nodejs爬取b站番剧数据,计算最佳追番推荐
    本文介绍了如何使用nodejs爬取b站番剧数据,并通过计算得出最佳追番推荐。通过调用相关接口获取番剧数据和评分数据,以及使用相应的算法进行计算。该方法可以帮助用户找到适合自己的番剧进行观看。 ... [详细]
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • 本文总结了Java中日期格式化的常用方法,并给出了示例代码。通过使用SimpleDateFormat类和jstl fmt标签库,可以实现日期的格式化和显示。在页面中添加相应的标签库引用后,可以使用不同的日期格式化样式来显示当前年份和月份。该文提供了详细的代码示例和说明。 ... [详细]
  • Webpack5内置处理图片资源的配置方法
    本文介绍了在Webpack5中处理图片资源的配置方法。在Webpack4中,我们需要使用file-loader和url-loader来处理图片资源,但是在Webpack5中,这两个Loader的功能已经被内置到Webpack中,我们只需要简单配置即可实现图片资源的处理。本文还介绍了一些常用的配置方法,如匹配不同类型的图片文件、设置输出路径等。通过本文的学习,读者可以快速掌握Webpack5处理图片资源的方法。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • switch语句的一些用法及注意事项
    本文介绍了使用switch语句时的一些用法和注意事项,包括如何实现"fall through"、default语句的作用、在case语句中定义变量时可能出现的问题以及解决方法。同时也提到了C#严格控制switch分支不允许贯穿的规定。通过本文的介绍,读者可以更好地理解和使用switch语句。 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • 服务器上的操作系统有哪些,如何选择适合的操作系统?
    本文介绍了服务器上常见的操作系统,包括系统盘镜像、数据盘镜像和整机镜像的数量。同时,还介绍了共享镜像的限制和使用方法。此外,还提供了关于华为云服务的帮助中心,其中包括产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题和视频帮助等技术文档。对于裸金属服务器的远程登录,本文介绍了使用密钥对登录的方法,并提供了部分操作系统配置示例。最后,还提到了SUSE云耀云服务器的特点和快速搭建方法。 ... [详细]
author-avatar
偶说撒浪嘿
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有