python⼈脸识别训练模型
_opencv+mtcnn+facenet+python+te。。。
opencv+mtcnn+facenet+python+tensorflow 实现实时⼈脸识别
Abstract:本⽂记录了在学习深度学习过程中,使⽤opencv+mtcnn+facenet+python+tensorflow,开发环境为ubuntu18.04,实现局域⽹连接⼿机摄像头,对⽬标⼈员进⾏实时⼈脸识别,效果并⾮特别好,会继续改进
这⾥是
如果各位⽼爷看完觉得对你有帮助的话,请给个⼩星星,3q
Instruction
当前时间距facenet论⽂发布已有三年,⽹上对于facenet的解读也有许多,但却也不到什么能修修改改就能⽤的代码,所以本⽂就此⽽⽣,将会系统的介绍在CNN在图像识别⽅向-⼈脸识别,我会把我遇到的⼀切问题以及见解都陆续的补充在本⽂中,并会附上项⽬地址,保证各位官⼈看的开⼼。
所⽤⼯具简介
opencv很有名了,在本次项⽬中⽤到的当然是它的强⼤的图⽚处理能⼒了,⼤概就是读取、写⼊、连接⼿机摄像头⼀些了
mtcnn是⼀个⽤来检测图⽚中⼈脸位置(⼈脸检测)的深度学习模型,其使⽤了三个卷积⽹络实现了对图像中⼈脸的检测,在⽂章后⾯再具体的介绍其实现的细节
facenet是⾕歌的⼀篇很有名的论⽂和开源项⽬,其实现了将输⼊的⼈像最终转换为shape为1*128的向量,然后通过计算不同照⽚之间的欧⼏⾥得距离来判断他们的相似度,当然其中还包含许多技巧以及创新的想法,最终的在lfw(⼀个很有名的⼈脸数据库)准确率达到
99%+++,在⽂章的后⾯我会尽可能的解读其论⽂和代码中的有意思的想法
tensorflow应该很熟悉了(不然你是怎么搜到我的这篇⽂章的?) 学习深度学习的应该都知道存在各种各样的⽅便于搭建⽹络的框
架,tensorflow就是其中很有名的⼀个,由google开源,功能强⼤
正式开始前的⼀些废话,防⽌看官⽼爷在后⾯麋⿅~
你肯定已经或多或许对机器学习或者是深度学习有些了解,所以你应该知道整个项⽬的过程⽆⾮就是
使⽤现有的⼏⼤框架搭建⽹络(当然不排除是使⽤matlab⾃⼰⼿动实现)
instrument怎样记忆喂数据并且调参,最终得到⼼仪的模型
保存模型,部署模型使⽤
因为现在我还处于菜鸟阶段,有幸搭建过的⼏个⽹络⽆⾮是吴恩达⽼师课程中的⼏个浅层⽹络,实现了⼀些⾮主流功能,还有的就是google官⽅的⼀些教学例⼦,总之都是些帮助巩固知识,但是没什么luan⽤的,如果想要作出⽐较吊的东西还是需要使⽤⼤公司和⼤神开源的⼀些模型,“嫁接”过来,改改,⼜不能不能⽤......真⾹
github上开源的⼀些项⽬以及⼀些⼤公司开源的项⽬,其项⽬⽂件⼀般包含 ⽹络的搭建 ⽹络的测试等⽂件,其训练好的模型往往⽐较⼤,需要另到他出下载,当我们有了⼀个项⽬的想法以后,并确定了要⽤哪些项⽬时候,切记⼏件事,不然后⾯会很影响效率
对模型的实现原理有⼀定的了解
对其输⼊输出的数据格式有很完善的了解
⾃⼰要有⾃⼰的思考,不然全是单纯的接受会让你丧失了对整个项⽬全貌的认识,如果这样,接下来
就是痛苦时间了(想想初⾼中古诗、⽂⾔⽂、散⽂、诗歌为啥那么熬⼈,现在偶尔看到的时候,都是woc,这⽂章写的⽜逼,可是为啥当时我咋那么痛苦呢?),这都是被动接受,在学习之前不愿意全局掌控的过,如果有看过这篇⽂章,后来没有这样做遇到头疼问题的同志,问你个问题,知道⼤鹅仲么叫
咩?GAI
ok,废话说完,开⼯
opencv
连接⼿机摄像头,并通过其⼀些⼩函数,对图⽚进⾏⼀些简单的处理,⼿机上要下载⼀个appip摄像头
import cv2
video="admin:admin@192.168.0.107:8081/" #此处@后的ipv4 地址需要修改为⾃⼰的地址
# 参数为0表⽰打开内置摄像头,参数是视频⽂件路径则打开视频
capture =cv2.VideoCapture(video)
# 建个窗⼝并命名
cv2.namedWindow("camera",1)
# ⽤于循环显⽰图⽚,达到显⽰视频的效果
while True:
ret, frame = ad()
# 在frame上显⽰test字符
image1=cv2.putText(frame,'test', (50,100),
cv2.FONT_HERSHEY_COMPLEX_SMALL, 2, (255, 0 ,0),
thickness = 2, lineType = 2)
cv2.imshow('camera',frame)
# 不加waitkey() 则会图⽚显⽰后窗⼝直接关掉
key = cv2.waitKey(3)
if key == 27:
#esc键退出
print("")
break
if key == ord(' '):
# 保存⼀张图像
num = num+1
filename = "frames_%s.jpg" % num
cv2.imwrite(filename,frame)
mtcnn
jquery ui可调整大小的元素覆盖另一个元素
github上的facenet⼯程在实现facent的时候,为了便于测试,mtcnn也⼀放在了⼯程⽂件中,在⼯程中的位置是align/detect_face.py
,它的参数模型也保存在align⽂件夹下,分别是det1.npy,det2.npy,det3.npy,它的⽤法便是先将⽹络搭建出来,定位input中的⼈脸的位置,然后返回⾃⼰设置的固定⼤⼩的脸部crop,然后再将其输⼊facenet就ok了(作⽤就是⼈脸检测+定位+对齐,因为我们⾸要⽬的是让⼯程能跑起来,并且对其有⼀个⼤体的认识,这才⽅便后⾯的学习,具体的实现原理和代码解读,以及物体的检测发展历史,⽬前的发展⽅向,各种检测的算法,我会在⽂章的后⾯细说)
facenet
facenet.py直接放在主⽬录下了,其主实现的功能是搭建⽹络,然后从模型中加载参数,接收固定⼤⼩的剪裁好的⼈脸照⽚,最终经过embeding层输出1*128的脸部特征向量,计算不同脸部照⽚的相似度时候直接计算向量的欧式距离就ok了,同⼀个⼈的照⽚,它们的差值⽐较⼩,不同的⼈差值会⽐较⼤,其中facenet最后使⽤的是triplet loss⽅法来微调embeding(具体的论⽂算法,⽹络搭建,各种算法,以及代码解读我都放在⽂章的最后再说)
⼯程⽂件说明(readme)
### ⽬录结构
20170512-110547⽂件夹是facent的模型,官⽅存放在google⽹盘上了(⽽且现在出来2018的预训练模型了),不⽅便下载的我⼀会⼉会把⽤到的⼤⽂件打包放在坚果云上
align⽂件中包含三个mtcnn要⽤到的模型,以及搭建mtcnn⽹络的⽂件 detect_face.py,这⾥⾯的东西在facenet的项⽬中的都可以到
models中存放的是训练好的knn模型,⽤于测试使⽤的简单模型,⼀会⼉展⽰的效果也是由其完成
数据结构与算法论文train_dir 顾名思义,就不解释了
facenet.py就是⼀直在谈的东西,其中包含了如何搭建facenet⽹络,以及计算的内容
test.py train_knn.py temp_test.py imageconvert.py这⼏个⽂件分别⼈脸识别测试 、 训练knn模型 、 遇到问题是精简代码调试使⽤ 、图像批量转化 ⽤于准备数据集 其他的没有谈及的⽂件都没有使⽤到,应该是以前测试时候忘记删除的
运⾏效果
vue菜鸟教程这是使⽤⼿机摄像头拍摄ipad从⽹上随便搜来的合照进⾏测试(也许也不是随便搜的...),能够准确将⼈脸框出,并进⾏识别,因为我使⽤的是knn训练的,⽽这⼏个⼈是未经过特殊训练的,所以将其归结为未知⼈,再接下来⼀段时间会对其进⾏改进,最终效果应该是可以实现单张图⽚数据库⽐对,
这样就不⽤对需要识别的⽬标每⼀个都训练⼀遍了,这也是⼈脸识别要达到的效果,上⾯所说的triplet loss就是⼀种很好的⽅法
因为房间光线⽐较暗,⽤⼿机摄像头拍摄以前的⾃拍,识别成功
运⾏环境和运⾏说明
推荐使⽤Anaconda配置tensorflow环境(因为本项⽬就是基于tensorflow框架的),是cpu版本(等新卡,其实就是穷...)⽹上教程很多,也很简单,本环境的python版本是3.6的,如果你的是2.7的话,那什么是多接口测试
就要改很多东西了(跟着报错改就ok),但何不如再安装个3.6的呢,在anaconda下真的是超级⽅便
编辑器⽤的是vscode,从windows转来,习惯使⽤vscode,真的很好⽤,在安装anaconda的时候会提⽰你是否装个vscode的,当然使⽤其他的也很好
⼀些依赖库当然是必备的,提⽰少啥装啥吧,我也忘了,反正那些基本的是要装的,⽐如numpy maplotlib jupyter scikit-image librosa kersa 这些,安装也很简单,在anaconda⾥安装 使⽤conda命令 或者如果你的linux的默认python就是anaconda⾥的,直接使⽤pip安装就好了
本项⽬⾥的⼏个运⾏的代码,我都写好了参数,直接运⾏即可(当然制定⽂件要在指定位置) 运⾏顺序是
准备好⾃⼰的训练集 ⼏⼗张⾃⼰照⽚即可(尺⼨要⼩⼀点的,最好500*500以下,不然速度慢,精度低),放到train_dir/pic_me ⽂件夹下⾯,把我打包⽂件⾥的pic_others⽂件夹中的放到指定train_dir/pic_others下⾯(这部分数据也可以⾃⼰准备,我的数据是来⾃lfw中的前⼏百张图⽚)
运⾏train_knn.py 得到⾃⼰的knn模型
运⾏test.py (记得要把⼿机上的ip摄像头app打开,点击下⾯打开IP摄像头服务器 ,并检查下显⽰的局域⽹ip和test.py 中的是否相同,如不相同,改⼀下)
启动的时候会⽐较慢,30s到⼀分钟左右,取决于电脑性能
⾄此你应该已经成功跑起来这个项⽬了,在此感谢开源的伟⼤,让我们能感受到这些神奇的算法
阅读代码和重构项⽬建议
好学的各位爷肯定是要将代码好好看⼀通的,因为我也是菜鸡,看到拙劣之处,请会⼼⼀笑...
代码思路
使⽤mtcnn截取视频帧中⼈像的⼈脸,并拉伸为固定⼤⼩(这⾥为160*160,由使⽤的facenet⽹络所受限)
将上⼀步骤得到的⼈脸输⼊facenet,得到embedding层的输出,⼀个⼈像对应⼀个1*128数据,然后将其输⼊knn⽹络,得到预测结果
学习思路
⼀定⼀定要搞清楚其中的数据流是以什么样的格式和形式在传递,其中⼤多数使⽤的都是numpy.ndarray数据类型,此外便要掌握⼀些基本的此类数据类型的格式转换函数,并熟记,很常⽤的,还有就是和list 的转换
掌握⼀点点opcv的读写函数
掌握⼀些对⽂件操作的函数
⾄此,你应该已经很容易的就能够吃透本项⽬的内容了,读完下⾯的论⽂和各种算法的衍⽣,相信你⼀定对计算机视觉会有更加深刻的认识,并且会觉得豁然开朗~
接下来的暑假时间我要去玩玩其他的⽅向了,⽐如NLP啥的,好像很⽕,⼯作简历⾥还是有⼏个项⽬好,之前说好的解读,我会在晚上打完游戏的时候写,毕竟⼀天沉淀的时间,我保证肯定会写的,各位爷,⽩了个⽩
mtcnn
关于物体检测的⽜逼好⽂ 基于深度学习的⽬标检测
Selective Search中如何选择初始时Bounding Box区域合并原理
图⽂并茂详细介绍的⽬标检测重⼤发展的paper原理基于深度学习的⽬标检测技术演进
facenet
python入门教程网盘
参考⽂章
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论