当前位置: 首页 > 后端技术 > Node.js

前端人脸检测指南

时间:2023-04-03 17:31:37 Node.js

ShapeDetectionAPI已经发布有一段时间了,主要能力是给前端直接可用的特征检测接口(包括条形码、人脸、文字检测)。本文将简单介绍一下,并对前端人脸检测做一个大概的说明。(本文不谈算法~希望拍拍)1背景与场景人脸检测(FaceDetection)是一个常见的话题,广泛应用于金融、安防、电商、智能手机、娱乐影业等行业。所涉及的技术也在不断发展。这里有一些想法:基于特征的人脸检测比如opencv内置了基于Viola-Jones目标检测框架的Harr分类器(其实大部分分类器都是基于学习的),你只需要加载相应的配置文件(haarcascade_frontalface_alt.xml)直接调用detectObject完成检测过程,同时也支持检测其他特征(如鼻子、嘴巴等)。b.基于学习的人脸检测实际上是对需要通过算子提取的图像中的局部特征进行分类、计数、回归得到的更准确、响应速度更快的分类器。2例程采集2.1后端处理前端通过网络将资源传输到后端,后端统一处理需要检测的图像或视频流,这对后端提出了一定的挑战建筑学。同时,网络延迟往往无法带来实时交互效果。2.2客户端处理得益于OpenCV在跨语言、跨平台方面的优势,客户端也可以以较低的开发成本提供人脸检测能力,可以通过JsBridge等方式向Web容器提供服务。这个容器,孤立的页面将失去这种能力。直到有一天...2.3OpenServices不知道从什么时候开始,云计算等概念如雨后春笋般涌现,计算成本一天天下降。各大研发团队(如阿里云、Face++)已经准备好毫不费力地推出人脸检测服务,甚至还带来了各种特殊功能!特别的!衣服!服务!,人脸识别,活体识别,文档OCR和人脸比对等。虽然它不仅提供了客户端SDK和前后端API,但是还是说说我的纯前端方案吧。3时代带来了什么?那么人脸识别还停留在前端刀耕火种的古代。但是,我们的基础设施建设已经开始了。希望后续的一些相关介绍能给读者带来一些启发。3.1ShapeDetectionAPI随着客户端硬件计算能力的逐步提升,在浏览器层面获取的权限越来越多。由于图像处理需要大量的计算资源,实际上浏览器也可以承担一些图像检测的工作,所以创建了ShapeDetectionAPI。下面通过简单的例子介绍基本的用法。在尝试编辑和运行这些代码之前,请确保您的Chrome版本和此新功能已激活。另外API受同源策略限制:chrome://flags/#enable-experimental-web-platform-featuresBarcodeDetection:BarcodeDetection(ForChrome56+)varbarcodeDetector=newBarcodeDetector();barcodeDetector.detect(image).then(barcodes=>{barcodes.forEach(barcode=>console.log(barcodes.rawValue))}).catch(err=>console.error(err));人脸检测:人脸检测(适用于Chrome56+)varfaceDetector=newFaceDetector();faceDetector.detect(image).then(faces=>faces.forEach(face=>console.log(face))).catch(err=>console.error(err));文本检测:文本检测(对于Chrome58+)vartextDetector=newTextDetector();textDetector.detect(image).then(boundingBoxes=>{for(letboxofboundingBoxes){speechSynthesis.speak(newSpeechSynthesisUtterance(box.rawValue)));}}).catch(err=>console.error(err));3.2图片人脸检测图片人脸检测比较简单,只需要传入一个图片元素,直接调用API即可进行人脸识别了。然后抓取画布,我们就可以显示检测结果了。核心代码:varimage=document.querySelector('#image');varcanvas=document.querySelector('#canvas');varctx=canvas.getContext("2d");varscale=1;image.onload=function(){ctx.drawImage(image,0,0,image.width,image.height,0,0,canvas.width,canvas.height);scale=canvas.width/image.width;};functiondetect(){if(window.FaceDetector==undefined){console.error('不支持人脸检测');返回;}varfaceDetector=newFaceDetector();console.time('检测');returnfaceDetector.detect(image).then(faces=>{console.log(faces)//在上绘制人脸。varctx=canvas.getContext("2d");ctx.lineWidth=2;ctx.strokeStyle="red";for(vari=0;iconsole.error("Boo,FaceDetectionfailed:"+e));}处理效果:3.3video视频中的人脸检测和图片没有太大区别。可以通过getUserMedia打开摄像头获取视频/麦克风信息。通过检测并显示视频帧,可以实现视频中的人脸检测。核心代码如下:navigator.mediaDevices.getUserMedia({video:true,//audio:true}).then(function(mediaStream){video.src=window.URL.createObjectURL(mediaStream);video.onloadedmetadata=function(e){//在这里对视频做点什么。};}).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.jstracking.js是一个js封装的图像处理库,为浏览器带来了丰富的计算视觉相关的算法和技术。通过它可以实现颜色跟踪、人脸检测等功能。具体特点如下:b.jquery.facedetectionjquery.facedetection是一个jquery/zepto人脸检测插件,基于ccv中的图像分类器和检测器,具有超强的跨终端能力。3.5Node.js&OpenCVnode-opencv模块已经发布多年了。虽然不能完美兼容v3.x,提供的API也比较有限,但是可以完美兼容opencvv2.4.x。N-API的到来或许会带来更多的惊喜。想象一下,在一个Electron或者Node-Webkit容器中,我们是否可以通过在本地开启websocket服务来实现实时人脸检测呢?实现思路代码如下:后端处理逻辑importcvfrom'opencv';constdetectConfigFile='./node_modules/opencv/data/haarcascade_frontalface_alt2.xml';//相机属性constcamWidth=320;常数camHeight=240;常数camFps=10;constcamInterval=1000/camFps;//人脸检测属性constrectColor=[0,255,0];constrectThickness=2;//初始化相机constcamera=newcv.VideoCapture(0);camera.setWidth(camWidth);camera.setHeight(camHeight);constframeHandler=(err,im)=>{returnnewPromise((resolve,reject)=>{if(err){returnreject(err);}im.detectObject(detectConfigFile,{},(error,faces)=>{if(error){returnreject(error);}letface;for(leti=0;i{returnframeHandler(err,im).then((img)=>;{socket.emit('frame',{缓冲区:img.toBuffer(),});});};consthandler=()=>{camera.read(frameSocketHanlder);};设置间隔(处理程序,凸轮间隔);};前端调用接口socket.on('frame',function(data){varunit8Arr=newUint8Array(data.buffer);varstr=String.fromCharCode.apply(null,unit8Arr);varbase64String=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=>图像/视频操作ShapeDetectionAPI=>图像检测WebWorkers=>并行计算能力ConvNetJS=>深度学习框架Tensorflow(原DeeplearnJS)=>正对JS4.2的强力支持其实也没有那么乐观。4.2.1正面人脸(多张)识别率准确率较高,但侧面有障碍物时检测效果不理想。4.2.2处理速度对于图片中人脸检测的例子2.2,耗时300ms+(实际上不能满足大分辨率视频的实时处理),是调用Opencv100ms检测速度的三倍。4.2.3还有很多功能需要改进:比如不支持眼镜状态、性别、年龄估计、表情识别、种族、微笑、模糊检测等主流服务商提供的服务。4.3想说却说不完的a.本文所有示例源码,欢迎Fork/Star:https://github.com/x-cold/fac...https://github.com/x-cold/fac...b.关于人脸检测在不同场景下的适应性以及检测耗时,暂时没有数据支持。后面会考虑引入PASCALVOC和AT&T提供的样本进行小规模测试。5参考人脸识别技术总结(一):FaceDetection&Alignment:http://blog.jobbole.com/85783/阿里巴巴直播防控中的真人认证技术:https://xianzhi.aliyun。com/fo...人工智能时代,前端能做什么?:https://yq.aliyun.com/article...浏览器中的ConvNetJS深度学习:http://cs.stanford.edu/people...使用形状检测API进行人脸检测:https://paul.kinlan.me/face-d...