栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

人脸识别算法优化总结

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

人脸识别算法优化总结

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

一 数据 问题:数据不均衡
造成影响:训练集损失忽高忽低,验证集部分数据总是识别错误
优化潜力: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, 不按顺序抽取样本图片
二 模型

我的模型结构: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. 降低模型深度(本质是降低特征图数量)
	2. 降低模型输入尺寸(模型输入尺寸增加会带来显存占用的指数级增长)
	3. 降低batch_size
五 部署 问题:推理速度慢
可能原因:直接将模型挂起服务,没有做格式转换。
解决:
	1. pytorch 转onnx,onnx runtime运行
	2. tensorflow 用tensorflow serving运行
问题:调用速度慢
可能原因: 使用flask启动服务速度较慢
解决:使用socket直接部署服务端
问题:环境不稳定
解决: 模型服务 docker打包 
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1021720.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号