首页 > 其他分享 >人脸识别

人脸识别

时间:2023-06-15 21:56:10浏览次数:33  
标签:人脸识别 img 标签 cv2 人脸 图像 path

1.导入库函数

1 import numpy as np 
2 import matplotlib.pyplot as plt
3 import cv2
4 import os #导入os库,用于实现与操作系统的交互
5 import imghdr #导入imghdr库,用于判断图像文件的类别

 

2.定义人脸识别函数

 1 def facedetector(img_name,output):
 2 #定义人脸识别函数,检测人脸后,把人脸保存到指定的文件中
 3     name = os.path.basename(img_name)
 4     #获取图像文件名
 5     
 6     img = cv2.imread(img_name)
 7     #读取图像文件
 8     
 9     gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
10     #将图像转为灰度图
11     
12     face_detector = cv2.CascadeClassifier("haarcascade_frontalface_alt.xml")
13     #加载人脸识别检测器
14     
15     #在灰度图中检测人脸
16     faces = face_detector.detectMultiScale(
17     gray, #灰度图像,即想要识别的人脸
18     scaleFactor=1.1,#表示每次缩小图像的比例,为1.1
19     minNeighbors=2, #表示图片需要有2个邻近矩形,才能被认为是人脸。
20     minSize=(20, 20),#定义匹配人脸的最小尺寸
21     flags=cv2.CASCADE_SCALE_IMAGE #选择检测模式,为正常比例检测
22 )  # 在灰度图像中检测人脸
23     
24     #将检测出来的人脸部分按照给定文件比蒙保存到指定的文件夹
25     for i,(x,y,w,h) in enumerate(faces):
26         pic_name = 'a{0}{1}'.format(i,name)# 根据人脸位置信息和文件名生成保存的文件名
27         f = cv2.resize(img[y:y+h,x:x+h],(200,200))# 从原图中截取人脸部分并调整大小为200x200像素
28         
29         cv2.imwrite(os.path.join(output,pic_name),f)# 将人脸图像保存到指定的输出路径
30         print(x,y)# 输出人脸位置信息

 

3.定义训练函数

1 def save_faces_for_train(path,output):
2 #保存训练样本中的人脸图像    
3     if not os.path.exists(output):
4     #如果输出目录不存在,则创建目录
5         os.makedirs(output)#创建目录
6         
7     for file in os.listdir(path):#遍历输入目录中的文件
8         file_name = os.path.join(path,file)# 获取文件的完整路径
9         facedetector(file_name,output)#对每个文件进行人脸检测并保存人脸图像

 

4.训练两个人脸模型

1 save_faces_for_train("msk","face_images/msk")# 调用函数保存"Msk"目录下的人脸图像
2 
3 save_faces_for_train("leijun","face_images/leijun")# 调用函数保存"Leijun"目录下的人脸图像
4 
5 print("OK")#如果调用成功,会打印OK

 

5.定义生成标签函数

 1 #生成样本标签
 2 def get_label(path):
 3     #打开标签文件
 4     fh = open("label.txt","w")
 5     # 创建一个空的标签文件,准备写入标签信息
 6     label = 0
 7     # 初始化标签值为0
 8     
 9     #遍历目录及子目录下的文件
10     for root,dirs,files in os.walk(path):
11         # 使用os.walk函数遍历目录及其子目录下的文件和文件夹
12         for subdir in dirs:
13             # 遍历子目录
14             subdir_path = os.path.join(root,subdir)# 获取子目录的完整路径
15             for file in os.listdir(subdir_path):
16                 # 遍历子目录中的文件
17                 filepath = os.path.join(subdir_path,file) # 获取文件的完整路径
18                 imgType = imghdr.what(filepath)# 判断文件类型
19                 
20                 # 将文件路径和对应的标签写入标签文件
21                 fh.write(filepath)# 写入文件路径
22                 fh.write(":")# 写入分隔符":"
23                 fh.write(str(label)) # 写入标签值(将数字转为字符串)
24                 fh.write("\n")# 写入换行符,用于分隔每个文件的标签
25                 
26             label += 1# 标签值自增,用于区分不同类别的文件
27 
28     
29     fh.close()# 关闭标签文件

 

6.生成标签

1 get_label("face_images")# 生成样本标签
2 
3 print("OK")#若生成成功,则打印OK

 

7.根据标签,打开对应的图像的灰度图,检查人脸识别情况,并手动删除脏数据

 1 import cv2
 2 import math #调用math库中的ceil函数来计算图像
 3 
 4 images = []  # 存储图像数据的列表
 5 labels = []  # 存储标签数据的列表
 6 
 7 fh = open("label.txt")  # 打开标签文件                       
 8 
 9 for line in fh:  # 逐行读取标签文件
