目录
前言
📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学来说是充满挑战。为帮助大家顺利通过和节省时间与精力投入到更重要的就业和考试中去,学长分享优质的选题经验和毕设项目与技术思路。
🚀对毕设有任何疑问都可以问学长哦!
大家好,这里是海浪学长计算机毕设专题,本次分享的课题是
🎯深度学习与注意力机制融合的人脸颜值评估算法系统
项目背景
随着社交媒体的普及和人工智能技术的发展,人脸颜值评估成为了一个备受关注的话题。然而,传统的人脸颜值评估方法往往依赖于主观的人为评价或简单的特征提取,无法准确地捕捉到面部的美学特征。深度学习和注意力机制作为最新的研究热点,具备了自动学习和关注重要信息的能力,有望提高人脸颜值评估的准确性和可靠性。
数据集
由于网络上缺乏现有的合适数据集,为了支持该课题的研究,我决定相机拍摄和使用网络爬虫技术进行数据收集。通过爬取各种社交媒体平台上的人脸图像,包括正常人脸和具有不同颜值的人脸样本,我制作了一个全新的、多样化的人脸颜值评估数据集。该数据集包含了真实且具有多样性的人脸图像,将为我的研究提供更准确、可靠的数据。通过数据预处理和增强技术,我对人脸图像进行了扩充和增强,包括样本的旋转、缩放和变换等操作。这样做的目的是进一步丰富数据集的多样性,提高算法系统的鲁棒性和泛化能力。
设计思路
算法技术基础
通过使用ReLU等激活函数、卷积核替代神经元连接等方法,有效构建了深度神经网络。在图像领域,出现了AlexNet、VGGNet、InceptionNet和ResNet等经典的深度神经网络模型;在文本识别等领域,循环神经网络和长短期记忆网络等结构也被广泛应用。深度神经网络的基本单元包括卷积层、非线性激活函数、池化层、批正则化层和全连接层。卷积层通过卷积运算提取特征,具有稀疏连接、共享参数和平移等变性的优势。非线性激活函数使神经网络具有更强的表征能力,避免了线性模型的限制。
池化层在神经网络中通常位于卷积层之间或最后一层卷积层和输出之间,用于降低数据维度。常见的池化方式包括平均池化和最大池化。平均池化通过在特征图上以池化步长滑动的方式提取池化窗口内数值的平均值作为输出,而最大池化则提取窗口内数值的最大值作为输出。池化层的主要特点是在降低数据维度的同时保持一定的不变性,即特征图中目标的相对位置在经过池化层后不会改变。池化层的使用可以减小模型的参数量,使模型更易于训练、减少过拟合的可能性,并提高运算效率和感受野。
最后一层卷积层经过非线性激活函数、批正则化和池化层后,通常与全连接层相连。全连接层中的每个神经元与该层的输入相连,最后一层的神经元数量与分类数目相同。在全连接层之后,可以添加Dropout层以防止过拟合。这种结构能够将卷积层提取的特征转化为一维数据,并通过全连接层进行分类或回归预测。
使用ResNet-50和ResNeXt-50作为主干网络,通过将选定的人脸关键点映射到最后一层卷积层的输出特征图上,提取相应的部分特征用于长短期记忆网络的输入。每个像素点在最后一层卷积层的输出特征图中的感受野大小几乎与原始输入图像相等。
为了减少关键点特征的数量,有两种选取方法。第一种方法选取6个关键点,包括人脸两只眼睛的眼角和眼尾坐标的四个关键点,以及嘴角左右两个关键点。在SCUT-FBP5500数据集中,这些关键点对应的是每张图片的第46个、第42个、第54个、第50个、第73个和第79个点的坐标。第二种方法选取3个关键点,包括人脸两只眼睛中点的两个关键点和嘴巴的中点。在SCUT-FBP5500数据集中,左眼的关键点由左眼(第46个和第42个点)坐标的均值计算得到,右眼的关键点由右眼(第54个和第50个点)坐标的均值计算得到,嘴巴的关键点由嘴角左右(第73个点和第79个点)坐标的均值计算得到。
在特征提取阶段,选定的关键点坐标被映射到一个7x7大小的特征图上。特征提取过程使用两种方法,一种是基于关键点取整的特征提取,另一种是基于关键点插值的特征提取。基于关键点取整的方法对映射到7x7特征图上的坐标进行取整操作,提取对应位置的特征。基于关键点插值的方法保留关键点映射到7x7特征图上的坐标值的小数点后两位,并使用双线性插值计算特征值,利用周围四个点的坐标和特征值进行插值。
实验环境
在Ubuntu 16.04 LTS环境下进行的实验,使用单张GTX 1080Ti运算显卡。ResNet-50_based网络使用tensorflow 1.12深度学习框架,而ResNeXt-50_based网络使用pytorch 1.3深度学习框架。这些实验旨在评估这两个网络在给定硬件和软件环境下的性能和效果。
模型训练
相关代码示例:
import torch
import torch.nn as nn
import torchvision.models as models
class FaceBeautyNet(nn.Module):
def __init__(self, num_classes):
super(FaceBeautyNet, self).__init__()
self.resnet50 = models.resnet50(pretrained=True)
self.fc = nn.Linear(1000, num_classes)
def forward(self, x):
features = self.resnet50(x)
out = self.fc(features)
return out
model = FaceBeautyNet(num_classes=1)
model.load_state_dict(torch.load('face_beauty_model.pth'))
def preprocess(image):
image = preprocess(image)
image_tensor = torch.from_numpy(image).unsqueeze(0)
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = model.to(device)
image_tensor = image_tensor.to(device)
model.eval()
with torch.no_grad():
output = model(image_tensor)
beauty_score = output.item()
print("颜值评分:", beauty_score)
海浪学长项目示例: