基于树莓派Python的人脸识别,宿舍都不用带钥匙了!
一、 介绍通过将人脸收集,进行训练,将要分析的面部的捕获部分作为参数,并将返回其可能的所有者,指示其ID以及识别器对此匹配的信任程度实现人脸的识别。二、实现步骤一、人脸收集首先,创建用于开发项目的目录,例如FacialRecognitionProject:mkdir FacialRecognitionProject1接下来,创建一个子目录,我们将在其中存储面部样本并将其命名为“数据集”:mkdir
一、 介绍
通过将人脸收集,进行训练,将要分析的面部的捕获部分作为参数,并将返回其可能的所有者,指示其ID以及识别器对此匹配的信任程度实现人脸的识别。
二、实现步骤
一、人脸收集
首先,创建用于开发项目的目录,例如FacialRecognitionProject:
mkdir FacialRecognitionProject 1
接下来,创建一个子目录,我们将在其中存储面部样本并将其命名为“数据集”:
mkdir dataset 1
之后将以下代码命名为01_face_dataset.py并保存在FacialRecognitionProject文件夹中,除此之外我们还必须在FacialRecognitionProject上保存面部分类器haarcascade_frontalface_default.xml
import cv2 import os cam = cv2.VideoCapture(0) cam.set(3, 640) # set video width cam.set(4, 480) # set video height face_detector = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') # For each person, enter one numeric face id face_id = input('\n enter user id end press <return> ==> ') print("\n [INFO] Initializing face capture. Look the camera and wait ...") # Initialize individual sampling face count count = 0 while(True): ret, img = cam.read() img = cv2.flip(img, 1) # flip video image vertically gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) faces = face_detector.detectMultiScale(gray, 1.3, 5) for (x,y,w,h) in faces: cv2.rectangle(img, (x,y), (x+w,y+h), (255,0,0), 2) count += 1 # Save the captured image into the datasets folder cv2.imwrite("dataset/User." + str(face_id) + '.' + str(count) + ".jpg", gray[y:y+h,x:x+w]) cv2.imshow('image', img) k = cv2.waitKey(100) & 0xff # Press 'ESC' for exiting video if k == 27: break elif count >= 30: # Take 30 face sample and stop video break # Do a bit of cleanup print("\n [INFO] Exiting Program and cleanup stuff") cam.release() cv2.destroyAllWindows() 1234567891011121314151617181920212223242526272829303132333435363738394041
运行代码,填入ID(1,2,3)号,ID必须为整数。
face_id = input('\n enter user id end press <return> ==> ') 1
对于捕获的每个帧,我们都应将其另存为“数据集”目录中的文件:
cv2.imwrite("dataset/User." + str(face_id) + '.' + str(count) + ".jpg", gray[y:y+h,x:x+w]) 1
请注意,要保存上述文件,必须已导入库“ os”。每个文件的名称将遵循以下结构:
User.face_id.count.jpg 1
例如,对于一个face_id = 1的用户,数据集/目录上的第四个样本文件将类似于:
User.1.4.jpg 1
在代码中,每个ID捕获30个样本,可以在最后的“elif”上进行更改。样本数量用于打破捕获面部样本的循环。运行Python脚本并捕获一些ID。每次要聚集新用户(或更改已经存在的用户的照片)时,都必须运行脚本。
二、人脸训练
我们必须从数据集中获取所有用户数据,并“训练” OpenCV Recognizer。这是通过特定的OpenCV函数直接完成的。
首先,创建一个子目录,我们将在其中存储训练后的数据:
mkdir trainer 1
之后将以下代码命名02_face_training.py,并保存在FacialRecognitionProject文件夹中。
import cv2 import numpy as np from PIL import Image import os # Path for face image database path = 'dataset' recognizer = cv2.face.LBPHFaceRecognizer_create() detector = cv2.CascadeClassifier("haarcascade_frontalface_default.xml"); # function to get the images and label data def getImagesAndLabels(path): imagePaths = [os.path.join(path,f) for f in os.listdir(path)] faceSamples=[] ids = [] for imagePath in imagePaths: PIL_img = Image.open(imagePath).convert('L') # convert it to grayscale img_numpy = np.array(PIL_img,'uint8') id = int(os.path.split(imagePath)[-1].split(".")[1]) faces = detector.detectMultiScale(img_numpy) for (x,y,w,h) in faces: faceSamples.append(img_numpy[y:y+h,x:x+w]) ids.append(id) return faceSamples,ids print ("\n [INFO] Training faces. It will take a few seconds. Wait ...") faces,ids = getImagesAndLabels(path) recognizer.train(faces, np.array(ids)) # Save the model into trainer/trainer.yml recognizer.write('trainer/trainer.yml') # recognizer.save() worked on Mac, but not on Pi # Print the numer of faces trained and end program print("\n [INFO] {0} faces trained. Exiting Program".format(len(np.unique(ids)))) 1234567891011121314151617181920212223242526272829303132333435
确认是否在Rpi上安装了PIL库。如果没有,请在终端中运行以下命令:
pip install pillow 1
运行代码,我们将使用OpenCV软件包中随附的LBPH(本地二进制模式直方图)人脸识别器作为识别器。我们在以下行中执行此操作:
recognizer = cv2.face.LBPHFaceRecognizer_create() 1
函数getImagesAndLabels(path)将在目录“ dataset /”上识别所有照片,并返回2个数组:“ Ids”和“ faces”。使用这些数组作为输入,我们将“训练我们的识别器”:
recognizer.train(faces, np.array(ids)) 1
结果,名为“ trainer.yml”的文件将保存在我们之前创建的Trainer目录中。
三、人脸识别
我们将在相机上捕捉一张新面孔,如果此人之前曾被捕捉和训练过,则我们的识别器将做出“预测”,返回其ID和索引,返回置信度。
将以下代码命名03_face_recognition.py,并保存在FacialRecognitionProject文件夹中。
import cv2 import numpy as np import os recognizer = cv2.face.LBPHFaceRecognizer_create() recognizer.read('trainer/trainer.yml') cascadePath = "haarcascade_frontalface_default.xml" faceCascade = cv2.CascadeClassifier(cascadePath); font = cv2.FONT_HERSHEY_SIMPLEX #iniciate id counter id = 0 # names related to ids: example ==> Marcelo: id=1, etc names = ['None', 'meng', 'Paula', 'Ilza', 'Z', 'W'] # Initialize and start realtime video capture cam = cv2.VideoCapture(0) cam.set(3, 640) # set video widht cam.set(4, 480) # set video height # Define min window size to be recognized as a face minW = 0.1*cam.get(3) minH = 0.1*cam.get(4) while True: ret, img =cam.read() img = cv2.flip(img, -1) # Flip vertically gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) faces = faceCascade.detectMultiScale( gray, scaleFactor = 1.2, minNeighbors = 5, minSize = (int(minW), int(minH)), ) for(x,y,w,h) in faces: cv2.rectangle(img, (x,y), (x+w,y+h), (0,255,0), 2) id, confidence = recognizer.predict(gray[y:y+h,x:x+w]) # Check if confidence is less them 100 ==> "0" is perfect match if (confidence < 100): id = names[id] confidence = " {0}%".format(round(100 - confidence)) else: id = "unknown" confidence = " {0}%".format(round(100 - confidence)) cv2.putText(img, str(id), (x+5,y-5), font, 1, (255,255,255), 2) cv2.putText(img, str(confidence), (x+5,y+h-5), font, 1, (255,255,0), 1) cv2.imshow('camera',img) k = cv2.waitKey(10) & 0xff # Press 'ESC' for exiting video if k == 27: break # Do a bit of cleanup print("\n [INFO] Exiting Program and cleanup stuff") cam.release() cv2.destroyAllWindows() 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
我们在此处定义一个新数组,因此我们将显示“名称”,而不是编号的ID:
names = ['None', 'meng', 'Paula', 'Ilza', 'Z', 'W'] 1
因此,例如:meng将id = 1的用户;Paula:id = 2,依此类推。
如果置信指数被视为完全匹配,则其将返回“零”。
最后,如果识别器可以预测到人脸,我们在图像上放上一个文本,并附上可能的ID,以“%”表示匹配正确(“概率” = 100-置信指数)。如果不是,则在脸上贴上“未知”标签。
源码获取加群:1136192749

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐
所有评论(0)