纯前端实现人脸识别-提取-合成

最近火爆朋友圈的军装照H5大家一定还记忆犹新,其原理是先提取出照片中的面部,然后与模板进行合成,官方的合成处理据说由天天P图提供技术支持,后端合成后返回给前端展示,形式很新颖效果也非常好,整个流程涉及的人脸识别和图像合成两项核心技术在前端都有对应的解决方案,因此理论上前端也可以完成人脸识别-提取-合成整个流程,实现纯前端的军装照H5效果。

前端人脸识别

首先需要的是人脸识别,这个一听就觉得高大上的东西原理并不深奥,无非是用人的面部特征规则对图像进行匹配和识别,这项工作前端虽然可以实现,但前端实现基本就只能依据内置规则库进行匹配,这个库的质量就决定了识别质量,而通常更成熟的方案是引入机器学习,让程序不断自我修正和提高,进一步提高识别率,机器学习的前端库倒是也有,但把这两者结合起来的还没发现,因此对前端人脸识别的准确率不要报太高期望。

现有的前端人脸识别库不算多,这里我们选择的是效果相对好点的trackingjs,这个类库功能非常强大,库如其名,它可以完成各种追踪类的图像处理任务,人脸识别只是其众多功能之一,而且通过选配插件,还可以精确识别眼睛、鼻子等五官的位置,貌似稍微折腾一下也可以实现美图秀秀的效果。

这里我们只用trackingjs实现面部识别,初始化一个面部识别任务的代码如下:


  1. //实例化 
  2. var tracker = new tracking.ObjectTracker(['face']); 
  3. //识别回调 
  4. tracker.on('track', function(event) { 
  5.     if (!event.data.length) { 
  6.         return console.log('画面中没有人脸'); 
  7.     } 
  8.     event.data.forEach(function(rect, i) { 
  9.         console.log(rect);//单个面部数据 
  10.     }) 
  11. }) 
  12. //配置参数 
  13. ... 

这样一个面部识别任务就初始化完成了,调用方式如下:


  1. tracking.track('#img', tracker); 
  2. //其中'#img'参数是目标图像的选择器 

在识别回调中event.data就是数组格式的面部数据,如果长度为0则表示图像中没有人脸或者识别失败,如果识别成功,单个面部数据的格式如下:


  1.     x: number,          //面部位于原图x轴方向位置 
  2.     y: nuber,           //面部位于原图y轴方向位置 
  3.     width:number,       //面部区域宽度 
  4.     height:nubmer       //面部区域高度 

有了这个面部数据就可以很容易的将该区域从原图中提取出来,前端当然就用canvas啦,示例如下:


  1. var img = document.getElementById("img"); 
  2. var faceCtx = document.getElementById("mycanvas").getContext('2d'); 
  3.   
  4. var theFace = ...; //假设我们识别到了theFace 
  5.   
  6. //使用drawImage()方法将面部绘制出来 
  7. faceCtx.drawImage(img, theFace.x, theFace.y, theFace.width, theFace.height, 0, 0, theFace.width, theFace.height); 

到这里我们已经实现了面部识别 + 提取,而且代码量也没多少,其实这里面有个小坑要在实践中才会发现,那就是trackingjs的配置,文档中能找到4个跟识别有关的配置,分别是:


  1. setClassifiers(classifiers) 
  2.  
  3. setEdgesDensity(edgesDensity) 
  4.  
  5. setScaleFactor(scaleFactor) 
  6.  
  7. setStepSize(stepSize) 

看不懂吧,我也看不懂,而且文档中对他们没有任何有用的说明,在测试中我只使用了后两个配置,翻译过来分别是”比例因子”和”步长”,经过枯燥的人肉测试发现,这两个参数的有效取值范围分别在1
- 2和1.1 -
2,其中setStepSize不能为1,否则会浏览器会卡死,所以从1.1开始取值,取值超过2也可以,但识别成功的概率就很低了。通过调整这两个参数绝大多数图像都可以成功识别,唯独对面部大特写很难识别,这可能需要配合另外两个参数吧,我实在没耐心继续人肉测试下去了,感兴趣的自己回去玩吧。

前端图像处理

经过上一步的识别+提取我们已经得到了面部图像,要实现合成军装照效果我们还需要对面部图像进行处理,使色调与模板一致,将来才能毫无违和感的融合在一起,具体到军装照这个例子我们需要将面部重新着色,并达到”做旧”的老照片效果,如果用PS想必大家都会,但在前端怎么实现呢?

