python人脸识别从入门到工程实践,Python实现人脸识别
前言:让我的电脑认识我。只有我的电脑认识我,才能称之为我的电脑!
今天我们用Python实现简单的人脸识别技术!
在python中,有很多方法可以实现简单的人脸识别。根据Python glue语言的特点,我们可以通过调用包来快速准确地达到这个目的。这里有一个准确度更高的。
欲直接下载源代码文件,关注微信公众号:Python联盟,回复“人脸识别”即可获取~
首先梳理一下实现人脸识别需要的步骤:
过程大致是这样的。在此之前,要把人的脸准确找出来,也就是能准确区分人脸的分类器。这里可以使用训练好的分类器,网上种类齐全,分类准确率高。在这方面我们也可以节省时间。
Ps:博主的宝贝来源已放入以下链接~
建议:GitHub项目
https://github.com/opencv/opencv/tree/master/data/haarcascades
既然用了python,自然要用包。在查看代码之前,让我们列出整个项目所需的包:
CV2(Opencv):图像识别,相机通话
os:文件操作
numpy:NumPy(数值Python)是Python语言的扩展库,支持大量的维数组和矩阵运算,还提供了大量的数组运算的数学函数库。
PIL:Python图像库,Python平台上图像处理的标准库。
2.接下来,1。对比人脸采集# -导入cv2#调用笔记本内置摄像头,参数为0。如果有其他摄像头,参数可以调整为1,2cap=cv2。VideoCapture(0)#来调用面部分类器。若要调整3face _ detector=cv2.cascade分类器(r x:/users/73950/desktop/facerec/Haar cascade _ frontal face _ default . XML )# to be changed #用id face _ id=input (\ n用户数据输入,看着摄像机并等待.)# SampleNum用于计算样本数count=当True: #从相机读取图片成功,Img=cap.read() #转换为灰度图像,降低程序符合性,提高识别度。如果成功为真:gray=cv2.cvtcolor (img,cv2 . color _ bgr 2 gray)Else:break # Detect faces,将各个摄像头记录的数据带入OpenCv,让分类器判断人脸#其中gray为待检测的灰度图像,1.3为各个图像缩小的比例,5为min neighbors faces=face _ detector。检测多尺度(Gray,1.3,5) #框选择人脸,for循环保证可以检测到人脸中(x,y,w,h)的实时动态视频流:#xy为左上角坐标,w为宽,h为高,框架矩形(img,(x,y),(x w,y w),(255,0,0) #如果框选择成功,样本数将增加count=1 #。保存图像,将灰度图像作为二维数组检测人脸区域#(这里是建立数据的文件夹,当然也可以设置成另一个路径或者调用数据库)cv2.imwrite (data/user。str (face _ id) . str (count)。jpg ,gray [y: y h,x: x w]) #显示图片cv2.imshow(image ,img) #保留图片。waitkey方法可以绑定键,保证画面可以收回,用Q键K=CV2退出相机。wait key(1 if K== 27 :获取800个样本后,中断#或退出相机。在这里,您可以根据实际情况修改数据量。经过实际测试,800张图像的效果比较理想:elif count=800: break#关闭相机,释放资源。首都Realease () CV2。破坏性的Windows()已经通过了博客的测试,并正在实施。
“face _ detector=cv2 . cascadeclsifier(r c:\ users \ admin \ desktop \ python \ data \ Haar cascode _ frontal face _ default . XML )”在这个语句中,实际路径中的目录名尽量不要有汉字,否则容易报错。
这样,你的电脑就能看到你啦!
2.通过算法建立对比模型。这次用的算法是opencv自带的算法。opencv的较新版本(我用的是2.4.8)提供了一个FaceRecognizer类,里面包含了一些相关的人脸识别算法和函数接口,包括三个人脸识别算法(我们用第一个
1 .特征脸
2 .渔民脸
3.LBPHFaceRecognizer
LBP是一种特征提取方法,可以提取图像的局部纹理特征。初始LBP算子在3X3窗口中取中心像素的像素值作为阈值,与周围8个像素的像素值进行比较。如果一个像素的像素值大于阈值,则该像素标记为1,否则标记为0。这样就可以得到一个8位的二进制码,转换成十进制的LBP码,就可以得到这个窗口的LBP值,这个值可以用来反映这个窗口的纹理信息。
LBPH是对原始LBP的改进。在opencv的支持下,我们可以直接调用函数来创建LBPH人脸识别的模型。
我们在前一部分的同一目录中创建一个名为trainner.py的Python文件,用于编写数据集生成脚本。在同一个目录中,创建一个名为trainner的文件夹来存储我们训练过的识别器。
# -用于处理图像# path=data#设置前采集的数据文件的路径#初始化识别的方法recog=cv2 . face . lbphface recognizer _ create()#调用熟悉的人脸分类器detector=cv2.cascade分类器( Haar cascade _ frontal face _ default . XML )#创建从数据集文件夹中获取训练图片的函数, 并获取id#注意图片的命名格式为user . id . samplenumdef get _ images _ and _ labels(path):image_paths=[OS . path . join(path,F) for f in os.listdir(path)] #新建列表存储face_samples=[] ids=[] #遍历图片路径,导入图片和id添加到image _ paths中image _ path的列表:#通过图像路径img=image.open (image _ path)将其转换为灰度图片。 Convert (l) #将图片转换成数组img _ NP=np.array (img, uint 8 )if OS . path . Split(image _ path= jpg :continue #为了得到id,对图片和路径进行拆分,得到id=int(OS . path . Split(image _ path)[-1]。拆分(.)[1])faces=detector . detect multi scale(img _ NP)#将获取的图片和id添加到faces:face _ samples . append(img _ NP[y:y H,x:x w])ids . append(id)return face _ samples,ids #调用该函数并将数据提供给识别器训练打印( training . )faces,IDS=get _ images _ and _ labels(path)#训练模型recog.train (faces,np.array (IDS)) #保存模型recog . save( train ner/train ner . yml )这就让电脑认识到你是与众不同的那颗星~
3.识别、检测、验证、输出的过程实际上是识别,与前两个过程不同。这是一个涉及实际使用的过程,所以我们把它放在一个统一的文件里。
#-检查、验证并输出结果-导入CV2 #准备识别方法recognizer=CV2 . face . lbphfacecognizer _ create()#使用之前训练好的模型recognizer . read( train ner/train ner . yml )#调用人脸分类器cascade _ frontal face _ default . XML face _ cascade=CV2 . cascade=CV2 . cascade _ path)#再次加载字体进行识别,在图片上标记对象名称font=CV2 . font _ Hershey _ simpleidnum=0 #。设置与ID号对应的用户名,如下所示。例如,0对应于初始名称=[initial , admin , user1 , user2 ,User3]#调用摄像机cam=cv2 . video capture(0)minw=0.1 * cam . get(3)Minh=0.1 * cam . get(4)while true:ret,img=cam . read()gray=cv2 . CVT color(img,2 .cv2。COLOR_BGR2GRAY) #人脸识别faces=face _ cascade。Detect multiscale (gray,scale factor=1.2,minneighbors=5,minsize=(int (minw),Int(minH))) # check for (x,Y,w,h in faces:cv2 . rectangle(img,(X,Y),(x w,y h),(0,255,0),2) idnum,confidence=recognizer . predict . X:X w)#如果置信度为100:idum=names[idnum]confidence= { 0 } % ,Format (round (100 0,255),1) cv2.puttext (img,str (confidence),(x5,y h-5),font,1,(0,0,0),1) #显示结果cv2 . imshow(Img)k=cv2 . wait key(20)如果k==27: break #释放资源cam . release()cv2 . destructively windows()现在,你的电脑就能识别出你来啦!
其他组合也可以实现上电检测等多种功能。你学会了吗?
下面是测试结果和博主审稿时的一些问题~希望对大家有帮助(易)
测试结果:
博主审稿测试过程中出现的问题:
(1)版本问题
解决方法:经过博主无数次的失败,建议你最好安装python2.7,可以直接使用pip安装numpy和pip安装opencv-python来安装python版本的numpy和opencv。
(如果您使用的是Anaconda2,可以在开始菜单中的Anaconda2文件夹下的Anaconda提示符中输入pip相关命令)
点击推文中给出的链接,下载github中的文件放到编译好的文件所在的文件夹中,在代码中更改相关目录。
(2)如果提示“module object has no attribute face”
解决方法:可以输入pip安装opencv-contrib-python解决问题。如果提示需要佣金,可以添加-user,即pip安装opencv-contrib-python-user。
如有其他问题,欢迎随时联系博主~ ~ ~
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。