web端实现AR人脸特效

前言

直播、短视频、在线会议等应用越来越多地进入人们的生活,随之诞生的是丰富的各类创意玩法与新鲜体验,其中大量应用了以AI检测和图形渲染为基础的AR技术。

而随着Web技术的不断成熟,AR技术在Web上的实现成为了一种可能。今天就总结了在Web端实现此功能的几个技术要点,跟大家一起探讨一下。

架构和概念

抽象整体的实现思路如下

调取Camera获得相机画面

使用tensorflow加载人脸识别模型生成FaceMesh

根据FaceMesh生成三角网格并进行UV贴图

FaceMesh

MediaPipe Face Mesh是一种脸部几何解决方案,即使在移动设备上,也可以实时估计468个3D脸部界标。它采用 机器学习 (ML)来推断3D表面几何形状,只需要单个摄像机输入,而无需专用的深度传感器。该解决方案利用轻量级的模型架构以及整个管线中的GPU加速,可提供对实时体验至关重要的实时性能。

UVMap

UV是二维纹理坐标,U代表水平方向,V代表垂直方向。UV Map用来描述三维物体表面与图像纹理(Texture) 的映射关系,有了UV Map,我们就可以将二维的图像纹理粘贴到三维的物体表面。

矩形贴图和球面的映射图

技术实现

调取Camera获得相机画面

通过navigator.mediaDevices.getUserMedia获取stream,放到video查看。

async function setupWebcam() {return new Promise( ( resolve, reject ) => {const webcamElement = document.getElementById( "webcam" );const navigatorAny = navigator;navigator.getUserMedia = navigator.getUserMedia ||navigatorAny.webkitGetUserMedia || navigatorAny.mozGetUserMedia ||navigatorAny.msGetUserMedia;if( navigator.getUserMedia ) {navigator.getUserMedia( { video: true },stream => {webcamElement.srcObject = stream;webcamElement.addEventListener( "loadeddata", resolve, false );},error => reject());}else {reject();}});
}
复制代码

人脸识别

