人脸识别算法优化总结

本文总结了人脸识别算法优化的三大关键:数据平衡、模型改进和训练策略。作者针对数据不均衡提出过采样和欠采样,确保模型公正对待各类个体;通过数据清洗和对齐图片提升模型精度;针对过拟合,提出数据增强和模型结构调整。此外,还介绍了GPU和内存优化策略,以及验证与部署阶段的问题解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文从三个方面阐述我对人脸识别算法优化的总结

一 数据

问题:数据不均衡
造成影响:训练集损失忽高忽低,验证集部分数据总是识别错误
优化潜力:acc 可提高30%
优化方法:
	1. 从原始数据中随机抽样采集(过采样+欠采样)。eg: 不同人的图片从5-100张不等,只有5张的个体就样本欠缺,训练不充分吗,而100张的个体由于训练过多,导致模型对这个个体更倾向,从而忽视样本少的个体。根据分布抽取中间值数量,每个个体随机抽取50张图片。如果图片不足就全部抽取,然后数据增强到50张,也可以重复抽取到50张,也就是过采样。对于超过50张的图片就进行随机收取,也就是欠采样,随机的原因是为了保障数据分布均衡。
	2. 引入该场景训练集。eg:随机采样后部分个体仍然无法识别,可能是由于训练集中根本就没有这种场景导致,需要扩大训练集收集范围,引入该该类型数据。
问题:数据清洗不彻底
造成影响:模型不收敛 或 准确率低
优化潜力: acc 可提高40%
优化方法:
	1. 对数据进行质量检测。eg: 图片在收录入训练集时可以进行如下检测;
		* 关键点质量检测,检测该图像是否有足够质量合格的关键点,合格关键点数量不达标不收录(如眼的合格关键点数量之和要大于4,嘴大于2,鼻子大于1);
		* 脸部遮挡检测,判断脸部是否被遮挡,被遮挡不收录,如被口罩、眼睛、污垢、涂鸦等遮挡;
		* 偏转角度检测,如果偏航角或翻转角过大,不被收录;
问题 :建库和比对图片未对齐
造成影响:acc虽然较高,但相似度低
优化潜力: 相似度 可提高20-40%
优化方法:
	1. 将建库图片和比对图片进行图像对齐。如根据双眼将不同图片的人脸经过中心变换,使其处在图片空间中的相同位置,如根据双眼坐标,将不同图片的人脸双眼都处于相同坐标。这样做的好处是尽可能的使建库图片和比对图片产生的图像特征值尽可能的相似。
	2. 训练集中增加对齐图片。如果只对建库和比对图像进行对齐,不对训练集进行增强,会导致模型之前见这种位置的图片较少,影响模型识别准确率。
问题:模型过拟合
造成影响:acc虽然较高,但相似度低
优化潜力: acc 可提高10%
优化方法:
	1. 数据增强。eg: 由于现实场景中的环境变化大,训练集场景有限,很容易就产生过拟合,也可能由于一些训练集中共有的非特征数据,导致模型学错地方,可以进行如下数据增强:
		* 亮度增强,让模型忽略亮度造成的影响
		* 左右翻转,上下翻转,让模型忽略人脸在图像中位置受到的影响
	2. 随机加载。dataloader 设置shuffle = True, 不按顺序抽取样本图片
问题:训练数据不进行掩码处理
造成影响:acc虽然较高,但相似度低
原因:周围的背景、发型等一些非生物识别特征进入训练集时,模型可能学到了不该学的特征,这些干扰信息也会降低识别时的相似度,需要用掩码将根据人脸关键点信息,将非必要区域用掩去,只让模型学习必要区域。
优化方法:
	1. 根据人脸关键点信息,对非必要区域进行掩码。

二 模型

我的模型结构:ir_se_resnet50(backbone) + arcface(head)
损失函数:交叉熵损失

问题:模型不收敛(欠拟合)
造成影响:acc很低,模型无法进一步学习
优化潜力: 模型恢复学习能力
优化方法:
	1. 优化器调整。eg:在cv任务中,一般优化器选择SGD比adam,模型在验证集会有更好的表现(5%左右),但SGD调整较麻烦,可以使用SGD于adam结合的方法,前期使用adam,后期使用SGD进行微调;
	2. 学习率、动量调整。eg: 可能是模型陷于局部最优解活着学习率过大,总是越过最优解,可以进行ab测试,观察学习率、动量与acc的关系,梯度调整学习率和动量。
	3. batch_size扩大。eg: batch_size更大,分布更均匀,在显存可容纳的前提下,尽可能提高batch_size,如果显存太小可以进行多卡训练;
	4. 增加模型深度。 eg: 模型完成任务需要的特征当前模型可能由于太浅,无法学到。增加模型深度,可将resnet50换成resnet100,或更深;
	5. 提高embeding_size。arcface结构的人脸识别模型一般最终输出的512的特征向量,再根据特征向量之间的距离来判断是否相似。可能由于embedding_size 太小,导致无法容纳足够的必须特征值。
问题:模型过拟合
造成影响:训练集损失极低,但验证集表现不好
优化潜力:acc 提高10%
优化方法:
	1. 引入注意力机制。eg: 引入se模块(通道注意力) 或 cbam模块(通道+空间注意力)。我自己测试,cbam由于内部全连接层较多,会导致推理降速,同时在我的任务中,cbam结构并没有se结构更优越。
	2. 提高drop比例。
	3. 增加bn层、正则(常规操作,提升不明显)
	4. 更换模型。一般没有比resnet更好的backbone,可以优化resnet网络结构

三 训练

问题:GPU占用低
造成影响:训练速度很慢
优化潜力:训练速度提高20倍
优化方法:
	1. 提高dataloader 线程数, 打开pin_memory [参考](https://blog.csdn.net/weixin_45456178/article/details/125635061)
问题:显存占用低
造成影响:训练效率降低
优化潜力:训练效率提高
优化方法:
	1. 提高batch_size (推荐)
	2. 提高模型输入尺寸
	3. 增加模型深度
	4. 关闭dataloader的pin_memory
问题:显存或内存溢出
造成影响:训练中断
优化方法:
	1. 降低模型深度(本质是降低特征图数量)
	2. 降低模型输入尺寸(模型输入尺寸增加会带来显存占用的指数级增长)
	3. 降低batch_size
问题:挂起后无法查看训练进度
# 将打印内如输入到日志文件中
nohup python train.py 1>>nohup.out 2>&1 &

四 验证

问题:建库和比对所需图片数量多
造成影响:识别速度 和 相似度结果
优化方法:
	1. 增加图片质检和图像对齐。通过提高图片质量和减少位置对比对的干扰来减少图片数量。
问题:验证集相似度相近
造成影响:
	1. 相似度阈值不好设置,阈值上下浮动一个点就会导致通过率和误识率的较大波动
优化方法:
 	1. 更换相似度计算方法
 	2. 图片根据关键点进行掩码处理,只保留人脸部分区域

五 部署

问题:推理速度慢
可能原因:
1. 没有将模型服务挂起,导致每次推理都要重新加载模型
2. 直接将模型挂起服务,没有做格式转换。
解决:
	1. pytorch 转onnx,onnx runtime运行,挂起在docker内
	2. tensorflow 用tensorflow serving运行,挂起在docker内
问题:调用速度慢
可能原因: 使用flask启动服务速度较慢
解决:使用socket直接部署服务端
问题:环境不稳定
解决: 模型服务 docker打包 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dennis-Ning

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值