一、实验目的通过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,cnotallow=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,cnotallow=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)
|