当前位置: 首页 > 科技观察

JavaScript教程:给Web应用添加人脸检测_0

时间:2023-03-12 18:23:01 科技观察

【.com快译】上周我们使用annyang给地图界面添加语音命令(https://www.infoworld.com/article/3400658/javascript-tutorial-add-speech-recognition-to-your-web-app.html)。本周我们将通过使用pico.js添加简单的头部跟踪功能来进一步增强我们的多模式界面。pico.js是一个精简的JavaScript库,与其说是生产级库,不如说是概念验证,但它似乎在我研究过的人脸检测库中效果最好。本文旨在从一个简单的红点开始,该红点显示用户头部覆盖在地图上的位置:图1让我们从创建一个简单的React类开始,该类包装了pico.js功能,我们可以使用该功能来获取关于用户头部位置的更新用户的脸:{this.setState({face})}}/>然后,如果检测到一张脸,我们可以渲染包含该脸位置细节的组件:{face&&}我们对pico.js的第一个挑战是它用JavaScript实现研究项目,不一定是遵循现代JavaScript标准的生产级库。除此之外,这意味着您无法执行yarnaddpicojs命令。虽然pico.js简介(https://tehnokv.com/posts/picojs-intro/)提供了对对象检测的深入介绍,但它更像是一篇研究论文,而不是API文档。但是,附带的示例足以实际使用代码。我花了几个小时将附加示例放入一个相对简单的React类中,我们可以使用它来充分利用我们的代码。pico.js做的第一件事是加载级联模型,这需要AJAX调用来获取面部预训练模型的二进制表示。(你可以使用相同的库来跟踪其他类型的对象,但你需要使用官方的pico实现来训练自定义模型。)我们可以将这个模型加载代码放在componentDidMount生命周期方法中。为了清楚起见,我进一步将示例代码抽象为另一个名为loadFaceFinder的方法:/cascades/facefinder';fetch(cascadeurl).then((response)=>{response.arrayBuffer().then((buffer)=>{varbytes=newInt8Array(buffer);this.setState({faceFinder:pico.unpack_cascade(bytes)});newcamvas(this.canvasRef.current.getContext('2d'),this.processVideo);});});}除了获取和解析人脸检测模型的二进制表示和设置状态,我们还创建了一个新的camvas,它引用了上下文和回调处理程序。camvas库将来自用户网络摄像头的视频加载到画布上,并为渲染的每一帧调用一个处理程序。loadFaceFinder的内容与pico.js提供的参考项目几乎完全相同。我们更改了模型的存储位置,以便可以在状态下访问它。我们通过ReactRef来引用画布上下文,而不是使用浏览器提供的DOMAPI。我们的this.processVideo也与参考项目中提供的代码几乎相同。我们只需要做一些改变。我们只想在加载模型时执行代码,因此我们对整个代码主体添加了检查。我还使用我们希望用户传入的回调处理程序创建了这个React类,以便我们仅在定义处理程序后运行处理代码:processVideo=(video,dt)=>{if(this.state.faceFinder&&this.props.onFaceFound){/*allthecode*/}}我所做的唯一其他更改是我们在找到人脸时所做的事情。pico.js示例在画布上绘制了几个圆圈,但我们希望将数据传回回调处理程序。让我们稍微修改一下代码,让回调处理程序更容易处理这些值:this.props.onFaceFound({x:640-dets[i][1],y:dets[i][0],radius:dets[i][2],xRatio:(640-dets[i][1])/640,yRatio:dets[i][0]/480,totalX:(640-dets[i][1])/640*window.innerWidth,totalY:dets[i][0]/480*window.innerHeight,});这种格式允许我们返回捕获的canvas元素中人脸的绝对位置和半径,以及人脸在canvas元素中的相对位置和人脸在canvas元素中的位置。我们的定制课程即将完成。我还需要对pico.js和camvas.js的pico版本进行一些小改动以使用现代语法,但这些更注重关键字而不是逻辑。现在我们可以将我们的自定义ReactPico类导入我们的应用程序,渲染它,并在检测到人脸时有条件地渲染FaceIndicator类。我使用了其他一些人脸检测库,并惊讶地发现pico.js非常准确且易于使用,尽管它不是一个功能齐全的库。原标题:JavaScripttutorial:Addfacedetectiontoyourwebapp,作者:JonathanFreeman