目录
前言
📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学来说是充满挑战。为帮助大家顺利通过和节省时间与精力投入到更重要的就业和考试中去,学长分享优质的选题经验和毕设项目与技术思路。
🚀对毕设有任何疑问都可以问学长哦!
大家好,这里是海浪学长计算机毕设专题,本次分享的课题是
🎯基于深度学习的面部表情动作迁移及唇形同步系统
项目背景
随着人工智能技术的飞速发展,面部表情动作迁移及唇形同步技术正成为研究热点。该技术通过深度学习模型捕捉并迁移一个人的面部表情到另一人脸上,实现动画人物的唇形同步等效果,在影视制作、虚拟角色互动、游戏设计等领域具有广泛的应用前景。研究基于深度学习的面部表情动作迁移及唇形同步系统,不仅能够推动相关技术的发展,还能够为上述行业带来创新性的应用解决方案,具有重要的现实意义和科研价值。
设计思路
表情标签
表情标签是通过描述性词语对不同面部表情进行主观分类的。然而,由于描述本身具有主观性,对表情的描述缺乏统一的标准,因此在20世纪中期的大量表情研究中并没有产生统一被普遍认可的理论体系。面部表情所表现的情绪比六种基本情绪要复杂得多,使用离散的情绪标签无法准确地表征细微的、模糊的情感。因此,一些研究者选择使用情感维度空间,旨在将自然情感数据表现得更加丰富细腻。情感维度空间是一种笛卡尔空间,其中每个维度代表一种情感的心理学属性。在这种维度空间中,表情特征可以量化为某一个点。
面部动作单元识别
基于几何特征的运动单元识别方法,该方法基于面部特征点的定位和跟踪,通过划分不同的待观测肌肉区域来识别动作单元。在这个过程中,面部特征点的定位和跟踪是关键问题,它们决定了待观测肌肉位置的准确性和动作单元识别的准确性。通过圈取面部肌肉待观测区域,并确定该区域的形变与哪些AU编码和AU强度相对应,可以决定AU序列的最终结果。在该方法中,人脸检测是基础,它将面部图像中的面部区域标出,为后续的面部特征点定位提供感兴趣区域。最大边距目标检测算法(MMOD)和梯度直方图(HOG)是常用的人脸检测算法。梯度直方图可以用于计算面部图像的梯度方向,以获取多个梯度直方信息。
表情图像合成
生成对抗网络(GAN)是常用的图像生成算法,研究人员不断将其生成对抗思想应用到新的图像生成网络框架中,不断提升生成效果。生成对抗网络是一种无监督学习模型,通过博弈对抗的方式进行训练。GAN的结构由生成模型(Generator)和判别模型(Discriminator)组成,两种模型的构成是独立的两个神经网络模型。其中,生成模型是一个样本生成器,是我们想要使用的主要网络,输入一组随机噪声,生成高维度的图像。判别模型是一个二分类模型,可以使用一个简单的神经网络结构,输入一张图像,模型计算出该图片的概率值。通过概率值计算图像的真假,当概率值大于0.5时,该图像为真实图像,当概率值小于0.5时,该图像为合成的虚拟图像。
生成对抗网络(GAN)通过分布采样而非建模的方式进行训练,使其生成的图像更贴近真实图像,但这种生成过程失去了控制。为了解决这个问题,Mirza等人提出了一种变形网络框架,称为条件生成对抗网络(CGAN)。CGAN是一种有约束的生成网络,将无监督的GAN转化为有监督模型,使得图像生成过程可控。在生成模型和判别模型中引入条件变量,这个条件变量可以是图像或者编码序列,其限制的内容可以是位置、颜色、形状等特征。额外添加一个条件变量相当于给生成网络引入了潜在的约束,可以指导生成对抗网络的生成方向,生成多类别高质量的图像。
循环生成对抗网络(CycleGAN)是针对无法配对的图像数据的图像转换模型。它由两个生成模型G和F以及两个判别模型D和E组成,形成一个完整的生成对抗网络。生成模型G和判别模型D组成一个原始的生成对抗网络,生成模型F和判别模型E组成另一个独立的生成对抗网络。循环生成对抗网络可以看作是两个镜像对称的原型生成对抗网络构成的环形网络。这两组原型生成对抗网络共享同一个生成模型的参数,并分别对应一个独立的判别模型。
数据集
为了实现面部表情动作迁移及唇形同步系统的研究,我们发现现有的公开数据集在表情多样性和唇形动作细节上不足以满足我们的需求。因此,我们决定自制一个更为精细的数据集。首先,我们选择了多位志愿者,让他们在多种情感状态下进行面部表情和唇形动作的录制。通过高清摄像头捕捉这些细微的动作变化,并记录下高质量的视频数据。接着,我们利用图像处理技术,从这些视频中逐帧提取出人脸区域,并进行细致的标注工作,以确保每张人脸图像都对应着准确的表情和唇形标签。
在面部表情动作迁移及唇形同步系统的研究中,数据扩充显得尤为重要,因为它可以模拟不同光照条件、拍摄角度、人脸姿态等因素对图像的影响。常见的数据扩充方法包括旋转、平移、缩放、裁剪等几何变换,以及亮度、对比度、色彩抖动等颜色变换。这些变换可以应用于训练集图像,以生成更多不同形态和风格的新图像,从而增强模型的鲁棒性。
import cv2
import numpy as np
import random
def augment_image(image, label):
# 几何变换
# 随机旋转
angle = random.randint(-30, 30)
(h, w) = image.shape[:2]
center = (w / 2, h / 2)
M = cv2.getRotationMatrix2D(center, angle, 1.0)
rotated = cv2.warpAffine(image, M, (w, h))
# 随机平移
tx, ty = random.randint(-10, 10), random.randint(-10, 10)
M = np.float32([[1, 0, tx], [0, 1, ty]])
translated = cv2.warpAffine(rotated, M, (w, h))
# 随机缩放
scale = random.uniform(0.9, 1.1)
scaled = cv2.resize(translated, None, fx=scale, fy=scale, interpolation=cv2.INTER_LINEAR)
实验环境
该面部表情迁移系统的全部实验分析是在实验室内部的设施平台上完成的。所使用的设备包括视频采集设备,用于捕获目标人物面部图像。模型训练使用核心数据处理平台,包括Dell R720型服务器和显存大小为12GB的NVIDIA Titan X GPU显卡。编程环境使用PyCharm 2017,CUDA版本为8.0.61,cuDNN版本为6.0.21,远程调用服务40。使用IntelIJ IDEA 2017作为系统框架的编程环境,调用模型实现系统流程的串联。
实验结果分析
系统的常见评价指标,包括准确率、均方误差、峰值信噪比、结构相似性指数、唇部形状相似度、同步误差和主观评价。这些指标用于衡量模型在分类、回归或生成任务中的准确性,以及图像的相似度和唇形同步的效果。通过综合使用客观和主观评价,可以全面评估系统的性能。
相关代码示例:
import torch
import torchvision
import torch.nn as nn
# 定义面部表情动作迁移模型
class FacialExpressionTransferModel(nn.Module):
def __init__(self):
super().__init__()
# 定义模型的层结构
def forward(self, input_image, target_expression):
# 前向传播计算
# 定义唇形同步模型
class LipSynchronizationModel(nn.Module):
def __init__(self):
super().__init__()
# 定义模型的层结构
def forward(self, input_audio, input_image):
# 前向传播计算
# 加载训练数据
train_data = loadfacial_expression_data() # 加载面部表情数据
train_audio = load_lip_sync_audio_data() # 加载唇形同步音频数据
# 定义训练循环
for epoch in range(num_epochs):
for batch in data_loader:
# 获取当前批次的数据
input_image, target_expression = batch
input_audio, _ = batch
# 计算损失
expression_loss = model_loss(expression_transfer_model(input_image, target_expression), target_expression)
lip_sync_loss = model_loss(lip_sync_model(input_audio, input_image), input_image)
# 反向传播更新模型参数
optimizer.zero_grad()
(expression_loss + lip_sync_loss).backward()
optimizer.step()
# 在测试数据上进行推理
test_image = load_test_image() # 加载测试图像
test_audio = load_test_audio() # 加载测试音频
transferred_expression = expression_transfer_model(test_image)
synced_lip = lip_sync_model(test_audio, test_image)
# 显示结果或进行其他后续处理
show_transfered_expression(transferred_expression)
show_synced_lip(synced_lip)
海浪学长项目示例: