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

前端人臉檢測指南

ShapeDetectionAPI的宣布已有一些光陰,其主要的供應的才能是賦予前端直接可用的特徵檢測的接口(包含條形碼、人臉、文本檢測)。本文將簡樸的對其舉行引見,對前端舉行人臉檢

Shape Detection API 的宣布已有一些光陰,其主要的供應的才能是賦予前端直接可用的特徵檢測的接口(包含條形碼、人臉、文本檢測)。本文將簡樸的對其舉行引見,對前端舉行人臉檢測舉行普適性的解說。(本文不講算法~望輕拍)

《前端人臉檢測指南》

1 背景與場景

人臉檢測(Face Detection)算是陳詞濫調的課題了,在諸多行業運用普遍,比方金融、安防、电子商務、智能手機、文娛圖片等行業。个中觸及的手藝也在不停的演化,下面扼要引見幾種思緒:

a. 基於特徵的人臉檢測

比方opencv中內置了基於Viola-Jones目的檢測框架的Harr分類器(實際上大多數分類器都是基於進修獲得的),只須要載入對應的配置文件(haarcascade_frontalface_alt.xml)就能夠直接挪用detectObject去完成檢測歷程,同時也支持其他特徵的檢測(如鼻子、嘴巴等)。

b. 基於進修的人臉檢測,實在也是須要經由過程算子提取的圖象中的部分特徵,經由過程對其舉行分類、統計、回歸等體式格局獲得的具有更準確和快相應的分類器。

2 套路集錦

2.1 後端處置懲罰

前端經由過程收集將資本傳輸到後端,後端一致處置懲罰須要檢測的圖象或視頻流,對後端的架構有肯定的應戰,同時收集的延時每每不能給用戶帶來及時的交互效果。

2.2 客戶端處置懲罰

得益於OpenCV在跨語言和跨平台的上風,客戶端也能以較低的開闢本錢的供應人臉檢測的才能,而且能夠經由過程JsBridge等體式格局向web容器供應效勞,然則一旦離開這個容器,伶仃的頁面將落空這類才能。直到有一天……

2.3 開放效勞

不知道從啥時候最先,雲盤算等觀點拔地而起,盤算的本錢日趨下降。各大研發團隊(如阿里雲、Face++)都捋臂張拳又不緊不慢的上架了人臉檢測效勞,以至還帶上了種種特!殊!服!務!,人臉辨認、活體辨認、證件OCR及人臉對照等等等。

《前端人臉檢測指南》

只管不僅供應了客戶端的SDK以及前後端的API,然則,怎麼說也要講講我純前端的計劃吧。

3 時期帶來了什麼

好吧,人臉辨認在前端依然是在刀耕火種的遠古時期,然則,我們的基礎建設已起步,願望後續的一些相干引見能為列位看官帶來肯定的啟示。

3.1 Shape Detection API

跟着客戶端硬件的盤算才能逐步進步,瀏覽器層面獲得的權限也越來越多,因為圖象處置懲罰須要斲喪大批的盤算資本,實際上瀏覽器上也能負擔圖象檢測的一些事情,因而就搞出了個Shape Detection API。

以下幾個簡樸的例子引見了基礎的用法,在嘗試編輯並運轉這些代碼之前,請確保在你的Chrome版本以及該新特徵已被激活,別的該API受同源戰略所限定:

chrome://flags/#enable-experimental-web-platform-features

條形碼檢測:Barcode Detection (For Chrome 56+)

var barcodeDetector = new BarcodeDetector();
barcodeDetector.detect(image)
.then(barcodes => {
barcodes.forEach(barcode => console.log(barcodes.rawValue))
})
.catch(err => console.error(err));

人臉檢測:Face Detection (For Chrome 56+)

var faceDetector = new FaceDetector();
faceDetector.detect(image)
.then(faces => faces.forEach(face => console.log(face)))
.catch(err => console.error(err));

文本檢測:Text Detection (For Chrome 58+)

var textDetector = new TextDetector();
textDetector.detect(image)
.then(boundingBoxes => {
for(let box of boundingBoxes) {
speechSynthesis.speak(new SpeechSynthesisUtterance(box.rawValue));
}
})
.catch(err => console.error(err));

3.2 圖象中的人臉檢測

圖象的人臉檢測比較簡樸,只須要傳入一個圖片的元素,就能夠直接調起該API舉行人臉辨認了。然後接住canvas我們能夠將檢測的效果展現出來。

中心代碼:

