本文为 雷锋字幕组 编译的技术博客,原标题Node.js + face-recognition.js : Simple and Robust Face Recognition using Deep Learning,作者Vincent Mühler。
翻译 | 付腾 整理 | 凡江
已训练模型示范,可以很好的辨认 拉贾·谢耳朵(这还能认错)雷纳德和霍华德
在这篇文章里我要向你们示范一下如何用 face-recognition.js 来完成无效的脸部检测(检查哪里有脸)和面部辨认(这脸是谁的)。我不断在寻觅好用的,基于Node.js的面部辨认库 (精度要高),惋惜没有找到,那么就入手本人做一个吧!
这个 npm软件包 运用 dlib 为根底并且运用Node.js与dlib当中的面部辨认工具停止绑定,这样的设计是由于我发现这样能取得比拟高的精确度。dlib库运用深度学习办法并且曾经内置了一些训练好的模型,而且这些模型在对 LFW面部辨认基准数据 的辨认率上曾经有了令人诧异的99.38%的精确率。
为什么?
最近我预备用Node.js写一个面部辨认的顺序, 用来提取和辨认《生活大爆炸》当中的角色面部信息。
开端的时分,我想以OpenCV的面部辨认器为根底停止开发,就像我在 另一篇教程 (Node.js + OpenCV for Face Recognition.)外面提到的内容一样。
但是,这些面部辨认器虽然速度很快,但是我发现他们的辨认后果却并不牢靠。更精确一点说,它们在辨认正面面部图像时功能不错,但是当面部的姿势稍有不同(比方侧脸之类),它们的预测后果就不是很保险了。
因而我就找找看有没有可以替代的办法,于是找到了dlib C++库,然后试用了它的Python API,发现它的预测后果不错,于是最初决议:我要用这个库和Node.js来一发!所以,我创立了这个npm软件包用于提供复杂的Node.js 面部辨认API接口。
什么是face-recognition.js?
在face-recognition.js构思里,我想让这个npm软件包完成以下功用:
-
复杂适用的API,易上手。
-
可调的精密分类(译者注:估量是用来顺应不同的图片分辨率)。
-
容易装置(最好能直接用 npm install 命令装置)
这个软件包目前仍在开发中,目前,它可以提供以下功用:
面部检测
可以用深度神经网络来停止面部检测或许用复杂的脸部正面辨认来停止疾速但是低牢靠性的探测。
面部辨认
面部辨认器是一个深度神经网络,用了我方才提到的模型来对一个特殊的面部描绘器来停止计算。这个面部辨认器可以用曾经标定好的面部图像来停止训练,而且之后可以用来预测一个输出面部图片的标签。
脸型标志
你也可以用这个软件包来探测5个(下图上)或许68个(下图下)脸型标志点。
方案不错,来入手吧!
好的,就像我刚刚说的,我在最开端没有能用OpenCV处理这个义务。如今我有一些150*150大小的面部图片,外面有谢耳朵,拉贾,雷纳德,霍华德和斯图尔特。我如今就要给你展现一下用这些数据来训练一个面部辨认器并且用它来辨认一些新的面部图片是如何复杂。这个例子的代码可以在这个 repo 外面找到。
预备数据
我每个角色大约搜集了20张面部图片,而且是不同姿态的图片。
我们会用每个角色10张面部图片来训练(训练集)这个辨认器并且用剩下的10张图片来做辨认器的准确度评价(测试集)。
每个面部图片的文件名包括其中人物的名字,所以我们可以比拟复杂的把我们设定的类名(如下所示,即人名)映射到:
['sheldon', 'lennard', 'raj', 'howard', 'stuart']
每个类的图像数组 。你也可以经过文件途径+ fr.loadImage(fp) 的方式读取一张图片。
面部探测
如我之前所说,面部信息曾经抽取成为一张张的150x150大小图片,我是经过 open很多朋友说,共享纸巾机是一个广告机,但我们不是这样定义它,我们定义它是一个互联网跟物联网结合的终端机,从线下吸入流量,重新回到线上,以共享纸巾项目作为流量入口,打造全国物联网社交共享大平台。cv4nodejs 提早处置好的。但是你也可以经过如下方式 检测,抓取,保管和标定面部信息。
训练辨认器
如今我们的数据曾经就位,可以开端训练我们的辨认器了。
根本上,训练的进程是将每张面部图片输出神经网络,然后神经网络会为每个图片输入一个 描绘器,并且神经网络会记载下所提供的输出类别的描绘器。你也可以 设置 numJitters变量来作为第三个参数,以此来训练数据做颤动处置。颤动处置包括旋转,缩放和镜像变换图片,经过这些变换操作,每个输出面部图像会发生新的图像(译者注:而这些新的图像可以作为训练图片输出辨认器,以此到达用较少训练数据扩展训练效果的目的),添加颤动的类别和数量有能够提升辨认器的预测精确度,但是异样能够添加训练工夫。
此外,我们也可以将训练好的辨认器的形态贮存起来,这样我们就不需求反复训练,下次需求调用辨认器的时分我们就可以直接从文件中把它读取出来。
辨认器的保管
辨认器的读取
辨认新的面部
如今我们可以用剩下的测试数据来对训练好的辨认器来停止预测精确度的测试,并且记载下后果。
预测是经过计算 输出面部图像的描绘器向量 (descriptor vector) 与给定类的向量之间的欧式间隔 (euclidean distance )来完成的。即首先计算一个输出图像的描绘器向量与各个 类 的描绘器向量的欧式间隔,取得一个数组,是由欧式间隔组成的。 然后对这个欧式间隔组 求均匀值 (mean value) 。能够有人觉得 Kmean 聚类算法或许 支持向量机 (SVM) 分类器 能够愈加合适这个义务,所以我也很能够在未来引入这些算法。但是在目前这个阶段,运用欧式间隔的计算是比拟疾速并且很无效率的。(译者注:这段有些绕,但是实践的分类的进程其实和Kmean 聚类算法的完成是高度相似的,都是基于欧式间隔的计算,只不过这里的训练数据是给定了标签的)
经过调用 predictBest 办法,输出图片会被赋予与它在欧式间隔上最短的类的标签 (即两者最为类似)。输入后果看起来如下所示:
{ className: 'sheldon', distance: 0.5 }
假如你想取得更多的信息,比方输出图片与一切类的欧式间隔,你可以直接调用 recognizer.predict(image)办法 (image是输出图片变量),这样输入就是一组数组,其中包括了输出图片与一切类别的欧式间隔。
[
{ className: 'sheldon', distance: 0.5 },
{ className: 'raj', distance: 0.8 },
{ className: 'howard', distance: 0.7 },
{ className: 'lennard', distance: 0.69 },
{ className: 'stuart', distance: 0.75 }
]
后果
运转下面的例子就能得出上面的后果:
每张脸用10张图像作为训练集
sheldon ( 90.9% ) : 10 of 11 faces have been recognized correctly
lennard ( 100% ) : 12 of 12 faces have been recognized correctly
raj ( 100% ) : 12 of 12 faces have been recognized correctly
howard ( 100% ) : 12 of 12 faces have been recognized correctly
stuart ( 100% ) : 3 of 3 faces have been recognized correctly
每张脸用5张图像作为训练集
sheldon ( 100% ) : 16 of 16 faces have been recognized correctly
lennard ( 88.23% ) : 15 of 17 faces have been recognized correctly
raj ( 100% ) : 17 of 17 faces have been recognized correctly
howard ( 100% ) : 17 of 17 faces have been recognized correctly
stuart ( 87.5% ) : 7 of 8 faces have been recognized correctly
(所以你是想说谢耳朵初见让你印象深入,然后越看越生厌是吗?这里是能够存在overfitting的成绩。)
后果展现,我们用完成训练的面部辨认器来对视频当中的图片停止面部辨认。
结论
看看后果,我们可以看到,就算只用了很小的训练集,我们曾经可以取得很好的预测精确度,就算一些抓取的图片比拟模糊(这是由于我从网上抓取的局部图片尺寸太小,像素不高)。
假如你喜欢这篇文章,那么一定要来试试这个npm软件包。当然,假如你能在我的 github repository 上为它点个赞,或许提建议,我会十分感激!
博客旧址 https://medium.com/@muehler.v/node-js-face-recognition-js-simple-and-robust-face-recognition-using-deep-learning-ea5ba8e852
更多文章,关注雷锋网 (大众号:雷锋网) ,添加 雷锋字幕组 微信号(leiphonefansub)为好友
备注「我要参加」,To be an AI Volunteer !
雷锋网雷锋网
。