利用python打造自己的人脸识别系统 - 简书

标签: | 发表时间:2017-12-04 21:39 | 作者:
出处:http://www.jianshu.com

正像著名物理学家,理查德•费曼说的一样,如果要真正理解一个东西,我们必须要能够把它创造出来。动手去做,永远比被动地听有用,我就是这么想并这么实践的。本文介绍了我自己动手做的一种基于卷积神经网络的人脸识别系统,以python为语言基础,综合应用了keras、opencv、numpy、sklearn等多种技术。代码位置:

https://github.com/jerry1900/faceRecognition.git

先看效果(感谢夫人赏脸出境):




知识基础

选用语言Python,时下入门机器学习成本最低、学习速度最快的语言,python搞网络爬虫也很靠谱,我用的是python 2.7。

运用的技术有opencv(摄像头、图片处理),numpy(图片数字化),os(文件的操作和处理),keras(构建神经网络进行图像识别)。

参考基础

https://github.com/Hironsan/BossSensor本文的代码很多参考了之前这个日本工程师写的demo,主体应用的技术是差不多的,但是有一些不同:

1.识别人脸的可扩展性。原有的demo只能识别一个人(他老板),新的demo在数据集的扩展性上有修改,理论上可以识别无数人的脸,只要你有足够多的数据;

2.神经网络设计更加简单。新的demo在卷积神经网络的设计上比原有的卷积神经网络更加简单和容易理解,没有搞得那么复杂,更加适合入门;

3.代码结构更清晰。程序设计更加模块化,把能拆分出来的尽量拆分出来,基本上每个文件都可以单独拿出来测试和使用;

4详尽的中文注释。你可以看很详细很详细的中文注释、不用看日文和英文的注释了......

Step 1

环境配置

环境配置这块,网上的资料非常多,总体来说我给大家的建议是:使用集成python环境Anaconda,里面已经集成了很多有用的安装包比如说numpy、scipy,免去了自己配置的痛苦;通过Anaconda安装新的计算包也非常方便,具体就不再赘述了,网上可以找到很多教程,多百度、多Google。我可以再提醒一句的是,好像Anaconda的theano还有tensorflow的包都有点小问题,需要删了然后重新下载配置,网上也有教程。

简而言之,使用Anaconda,安装好必要的科学计算包:numpy,scipy,sklearn,keras,opencv。贴一个别人的环境配置教程,仅供参考:

http://machinelearningmastery.com/setup-python-environment-machine-learning-deep-learning-anaconda/

Step 2 获得训练数据集

第二步就是要获得数据训练集,你可以从网上找训练集,也可以用自己或者朋友的照片来做素材(顺手练习下opencv和os),具体操作办法:

打开pick_face.py这个程序,里面有一个函数readPicSaveFace(sourcePath,objectPath,*suffix),sourcePath是存储图像源的文件夹,objectPath是存储识别出的人脸的文件夹,看这个函数的备注:



写的是不是很清楚,具体使用如下:



前面是你存储源文件图片的文件夹地址,后面那个是你存储剪裁好、处理好的人脸图片的地址,最后是源文件图片的格式(文件后缀)。

通过这个函数你就可以很方便地把各种图片中的人脸给扣出来并保存下来了。像我的人脸就放在了“D:\myProject\pictures\dataset\jerry”这个文件夹中,如下所示:



Step 3 构建模型和进行模型训练

当你建立好你的的数据集之后,应该会有一个dataset的总文件夹,dataset下会分几个文件夹,你想让你的模型识别几张人脸就建立几个子文件夹,每个子文件夹里面应该有至少几十张格式一致的照片(训练素材越多越好)。然后进入train_model.py,输入你的数据集地址,我的数据集地址是“D:\myProject\pictures\dataset”,然后建立模型、读取训练集、训练模型、评估模型,最后存储模型:



关于CNN模型的介绍我就不展开了,具体我推荐一个哥们的视频教程叫莫烦python,讲的很细,一步一步的,教的非常好,大家可以去优酷上搜索。如果要看最详细的CNN的原理介绍,我推荐这个: http://cs231n.github.io/。斯坦福出的教程,是最权威和准确的解释。

训练好的模型会存储在Model这个类中写死的一个固定位置中:



Step 4 打开摄像头验证模型效果

模型训练好之后,打开read_camera.py,这个文件中有一个Camera_reader的类,在模型初始化的时候就加载你之前训练好的模型:



然后在建立一个Camera_reader的实例之后调用build_camera()的方法,该方法打开摄像头,并对视频流中读取到的人脸交给model进行识别:



模型的predict()函数会返回两个参数,第一个是概率最高的label的index,第二个参数为对应概率,我们会对概率进行下判定,如果高于70%我们就认为模型是可靠的(这个值自己可以调整观察带来的影响),可以显示具体的label,反之我们认为识别出的人脸是一个Stranger。

总结

从我自己的实践来看,虽然跑通了整个流程,

但是有几个问题还是很明显的:

1.模型有过拟合的问题。在训练的时候如果epoch太高,会发现accuray虽然逐步提高甚至到达95%以上,但是实际test的准确度要比training的时候低很多,这个就说明模型出现了过拟合的问题。解决办法,增加样本类别和样本数,这个需要花费很多功夫;调整模型,但是在样本数量比较小的时候不是很显著。

