当前位置: 首页 > news >正文

衡水网站建设设计旅游网站有哪些

衡水网站建设设计,旅游网站有哪些,厦门建设与管理局官网,amh面板安装wordpress摘要#xff1a;之前的表情识别系统升级到v3.0版本#xff0c;本篇博客详细介绍使用PyTorch框架来构建并训练MobileNet V3模型以进行实现表情识别#xff0c;给出了完整实现代码和数据集可供下载。从构建数据集、搭建深度学习模型、数据增强、早停等多种技术#xff0c;到模… 摘要之前的表情识别系统升级到v3.0版本本篇博客详细介绍使用PyTorch框架来构建并训练MobileNet V3模型以进行实现表情识别给出了完整实现代码和数据集可供下载。从构建数据集、搭建深度学习模型、数据增强、早停等多种技术到模型训练过程的每个细节进行逐行代码讲解。再到最终的模型评估给出了绘制训练和验证的损失与准确率曲线、混淆矩阵、精确率-召回率PR曲线以及F1分数的详细分析。本文结构如下 文章目录 1. 表情识别思路与方案2 训练MobileNet深度神经网络2.1 数据集构建2.2 模型构建2.3 训练过程2.4 模型评估 3. 系统界面效果下载链接4. 总结与展望5. 结束语 ➷点击跳转至文末所有涉及的完整代码文件下载页☇ 最新升级版—人脸表情识别系统v3.0SSDMobileNet/XceptionUI界面演示 1. 表情识别思路与方案 四年前我写了一篇关于利用深度学习算法进行表情识别的博客人脸表情识别系统介绍——上篇python实现含UI界面及完整代码虽然去年前年也都有更新这个系列不过还是来一版这个的后续。当然本文采用的是先检测人脸再进行表情分类的方式也可以一步到位采用目标检测算法同时检测人脸并识别表情在我的另一篇博客基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的人脸表情识别系统附完整资源PySide6界面训练代码中就使用YOLO系列算法直接实现了表情识别。 在进行表情识别之前先说明一下整个系统需要的实现步骤包括图像采集、图像预处理、人脸检测、表情分类和输出结果。首先输入的图像会经过一系列的预处理步骤这可能包括调整大小、归一化像素值以及可能的数据增强操作为接下来的步骤提供统一和标准化的输入。然后是人脸检测这一步骤关键在于定位图像中的人脸为表情分类提供准确的切割图像。有了这两个步骤可以实现对分割出的人脸图像进行表情分类。 表情分类是将人脸图像映射到一组预定义的表情类别上。这一过程需要借助深度学习模型来识别和理解图像中人脸的各种表情细节这些细节往往隐藏在面部的微小变化之中。完成这些步骤后模型会输出它对于图像中人物表情的判断这可以用于进一步的分析或作为其他系统的输入。 在博主前面的几篇博客中已经发布文章详细介绍了数据处理和人脸检测的步骤。在文章“人脸表情识别系统项目完整实现详解——一深度学习数据集处理”中介绍了如何从csv文件下载图像数据并将其转换为模型可以处理的图片文件格式。 第二篇文章“人脸表情识别系统项目完整实现详解——二使用SSD模型检测人脸”详细介绍了使用SSD算法进行人脸检测的具体步骤。SSD是一种性能卓越的目标检测算法它能够在图像中快速准确地定位人脸这对于我们后续的表情分类是需要的一步。 这篇博客我们将重点介绍使用MobileNet模型对人脸表情进行分类的过程。MobileNet以其轻量化和高效率而著称在表情识别任务中显示出了巨大的潜力1。这里将详细说明如何使用PyTorch搭建MobileNet的结构2并调整它以适应我们的表情分类任务后面介绍训练和验证模型的过程。在后面的博客里面可以介绍如何将其做成一个完整的系统。 2 训练MobileNet深度神经网络 2.1 数据集构建 在构建一个高效的表情识别模型时其实关键任务是确保模型既能理解复杂的人脸表情特征又能在现实世界的多变环境中准确运行。为此我们采用了MobileNetV3——一个专为移动和边缘计算设备优化的轻量级深度学习网络。这个网络的源码可以在开源项目https://github.com/d-li14/mobilenetv3.pytorch中获得。 1设置随机数种子在模型训练的开端设置随机种子能够确保我们的实验结果可复现不论我们运行多少次实验只要随机种子相同输出结果也应该是一致的。在代码中博主通过设置torch.manual_seed和相关的CUDA种子 def set_seed(seed42):torch.manual_seed(seed)torch.cuda.manual_seed(seed)torch.cuda.manual_seed_all(seed) # 如果使用多GPU还需要设置torch.backends.cudnn.benchmark Falsetorch.backends.cudnn.deterministic True这里使用的设备可以是CPU也可以是GPU取决于我们的硬件条件。PyTorch通过torch.device使得这一过程的设置很方便只需指定要使用的设备类型。如果检测到GPU可用那么利用它的计算能力来加速训练过程。 # 设置随机种子以确保实验的可重复性 set_seed(2035)# 根据设备的可用性选择使用CPU或GPU device torch.device(cuda:0 if torch.cuda.is_available() else cpu) print(fUsing {device} device)2训练验证集转换器在数据预处理方面博主采用了一组转换操作来增强模型的泛化能力。这些操作包括随机裁剪、翻转、旋转和亮度调整其实是模仿了现实世界中的各种变化可以使模型在面对未见过的数据时表现得更加稳定。你可以看到所有的图像最终都被转换成了归一化的张量这是因为深度学习模型通常在这种处理过的数据上表现得更好。 # 定义用于训练集的图像预处理操作 train_transforms transforms.Compose([transforms.RandomResizedCrop(224),transforms.RandomHorizontalFlip(),transforms.RandomRotation(10),transforms.ColorJitter(brightness0.2),transforms.ToTensor(),transforms.Normalize(mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225]), ])# 定义用于测试集的图像预处理操作 test_transforms transforms.Compose([transforms.Resize(224), # 调整图像大小至256x256# transforms.CenterCrop(224), # 从中心裁剪出224x224大小的图像transforms.ToTensor(), # 将图像转换为Tensortransforms.Normalize(mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225]), # 归一化 ])数据转换不仅要应用于训练数据也得为测试数据定义一组转换流程虽然没有包含数据增强操作但包括了重要的尺寸调整和归一化步骤。这样确保可以在一个统一的数据分布上评估模型性能。 3数据集划分这里数据集是按照文件夹结构组织的也就是说每个类别的图像都存放在独立的文件夹中。PyTorch通过datasets.ImageFolder提供了一种非常便捷的方式来加载这类结构的数据集。之后可以使用random_split方法将数据集分为训练集和测试集确保了数据的多样性和模型的可靠性。 data_directory ./datasets/fer2013_images dataset datasets.ImageFolder(rootdata_directory)train_size int(0.8 * len(dataset)) test_size len(dataset) - train_size train_dataset, test_dataset random_split(dataset, [train_size, test_size])# 应用预处理操作 train_dataset.dataset.transform train_transforms test_dataset.dataset.transform test_transforms上面这一步骤确保我们有足够的数据用于训练同时也为模型的验证保留了一部分数据。这样的划分之后能够在保持数据独立性的同时对模型的泛化能力进行有效评估。 4构建数据集的DataLoaderDataLoader是PyTorch中一个非常强大的工具它能够以批量的方式加载数据还可以进行多进程处理并支持自动批量数据的内存管理这在大规模数据训练时尤其有用。将这些预处理操作应用于我们的数据集之后这里定义数据集的DataLoader为训练集设置随机洗牌以避免模型在训练过程中学习到批次的顺序有助于模型学习到更加稳健的特征。 # 定义训练参数 num_epochs 400 # 训练轮数 batch_size 32 # 每批处理的图像数量 n_worker 1 # DataLoader使用的工作线程数量 train_loader DataLoader(datasettrain_dataset, batch_sizebatch_size, shuffleTrue, num_workersn_worker, pin_memoryTrue) test_loader DataLoader(datasettest_dataset, batch_sizebatch_size, shuffleFalse, num_workersn_worker, pin_memoryTrue)batch_size、num_workers和pin_memory是几个关键参数影响着数据加载的效率。batch_size决定了每次喂给模型多少图像这直接关联到模型训练的速度和内存使用量。num_workers定义了加载数据时使用的进程数正确设置此参数可以显著提高数据加载效率特别是在CPU资源充足的机器上。pin_memory则是告诉DataLoader将数据加载到CUDA的固定内存中这样可以加速数据从CPU传输到GPU的过程。 2.2 模型构建 构建和调整模型是深度学习工作流中最关键的部分之一。在我们的表情识别项目中我们选择了MobileNetV3作为基础架构。由于MobileNetV3在保持轻量级的同时还提供了与复杂模型相媲美的性能这对于我们的实时识别表情应用很重要。 模型构建过程首先从加载MobileNetV3的结构开始然后把模型放到我们选择的设备上。在PyTorch中这通过调用.to(device)方法实现这能够确保模型的计算会在CPU或GPU上进行取决于我们的设备选择看是否安装了pytorch-gpu。这是模型优化过程中的一个基础步骤可以显著提高模型训练和推理的速度。 model mobilenetv3(modesmall).to(device)然后利用预训练的权重来初始化模型。预训练是深度学习领域常用的一种技术它能够帮助加速训练过程同时提高模型的泛化能力。这种方法特别适用于数据集较小或计算资源有限的情况。在我们的代码中通过加载预训练权重这里的模型已经具备了一些识别图像的基础能力。 state_dict torch.load(./models/mobilenetv3_small_67.4.pth.tar) model.load_state_dict(state_dict)由于这里我们的任务是识别7种不同的表情因此需要调整MobileNetV3的分类器部分以便它的输出层与我们的类别数相匹配。可以通过替换最后一个线性层的输出特征数实现这一点这种调整其实是在迁移学习中非常典型的做法。 model.classifier[1] nn.Linear(model.classifier[1].in_features, 7) model.to(device)为了训练模型我们定义交叉熵损失函数这是处理多类别分类问题的标准选择。它可以度量模型输出的概率分布和实际标签之间的差异从而指导模型朝正确类别的方向学习。 criterion nn.CrossEntropyLoss()最后博主这里选择的是Adam优化器设定了一个学习率。Adam是一种自适应学习率的优化算法它结合了RMSProp和Momentum两种优化算法的优点。在实践中Adam优化器被证明对于多种不同的深度学习任务都是有效的这使得它成为一个非常流行的选择。 optimizer optim.Adam(model.parameters(), lr0.0001)通过上述步骤我们成功地构建并配置了适用于表情识别任务的MobileNetV3模型。在后续的训练过程中我们将不断地调整和评估模型以确保最终得到的模型可以在实际应用中准确快速地识别用户的表情。 2.3 训练过程 在训练过程中我们需要使用一些常见技术包括模型的正则化、性能监控以及早停机制以确保我们的模型不仅能从数据中学习还能保持对新数据的泛化能力。 1早停设置在本项目的训练过程中首先定义了早停机制的相关参数。早停是一种防止深度学习模型过拟合的技术其工作原理是监控模型在验证集上的性能。如果模型在一定数量的连续训练周期由patience参数定义中未显示出性能提升则训练过程将被提前终止。这不仅节省了时间和计算资源还提高了模型的泛化能力因为它防止了在训练集上的过度拟合。 patience 20 min_val_loss np.inf patience_counter 0接下来我们使用一个自定义的训练监控器它能够记录每个训练周期的性能并最终绘制出一个性能变化图。这是一个自定义的类可以帮助我们可视化训练过程并在必要时作出调整。 monitor TrainingMonitor(file_pathruns/training_performance.png)2训练过程在每个训练周期的开始我们将模型设置为训练模式使得模型的参数能够更新。然后初始化一些变量来追踪损失和准确性并设置一个进度条来监控训练进度。通过遍历训练数据集并在每个批次上执行前向传播、损失计算、反向传播和参数更新便可以完成模型的训练步骤。 # 开始训练周期遍历设定的训练轮数 for epoch in range(num_epochs):model.train() # 设置模型为训练模式# 初始化用于累计的变量运行损失、正确分类的训练样本数和总训练样本数running_loss 0.0correct_train 0total_train 0# 初始化训练阶段的进度条train_pbar tqdm(train_loader, descfEpoch {epoch 1}/{num_epochs} [Training], leaveFalse)# 遍历训练数据集for images, labels in train_pbar:images, labels images.to(device), labels.to(device) # 将图像和标签数据移至指定设备optimizer.zero_grad() # 清空之前的梯度outputs model(images) # 获取模型的预测输出loss criterion(outputs, labels) # 计算损失loss.backward() # 反向传播求梯度optimizer.step() # 根据梯度更新模型参数# 累计损失和正确分类的数量running_loss loss.item()_, predicted torch.max(outputs.data, 1)total_train labels.size(0)correct_train (predicted labels).sum().item()train_pbar.close() # 关闭训练阶段的进度条# 计算训练准确率train_accuracy 100 * correct_train / total_train3进行验证集评估在每个训练周期之后将模型切换到评估模式并在验证数据集上运行模型以计算损失和准确性。这一步骤不涉及梯度计算因为我们在这一阶段不会更新模型的权重。 # 验证模型性能model.eval() # 设置模型为评估模式val_loss 0.0correct_val 0total_val 0# 初始化验证阶段的进度条val_pbar tqdm(test_loader, descfEpoch {epoch 1}/{num_epochs} [Validation], leaveFalse)with torch.no_grad(): # 关闭梯度计算# 遍历验证数据集for images, labels in val_pbar:images, labels images.to(device), labels.to(device)outputs model(images)loss criterion(outputs, labels)val_loss loss.item()_, predicted torch.max(outputs.data, 1)total_val labels.size(0)correct_val (predicted labels).sum().item()val_pbar.close() # 关闭验证阶段的进度条# 计算验证准确率val_accuracy 100 * correct_val / total_val# 打印每轮的训练损失、验证损失和验证准确率print(f\nEpoch {epoch 1}, Train Loss: {running_loss / len(train_loader)}, fVal Loss: {val_loss / len(test_loader)}, Accuracy: {val_accuracy}%)4打印训练损失和准确率这里代码会打印出训练损失、验证损失和验证准确率并根据早停策略判断是否应该提前结束训练。如果在patience定义的周期数内验证损失没有下降就会结束训练并保存当前效果最好的模型。 # 实现早停机制以避免过拟合if val_loss min_val_loss:min_val_loss val_losstorch.save(model.state_dict(), runs/best_mobilenet_model.pt) # 保存表现最好的模型patience_counter 0else:patience_counter 1if patience_counter patience: # 如果验证损失不再下降则提前停止训练print(Early stopping triggered)break最后需要调用监控器的更新和绘图功能来记录和展示模型的训练和验证性能。这一步是训练流程中的可视化环节让我们能够直观地评估模型训练的结果。 # 更新训练监控器数据monitor.update(running_loss / len(train_loader), val_loss / len(test_loader), train_accuracy, val_accuracy)# 训练完成后绘制训练和验证的性能变化图 monitor.plot()通过以上步骤我们确保了模型在训练过程中能够稳步提升其性能并通过早停策略避免了过拟合。这种方法论不仅可以应用于表情识别还适用于广泛的机器学习和深度学习任务。 5分析训练和验证损失以上训练过程结束后可以得到观察训练和验证损失的图表如下图所示。我们可以看到随着训练轮数Epochs增加训练损失持续下降这表明模型在训练数据上学习得越来越好正在减少误差。验证损失在初始几个周期后下降了一段时间在大约5个epoch后开始上升这是过拟合的一个明显迹象。意味着模型开始在训练数据上过于精确地学习数据特征以至于它无法很好地泛化到未见过的验证数据上。这里不用担心因为我们设置了保存历史验证集最佳的模型才保留同时还有早停这张图是为了便于分析。 对于上图右边训练和验证准确率的图表我们看到训练准确率随着epoch增加而持续提高这进一步证明了模型在训练数据上的性能正在改善。与此同时验证准确率在初期也有所提高但很快达到平稳状态。尽管训练准确率继续增长但验证准确率没有显著提高这表面模型在这之后已经进入过拟合。可采用的策略包括引入正则化技术如dropout或weight decay收集更多的训练数据或者调整模型的复杂性。这里过拟合的模型并不会被保存我们依然采用的是泛化能力最好的模型作为最终模型。 2.4 模型评估 模型评估是机器学习项目的一个关键环节不仅帮助我们理解模型在实际情况中的表现还可以找出模型可能存在的问题和改进空间。在本文中我们将详细讲解如何使用PyTorch进行表情识别模型的评估。 1设置随机数种子首先我们需要确保模型评估的可重现性所以像训练过程一样设置随机种子还是有必要的。然后我们检查一下是否有GPU可用以利用其计算能力进行快速评估。 set_seed(2024) device torch.device(cuda:0 if torch.cuda.is_available() else cpu)2载入训练好的模型模型评估的下一步是加载经过训练的模型权重。我们先创建模型的实例调整分类器层以适应我们的7个类别然后加载权重。可以通过下面几行代码就能完成 model mobilenetv3(modesmall).to(device) model.classifier[1] nn.Linear(model.classifier[1].in_features, 7) state_dict torch.load(models/best_mobilenet_model_f1_72.pt) model.load_state_dict(state_dict)3构建测试集在准备好模型后我们定义一个图像转换流程来处理数据集。这个流程会将图像调整到适合模型的大小、转换为张量并对其进行标准化确保输入数据与模型训练时的格式相同。 transform transforms.Compose([transforms.Resize((224, 224)),transforms.ToTensor(),transforms.Normalize(mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225]), ])处理数据的过程非常简单定义数据集、应用上述的转换、创建一个DataLoader来批量加载数据并进行评估。 # 加载并处理数据集 data_directory ./datasets/fer2013_images dataset datasets.ImageFolder(rootdata_directory, transformtransform)# 分割数据集为训练集和验证集 val_size int(0.2 * len(dataset)) # 验证集大小 train_size len(dataset) - val_size # 训练集大小 _, val_dataset random_split(dataset, [train_size, val_size])# 创建DataLoader来批量加载数据 batch_size 8 val_loader DataLoader(datasetval_dataset, batch_sizebatch_size, shuffleFalse)4评估阶段评估阶段的重点是收集模型的预测标签、真实标签以及预测分数这些要用于计算不同的性能指标。这里在不进行梯度计算的上下文中执行模型的前向传播因为在评估模式下我们就不要再进行反向传播或任何形式的模型训练。 with torch.no_grad(): for images, labels in tqdm(val_loader, descEvaluating, leaveTrue):images images.to(device)labels labels.to(device)outputs model(images)_, preds torch.max(outputs, 1)scores torch.softmax(outputs, dim1)y_true.extend(labels.cpu().numpy())y_pred.extend(preds.cpu().numpy())y_scores.extend(scores.cpu().detach().numpy()) y_scores np.array(y_scores) # 将预测分数转换为NumPy数组便于后续处理5绘制混淆矩阵利用这些收集的数据来绘制混淆矩阵这是评估分类模型性能的一个常见思路。混淆矩阵不仅提供了每个类别的预测准确性的视图还可以让我们看到模型在哪些类别上混淆了预测。 cm confusion_matrix(y_true, y_pred, normalizetrue)在图形表示方面我们采用了热力图的形式它通过不同的颜色深浅来表达数值的大小这种直观的表示方式可以帮助我们更快地理解模型的性能。 plt.figure(figsize(10, 8)) sns.heatmap(cm, annotTrue, fmt.2f, cmapBlues, xticklabelsclass_names, yticklabelsclass_names) plt.title(Normalized Confusion Matrix) plt.ylabel(True Label) plt.xlabel(Predicted Label) plt.savefig(./runs/confusion_matrix.png) plt.show()通过混淆矩阵我们能够了解模型在各个类别上的具体表现并据此作出必要的模型调整结果如下图所示 6绘制P-R曲线在表情识别模型的评估阶段我们不仅需要考虑传统的准确率还需要深入分析模型的预测能力。为此精确率-召回率PR曲线和F1分数成为了评估分类性能的重要指标。 # 计算并绘制所有类别的PR曲线和整体AP y_true_binary label_binarize(y_true, classesnp.arange(len(class_names))) # 将真实标签二值化precision dict() # 初始化精确度字典 recall dict() # 初始化召回率字典 average_precision dict() # 初始化平均精确度字典for i in range(len(class_names)): # 对于每个类别# 计算每个类别的精确度和召回率precision[i], recall[i], _ precision_recall_curve(y_true_binary[:, i], y_scores[:, i])average_precision[i] average_precision_score(y_true_binary[:, i], y_scores[:, i]) # 计算平均精确度# 计算微平均PR曲线和AP precision[micro], recall[micro], _ precision_recall_curve(y_true_binary.ravel(), np.array(y_scores).ravel()) average_precision[micro] average_precision_score(y_true_binary, y_scores, averagemicro) # 计算微平均精确度# 绘制PR曲线 plt.figure(figsize(8, 8)) # 设置图像大小 plt.plot(recall[micro], precision[micro],labelfMicro-average PR curve (area {average_precision[micro]:0.2f}), linestyle:, linewidth4)colors cycle([navy, turquoise, darkorange, cornflowerblue, teal]) # 定义颜色循环 for i, color in zip(range(len(class_names)), colors): # 为每个类别绘制PR曲线plt.plot(recall[i], precision[i], colorcolor, lw2,labelfPR for class {class_names[i]} (area {average_precision[i]:0.2f}))plt.xlabel(Recall) # 设置x轴标签 plt.ylabel(Precision) # 设置y轴标签 plt.title(Precision-Recall Curve) # 设置标题 plt.legend(locbest) # 显示图例 plt.savefig(./runs/precision_recall_curve.png) # 保存PR曲线图像 plt.show() # 显示PR曲线图像PR曲线展示了在不同阈值下模型精确率和召回率的关系。在理想情况下我们希望模型的召回率和精确率都尽可能高这意味着曲线会趋向于右上角。平均精确度AP则提供了一个PR曲线下的面积量度它反映了模型在所有阈值水平上的整体表现。微平均PR曲线和APmicro-average对所有类别的预测进行总结给出了模型在所有分类任务上的总体性能指标。 7绘制F1 Score曲线F1分数是精确率和召回率的调和平均它将二者结合成一个单一的指标。在分类问题中F1分数特别有用因为它能在不均衡类别分布的情况下提供比准确率更公正的性能评估。通过为不同的预测阈值计算F1分数我们能够找到模型性能最优化的点。 # 为每个类别计算F1 Score f1_scores dict() # 初始化存储每个类别F1分数的字典 best_f1_scores dict() # 初始化存储每个类别最佳F1分数的字典 best_thresholds dict() # 初始化存储每个类别对应最佳阈值的字典for i in range(len(class_names)): # 遍历所有类别# 对不同的阈值计算F1分数f1_scores[i] [f1_score(y_true_binary[:, i], y_scores[:, i] threshold) for threshold innp.linspace(0, 1, 100)]best_idx np.argmax(f1_scores[i]) # 找到最佳F1分数的索引best_f1_scores[i] f1_scores[i][best_idx] # 获取最佳F1分数best_thresholds[i] np.linspace(0, 1, 100)[best_idx] # 获取对应的最佳阈值# 计算微平均F1分数 thresholds np.linspace(0, 1, 100) # 定义阈值范围 micro_f1_scores [] # 初始化微平均F1分数列表for threshold in thresholds: # 遍历所有阈值y_pred_binary y_scores threshold # 应用阈值生成二值预测micro_f1 f1_score(y_true_binary, y_pred_binary, averagemicro) # 计算微平均F1分数micro_f1_scores.append(micro_f1) # 添加到列表best_micro_f1 np.max(micro_f1_scores) # 找到最佳微平均F1分数 best_threshold thresholds[np.argmax(micro_f1_scores)] # 找到对应的最佳阈值绘制出的F1分数曲线能够清晰展示在不同阈值下的模型性能。通过选择在所有类别上表现最佳的阈值我们能够调整模型以在实际应用中达到最佳的准确率和召回率平衡。 # 绘制F1分数曲线 plt.figure(figsize(10, 6)) # 设置图像大小 colors cycle([navy, turquoise, darkorange, cornflowerblue, teal, maroon, darkgreen]) # 设置颜色循环 for i, color in zip(range(len(class_names)), colors): # 为每个类别绘制F1分数曲线plt.plot(np.linspace(0, 1, 100), f1_scores[i], colorcolor, lw2, labelfClass {class_names[i]})# 绘制微平均F1分数曲线 plt.plot(thresholds, micro_f1_scores, colorblack, lw2, linestyle--,labelfOverall Micro-average (best{best_micro_f1:.2f} at threshold{best_threshold:.2f}))plt.xlabel(Threshold) # 设置x轴标签 plt.ylabel(F1 Score) # 设置y轴标签 plt.title(F1 Score by Class and Overall Micro-average) # 设置标题 plt.legend(loclower left) # 显示图例 plt.grid(True) # 显示网格plt.savefig(./runs/f1_score_curve.png) # 保存F1分数曲线图 plt.show() # 显示F1分数曲线图在所有评估指标计算完毕后我们得出了模型的总体准确率这是一个直观的性能度量反映了模型预测正确标签的能力。 # 计算模型的准确率 correct_predictions np.sum(np.array(y_true) np.array(y_pred)) # 计算正确预测的数量 total_predictions len(y_true) # 总预测数量 accuracy correct_predictions / total_predictions # 计算准确率print(fAccuracy: {accuracy * 100:.2f}%) # 打印准确率以上步骤为我们提供了一个全面的性能评估框架从而可以确信模型在处理真实世界数据时的鲁棒性和可靠性。我们通过不同的图表和统计数据深入理解了模型的强项和弱点这为进一步优化模型和选择合适的运营策略奠定了基础得到的曲线图如下图所示 3. 系统界面效果 本系列博客的目的是实现一个人脸表情识别系统。我们以PySide6作为GUI库提供了一套直观且友好的用户界面这节先演示一下各个主要界面的功能和设计将在后面的几个章节介绍训练MobileNet深度神经网络识别表情的详细步骤。 1系统提供了基于SQLite的注册登录管理功能。用户在首次使用时需要通过注册界面进行注册输入用户名和密码后系统会将这些信息存储在SQLite数据库中。注册成功后用户可以通过登录界面输入用户名和密码进行登录。这个设计可以确保系统的安全性也为后续添加更多个性化功能提供了可能性。 2在主界面上系统提供了支持图片、视频、实时摄像头和批量文件输入的功能。用户可以通过点击相应的按钮选择要进行表情识别的图片或视频或者启动摄像头进行实时检测。在进行检测时系统会实时显示检测结果并将检测记录存储在表格中。 3此外系统还提供了一键更换pt模型的功能。用户可以通过点击界面上的更换模型按钮选择不同训练好的模型进行检测。与此同时资源包中附带的数据集也可以用于重新训练模型以满足用户在不同场景下的检测需求。 4为了提供更个性化的使用体验这里系统支持界面修改用户可以自定义图标、文字等界面元素。例如用户可以根据自己的喜好选择不同风格的图标也可以修改界面的文字描述。 下载链接 若您想获得博文中涉及的实现完整全部资源文件包括测试图片、视频py, UI文件训练数据集、训练代码、界面代码等这里已打包上传至博主的面包多平台见可参考博客与视频已将所有涉及的文件同时打包到里面点击即可运行完整文件截图如下 完整资源中包含数据集及训练代码环境配置与界面中文字、图片、logo等的修改方法请见视频项目完整文件下载请见演示与介绍视频的简介处给出➷➷➷ 演示与介绍视频https://www.bilibili.com/video/BV1fK421v7Rb/ 在文件夹下的资源显示如下下面的链接中也给出了Python的离线依赖包读者可在正确安装Anaconda和Pycharm软件后复制离线依赖包至项目目录下进行安装另外有详细安装教程1Pycharm软件安装教程2Anaconda软件安装教程3Python环境配置教程 离线依赖安装教程https://www.bilibili.com/video/BV1hv421C7g8/ 离线依赖库下载链接https://pan.baidu.com/s/1y6vqa9CtRmC72SQYPh1ZCg?pwd33z5 提取码33z5 4. 总结与展望 这篇博客实现了一个基于MobileNetV3进行表情识别的深度学习模型。博主利用了PyTorch来构建和优化模型确保处理速度和准确性的平衡。通过具体的数据预处理和增强策略提高了模型对不同表情的识别能力同时避免了过拟合现象的产生。在模型训练过程中我们在代码中监测了损失和准确率以便识别并解决模型在学习过程中可能出现的问题。在评估阶段混淆矩阵、F1分数和PR曲线的详细介绍应该能使大家能够全面了解模型的性能和局限性。 在后面的研究中博主建议大家看看这几个方面。首先数据肯定是深度学习模型不可或缺的部分我们可以通过扩大和多样化数据集来进一步提高模型的泛化能力和鲁棒性。其次模型架构和超参数的调整也有助于改进性能可以通过引入新的层、正则化技术或改进的训练技巧可能会炼丹得到更好的模型。最后将我们这里的模型应用于实际场景如情绪分析或人机交互将是检验其实用性的真正标尺。 5. 结束语 由于博主能力有限博文中提及的方法即使经过试验也难免会有疏漏之处。希望您能热心指出其中的错误以便下次修改时能以一个更完美更严谨的样子呈现在大家面前。同时如果有更好的实现方法也请您不吝赐教。 Nan Y, Ju J, Hua Q, et al. A-MobileNet: An approach of facial expression recognition[J]. Alexandria Engineering Journal, 2022, 61(6): 4435-4444. ↩︎ Howard A G, Zhu M, Chen B, et al. Mobilenets: Efficient convolutional neural networks for mobile vision applications[J]. arXiv preprint arXiv:1704.04861, 2017. ↩︎
http://www.zqtcl.cn/news/619214/

相关文章:

  • 如何自己做企业网站织梦做的网站织梦修改网页
  • 医院网站开发兼职怎么做可以支付的网站
  • 网站开发大概需要多久湛江招聘网最新招聘
  • 免费建网站 手机网站深圳网站设计(深圳信科)
  • 辽宁做网站的公司工作室网站建设的意义
  • 南京网站搜索排名免费企业网站空间
  • 手机要访问国外网站如何做附近学电脑在哪里报名
  • 免费建网站哪个网好中国建设银行信用卡黑名单网站
  • 网页设计好看的网站中小型网站建设 教案
  • 优秀网站设计案例行业内做网站的公司排名
  • 个人备案网站能做商城吗长沙app制作公司哪家好
  • 成都网站建设方案优化旺道seo怎么优化网站
  • 九江县建设规划局网站wordpress多个博客
  • 绵阳住房和城乡建设局网站做服装外贸的网站
  • 福建省华荣建设集团有限公司网站建设网站西安
  • 做视频网站程序多少钱网站内链有什么用
  • 建设企业网站模板联享品牌网站建设
  • 网站建设耂首先金手指提升网站访问速度
  • 为什么备案关闭网站网站seo推广招聘
  • 建设企业网站的重要性城乡建设厅官方网站
  • 网上有做口译的网站么怎样手机做网站教程
  • 孵化器网站平台建设网站一直建设中
  • 企业网站建设的方案书网站镜像 cdn
  • 淘宝做网站的都是模板泉州模板建站公司
  • 清理网站数据库网站服务器租一个月
  • wordpress免费简约主题搜索引擎优化的英文
  • 瑞安门户网站建设怎么建设自己网站首页
  • 网站建设岗位周计划thinkphp微网站开发
  • 如何修改asp网站栏目帝国cms网站搬家教程
  • 网站建设与网页制作小团队兼职做网站