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

一 数据

问题:数据不均衡

造成影响:训练集损失忽高忽低,验证集部分数据总是识别错误
优化潜力: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. 轻松上手UAI-Train,拍拍贷人脸识别算法优化效率提升85.7%

    2019独角兽企业重金招聘Python工程师标准>>> "UAI-Train平台可以让我们方便地在短时内使用大量的GPU资源,用较低的成本训练海量的数据集,提高算法模型迭代 ...

  2. 人脸识别算法初次了解

    人脸识别算法初次了解 这是转载别人的帖子,认为好,大家一块学习http://www.cnblogs.com/guoyiqi/archive/2011/07/28/2129300.html 前言 在写此 ...

  3. 轻量级3d模型查看器_耐能取得两项软件著作权,自研轻量级3D人脸识别算法领先业界...

    近日,耐能收到国家版权局颁发的两份<计算机软件著作权登记证书>,两款软件分别是人脸活体检测和人脸识别开发包软件V1.1.0.卷积神经网络简化和加速开发工具软件V2.2.17.这次取得两项软 ...

  4. 3d人脸识别算法opencv_热招职位算法类

    1.资深算法工程师leader-AI平台 地点:深圳 工作职责 1.推进机器学习及计算机视觉领域的核心算法: 2.构建机器学习及计算机视觉领域的关键应用: 3.将算法于实际应用场景相结合,构建算法和应 ...

  5. 【华为云技术分享】人脸识别算法的训练之路(下)

    人脸识别算法的训练之路(上) 人脸识别 人脸识别问题本质是一个分类问题,即每一个人作为一类进行分类检测,但实际应用过程中会出现很多问题.第一,人脸类别很多,如果要识别一个城镇的所有人,那么分类类别就将 ...

  6. python人脸识别算法_python人脸算法

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 若图片中包含多张人脸,只选取其中人脸面积最大的人脸. 支持png.jpg.jpe ...

  7. 有了它,你的照片能“屏蔽”人脸识别算法

    [导语]:一款保护个人照片隐私的 AI 工具. 简介 如今强大的面部识别系统的激增对个人隐私构成了真正的威胁.人人都可以在互联网上搜索数据,可以在个体不知情的情况下训练出高度精确的人脸识别模型.我们需 ...

  8. android seetaface6_中科视拓宣布开源SeetaFace6人脸识别算法(附相关课程)

    3月31日,中科视拓宣布开放SeetaFace6人脸识别算法. 2016年9月和2019年8月,中科视拓分别开源了SeetaFace1.0人脸识别引擎.SeetaFace2.0商用级人脸识别算法.Se ...

  9. RetinaFace最强开源人脸识别算法

    最近这几天,美国国家标准与技术研究院(NIST)公布了全球最权威的人脸识别算法测试(FRVT)的最新结果, 国内知名视觉算法公司格灵深瞳取得了优异成绩:在最具挑战的"非约束性自然环境人脸照片 ...

最新文章

  1. java methode_Java Method.getTypeParameters方法代码示例
  2. 通过100个单词掌握英语语法(十八)did
  3. Hyperledger Besu(4)身份许可
  4. leetcode-Minimum Size Subarray Sum-209
  5. [IE9] 开发IE9上的屏幕取词功能
  6. 麦当劳员工称缺乏归属感 长期重复劳动像个机器
  7. apache madlib 教程_Apache顶级开源项目——机器学习库MADlib简介与应用实例
  8. iOS内存泄漏的常见情况
  9. Python快速安装库的靠谱办法
  10. 潭州课堂25班:Ph201805201 爬虫基础 第六课 选择器 (课堂笔记)
  11. ElasticSearch.js源码走一个大概
  12. Android启动过程概述
  13. HTML入门之003
  14. 110 同步、异步、阻塞、非阻塞
  15. 获取base64编码格式的图片大小
  16. Git 工具之TortoiseGit小乌龟安装配置及使用
  17. collect2:error:ld returned 1 exit status解决方案
  18. html中加号实体,纯css实现加号“+”效果(代码示例)
  19. 立体仓库货物识别率99.9%!AI让仓储管理事半功倍
  20. Java面试题-LuceneSolrElasticSearch

热门文章

  1. 想跳槽涨薪的必看!Java开发了解这些自然无惧面试,附面试题
  2. 日报-康益明爱崔紫娟
  3. Playwright-Node.js 自动化办公
  4. 网络会计信息失真的风险及对策
  5. 华为云OCR文字识别工具类
  6. SqlAlchemy使用
  7. java与线程相关的一些重要方法1(不涉及并发包)-Object的wait(long timeout)和wait()
  8. LC滤波器简单设计法 - 一文读懂LC滤波器简单设计方法及原理介绍,LC值计算方法
  9. 跨局域网远程访问SQL数据库方法
  10. 上海市计算机中专学校,上海公立中专学校一览表