利用opencv实现人脸识别,基于opencv的人脸识别系统
如果我们想真正理解某事,我们必须能够创造它。做总比被动听有用。本文介绍了一个基于卷积神经网络的人脸识别系统,是我自己用python做的。
在语言基础上,综合应用了keras、opencv、numpy、sklearn等技术。代码位置:
https://github.com/jerry1900/faceRecognition.git
先看看效果吧(感谢你老婆从国内出来):
开始准备
:使用的语言Python是入门级机器学习成本最低,学习速度最快的语言。Python搞网络爬虫也很靠谱。应用的技术有opencv(相机、图像处理)、numpy(图像数字化)、os(文件操作与处理)、keras(构建图像识别的神经网络)。
硬件条件很简单,一台windows普通笔记本,一个普通摄像头就可以了。
参考基础
:https://github.com/Hironsan/BossSensor,本文中的很多代码都参考了之前这位日本工程师写的demo。主要的应用技术是相似的,但也有一些不同之处:1.人脸识别的可扩展性。原来的演示只能识别一个人(他的老板),而新的演示在数据集的扩展性上有一些修改。理论上,它可以识别无数张脸,只要你有足够的数据;
2.神经网络设计更简单。新的demo在卷积神经网络的设计上比原来更简单易懂,不那么复杂,更适合入门。
3.代码结构更加清晰。程序设计更加模块化,尽量把能拆分出来的都拆分出来,基本上每个文件都可以单独测试和使用;
4详细的中文注释。可以看详细的中文笔记,不能看日文和英文笔记。
Step 1 环境配置
环境配置,网上有很多资料。总的来说,我给你的建议是:用Anaconda,一个集成的python环境,里面已经集成了numpy、scipy等很多有用的安装包,这样就省去了自己配置的痛苦;通过Anaconda安装新的计算包也非常方便,就不赘述了。网上可以找到很多教程,百度多,谷歌多。我可以再提醒一下,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,*后缀)。Sourcepath是存储图像源的文件夹,objectpath是存储已识别人脸的文件夹。参见本功能的备注:
写清楚了吗?具体用途如下:
前面是你存放源图像的文件夹地址,后面是你存放切割处理后的人脸图像的地址,最后是源图像的格式(文件后缀)。
有了这个功能,你就可以很方便的把各种图片中的人脸进行推演和保存。我的脸放在文件夹“D: 我的项目图片数据集杰瑞”里,如下图:
Step 3 构建模型和进行模型训练
天真心锁在你建立了你的数据集之后,应该会有一个数据集的通用文件夹。数据集下会有几个文件夹。如果希望模型识别几个面,可以建立几个子文件夹。每个子文件夹至少要有几十张相同格式的照片(训练资料越多越好)。然后转到train_model.py,输入你的数据集地址。我的数据集地址是“D:myProjectpicturesdataset”,然后建立模型,读取训练集,训练模型,评估模型,最后存储模型:CNN模型的介绍我就不展开了。具体推荐一个哥们的视频教程叫莫凡python,很详细,循序渐进,教的很好。可以上优酷搜一下。如果你想看CNN原理最详细的介绍,我推荐这个:http://cs231n.github.io/.这门课的讲师是李菲菲。什么?你不知道李菲菲是谁?
被训练的模型将被存储在一个固定的位置,在类模型中被写死:
Step 4 打开摄像头验证模型效果
模型训练好之后,打开read_camera.py这个文件里有一个Camera_reader的类。当模型初始化后,加载之前训练的模型:
然后在设置Camera_reader实例后调用build_camera()方法,该方法打开摄像机,并将视频流中读取的人脸提供给model进行识别:
模型的predict()函数会返回两个参数,第一个是概率最高的标签的索引,第二个是对应的概率。我们将对概率做出判断。如果高于70%,我们认为模型是可靠的(这个值可以自行调整观察的影响),可以显示具体的标签。相反,我们认为认出的面孔是陌生人。
总结
这个自己搭建的人脸识别系统,有自己的学习能力。你喂给它的数据越多,它能识别的人就越多,准确率也会不断提高。希望你自己测试研究一下。这个演示也有几个问题提醒大家:1.模型存在过拟合的问题。如果训练时历元过高,会发现虽然准确率已经逐渐提高甚至达到95%以上,但实际测试的准确率远低于训练时,说明模型存在过拟合的问题。解决的办法是增加样本类别和样本数量,这需要付出很大的努力;调整模型,但在样本数比较少的情况下,意义不是很大。
2.openCV的人脸识别准确率还是有一些问题的。这个读者在使用pick_face.py抓取素材的时候就能感受到。你放进去的生活照只有70%-80%左右能看懂脸料。有些照片明明有你的脸,OpenCV却认为不是脸。这很尴尬吗?可以找一本关于openCV先进性的书。我推荐机械工业出版社出版的《OpenCV 3计算机视觉Python语言实现(原书第2版)》。