目录
前言
📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学来说是充满挑战。为帮助大家顺利通过和节省时间与精力投入到更重要的就业和考试中去,学长分享优质的选题经验和毕设项目与技术思路。
🚀对毕设有任何疑问都可以问学长哦!
选题指导:
大家好,这里是海浪学长毕设专题,本次分享的课题是
🎯基于深度学习的人脸活体检测算法系统
课题背景和意义
如果有人试图用照片打印、视频重放或 3D 面具等手段欺骗该技术,那么就会给用户带来严重的财产安全问题。人脸活体检测通过检测人脸识别系统采集到的人脸图片是否来源于人类面部并且未经翻拍来确认是否为活体,也就是说,直接从真实人脸获得的图像能够代表活体。
实现技术思路
一、 活体检测方法
1.1 轻量化卷积模块
BlockA 和 BlockB 使用 ResNet中残差模块的捷径连接,因此使用这种轻量级卷积模块构建的网络更容易被训练并且有效地防止了模型退化问题。BlockA 称为特征提取模块,输入特征向量依次经过逐点、逐通道、逐点卷积后与原输入特征相加,经过此模块的特征向量可以改变通道数,但是不会改变尺寸。BlockB 为下采样模块,有两条支路,一条输入依次经过逐点,逐通道,逐点卷积,其中逐通道卷积的步长为 2,另一条输入经过步长为 2 的平均池化与逐点卷积,最后相加得到输出,此模块将改变特征的尺寸。
利用纹理特征图可以更好地区分真实人脸与欺骗性物品,从而提高检测的准确性。而原始图像的融合可以提供更多对活体检测有效的图像信息,使得检测算法能够更好地理解人脸的形态和结构,进一步提高检测准确率。通过对原始图像和纹理特征图进行多模态融合,可以提高活体检测算法的鲁棒性,使其能够更好地应对不同的攻击方式和干扰因素,如面具、假发、光照变化、遮挡等。
# 提取纹理特征图
def extract_texture_features(image):
texture_features = texture_extraction.extract(image) # 使用纹理提取算法提取纹理特征
return texture_features
# 图像融合
def image_fusion(original_image, texture_map):
fused_image = cv2.addWeighted(original_image, 0.5, texture_map, 0.5, 0) # 图像融合,使用原始图像和纹理特征图进行加权融合
return fused_image
1.2 纹理特征提取模块
人脸图像中人的性别、年龄肤色等信息对于活体检测来说是无效的,这些信息会对模型的泛化能力和性能产生负面影响。纹理特征可以提取出面部图像中的纹理信息,从而区分真实人脸和虚假人脸,并且它能够减少无效信息对网络的干扰。
基于图像纹理特征的活体检测方法是早期的人脸活体检测方法之一,这种方法受环境等因素影响大,鲁棒性不高。在人脸图像中,除了纹理特征之外,仍然包含大量对人脸活体检测有效的信息,所以将原图像作为多模态特征之一进行输入。
中期融合是将不同模态的特征在中间层次进行交互或对齐,以增强多模态之间的关联性。在中期融合中,每个模态的特征都被提取出来,并在融合前进行了一定的处理,因此,融合后的特征更具信息量。
1.3 损失函数设计
真实人脸使用PRNet生成深度图标签,然后对深度图标签二值化生成二值掩模标签,对于虚假人脸使用全0图作为其深度图标签与二值掩模标签。针对单张RGB图片进行人脸活体检测时,使用深度图标签和二值掩模标签可以提供不同的信息以辅助检测。
任何人脸活体检测数据集都无法涵盖现实世界场景中的所有非活体攻击方式,一个经过训练的活体检测模型,对于未知攻击的判别往往比较差,另外,进行跨数据集测试时,由于数据集中样本采集环境的差异使模型对已知攻击的判别能力下降。 单类对比消耗将活体检测看作一种异常检测,使网络将真实人脸特征向正样本中心聚集,将伪造人脸特征拉向正样本中心远处。
# 生成深度图标签和二值掩模标签
def generate_labels_real(samples):
depth_labels = []
binary_labels = []
for sample in samples:
image = cv2.imread(sample)
depth_map = generate_depth_map_real(image) # 使用PRNet生成深度图标签
depth_labels.append(depth_map)
binary_mask = generate_binary_mask(depth_map) # 二值化深度图标签生成二值掩模标签
binary_labels.append(binary_mask)
return depth_labels, binary_labels
# 生成虚假人脸的深度图标签和二值掩模标签
def generate_labels_fake(samples):
depth_labels = [np.zeros((32, 32))] * len(samples) # 使用全0图作为深度图标签
binary_labels = [np.zeros((32, 32))] * len(samples) # 使用全0图作为二值掩模标签
return depth_labels, binary_labels
二、数据集
数据集一部分采用网络公开数据集,另一部分采取相机拍摄收集,包含多种分辨率和多种光照条件。照片弯曲攻击模拟不法分子通过打印用户照片攻击人脸识别系统的行为;照片剪裁攻击是攻击者通过扣掉图片的眼睛部位,躲在照片后面眨眼的行为对活体检测系统进行攻击;视频重放攻击是使用电子设备向人脸识别系统展示视频回放的行为。此数据集的使用了多种场景,多种攻击方式来构建,对模型的泛化能力可以进行有效的测试。
对视频样本进行抽帧,使用OpenCV检测人脸,并将人脸裁出,重设大小为3×256×256,这些人脸图片作为训练集,将正负样本调整为1:1。由于训练集中不含有深度标签,需要使用PRNet对正样本进行深度图生成,然后使用OpenCV对图片进行下采样,大小为1×32×32,作为正样本标签。负样本使用1×32×32的全0图作为训练标签。
# PRNet对正样本进行深度图生成
def generate_depth_map(image):
depth_map = prnet.generate_depth_map(image)
return depth_map
# OpenCV对图片进行下采样,大小为1×32×32
def downsample_image(image):
resized_image = cv2.resize(image, (32, 32))
return resized_image
# 生成深度图标签和正样本标签
def generate_labels(samples):
depth_labels = []
positive_labels = []
for sample in samples:
image = cv2.imread(sample)
depth_map = generate_depth_map(image) # 使用PRNet生成深度图标签
depth_labels.append(depth_map)
downsampled_image = downsample_image(image) # 使用OpenCV对图片进行下采样
positive_labels.append(downsampled_image)
return depth_labels, positive_labels
三、实验及结果分析
3.1 环境及参数设置
测试环境使用的主机显卡为 NVIDA GeForceRTX2060,使用 PyTorch 进行网络模型搭建与训练框架搭建。仍然使用 Adma 优化器更新网络参数,初始学习率设置为 0.0001,batch size 设置为 4,混合卷积算子中的@统一取值为 0.7。
3.2 消融实验
设置三项消融实验,以考察所提方法中各个策略的有效性,包括使用哪种损失函数组合、伪负样本数量,以及超参数。
使用 focal 损失的 ACER为 9.97%,比仅使用交叉熵损失更高。正则化 pairwise confusion 损失可以提高ACER 约 3%。此外,还将 focal 损失的 focusing 参数设置为四个不同的值
最后
我是海浪学长,创作不易,欢迎点赞、关注、收藏。
毕设帮助,疑难解答,欢迎打扰!