一、实验目的

通过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)

深度学习人脸目标检测 目标检测和人脸识别_数组

深度学习人脸目标检测 目标检测和人脸识别_计算机视觉_02

   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)

深度学习人脸目标检测 目标检测和人脸识别_计算机视觉_03