这里我们需要借助腾讯前端团队出品的AlloyImage,这是一个堪称前端PS的前端图像处理类库,比如要实现上述效果,我们只需要这样:


  1. var faceImg = document.getElementById("theFace"); 
  2. faceImg.loadOnce(function() { 
  3.     AlloyImage(this).act("灰度处理").add( 
  4.         AlloyImage(this.width, this.height, "#808080") 
  5.         .act("高斯模糊", 4) 
  6.         .act("色相/饱和度调节", 22, 45, 0, true), 
  7.         "叠加" 
  8.     ).replace(this); 

然后你就得到了一个做旧的人脸,还是非常简单的,AlloyImage的使用基本可以说是傻瓜化,感兴趣的就自己花个五分钟去看下官方文档吧,这里不再赘述。

然后就要说一下我们这个图像处理和人家天天P图的差距了,虽然我们得到了理想的色调,但要想把随便一张人脸与特定模板做合成,有两件事必不可少。首先是面部角度矫正,如果模板是正的而你的照片是歪的,直接暴力拼接肯定很违和,所以需要先识别出面部角度,并纠正到指定角度;然后是面部中心定位,因为人脸识别的结果提取出来后不一定是以面部中心为中心的,所以在合成之前要识别出面部中心线,并以此为依据与模板进行定位。然而这些我们都没有,所以我们只能对输入的图像的要求更高,如果输入了嘴歪眼斜的图片,结果就只能尴尬了。

最后的图片合成部分就更简陋了,先将处理好的面部画到画布指定位置,然后将抠好图的脸部透明png模板铺在上面,完成。实际过程中需要处理一些小问题,比如要根据模板的面部尺寸将面部图像缩放到合适的尺寸;抠模板时要将边缘模糊处理,而且尽量保留模板本来的面部轮廓,只将五官抠掉。即便这样,合成结果还是很容易穿帮,不过纯前端处理也没有更好的办法了。

效果展示

好了,说的再多不如看个例子,示例提供三种图片输入源,分别是本地图片、远程图片、内置示例。其中内置的图片大部分是提前在PS中纠正过角度的,而且内置图片会自动匹配到我事先调校好的参数,不出意外可以直接识别出人脸;如果选择本地图片作为图片源,最好选择头部姿态垂直的正面照,同时参考内置图片的

参数设置调节参数,一次识别不成功很正常,需要多调几次;也可以使用远程图片识别,但因为canvas受到跨域策略影响,远程图片只能识别不能提取和合成。

示例:纯前端军装照合成(http://refined-x.com/projects/codes/tracking.html)

后记

最初是抱着好奇的心态开始捣鼓这个项目的,虽然最终的合成效果远远达不到生产要求,但整个示例撸下来后对人脸识别和图片处理技术都有了基本的认识,对canvas操作中一些细节问题的解决也略微补足了一下这方面的知识空白,算略有收获吧。

本文作者:佚名

来源:51CTO

时间: 2024-10-30 20:57:41

纯前端实现人脸识别-提取-合成的相关文章

315晚会回顾:手机充电站可控制你的手机、软件合成照片秒破人脸识别

本文讲的是315晚会回顾:手机充电站可控制你的手机.软件合成照片秒破人脸识别, 曝光不良企业的同时,也对公众进行安全科普教育,已经成了每年315晚会的惯例.前年是诈骗电话.手机实名制:去年是吸话费恶意程序.公共免费WiFi风险:今年的晚会果不出所料,提到了免费手机充电站安全风险和软件合成照片秒破人脸识别. 使用公共空间的免费手机充电站给手机充电,最为人诟病的是充电站会诱导用户授权从而安装各种推广应用.央视这次谈论了另一个风险,当你授权充电站后,充电站存在漏洞,攻击者将可以通过充电站控制你的手机,

人脸识别成为视频监控前端智能化最受捧的应用

在视频监控摄像机智能化应用方面,部分智能分析手段因为前端摄像机芯片的升级换代,如今已经可以实现智能化应用前移的功效.其中,以人脸识别作为突出的代表,已经广泛应用于监控探头,并通过高效的多目标抓拍和复杂环境条件下的高准确率,受到了来自展会.论坛.银行.公安.交通.零售等行业的亲睐,并给用户的工作效率提升带来实在的帮助. 当前,也有很多人脸识别算法的科技公司进入安防行业,并带来切实可行的前端人脸识别技术和解决方案.今年8月10日,旷视(Face++)就为蚂蚁金服合作伙伴大会提供了刷脸签到服务,采用旷

315预警说人脸识别有漏洞,互联网企业纷纷表示其实我们之前就想到了

文| 李丽芝 编辑 | 石亚琼 昨日,央视315晚会消费预警环节曝光了人脸识别技术的安全漏洞问题,在现场的测试中可以使用软件后期修改人脸图片进行脸部识别,从而绕过网络实名认证系统.一时间舆论哗然,人脸识别技术顿时成为众人热议的焦点. 315现场,央视做了两个实验,"换脸"骗过人脸识别系统,成功刷脸登录账号    实验一 主持人现场提供了一张自己的证件照 一分钟后,这张静态自拍照变成可眨眼.可动嘴的动态照片 对准某人脸识别APP,成功实现了刷脸登录     实验二 主持人现场选取一名观众

如何判断人脸识别是否准确?SeetaFace助你一臂之力|AI科技评论

对不同的人进行区分是很多智能系统的必备能力.所谓的人脸识别技术也是为了实现此目的开发出来的,通过对人脸的光学成像来感知人.识别人.经过几十年的研发积累,特别是近年来深度学习技术的涌现,人脸识别取得了长足的进步,在安防.金融.教育.社保等领域得到了越来越多的应用,也成为计算机视觉领域最为成功的分支领域之一. 然而,人脸识别并非是完全成熟的技术,离公众期望的全面应用尚有距离,仍然需要学术界.工业界的共同努力.为此,整个人脸识别社区需要有基准(Baseline)系统,而且基准系统的水平显然会极大影响着

什么是SeetaFace开源人脸识别引擎?

雷锋网按:本文作者VIPL_Face 区分不同的人是很多智能系统的必备能力.为实现此目的,一种可能的技术手段是通过对人脸的光学成像来感知人.识别人,即所谓的人脸识别技术.经过几十年的研发积累,特别是近年来深度学习技术的涌现,人脸识别取得了长足的进步,在安防.金融.教育.社保等领域得到了越来越多的应用,成为计算机视觉领域最为成功的分支领域之一. 然而,人脸识别并非完全成熟的技术,离公众期望的全面应用尚有距离,还需要学术界.工业界的共同努力.为此,整个人脸识别社区需要有基准(Baseline)系统,

什么是 SeetaFace 开源人脸识别引擎

区分不同的人是很多智能系统的必备能力.为实现此目的,一种可能的技术手段是通过对人脸的光学成像来感知人.识别人,即所谓的人脸识别技术.经过几十年的研发积累,特别是近年来深度学习技术的涌现,人脸识别取得了长足的进步,在安防.金融.教育.社保等领域得到了越来越多的应用,成为计算机视觉领域最为成功的分支领域之一. 然而,人脸识别并非完全成熟的技术,离公众期望的全面应用尚有距离,还需要学术界.工业界的共同努力.为此,整个人脸识别社区需要有基准(Baseline)系统,而且基准系统的水平显然会极大影响着该领

《战狼2》中人脸识别无人机表现不俗,军、警用果真如此高能?

"非洲某国战乱,战火蔓至海外华人,雇佣兵辣手残杀普通平民,在此危急时刻,前解放军特种兵冷锋挺身而出单刀赴会,中国海军舰队临危上线奔袭掩护-.."前不久上映的军事动作电影<战狼2>以其燃爆男性荷尔蒙的火爆战争打斗场面一时间刷屏朋友圈,上映后不久便迅速吸金39亿,成功打破中国电影票房纪录. 本片中,海陆空各种高能武器集中展示,闪瞎围观群众.从海军装备来说,搭载垂直发射系统的中国海军052D驱逐舰排浪而来.054A护卫舰不怒自威,最让人意外的是,连中国航母辽宁舰也首次在商业片中&

人脸识别与自动巡检技术在地铁安防系统中的应用

现阶段,视频智能分析在轨道交通行业中主要应用包含几大类:行为分析即拥挤侦测.徘徊侦测.逆向侦测等:特征识别即人脸识别系统等:图像质量自动巡检即系统自动对前端摄像机采集图像质量进行分析报警等.由于当前智能分析在轨道行业应用尚处于起步阶段,本着从事实出发的原则,下文着重结合实际工程案例,着重探讨人脸识别和自动巡检两项技术的应用. 一.人脸识别系统 XX市轨道交通一号线共有20个车站,在每个车站的出入口闸机设置8套人脸识别设备,共160套,对出入闸机的乘客面部特征实时采集,并与后台公安部犯罪人员库进行

JavaScript人脸识别技术及脸部识别JavaScript类库Tracking.js_javascript技巧

我一直对人工智能识别技术非常感兴趣,因为我无法想象这究竟是一种什么样的算法,什么样的分析过程.无论是声音识别.人脸识别或其它种识别,人们的外貌.说话的方式都是如此不同,一种图片你可以用不同的方式.从不同的角度拍摄,我不能理解这些识别技术是如何做到的.有个叫做"面具"的游戏也使用了这种识别技术,我想对于脸部识别技术也应该研究一下.Facebook使用了这种技术,在手势控制中也能用到它,所以,你网站上也会有应用的地方. 我找到的一个可以用于人脸识别的JavaScript程序包是Face D