10     arr = line.split(":")  # 使用冒号":"分割每行的文件路径和标签值
11     img = cv2.imread(arr[0])  # 读取图像文件                                                     
12     gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)  # 将图像转换为灰度图像
13     
14     images.append(gray)  # 将灰度图像添加到图像列表中
15     labels.append(int(arr[1]))  # 将标签值转换为整数后添加到标签列表中
16 
17 n = math.ceil(len(images) / 10)  # 计算图像显示的行数
18 plt.figure(figsize=(10, n))  # 创建一个图像显示窗口,指定宽度为10,高度为n
19 
20 # 遍历图像列表并显示图像         
21 for i, img in enumerate(images):
22     plt.subplot(n, 10, i+1)  # 在图像显示窗口中创建子图
23     plt.imshow(img, "gray")  # 显示灰度图像                                                                 
24     plt.title(labels[i])  # 设置子图标题为对应的标签值
25     plt.axis("off")  # 不显示坐标轴
26     plt.tight_layout()  # 调整子图布局,确保图像显示完整
27     
28 plt.show()  # 显示图像窗口

 

8.保存自己训练的模型

 1 import cv2
 2 import math
 3 
 4 images = []# 存储图像数据的列表
 5 labels = []# 存储标签数据的列表
 6 
 7 fh = open("label.txt")# 打开标签文件
 8 
 9 for line in fh:# 逐行读取标签文件
10     arr = line.split(":")# 使用冒号":"分割每行的文件路径和标签值
11     img = cv2.imread(arr[0])#读取图像
12     gray = cv2.cvtColor(img,cv2.COLOR_RGB2GRAY)#将图像转为灰度图 
13      
14     images.append(gray)# 将灰度图像添加到图像列表中
15     labels.append(int(arr[1]))# 将标签值转换为整数后添加到标签列表中
16 
17 model = cv2.face.EigenFaceRecognizer_create()# 创建一个Eigenfaces人脸识别模型
18 model.save("0611_face_trained.yml")# 保存训练好的模型为"0611_face_trained.yml"文件
19  
20 print("OK")#模型保存运行成功,打印OK

 

9.识别人脸

 1 import cv2
 2 import matplotlib.pyplot as plt
 3 
 4 model = cv2.face.EigenFaceRecognizer_create() # 创建一个Eigenfaces人脸识别模型
 5 model.read("0611_face_trained.yml")#导入训练好的模型
 6 
 7 img_name = "leijun1.jpg"  # 导入想要识别的图片            
 8 img = cv2.imread(img_name)  # 读取图片
 9 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # 将图片转换为灰度图像
10 
11 face_detector = cv2.CascadeClassifier("haarcascade_frontalface_alt.xml")  # 加载人脸识别检测器
12 
13 faces = face_detector.detectMultiScale(
14     gray, #灰度图像,即想要识别的人脸
15     scaleFactor=1.1,#表示每次缩小图像的比例,为1.1
16     minNeighbors=2, #表示图片需要有2个邻近矩形,才能被认为是人脸。
17     minSize=(20, 20),#定义匹配人脸的最小尺寸
18     flags=cv2.CASCADE_SCALE_IMAGE #选择检测模式,为正常比例检测
19 )  # 在灰度图像中检测人脸
20 
21 if len(faces) == 1:  # 如果检测到一个人脸
22     x, y, w, h = faces[0]  # 提取人脸的位置和尺寸
23     face = cv2.resize(gray[y:y+h, x:x+h], (200, 200))  # 调整人脸图像的大小为200x200像素
24     cv2.rectangle(img, (x, y), (x+w, y+h), (0, 0, 255), 2)  # 在原图中标记人脸位置,用红色矩形框表示
25 
26     params = model.predict(face)  # 使用模型预测人脸标签
27     if params[0] == 0:  # 如果预测结果为0
28         print("该图片是雷军!")
29     elif params[0] == 1:  # 如果预测结果为1
30         print("该图片是马斯克!")
31     else:  # 如果预测结果不是0也不是1
32         print("不是雷军也不是马斯克!此人不认识!")
33 else:  # 如果未检测到人脸或检测到多个人脸
34     print("无法识别!")
35 
36 img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)  # 将图片从BGR格式转换为RGB格式
37 plt.axis("off")  # 不显示坐标轴
38 plt.imshow(img)  # 显示图片

 

标签:人脸识别,img,标签,cv2,人脸,图像,path
From: https://www.cnblogs.com/Ares-xh/p/17484213.html

相关文章

  • 基于XC7Z100+OV5640(DSP接口)YOLO人脸识别模块编写思路(部分1)
    填充模块设计及代码编写填充模块的功能对卷积层的输入数据进行填充操作,即在数据的四周加上一圈0,以保持特征图的尺寸不变或增大例如,将\(416*416\)的数据填充为\(418*418\)的数据填充模块的设计思路以第一层卷积层(layer0)的输入数据为例,图像尺寸为\(416*416\),通道数......
  • 基于XC7Z100+OV5640(DSP接口)YOLO人脸识别前向推理过程(部分5)
    Stream_rx模块代码编写功能Stream_rx模块是一个用来接收PS端发送的数据(包括权重、偏置、输入数据、激活查找表等)的模块,需要完成两个功能:完成对DMA数据的接收功能,并且区分当前接收的是哪一种类型的数据(根据data_type寄存器判断)。产生write_finish信号,给到main_control模块,......
  • 基于XC7Z100+OV5640(DSP接口)YOLO人脸识别前向推理过程(部分4)
    AXI-DMA使用介绍内容概述如何在Zynq平台上使用AXI-DMA进行PS和PL之间的高带宽数据传输。主要包括以下几个部分:AXI-DMA的简介和模式选择AXI-DMA的寄存器配置和编程顺序Vivado工程的创建和IP核的添加Vitis工程的创建和示例代码的运行ILA信号的抓取和分析AXI-DMA的简介......
  • Dlib+OpenCV深度学习人脸识别
    Dlib+OpenCV深度学习人脸识别 前言人脸识别在LWF(LabeledFacesintheWild)数据集上人脸识别率现在已经99.7%以上,这个识别率确实非常高了,但是真实的环境中的准确率有多少呢?我没有这方面的数据,但是可以确信的是真实环境中的识别率并没有那么乐观。现在虽然有一些商业应用如员工......
  • 基于XC7Z100+OV5640(DSP接口)YOLO人脸识别前向推理过程(部分3)
    基于ZYNQ的摄像头显示系统本文介绍了如何使用ZYNQ开发板、OV5640摄像头和HDMI显示器搭建一个摄像头显示系统本文的内容主要分为以下几个部分:硬件介绍Vivado工程创建Vitis工程创建实验结果展示硬件介绍ZYNQ开发板使用的是ZINC7100芯片,具有双核ARMCortex-A9处理器......
  • 基于XC7Z100+OV5640(DSP接口)YOLO人脸识别前向推理过程(部分2)
    认识神经网络1.认识神经网络中的神经元神经网络是模仿生物神经网络的结构和功能的数学模型或计算模型,由大量的节点或称神经元相互连接构成。神经元是神经网络的基本成分,它接收来自其他神经元的输入信号,通过权重、偏置和激活函数来产生输出信号。权重(weight)是表示输入信号的......
  • 基于XC7Z100+OV5640(DSP接口)YOLO人脸识别前向推理过程(笔记)
    PS与PL使用Axi4-lite进行数据交互内容概述如何在PS和PL之间使用Axi4-lite接口进行数据交互Axi4-lite是一种简单的总线协议,适用于低吞吐量的数据传输,例如PS发送加速相关的命令给PL内容分为以下几个部分:PS和PL之间的数据交互方案介绍Axi4-lite接口的使用方法和示例代码Ax......
  • 介绍.NET几种人脸识别组件
    人脸识别技术在现代社会中扮演着越来越重要的角色,比如人脸识别门禁、人脸识别支付、甚至人脸识别网站登录等。 最近有群友问.NET有没有人脸识别的组件,小编查阅相关资料介绍下面几种.NET人脸识别组件供大家参考。1、MicrosoftAzureFaceAPI简介:MicrosoftAzureFaceAPI是微软......
  • 旷视人脸识别代码
    servletpackagecom.sxr;importjavax.net.ssl.SSLException;importjava.io.*;importjava.net.HttpURLConnection;importjava.net.URL;importjava.net.URLEncoder;importjava.util.HashMap;importjava.util.Iterator;importjava.util.Map;importjava.util......
  • 从零玩转人脸识别验证-face
    title:从零玩转人脸识别验证date:2022-05-1521:05:52.974updated:2023-05-1600:00:11.594url:https://www.yby6.com/archives/facecategories:-Java分类-从零玩转系列-人脸识别tags:-java-人脸识别前言在线demo(前往享受人脸识别)本期教程人脸识别第......