目标人脸检测与识别(计算机视觉)

一、实验目的

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

目标人脸检测与识别(计算机视觉)_第1张图片

目标人脸检测与识别(计算机视觉)_第2张图片

   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)

目标人脸检测与识别(计算机视觉)_第3张图片

  

代码:(注意对图像的像素要求很高,如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)

目标人脸检测与识别(计算机视觉)_第4张图片

你可能感兴趣的:(计算机视觉)