当前位置: 首页 > Web前端 > HTML5

嗯?浏览器可以进行人脸检测吗?

时间:2023-04-05 23:58:53 HTML5

ShapeDetectionAPI已经发布有一段时间了,主要能力是给前端直接可用的特征检测接口(包括条形码、人脸、文字检测)。本文将简单介绍一下,并对前端人脸检测做一个大概的说明。(本文不谈算法~希望拍拍)1背景与场景人脸检测(FaceDetection)是一个常见的话题,广泛应用于金融、安防、电商、智能手机、娱乐影业等行业。所涉及的技术也在不断发展。这里有一些想法:基于特征的人脸检测。例如,opencv内置了基于Viola-Jones目标检测框架的Harr分类器。只需要加载一个配置文件(haarcascade_frontalface_alt.xml)就可以直接调用detectObject完成检测过程,同时也支持检测其他特征(如鼻子、嘴巴等)。基于学习的人脸检测实际上是对需要通过算子提取的图像中的局部特征进行分类、计数、回归得到的更准确、响应速度更快的分类器。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-featuresBarcode:BarcodeDetection(ForChrome56+)varbarcodeDetector=newBarcodeDetector();barcodeDetector。检测(图像).then(条形码=>{barcodes.forEach(条形码=>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图片中的人脸检测图片中的人脸检测比较简单,只需要传入一个图片元素,直接调用接口进行人脸识别即可。然后抓取画布,我们就可以显示检测结果了。核心代码如下: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;i{console.error("Boo,FaceDetectionfailed:"+e);});}3.3视频中的人脸检测视频中的人脸检测与图片没有太大区别.可以通过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');图片.onload=function(){detect();}},60);3.4回到没有API的时代其实,很久很久以前就存在很多解决方案。由于硬件条件和没有硬件加速等限制,一直没有广泛投入生产。tracking.jstracking.js是js封装的图像处理库,为浏览器带来了丰富的计算视觉相关的算法和技术。通过它可以实现颜色跟踪、人脸检测等功能。具体功能如下:jquery。facedetectionjquery.facedetection是一个jquery/zepto人脸检测插件,基于ccv中的图像分类器和检测器,具有超强的跨终端能力。2.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);};设置间隔(处理程序,凸轮间隔);};.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总结4.1这些未来的发展毫无疑问,前沿技术将在前端得到更广泛的应用和支持。未来图像也将按照传统图像处理->学习+前端图像处理的方式推进。所有这些功劳都离不开基础设施(硬件、浏览器、工具、库等)的逐步增强和完善,包括但不限于:getUserMedia/Canvas=>图像/视频操作ShapeDetectionAPI=>图像检测WebWorkers=>并行计算能力ConvNetJS=>深度学习框架4.2其实没那么乐观4.2.1正脸的准确率(multiple)的识别率比较高,但是在侧脸已经有障碍物的情况下检测效果不理想。4.2.2处理速度对于例子2.2的图片中的人脸检测,需要300ms+(不能满足高分辨率视频的实时处理),是调用Opencv检测速度100ms的三倍。4.2.3还有很多功能需要改进:比如不支持眼镜状态、性别、年龄估计、表情识别、种族、微笑、模糊检测等主流服务商提供的服务。4.3想说却说不完的Demo:https://github.com/x-cold/fac...https://github.com/x-cold/fac...关于人脸检测in不同场景的适应性和检测耗时没有数据支持。后面会考虑引入PASCALVOC和AT&T提供的样本进行小规模测试。招聘AndroidIOS视觉交互高级前端:ais-ued-jobs@list.alibaba-inc.com5参考人脸识别技术总结(一):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...