2. openCV的人脸识别精度还是有点问题,这个读者可以在使用pick_face.py进行素材抓取的时候感受到,你放入的生活照片大概只有70%-80%可以读取人脸素材出来,有的照片明明有你的脸,但是openCV认为那不是一张脸,这个就很尴尬了有没有;关于openCV的进阶可以找本书看看,我推荐机械工业出版社出的《OpenCV 3计算机视觉Python语言实现(原书第2版)》。

 


相关 [利用 python 人脸识别] 推荐:

利用python打造自己的人脸识别系统 - 简书

- -
正像著名物理学家,理查德•费曼说的一样,如果要真正理解一个东西,我们必须要能够把它创造出来. 动手去做,永远比被动地听有用,我就是这么想并这么实践的. 本文介绍了我自己动手做的一种基于卷积神经网络的人脸识别系统,以python为语言基础,综合应用了keras、opencv、numpy、sklearn等多种技术.

Python 3 利用 Dlib 实现摄像头实时人脸识别 - coneypo - 博客园

- -
  利用 Python 开发,借助 Dlib 库捕获摄像头中的人脸,提取人脸特征,通过计算特征值之间的欧氏距离,来和预存的人脸特征进行对比,判断是否匹配,达到人脸识别的目的;.   可以从摄像头中抠取人脸图片存储到本地,然后提取构建预设人脸特征;.   根据抠取的 / 已有的同一个人多张人脸图片提取 128D 特征值,然后计算该人的 128D 特征均值;.

用python库face_recognition进行人脸识别

- - 开源软件 - ITeye博客
期间在安装依赖包dlib时遇到问题,解决见:  http://kissmett.iteye.com/blog/2409857. 3.通过摄像头实时在获取的帧上进行人脸识别(较卡顿). basefacefilespath ="images"#faces文件夹中放待识别任务正面图,文件名为人名,将显示于结果中 baseface_titles=[] #图片名字列表 baseface_face_encodings=[] #识别所需人脸编码结构集 #读取人脸资源 for fn in os.listdir(basefacefilespath): #fn 人脸文件名.

基于Python的开源人脸识别库:离线识别率高达99.38% | 机器之心

- -
仅用 Python 和命令行就可以实现人脸识别的库开源了. 该库使用 dlib 顶尖的深度学习人脸识别技术构建,在户外脸部检测数据库基准(Labeled Faces in the Wild benchmark)上的准确率高达 99.38%. 该项目是要构建一款免费、开源、实时、离线的网络 app,支持组织者使用人脸识别技术或二维码识别所有受邀人员.

【人脸识别】初识人脸识别

- - CSDN博客推荐文章
由于导师给我们布置了每周阅读两篇大牛论文,并写ppt的任务. 反正ppt都写了,所以我想干脆直接把ppt的内容再整理一下写成博客. 近期的阅读论文都是 人脸识别相关的主题. 如果你研究过人脸识别,或者对这方面有兴趣,那么你一定听说过Paul Viola. 他可以算得上是人脸检测识别的始祖,他的一篇大作《RobustReal-time Object Detection》可以说是人脸识别领域最重要的一篇论文.

人脸识别黑产

- - 奇客Solidot–传递最新科技情报
新京报 报道了人脸识别的地下黑产交易,有许多应用都需要人脸验证,创造了对人脸验证的一种需求,催生了一个地下产业链. 报道称,人脸识别的优质数据需要一百元一套,而便宜量大的仅需要 0.5元一套. 报道称一小部分来自网络刷单兼职人员,大部分来自企业内部员工. 人脸识别的黑产商贩称,市面上流通的手持身份证照片大多是在小额贷款平台和公司野蛮发展期间,泄露出来的,还有部分是从各行业收集而来的,这种信息交易和使用一般情况下不会被人发现,“当时很多人借钱不还,平台就把这些信息拿出来卖钱了,刚开始挺贵的,现在层层转卖就便宜了.

【转载】用HTML5进行人脸识别

- - HTML5研究小组
其中的一个特性是getUserMedia( W3C规范 ). 它是一个JavaScript API,可以让你访问(需要权限)用户的网络摄像头和麦克风. 今天发现一篇文章写的很有趣,叫你如何使用HTML5进行人脸识别. 在网页内进行人脸识别,很好很强大. “现代Web”不断发展出不少有趣的API,但你并不会在大多数项目中使用到所有的内容.

自动人脸识别基本原理

- - IT技术博客大学习
标签:   https://b2museum.   人脸识别经过近 40 年的发展,取得了很大的发展,涌现出了大量的识别算法. 这些算法的涉及面非常广泛,包括模式识别、图像处理、计算机视觉、人工智能、统计学习、神经网络、小波分析、子空间理论和流形学习等众多学科. 所以很难用一个统一的标准对这些算法进行分类.

人脸识别发展史与算法综述

- king - CSDN博客推荐文章
      在我们生存的这个地球上,居住着近 65 亿人. 每个人的面孔都由额头、眉毛、眼睛、鼻子、嘴巴、双颊等少数几个区域组合而成,它们之间的大体位置关系也是固定的,并且每张脸的大小不过七八寸见方. 然而,它们居然就形成了那么复杂的模式,即使是面容极其相似的双胞胎,其家人通常也能够非常容易地根据他们面孔上的细微差异将他们区分开来.

温习传闻:Facebook收购人脸识别创业公司Face.com

- - 业界
导读:准备好再听一个后IPO 时代的Facebook 收购的传闻吗. 事实上,Face.com 传言将成为Facebook 的收购目标由来已久. 虽然我们还不能确定这次收购能否成真,但本文给出的一些分析还是饶意义的. 据以色列商业报纸Calcalist披露,社交网络巨人将要收购人脸识别科技公司Face.com.