一、实验目的通过python 语言编程设计人脸检测算法,以此人脸作为训练样本,训练目标人脸模型,进一步实现目标人脸的识别。通过上述编程促进学生理解并掌握人脸检测及识别的相关原理,同时培养学生的编程能力。 二、实验硬、软件环境笔记本电脑,windows10系统,Visual Studio Code编辑器,opencv视觉库,numpy库, matplolib库。 三、实验内容及步骤(一)实验内容实现人脸的检测及目标人脸识别 采用DNN人脸检测和EigenFaces人脸识别器 (二) 实验过程1.从包含目标人脸的图像中检测到人脸并保存到文件夹。dnnnet = cv2.dnn.readNetFromTensorflow("opencv_face_detector_uint8.pb", "opencv_face_detector.pbtxt") img = cv2.imread("xiaolihao.png") #读取图像 h, w = img.shape[:2] #获得图像尺寸 blobs = cv2.dnn.blobFromImage(img, 1.0, (300, 300), [104., 117., 123.], False, False) #创建图像块数据 dnnnet.setInput(blobs) #将块数据设置为输入 detections = dnnnet.forward() ###将检测出可信度高的人脸图像保存到文件夹 faces += 1 box = detections[0, 0, i, 3:7] * np.array([w, h, w, h]) #获得人脸在图像中的坐标 x1,y1,x2,y2 = box.astype("int") y = y1 - 10 if y1 - 10 > 10 else y1 + 10 #算出可信度输出位置 text = "%.3f"%(confidence * 100)+'%' cv2.rectangle(img, (x1, y1), (x2, y2), (255, 0, 0), 2)#标注人脸范围 img2=img[ y1: y2,x1 : x2 ] cv2.imwrite(str(j)+".jpg",img2) 2.读取目标人脸训练模型。train_images=[img11,img12,img21,img22] #创建训练图像数组 labels=np.array([1,2,3,4]) #创建标签数组,1~4表示训练图像数组中人脸的身份 recognizer=cv2.face.EigenFaceRecognizer_create()#创建EigenFaces识别器 recognizer.train(train_images,labels) #执行训练操作 3.从包含目标人脸的图像中检测并识别目标人脸,在图像中进行标记,保存标记后的图像。testimg=cv2.imread('test2.png',0) #打开测试图像 label,confidence=recognizer.predict(testimg) #识别人脸 print('匹配标签:',label) print('可信程度:',confidence) b=label #保存标记后的图像 if b==1: cv2.imwrite('biaoji.png',img11) elif b==2: cv2.imwrite('biaoji.png',img12) elif b==3: cv2.imwrite('biaoji.png',img21) elif b==4: cv2.imwrite('biaoji.png',img22)
代码:(注意对图像的像素要求很高,如xiao1.png像素都控制在120*160)renlianjiance1.py: #DNN人脸检测 import cv2 import numpy as np from matplotlib import pyplot as plt dnnnet = cv2.dnn.readNetFromTensorflow("opencv_face_detector_uint8.pb", "opencv_face_detector.pbtxt") img = cv2.imread("xiaolihao.png") #读取图像 h, w = img.shape[:2] #获得图像尺寸 blobs = cv2.dnn.blobFromImage(img, 1.0, (300, 300), #创建图像的块数据 [104., 117., 123.], False, False) dnnnet.setInput(blobs) #将块数据设置为输入 detections = dnnnet.forward() #执行计算,获得检测结果 faces = 0 j=0 for i in range(0, detections.shape[2]): #迭代,输出可信度高的人脸检测结果 confidence = detections[0, 0, i, 2] #获得可信度 if confidence > 0.6: #输出可行度高于80%的结果 faces += 1 box = detections[0, 0, i, 3:7] * np.array([w, h, w, h]) #获得人脸在图像中的坐标 x1,y1,x2,y2 = box.astype("int") y = y1 - 10 if y1 - 10 > 10 else y1 + 10 #计算可信度输出位置 text = "%.3f"%(confidence * 100)+'%' cv2.rectangle(img, (x1, y1), (x2, y2), (255, 0, 0), 2) #标注人脸范围 img2=img[ y1: y2,x1 : x2 ] cv2.imwrite(str(j)+".jpg",img2) j=j+1 cv2.putText(img,text, (x1, y), #输出可信度 cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 0, 255), 2) cv2.imshow('faces',img) cv2.waitKey(0) renlianshibie2.py: # 使用EigenFaces人脸识别器 import cv2 import numpy as np #读入训练图像 img11=cv2.imread('xiao0.png',0) #打开图像,灰度图 img12=cv2.imread('xiao1.png',0) #打开图像,灰度图 img21=cv2.imread('xiao2.png',0) #打开图像,灰度图 img22=cv2.imread('xiao3.png',0) #打开图像,灰度图 train_images=[img11,img12,img21,img22] #创建训练图像数组 labels=np.array([1,2,3,4]) #创建标签数组,0~1表示训练图像数组中人脸的身份 recognizer=cv2.face.EigenFaceRecognizer_create() #创建EigenFaces识别器 recognizer.train(train_images,labels) #执行训练操作 testimg=cv2.imread('test2.png',0) #打开测试图像 label,confidence=recognizer.predict(testimg) #识别人脸 print('匹配标签:',label) print('可信程度:',confidence) b=label if b==1: cv2.imwrite('biaoji.png',img11) elif b==2: cv2.imwrite('biaoji.png',img12) elif b==3: cv2.imwrite('biaoji.png',img21) elif b==4: cv2.imwrite('biaoji.png',img22) |