var image = document.querySelector('#image');
var canvas = document.querySelector('#canvas');
var ctx = canvas.getContext("2d");
var scale = 1;
image.Onload= function () {
ctx.drawImage(image, 0, 0, image.width, image.height, 0, 0, canvas.width, canvas.height);
scale = canvas.width / image.width;
};
function detect() {
if (window.FaceDetector == undefined) {
console.error('Face Detection not supported');
return;
}
var faceDetector = new FaceDetector();
console.time('detect');
return faceDetector.detect(image)
.then(faces => {
console.log(faces) // Draw the faces on the .
var ctx = canvas.getContext("2d");
ctx.lineWidth = 2;
ctx.strokeStyle = "red";
for (var i = 0; i var item = faces[i].boundingBox;
ctx.rect(Math.floor(item.x * scale), Math.floor(item.y * scale), Math.floor(item.width * scale), Math.floor(item.height * scale));
ctx.stroke();
}
console.timeEnd('detect');
})
.catch((e) => console.error("Boo, Face Detection failed: " + e));
}

處置懲罰效果:

《前端人臉檢測指南》

3.3 視頻中的人臉檢測

視頻中的人臉檢測跟圖象相差不大,經由過程

getUserMedia 能夠翻開攝像頭獵取視頻/麥克風的信息,經由過程將視頻幀舉行檢測和展現,即可完成視頻中的人臉檢測。

中心代碼以下:

navigator.mediaDevices.getUserMedia({
video: true, // audio: true
})
.then(function (mediaStream) {
video.src = window.URL.createObjectURL(mediaStream);
video.Onloadedmetadata= function (e) {
// Do something with the video here.
};
})
.catch(function (error) {
console.log(error.name);
});
setInterval(function () {
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.drawImage(video, 0, 0);
image.src = canvas.toDataURL('image/png');
image.Onload= function() {
detect();
}
}, 60);

處置懲罰效果:

《前端人臉檢測指南》

3.4 時光倒流到沒有API的日子

實際上,在良久良久以前,也有不少解決計劃存在。因為硬件前提以及沒有硬件加速等限定的狀況,一向沒有被普遍地投入生產。

a. tracking.js

tracking.js 是一款js封裝的圖象處置懲罰的庫,為瀏覽器帶來雄厚的盤算視覺相干的算法和手藝,經由過程它能夠完成色彩追蹤、人臉檢測等功能,詳細特徵以下:

《前端人臉檢測指南》

b. jquery.facedetection

jquery.facedetection 是一款jquery / zepto 人臉檢測插件,基於跨終端才能超強的ccv中的圖象分類器和檢測器。

3.5 Node.js & OpenCV

node-opencv 模塊已宣布了有些歲首,只管現在還不能圓滿兼容v3.x,供應的API也比較有限,但能圓滿兼容opencv v2.4.x。N-API的到來可能會帶來更多的欣喜。

想象一下在一個Electron或許Node-Webkit容器中,我們是不是能夠經由過程當地開啟websocket效勞來完成及時的人臉檢測呢?完成的思緒代碼以下:

後端處置懲罰邏輯

import cv from 'opencv';
const detectCOnfigFile= './node_modules/opencv/data/haarcascade_frontalface_alt2.xml';
// camera properties
const camWidth = 320;
const camHeight = 240;
const camFps = 10;
const camInterval = 1000 / camFps;
// face detection properties
const rectColor = [0, 255, 0];
const rectThickness = 2;
// initialize cameraconst camera = new cv.VideoCapture(0);
camera.setWidth(camWidth);
camera.setHeight(camHeight);
const frameHandler = (err, im) => {
return new Promise((resolve, reject) => {
if (err) {
return reject(err);
}
im.detectObject(detectConfigFile, {}, (error, faces) => {
if (error) {
return reject(error);
}
let face;
for (let i = 0; i face = faces[i];
im.rectangle([face.x, face.y], [face.width, face.height], rectColor, rectThickness);
}
return resolve(im);
});
});
};
module.exports = function (socket) {
const frameSocketHanlder = (err, im) => {
return frameHandler(err, im)
.then((img) => {
socket.emit('frame', {
buffer: img.toBuffer(),
});
});
};
const handler = () => {
camera.read(frameSocketHanlder);
};
setInterval(handler, camInterval);
};

前端挪用接口

socket.on('frame', function (data) {
var unit8Arr = new Uint8Array(data.buffer);
var str = String.fromCharCode.apply(null, unit8Arr);
var base64String = btoa(str);
img.Onload= function () {
ctx.drawImage(this, 0, 0, canvas.width, canvas.height);
}
img.src = 'data:image/png;base64,' + base64String;
});

4.1 將來的生長

這些前沿的手藝將會在前端獲得更加普遍的運用和支持是毋庸置疑的,將來的圖象在前端也會跟着傳統圖象處置懲罰->進修+圖象處置懲罰的體式格局行進,這一切的勞績離不開基礎設施(硬件、瀏覽器、東西、庫等)的逐步加強和完美,个中包含但不僅限於:

  • getUserMedia/Canvas => 圖象 / 視頻的操縱
  • Shape Detection API => 圖象檢測
  • Web Workers => 并行盤算才能
  • COnvNetJS=> 深度進修框架
  • Tensorflow (原 DeeplearnJS) => 正大力支持 JS

4.2 實際上並沒有那末樂觀

4.2.1 準確率

