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

人脸识别

时间:2023-06-15 22:44:56浏览次数:29  
标签:人脸识别 image labels cv2 face 图像 path

1、引入库函数

1 import cv2
2 import os
3 import imghdr
4 import numpy as np
5 import matplotlib.pyplot as plt

2、#定义函数:检测人脸并保存

 1 def detect_faces(image_path, output_dir):
 2     # 读取图像
 3     image = cv2.imread(image_path)
 4     # 将图像转换为灰度图像
 5     grayscale_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
 6     # 加载人脸检测器(使用Haar级联分类器)
 7     face_detector = cv2.CascadeClassifier("haarcascade_frontalface_alt.xml")
 8     # 检测人脸
 9     faces = face_detector.detectMultiScale(
10         grayscale_image,
11         scaleFactor=1.1,
12         minNeighbors=2,
13         minSize=(20, 20),
14         flags=cv2.CASCADE_SCALE_IMAGE
15     )
16     # 对于每个检测到的人脸
17     for i, (x, y, w, h) in enumerate(faces):
18         # 生成人脸图像的文件名
19         pic_name = f"face_{i}_{os.path.basename(image_path)}"
20         # 提取人脸图像
21         face = cv2.resize(image[y:y+h, x:x+w], (200, 200))
22         # 将人脸图像保存到输出目录
23         cv2.imwrite(os.path.join(output_dir, pic_name), face)

3、定义函数:保存用于训练的人脸图像

 1 def save_faces_for_training(data_dir, output_dir):
 2     # 如果输出目录不存在,则创建它
 3     if not os.path.exists(output_dir):
 4         os.makedirs(output_dir)
 5     # 遍历数据目录中的文件
 6     for file in os.listdir(data_dir):
 7         # 构建文件路径
 8         file_path = os.path.join(data_dir, file)
 9         # 检测并保存人脸图像
10         detect_faces(file_path, output_dir)

 

4、定义函数:生成标签文件

 1 def generate_labels(data_dir):
 2     # 打开标签文件,准备写入标签
 3     with open("label.txt", "w") as label_file:
 4         label = 0
 5         # 遍历数据目录中的子目录
 6         for root, dirs, files in os.walk(data_dir):
 7             for subdir in dirs:
 8                 # 构建子目录路径
 9                 subdir_path = os.path.join(root, subdir)
10                 # 遍历子目录中的文件
11                 for file in os.listdir(subdir_path):
12                     # 构建文件路径
13                     file_path = os.path.join(subdir_path, file)
14                     # 获取文件的图像类型
15                     image_type = imghdr.what(file_path)
16                     # 如果是支持的图像类型(如jpeg、png、jpg),则将文件路径写入标签文件
17                     if image_type in ("jpeg", "png", "jpg"):
18                         label_file.write(f"{file_path}\n")
19                 label += 1

5、定义函数:加载图像和标签

 1 def load_images_and_labels():
 2     images = []
 3     labels = []
 4     # 打开标签文件,读取图像和标签
 5     with open("label.txt") as label_file:
 6         for line in label_file:
 7             # 去除每行的换行符,并获取图像路径
 8             image_path = line.strip()
 9             # 获取标签(从图像路径中提取)
10             label = os.path.basename(os.path.dirname(image_path))
11             # 读取图像并将其转换为灰度图像
12             image = cv2.imread(image_path)
13             # 将图像转换为灰度图像
14             grayscale_image = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
15             # 将灰度图像添加到图像列表中
16             images.append(grayscale_image)
17             # 将标签添加到标签列表中
18             labels.append(label)
19     return images, labels

6、定义函数:训练模型

 1 def train_model(images, labels):
 2     # 获取唯一的标签值
 3     unique_labels = list(set(labels))
 4     # 创建标签到索引的映射
 5     label_map = {label: idx for idx, label in enumerate(unique_labels)}
 6     # 将标签转换为映射后的整数标签
 7     mapped_labels = [label_map[label] for label in labels]
 8 
 9     # 创建人脸识别模型(使用Eigenfaces算法)
10     model = cv2.face.EigenFaceRecognizer_create()
11     # 将标签转换为NumPy数组
12     labels_array = np.array(mapped_labels, dtype=np.int32)
13     # 训练模型
14     model.train(images, labels_array)
15     # 保存训练后的模型
16     model.save("face_trained.yml")

7、定义函数:识别人脸

 1 def recognize_face(image_path, model):
 2     # 读取图像
 3     image = cv2.imread(image_path)
 4     # 将图像转换为灰度图像
 5     grayscale_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
 6     # 将图像转换为RGB图像(用于显示)
 7     rgb_image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
 8     # 不显示坐标轴
 9     plt.axis("off")
10     # 显示图像
11     plt.imshow(rgb_image)
12     # 加载人脸检测器
13     face_detector = cv2.CascadeClassifier("haarcascade_frontalface_alt.xml")
14     # 检测人脸
15     faces = face_detector.detectMultiScale(
16         grayscale_image,
17         scaleFactor=1.1,
18         minNeighbors=2,
19         minSize=(20, 20),
20         flags=cv2.CASCADE_SCALE_IMAGE
21     )
22     # 如果检测到一个人脸
23     if len(faces) == 1:
24         x, y, w, h = faces[0]
25         # 提取人脸图像并调整大小
26         face = cv2.resize(grayscale_image[y:y+h, x:x+w], (200, 200))
27         # 使用模型预测人脸图像的标签
28         params = model.predict(face)
29         # 根据预测的标签输出结果
30         if params[0] == 1:
31             print("该图片里的人是蔡徐坤!")
32         elif params[0] == 0:
33             print("该图片里的人是李晨!")
34         else:
35             print("该图片里的人不是蔡徐坤也不是李晨!此人不认识。")
36     else:
37         print("无法识别!")

8、保存人脸图像用于训练

 1 save_faces_for_training("caixukun", "face_images/wang")
 2 save_faces_for_training("lichen", "face_images/angel")
 3 print("读取并截取人脸图片OK")
 4 
 5 # 生成标签文件
 6 generate_labels("face_images")
 7 print("保存截取的人脸图片OK")
 8 
 9 # 加载图像和标签
10 images, labels = load_images_and_labels()
11 # 训练模型
12 train_model(images, labels)
13 print("正在开始识别请稍等")
14 
15 # 识别人脸
16 image_path = "c01.jpg"
17 # 创建人脸识别模型
18 model = cv2.face.EigenFaceRecognizer_create()
19 # 从文件中加载训练好的模型
20 model.read("face_trained.yml")
21 # 使用模型识别人脸
22 recognize_face(image_path, model)

 

标签:人脸识别,image,labels,cv2,face,图像,path
From: https://www.cnblogs.com/One-punch-man/p/17484312.html

相关文章

  • 人脸识别
    1.导入库函数1importnumpyasnp2importmatplotlib.pyplotasplt3importcv24importos#导入os库,用于实现与操作系统的交互5importimghdr#导入imghdr库,用于判断图像文件的类别 2.定义人脸识别函数1deffacedetector(img_name,output):2#定义人脸识别......
  • 基于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......