//创建模型
createModel() {return new Promise(async resolve => {await tf.setBackend('webgl')const model = faceLandmarksDetection.SupportedModels.MediaPipeFaceMesh;const detectorConfig = {maxFaces: 1, //检测到的最大面部数量refineLandmarks: true, //可以完善眼睛和嘴唇周围的地标坐标,并在虹膜周围输出其他地标runtime: 'mediapipe',solutionPath: 'https://unpkg.com/@mediapipe/face_mesh', //WASM二进制文件和模型文件所在的路径};this.model = await faceLandmarksDetection.createDetector(model, detectorConfig);resolve(this.model);})
},
//识别
async recognition() {try {const video = this.$refs.video;const faces = await this.model.estimateFaces(video, {flipHorizontal: false, //镜像});if (faces.length > 0) {const keypoints = faces[0].keypoints;this.render3D({scaledMesh:keypoints.reduce((acc, pos) =>{acc.push([pos.x,pos.y,pos.z])return acc}, [])});}else{this.render3D({scaledMesh:[]})}} catch (error) {console.log(error);}
}
复制代码

3D场景贴图

  1. TRIANGULATION
  2. UV_COORDS
    //3D场景const scene = new THREE.Scene();//添加一些光照scene.add( new THREE.AmbientLight( 0xcccccc, 0.4 ) );camera.add( new THREE.PointLight( 0xffffff, 0.8 ) );//正交相机scene camera = new THREE.PerspectiveCamera( 45, 1, 0.1, 2000 );camera.position.x = videoWidth / 2;camera.position.y = -videoHeight / 2;camera.position.z = -( videoHeight / 2 ) / Math.tan( 45 / 2 )scene.add( camera ); //渲染器const renderer = new THREE.WebGLRenderer({canvas: document.getElementById( "overlay" ),alpha: true});//创建geometry,将468个人脸特征点按照一定的顺序(TRIANGULATION)组成三角网格,并加载UV_COORDSconst geometry = new THREE.BufferGeometry()geometry.setIndex(TRIANGULATION)geometry.setAttribute('uv', new THREE.Float32BufferAttribute(UV_COORDS.map((item, index) => index % 2 ? item : 1 - item), 2))geometry.computeVertexNormals()//创建materialconst textureLoader = new THREE.TextureLoader();const meshImg = this.meshList[meshIndex].src;//材质图片地址textureLoader.load(meshImg,texture=>{texture.encoding = THREE.sRGBEncodingtexture.anisotropy = 16const material = new THREE.MeshBasicMaterial({map: texture,transparent: true,color: new THREE.Color(0xffffff),reflectivity: 0.5});const mesh = new THREE.Mesh(geometry, material)scene.add(mesh)})// 根据face mesh实时更新geometryupdateGeometry(prediction){let w = canvasWidth;let h = canvasWidth;const faceMesh = resolveMesh(prediction.scaledMesh, w, h)const positionBuffer = faceMesh.reduce((acc, pos) => acc.concat(pos), [])geometry.setAttribute('position', new THREE.Float32BufferAttribute(positionBuffer, 3))geometry.attributes.position.needsUpdate = true}resolveMesh(faceMesh, vw, vh){return faceMesh.map(p => [p[0] - vw / 2, vh / 2 - p[1], -p[2]])}//渲染render3D(prediction){if (prediction) {updateGeometry(prediction)}renderer.render(scene, threeCamera)}
复制代码

加载3D模型

//加载3D模型
const loader = new GLTFLoader();
const Object3D = new THREE.Object3D();
loader.load(modelUrl, (gltf) => {const object = gltf.sceneconst box = new THREE.Box3().setFromObject(object)const size = box.getSize(new THREE.Vector3()).length()const center = box.getCenter(new THREE.Vector3())object.position.x += (object.position.x - center.x);object.position.y += (object.position.y - center.y + 1);object.position.z += (object.position.z - center.z - 15);Object3D.add(object)this.scene.add(Object3D)
})//计算Matrix
const position = prediction.midwayBetweenEyes[0]
const scale = this.getScale(prediction.scaledMesh, 234, 454)
const rotation = this.getRotation(prediction.scaledMesh, 10, 50, 280)
object.position.set(...position)
object.scale.setScalar(scale / 20)
object.scale.x *= -1
object.rotation.setFromRotationMatrix(rotation)
object.rotation.y = -object.rotation.y
object.rotateZ(Math.PI)
object.rotateX(-Math.PI * .05)
if (this.morphTarget) {// flippedthis.morphTarget['leftEye'] && this.morphTarget['leftEye'](1 - prediction.faceRig.eye.r)this.morphTarget['rightEye'] && this.morphTarget['rightEye'](1 - prediction.faceRig.eye.l)this.morphTarget['mouth'] && this.morphTarget['mouth'](prediction.faceRig.mouth.shape.A)
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/41219.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DataFunCon:2021热点技术和未来趋势预测

12月18-19日,由DataFun主办的DataFunCon 2021,将如期而至!本次大会由百度深圳研发中心自然语言处理部技术总监 何径舟、腾讯云大数据产品中心研发副总经理 雷小平、腾讯信息平台与服务业务线AI算法负责人 文镇、达摩院人工智能科学家 杨红霞等…

未来计算的十大趋势预测,你觉得能中几条?

作者 | Adrian Mouat 译者 | 平川 本文最初发布于 Container Solutions WASM 将无所不在:编译目标、部署目标、IoT、插件生态系统。这是正在发生的事。(1 到 5 年) Rust 的流行度将继续增加,未来几年有望在 RedMonk 排行榜上超…

未来的趋势————以ChatGPT为标杆的AI对生活的影响是巨大的

文章目录 前言1.AI的发展历程2.我是如何接触到人工智能的概念和产品的3.对于ChatGPT的一点看法4.AI对大学毕业生的职业发展的利与弊5.对于AI的思考和问题 前言 随着ChatGPT的爆火,生成式AI,大模型的人工智能被越来越多的人注意到,同时他也带…

2023年五大趋势预测 | 大数据分析、人工智能和云产业展望

随着我们迈入2023年,大数据分析、人工智能和云产业将迎来蓬勃的创新和发展阶段 以下是我们预测的,将对行业格局产生重大影响的五大趋势: 世界在剧变,我们需要尽快寻找行业中的方向,迅速重回轨道 2023年,全…

快收藏!手把手教你用AI绘画

点个关注👆跟腾讯工程师学技术 最近看到一篇有趣的文章,一副名为《太空歌剧院》(如下图)的艺术品在某美术比赛上,获得了第一名的成绩, 有意思的是这件作品是通过AI来实现的画作, 顿时觉得非常神…

用K8s的公司有多少人会部署K8s?

作者:51CTO技术栈 译者 | 布加迪 Kubernetes是如今最知名最流行的容器编排引擎。Kubernetes之所以成为云原生计算的中心,是由于它是开源的,还有一个快速增长的生态系统。如果观察它在过去几年的发展和采用趋势,尤其是在云原生世界…

LLM_StableDiffusion_studio发布

背景: 从chatgpt发布到现在已经超过半年时间,AGI的势头越来越猛。大家都在做各种的尝试和组合,把chatgpt通用的强大的知识表达和理解能力尝试应用在自己的业务场景。前期也是出现非常多的业务应用,但是主要还是围绕chatgpt本身已…

智能AI抢了元宇宙的风头?

前几天,微博突然出现这么一条热搜。 #ChatGPT官方APP登录美国苹果应用商店 这绝对是一条相当火爆的新闻,因为这意味着智能聊天机器人ChatGPT终于有自己的App了。值得一提的是,ChatGPT不仅仅登录了美国苹果应用商店,而且下载量迅…

AI VS 好莱坞?新时代电影工作流;MJ制作微信表情包的麻瓜教程;关于ControlNet的一切;AI创业真钱景 | ShowMeAI日报

👀日报&周刊合集 | 🎡生产力工具与行业应用大全 | 🧡 点赞关注评论拜托啦! 🤖 『OpenAI通过了一大批GPT-4申请』大量放号ing~快去看邮箱! 🤖 『小马智行 | 广州南沙区开启车内无安全员的自动…

C++ 正在向 C 发起“进攻”!TIOBE 7 月榜单发布

整理 | 郑丽媛 出品 | CSDN(ID:CSDNnews) 一月一度的 TIOBE 榜单又发布了,快来看看 7 月的编程语言排行榜有什么最新变化吧! C 正在向 C 发起“进攻”! 自从去年 12 月 C 在 TIOBE 排名历史上首次超过 Java…

chatgpt赋能python:Python访问Word文档的方法

Python访问Word文档的方法 在现代社会,文档是人们日常生活和工作中必不可少的一部分。特别是在办公和教育中,Word文档被广泛使用。Python是目前应用最广泛的编程语言之一,在一些编程任务中,需要访问和修改Word文档。在这篇文章中…

chatgpt赋能python:Python处理Word文档

Python处理Word文档 介绍 Microsoft Word是业界最流行的办公文档编辑工具之一。对于文档处理工作,Word是必不可少的工具之一。然而,尽管Word是十分强大的,但在处理大量数据时,手动处理每个文件是费时费力的。幸运的是&#xff0…

chatgpt赋能python:Python下载jieba:优化中文分词的必备工具

Python下载jieba:优化中文分词的必备工具 在中文自然语言处理的领域中,分词是一项基础且重要的任务。jieba是一个优秀的中文分词组件,它支持三种分词模式,并且具有高效、准确、易用等优点。本文将介绍如何通过Python来下载jieba&…

为什么ChatGPT非得用强化学习,而不直接用监督学习?

为什么ChatGPT非得用强化学习,而不直接用监督学习?原因不是那么显而易见。OpenAI联合创始人、ChatGPT主要负责人John Schulman分享了OpenAI在人类反馈的强化学习(RLHF)方面的进展,分析了监督学习和强化学习各自存在的挑…

大咖,我能转行做UX设计师吗?

前几天,有个朋友找到我,叫我给分析下他适不适合转UX设计。他的专业是建筑设计,之所以要辞职,也就是公司破事多,老板又不看重他。看到UX设计这个行业的前景很不错,想要转行。他说的也没错, 现在的…

想成为一名成功的UX设计师吗?做好这13件事情吧

以下内容由Mockplus团队翻译整理,仅供学习交流,Mockplus是更快更简单的原型设计工具。 丢掉那些阻碍你前进的东西 每个人对成功的定义都不同。如果想在重要事情上取得成功,学会给予才是关键。只有放弃一些阻碍你前进的东西,你才能…

人工智能在医学影像中的研究与应用

人工智能在医学影像中的研究与应用 韩冬, 李其花, 蔡巍, 夏雨薇, 宁佳, 黄峰 沈阳东软医疗系统有限公司,辽宁 沈阳 110167 慧影医疗科技(北京)有限公司,北京 100192 东软集团股份有限公司,辽宁 沈阳 110179 摘要&#…

人工智能在癌症和精准医学领域的研究

目录 介绍 卷积神经网络:图像分类的主力军 从其他大型数据集生成预测模型 数据质量和模型选择是关键 癌症的早期检测、诊断和分期 使癌症诊断更准确 癌症分期和分级 在早期癌症检测的道路上 使用机器学习检测癌症突变 充分利用突变 确定来源的肿瘤细胞 表…

《天池精准医疗大赛-人工智能辅助糖尿病遗传风险预测》模型复现和数据挖掘-论文_企业

大赛概况 进入21世纪,生命科学特别是基因科技已经广泛而且深刻影响到每个人的健康生活,于此同时,科学家们借助基因科技史无前例的用一种全新的视角解读生命和探究疾病本质。人工智能(AI)能够处理分析海量医疗健康数据…

【智能医疗】48页论文详述医学AI最新进展

点击上方,选择星标或置顶,每天给你送干货! 阅读大概需要9分钟 跟随小博主,每天进步一丢丢 整理:专知 【导读】机器学习和深度学习为我们提供了一个全新的方法去探索未知领域。本文为大家带来了一份最新的智能医疗综述&…