關於正臉(多個)的辨認率照樣比較高的,然則在側臉已有障礙物的狀況下,檢測的效果並不抱負。

4.2.2 處置懲罰速率

關於圖象中人臉檢測的例子2.2,斲喪時候300ms+(實際上沒法滿足大分辨率視頻及時處置懲罰),是挪用Opencv的檢測速率100ms的三倍之多。

4.2.3 特徵

另有許多須要完美的處所:如不支持眼鏡狀況、性別、歲數預計、臉色辨認、人種、笑顏、隱約檢測等主流效勞供應商供應的效勞。

4.3 想說又說不完的

a. 本文中所有樣例的源代碼,迎接 Fork / Star:

https://github.com/x-cold/fac…

https://github.com/x-cold/fac…

b. 關於人臉檢測在差別場景的適應性,以及檢測斲喪的時候臨時沒有數據支持,背面斟酌引入PASCAL VOC、AT&T供應的樣本舉行小規模的測試。

5 參考

  1. 人臉辨認手藝大總結(1):Face Detection & Alignment: http://blog.jobbole.com/85783/
  2. 阿里巴巴直播防控中的實人認證手藝: https://xianzhi.aliyun.com/fo…
  3. 前端在人工智能時期能做些什麼?:https://yq.aliyun.com/article…
  4. ConvNetJS Deep Learning in your browser:http://cs.stanford.edu/people…
  5. Face detection using Shape Detection API:https://paul.kinlan.me/face-d…

《前端人臉檢測指南》


推荐阅读
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • Webpack5内置处理图片资源的配置方法
    本文介绍了在Webpack5中处理图片资源的配置方法。在Webpack4中,我们需要使用file-loader和url-loader来处理图片资源,但是在Webpack5中,这两个Loader的功能已经被内置到Webpack中,我们只需要简单配置即可实现图片资源的处理。本文还介绍了一些常用的配置方法,如匹配不同类型的图片文件、设置输出路径等。通过本文的学习,读者可以快速掌握Webpack5处理图片资源的方法。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • ASP.NET2.0数据教程之十四:使用FormView的模板
    本文介绍了在ASP.NET 2.0中使用FormView控件来实现自定义的显示外观,与GridView和DetailsView不同,FormView使用模板来呈现,可以实现不规则的外观呈现。同时还介绍了TemplateField的用法和FormView与DetailsView的区别。 ... [详细]
  • 本文记录了在vue cli 3.x中移除console的一些采坑经验,通过使用uglifyjs-webpack-plugin插件,在vue.config.js中进行相关配置,包括设置minimizer、UglifyJsPlugin和compress等参数,最终成功移除了console。同时,还包括了一些可能出现的报错情况和解决方法。 ... [详细]
  • 本文由编程笔记小编整理,主要介绍了使用Junit和黄瓜进行自动化测试中步骤缺失的问题。文章首先介绍了使用cucumber和Junit创建Runner类的代码,然后详细说明了黄瓜功能中的步骤和Steps类的实现。本文对于需要使用Junit和黄瓜进行自动化测试的开发者具有一定的参考价值。摘要长度:187字。 ... [详细]
  • NotSupportedException无法将类型“System.DateTime”强制转换为类型“System.Object”
    本文介绍了在使用LINQ to Entities时出现的NotSupportedException异常,该异常是由于无法将类型“System.DateTime”强制转换为类型“System.Object”所导致的。同时还介绍了相关的错误信息和解决方法。 ... [详细]
  • 本文介绍了Java集合库的使用方法,包括如何方便地重复使用集合以及下溯造型的应用。通过使用集合库,可以方便地取用各种集合,并将其插入到自己的程序中。为了使集合能够重复使用,Java提供了一种通用类型,即Object类型。通过添加指向集合的对象句柄,可以实现对集合的重复使用。然而,由于集合只能容纳Object类型,当向集合中添加对象句柄时,会丢失其身份或标识信息。为了恢复其本来面貌,可以使用下溯造型。本文还介绍了Java 1.2集合库的特点和优势。 ... [详细]
  • 本文介绍了一种求解最小权匹配问题的方法,使用了拆点和KM算法。通过将机器拆成多个点,表示加工的顺序,然后使用KM算法求解最小权匹配,得到最优解。文章给出了具体的代码实现,并提供了一篇题解作为参考。 ... [详细]
  • 本文介绍了如何使用MATLAB调用摄像头进行人脸检测和识别。首先需要安装扩展工具,并下载安装OS Generic Video Interface。然后使用MATLAB的机器视觉工具箱中的VJ算法进行人脸检测,可以直接调用CascadeObjectDetector函数进行检测。同时还介绍了如何调用摄像头进行人脸识别,并对每一帧图像进行识别。最后,给出了一些相关的参考资料和实例。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了源码分析--ConcurrentHashMap与HashTable(JDK1.8)相关的知识,希望对你有一定的参考价值。  Concu ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
author-avatar
奎奎201277
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有