P6周人脸识别

2024-05-04 03:36
文章标签 人脸识别 p6

本文主要是介绍P6周人脸识别,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、前期准备

1.设置GPU

import torch
import torch.nn as nn
import torchvision.transforms as transforms
import torchvision
from torchvision import transforms, datasets
import os,PIL,pathlib,warningswarnings.filterwarnings("ignore")             #忽略警告信息device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
device

2.导入数据

import os,PIL,random,pathlibdata_dir = './6-data/'
data_dir = pathlib.Path(data_dir)data_paths  = list(data_dir.glob('*'))
classeNames = [str(path).split("\\")[1] for path in data_paths]
classeNames

3.数据处理

 图片处理

# 关于transforms.Compose的更多介绍可以参考:https://blog.csdn.net/qq_38251616/article/details/124878863
train_transforms = transforms.Compose([transforms.Resize([224, 224]),  # 将输入图片resize成统一尺寸# transforms.RandomHorizontalFlip(), # 随机水平翻转transforms.ToTensor(),          # 将PIL Image或numpy.ndarray转换为tensor,并归一化到[0,1]之间transforms.Normalize(           # 标准化处理-->转换为标准正太分布(高斯分布),使模型更容易收敛mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])  # 其中 mean=[0.485,0.456,0.406]与std=[0.229,0.224,0.225] 从数据集中随机抽样计算得到的。
])total_data = datasets.ImageFolder("./6-data/",transform=train_transforms)
total_data

划分数据集(4:1)

total_data.class_to_idx
得到映射如下
{'Angelina Jolie': 0,'Brad Pitt': 1,'Denzel Washington': 2,'Hugh Jackman': 3,'Jennifer Lawrence': 4,'Johnny Depp': 5,'Kate Winslet': 6,'Leonardo DiCaprio': 7,'Megan Fox': 8,'Natalie Portman': 9,'Nicole Kidman': 10,'Robert Downey Jr': 11,'Sandra Bullock': 12,'Scarlett Johansson': 13,'Tom Cruise': 14,'Tom Hanks': 15,'Will Smith': 16
}
t
划分数据集
rain_size = int(0.8 * len(total_data))
test_size  = len(total_data) - train_size
train_dataset, test_dataset = torch.utils.data.random_split(total_data, [train_size, test_size])
train_dataset, test_dataset
加入dataloder中
batch_size = 32train_dl = torch.utils.data.DataLoader(train_dataset,batch_size=batch_size,shuffle=True,num_workers=1)
test_dl = torch.utils.data.DataLoader(test_dataset,batch_size=batch_size,shuffle=True,num_workers=1)
for X, y in test_dl:print("Shape of X [N, C, H, W]: ", X.shape)print("Shape of y: ", y.shape, y.dtype)break

二、构建网络

这次直接调用官方VGG

from torchvision.models import vgg16device = "cuda" if torch.cuda.is_available() else "cpu"
print("Using {} device".format(device))# 加载预训练模型,并且对模型进行微调
model = vgg16(pretrained = True).to(device) # 加载预训练的vgg16模型for param in model.parameters():param.requires_grad = False # 冻结模型的参数,这样子在训练的时候只训练最后一层的参数# 修改classifier模块的第6层(即:(6): Linear(in_features=4096, out_features=2, bias=True))
# 注意查看我们下方打印出来的模型
model.classifier._modules['6'] = nn.Linear(4096,len(classeNames)) # 修改vgg16模型中最后一层全连接层,输出目标类别个数
model.to(device)  
model

三、训练模型

1.设置学习率

# def adjust_learning_rate(optimizer, epoch, start_lr):
#     # 每 2 个epoch衰减到原来的 0.98
#     lr = start_lr * (0.92 ** (epoch // 2))
#     for param_group in optimizer.param_groups:
#         param_group['lr'] = lrlearn_rate = 1e-4 # 初始学习率
optimizer  = torch.optim.SGD(model.parameters(), lr=learn_rate)

2.编写训练函数

# 训练循环
def train(dataloader, model, loss_fn, optimizer):size = len(dataloader.dataset)  # 训练集的大小num_batches = len(dataloader)   # 批次数目, (size/batch_size,向上取整)train_loss, train_acc = 0, 0  # 初始化训练损失和正确率for X, y in dataloader:  # 获取图片及其标签X, y = X.to(device), y.to(device)# 计算预测误差pred = model(X)          # 网络输出loss = loss_fn(pred, y)  # 计算网络输出和真实值之间的差距,targets为真实值,计算二者差值即为损失# 反向传播optimizer.zero_grad()  # grad属性归零loss.backward()        # 反向传播optimizer.step()       # 每一步自动更新# 记录acc与losstrain_acc  += (pred.argmax(1) == y).type(torch.float).sum().item()train_loss += loss.item()train_acc  /= sizetrain_loss /= num_batchesreturn train_acc, train_loss

3.编写测试函数

def test (dataloader, model, loss_fn):size        = len(dataloader.dataset)  # 测试集的大小num_batches = len(dataloader)          # 批次数目, (size/batch_size,向上取整)test_loss, test_acc = 0, 0# 当不进行训练时,停止梯度更新,节省计算内存消耗with torch.no_grad():for imgs, target in dataloader:imgs, target = imgs.to(device), target.to(device)# 计算losstarget_pred = model(imgs)loss        = loss_fn(target_pred, target)test_loss += loss.item()test_acc  += (target_pred.argmax(1) == target).type(torch.float).sum().item()test_acc  /= sizetest_loss /= num_batchesreturn test_acc, test_loss

4.正式训练

import copyloss_fn    = nn.CrossEntropyLoss() # 创建损失函数
epochs     = 40train_loss = []
train_acc  = []
test_loss  = []
test_acc   = []best_acc = 0    # 设置一个最佳准确率,作为最佳模型的判别指标for epoch in range(epochs):# 更新学习率(使用自定义学习率时使用)# adjust_learning_rate(optimizer, epoch, learn_rate)model.train()epoch_train_acc, epoch_train_loss = train(train_dl, model, loss_fn, optimizer)scheduler.step() # 更新学习率(调用官方动态学习率接口时使用)model.eval()epoch_test_acc, epoch_test_loss = test(test_dl, model, loss_fn)# 保存最佳模型到 best_modelif epoch_test_acc > best_acc:best_acc   = epoch_test_accbest_model = copy.deepcopy(model)train_acc.append(epoch_train_acc)train_loss.append(epoch_train_loss)test_acc.append(epoch_test_acc)test_loss.append(epoch_test_loss)# 获取当前的学习率lr = optimizer.state_dict()['param_groups'][0]['lr']template = ('Epoch:{:2d}, Train_acc:{:.1f}%, Train_loss:{:.3f}, Test_acc:{:.1f}%, Test_loss:{:.3f}, Lr:{:.2E}')print(template.format(epoch+1, epoch_train_acc*100, epoch_train_loss, epoch_test_acc*100, epoch_test_loss, lr))# 保存最佳模型到文件中
PATH = './best_model.pth'  # 保存的参数文件名
torch.save(model.state_dict(), PATH)print('Done')

四、结果可视化

import matplotlib.pyplot as plt
#隐藏警告
import warnings
warnings.filterwarnings("ignore")               #忽略警告信息
plt.rcParams['font.sans-serif']    = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False      # 用来正常显示负号
plt.rcParams['figure.dpi']         = 100        #分辨率epochs_range = range(epochs)plt.figure(figsize=(12, 3))
plt.subplot(1, 2, 1)plt.plot(epochs_range, train_acc, label='Training Accuracy')
plt.plot(epochs_range, test_acc, label='Test Accuracy')
plt.legend(loc='lower right')
plt.title('Training and Validation Accuracy')plt.subplot(1, 2, 2)
plt.plot(epochs_range, train_loss, label='Training Loss')
plt.plot(epochs_range, test_loss, label='Test Loss')
plt.legend(loc='upper right')
plt.title('Training and Validation Loss')
plt.show()

from PIL import Image classes = list(total_data.class_to_idx)def predict_one_image(image_path, model, transform, classes):test_img = Image.open(image_path).convert('RGB')plt.imshow(test_img)  # 展示预测的图片test_img = transform(test_img)img = test_img.to(device).unsqueeze(0)model.eval()output = model(img)_,pred = torch.max(output,1)pred_class = classes[pred]print(f'预测结果是:{pred_class}')# 预测训练集中的某张照片
predict_one_image(image_path='./6-data/Angelina Jolie/001_fe3347c0.jpg', model=model, transform=train_transforms, classes=classes)

五、模型评估

best_model.eval()
epoch_test_acc, epoch_test_loss = test(test_dl, best_model, loss_fn)
epoch_test_acc, epoch_test_loss
# 查看是否与我们记录的最高准确率一致
epoch_test_acc

六,总结

构建数据集中

这次构建数据集还是直接调用的,但是遇到了一个问题就是

classeNames = [str(path).split("\\")[1] for path in data_paths]替换为
classeNames = [os.path.basename(str(path)) for path in data_paths]
这两行代码的目的都是从一系列路径中提取某些信息,但它们使用不同的方法来实现这一目的。让我们来详细比较一下:1. `classeNames = [str(path).split("\\")[1] for path in data_paths]`这行代码尝试对每个 `path` 对象执行以下操作:- 将 `path` 对象转换为字符串。- 使用反斜杠 `\` 作为分隔符来分割字符串。- 尝试访问分割后的列表中索引为 `1` 的元素,即第二个元素。这种方法假设所有路径都使用反斜杠 `\` 作为分隔符,并且每个路径至少包含两个由 `\` 分隔的元素。如果路径中没有足够的分隔符来产生至少两个元素,或者路径使用的是正斜杠 `/` 作为分隔符(在Unix-like系统中很常见),这将导致 `IndexError`。2. `classeNames = [os.path.basename(str(path)) for path in data_paths]`这行代码使用 `os.path.basename` 函数来获取每个 `path` 对象的基名称(即路径的最后一部分)。`os.path.basename` 是一个平台独立的函数,它自动处理不同操作系统的路径分隔符。这意味着无论您在什么操作系统上运行代码,`os.path.basename` 都能正确地返回路径的最后一部分。这种方法不依赖于路径中分隔符的数量,因此不会产生 `IndexError`。即使路径中只有一个元素或没有使用反斜杠 `\` 作为分隔符,`os.path.basename` 也会返回正确的结果。### 为什么后者不报错?- **平台独立性**:`os.path.basename` 函数适用于所有操作系统,自动处理不同的路径分隔符。
- **错误处理**:`os.path.basename` 函数设计得更加健壮,即使路径只有一个元素或没有元素,它也能正确地返回空字符串或路径本身。
- **语义清晰**:`os.path.basename` 的用途非常明确,即获取路径的基名称,这使得代码更易于理解和维护。### 总结使用 `os.path.basename` 是更安全、更清晰的方法,特别是在处理来自不同操作系统的路径时。它减少了因路径分隔符引起的错误,并使代码更加健壮和易于理解。因此,推荐在处理文件路径时使用 `os.path` 模块中的函数,而不是手动分割字符串。

训练模型中

静态learn_rate = 1e-4,epoch=40

静态learn_rate = 1e-2,epoch=40

动态 learn_rate = 1e-2,epoch=30

结论,在想同epoch---learnrate下,使用动态学习了吧有提升

这篇关于P6周人脸识别的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/958258

相关文章

深度学习实战:如何利用CNN实现人脸识别考勤系统

1. 何为CNN及其在人脸识别中的应用 卷积神经网络(CNN)是深度学习中的核心技术之一,擅长处理图像数据。CNN通过卷积层提取图像的局部特征,在人脸识别领域尤其适用。CNN的多个层次可以逐步提取面部的特征,最终实现精确的身份识别。对于考勤系统而言,CNN可以自动从摄像头捕捉的视频流中检测并识别出员工的面部。 我们在该项目中采用了 RetinaFace 模型,它基于CNN的结构实现高效、精准的

Python 人脸识别实战教程

引言 在本教程中,我们将深入探讨如何使用Python和OpenCV库来实现人脸检测与识别。本文从基础知识入手,逐步构建一个简单的人脸识别系统。本教程假设读者已经熟悉Python编程,并具备一定的OpenCV使用经验。 环境配置 安装必要的库 确保您的开发环境中已安装了Python和OpenCV。可以通过以下命令安装OpenCV: pip install opencv-python

人脸识别开源项目之-face_recognition

特性 从图片里找到人脸 定位图片中的所有人脸: import face_recognitionimage = face_recognition.load_image_file("your_file.jpg")face_locations = face_recognition.face_locations(image) 识别人脸关键点 识别人脸关键点,包括眼睛、鼻子、嘴和下巴。

【C++】基于 OpenCV 的人脸识别(强烈推荐)

原文网址:http://www.jianshu.com/p/96be2417cc98 一点背景知识 OpenCV 是一个开源的计算机视觉和机器学习库。它包含成千上万优化过的算法,为各种计算机视觉应用提供了一个通用工具包。根据这个项目的关于页面,OpenCV 已被广泛运用在各种项目上,从谷歌街景的图片拼接,到交互艺术展览的技术实现中,都有 OpenCV 的身影。 OpenCV 起始于

行业首家!百度智能云通过中国信通院「H5 端人脸识别安全能力」测评

2024 年 6 月,在中国信通院组织的 H5 端人脸识别产品安全能力评测中,百度智能云「H5 实时活体检测产品-V3.0」在人脸识别算法安全能力、人脸数据传输安全能力、H5 端应用安全能力、身份认证业务安全能力、安全管理能力 5 个方面表现优异,相应能力项的指标均符合标准验证要求。成为行业内首家通过该项权威测评的企业,再次彰显了百度智能云在人工智能领域的领先地位。 随着数字化时代的

一款人脸识别的芯片内部

三年前在一家3D人脸识别的芯片公司,先后做过两个稍具规模的芯片项目,因为各种原因,这些最终都没有上市,成为沉寂在实验室的产物。但是这些芯片的总体设计都颇具匠心,自己在当时也很有触动,现在拿出一点来供读者欣赏。为不侵犯原有设计者的创作,所有列举的芯片结构图已经经过本人抽取和改动,只为学习和演示这些设计的原理。 首先介绍的是一款当时爆炒的关于人脸识别的门锁芯片的VI系统,该系统如下所示,支持单摄象头

iOS原生人脸识别CIDetector使用

本片博客版权归黑马程序员所有:黑马程序员苹果原生人脸识别早在iOS5就已经有了,但是能够识别的数据及其的少,所以用的人不是很多。目前做的比较好的人脸识别就是Facebook的face++人脸识别原理简介:每一张图片都是由每一个像素点组成,而每一个像素点中又有对应的颜色值(如RGB),人的面部特征中,不同的五官,颜色值肯定存在差异,而人脸识别技术就是通过对照片中每一个像素的识别进行大量的算法处理,最

机器视觉开源处理库汇总-介绍n款计算机视觉库/人脸识别开源库/软件 -几种图像处理类库的比较-视觉相关网站

机器视觉开源处理库汇总-介绍n款计算机视觉库/人脸识别开源库/软件 -几种图像处理类库的比较-视觉相关网站 机器视觉开源处理库汇总 从cvchina搞到的机器视觉开源处理库汇总,转来了,很给力,还在不断更新。。。 通用库/General Library OpenCV 无需多言。 RAVL Recognition And Vision Library. 线程安全。强大的

每天五分钟计算机视觉:人脸识别网络FaceNet

本文重点 在前面的课程中,为了解决人脸识别的问题,我们学习了Siamese神经网络。本文我们学习另外一种人脸识别网络模型FaceNet。 论文 FaceNet: A Unified Embedding for Face Recognition and Clustering FaceNet概述 FaceNet是谷歌在CVPR 2015上提出的一种深度学习模型,旨在解决人脸识别、验证和

在RV1126上实现人脸识别----facenet转成rknn模型

目录 1.模型下载 Pre-trained models 2.将facenet转成rknn模型并推理  3 查看网络模型 1.模型下载 首先需要下载facenet的模型,github下载网址为:https://github.com/davidsandberg/facenet Pre-trained models Model nameLFW accuracyTraining