原理

人脸属性识别与算法

人脸是一种非常重要的生物特征,具有结构复杂、细节变化多等特点,同时也蕴含了大量的信息,比如性别、种族、年龄、表情等。主流的人脸属性识别算法主要包括:性别识别、种族识别、年龄估计、表情识别等。 目前主流的人脸属性识别算法主要包括:性别识别、种族识别、年龄估计、表情识别等。

年龄估计

年龄估计的问题,定义并不明确。它既可以是分类问题,亦可是回归问题。如果将年龄分成几类,比如:少年、青年、中年和老年时,年龄估计就是分类问题;如果精确的估计具体年龄时,年龄估计就是回归问题。

人的年龄特征在外表上很难准确地被观察出来,即使是人眼也很难准确地判断出一个人的年龄。再看人脸的年龄特征,它通常表现在皮肤纹理、皮肤颜色、光亮程度和皱纹纹理等方面,而这些因素通常与个人的遗传基因、生活习惯、性别和性格特征和工作环境等方面相关。所以说,我们很难用一个统一的模型去定义人脸图像的年龄。若想要较好地估出人的年龄层,则需要通过大量样本的学习。

年龄估计大致分为预估和详细评估两个阶段。

  • 预估阶段: 提取出照片中人脸的肌肤纹理特征,对年龄范围做一个大致的评估,得出一个特定的年龄段;
  • 详细评估阶段:通过支持向量机的方法,建立了对应于多个年龄段的多个模型分类器,并选择合适的模型进行匹配。这其中,以一项融合LBP和HOG特征的人脸年龄估计算法最为人们所熟知。融合LBP和HOG特征的人脸年龄估计算法提取与年龄变化关系紧密的人脸的局部统计特征。LBP(局部二值化模式)特征和HOG(梯度直方图)特征,并用CCA(典型相关分析)的方法融合,最后通过SVR(支持向量机回归)的方法对人脸库进行训练和测试。

表情识别

人脸表情是情绪状态和心理状态表现出来的一种重要形式。通过人脸表情可以得到很多有价值的信息,比如人的意识和心理活动等,这也就是我们常说的人脸表情识别。

人脸表情识别是指研究一个自动、高效、准确的系统来识别人脸表情的状态,进而通过人脸表情信息了解人的情绪,比如高兴、悲伤、愤怒、恐惧、惊讶、厌恶等。在算法识别中,融合LBP 和局部稀疏表示的人脸表情识别算法最为著名。

融合LBP 和局部稀疏表示的人脸表情识别算法包括:

  • 首先,对规格化后的训练集人脸图像进行特征分区,对于每个人脸分区计算该区域的LBP特征,并采用直方图统计方法整合该区域特征向量,形成由特定人脸的局部特征组成的训练集局部特征库;
  • 其次,对于测试人脸,同样进行人脸图像规格化、人脸分区、局部LBP特征计算和局部直方图统计操作;
  • 最后,对于测试人脸的局部直方图统计特征,利用训练集特征库进行局部稀疏重构表示,并采用局部稀疏重构残差加权方法进行最终人脸表情分类识别。

onnx

onnxruntime 介绍

开放神经网络交换(Open Neural Network Exchange)简称ONNX是微软和Facebook提出用来表示深度学习模型的开放格式。所谓开放就是ONNX定义了一组和环境,平台均无关的标准格式,来增强各种AI模型的可交互性。

无论你使用何种训练框架训练模型(比如TensorFlow/Pytorch/OneFlow/Paddle),在训练完毕后你都可以将这些框架的模型统一转换为ONNX这种统一的格式进行存储。注意ONNX文件不仅仅存储了神经网络模型的权重,同时也存储了模型的结构信息以及网络中每一层的输入输出和一些其它的辅助信息。

ONNX Runtime是一个用于ONNX(Open Neural Network Exchange)模型推理的引擎。适用于Linux,Windows和Mac上。ONNX Runtime在设计上是轻量级和模块化的,CPU的构建只有几M字节。可扩展架构、优化硬件加速器,降低计算延时,提升计算效率。

很多业界领先的企业都在积极将自己的技术与ONNX Runtime实现集成和整合,使自己的服务能够完整支持ONNX规范,同时实现性能的最优化。比如英伟达、英特尔、高通等.

如何使用ONNX Runtime

  1. 首先,你需要建立一个ONNX模型。 或者直接下载开源模型。 ONNX Model Zoo,github等
  2. 使用Azure Custom Vision Cognitive Service创建自己的自定义计算机视觉模型。如果已经拥有TensorFlow、Keras、Scikit-Learn或CoreML格式的模型,可以使用开源转换器(ONNX MLTools和TF2 ONNX)进行转换。
  3. 可以使用Azure机器学习服务训练新模型并保存为ONNX格式。
  4. 要使用ONNX Runtime,只需安装所需平台和所选语言的软件包,或者从源代码创建。ONNX Runtime支持  CPU 和  GPU (CUDA)  以及兼容Linux、Windows和Mac上的Python、C#和C接口。具体的安装说明可以在GitHub中获取。

netron

查看多种模型结构可以使用 netron https://github.com/lutzroeder/netron

利用onnxruntime的实现人脸属性的流程如下:

  1. 加载模型
  2. 读取图片
  3. 对图片进行人脸检测
  4. 把检测到人脸的部分裁剪出来
  5. 对人脸部分进行前处理
  6. 推理
  7. 对结果进行后处理,后处理的复杂程度和是否量化有关
  8. 显示图片

onnxruntime api

https://www.onnxruntime.ai/docs/reference/api/python-api.html https://www.onnxruntime.ai/python/api_summary.html

class onnxruntime.InferenceSession(path_or_bytes, sess_options=None, providers=None, 
                provider_options=None)
run

前处理

  • 裁剪的尺寸需要是模型的输入尺寸
  • 裁剪之前最后对原图进行扩展,防止裁剪的时候出问题。主要使用的函数是 cv.copyMakeBorder 加宽加长原始图片。模式有边缘值,镜像,固定值。
  • Resize 的时候需要按照原始比例,否则出来的结果准确性就差了.
  • 输入模型的数据类型也要按照模型的要求进行转换,这个可以通过 netron 来查看,或者模型加载后读取也可以。

实践

安装

安装 onnxruntime,pip3 install onnxruntime --user, 可能会出现版本报错,更新 pip 就可以了,python3 -m pip install --upgrade pip --user

310 安装:

tar xvfz onnxruntime_install.tar.gz 
cd onnxruntime_install
./install.sh

使用 onnxruntime,可能会出现报错 Illegal instruction (core dumped),使用命令 export OPENBLAS_CORETYPE=ARMV8 如果想要以后不报错,那就写入 .bashrc

echo "export OPENBLAS_CORETYPE=ARMV8" >> ~/.bashrc,
source ~/.bashrc

参考:

https://www.onnxruntime.ai/python/api_summary.html
https://www.onnxruntime.ai/docs/tutorials/inferencing/
https://www.sohu.com/a/124787315_607256
https://cloud.tencent.com/developer/article/1434832
https://cloud.tencent.com/developer/article/1377117
https://mp.weixin.qq.com/s?__biz=MzA3MzI4MjgzMw==&mid=2650734809&idx=1&sn=f5dd841fb56b668dbc4dc4c2a668c195&chksm=871ac4a7b06d4db1befb03fb1616cea7ea158561125df55798209a2926bcfa31e131eb46d7d4&mpshare=1&scene=1&srcid=1218rrapKUj3NqpaO12LfFgL#rd
https://blog.csdn.net/minstyrain/article/details/82257369
https://www.jianshu.com/p/c50953e8d828#:~:text=ONNX%20Runtime%E6%98%AF%E4%B8%80%E4%B8%AA%E7%94%A8%E4%BA%8EONNX%20%28Open,Neural%20Network%20Exchange%29%E6%A8%A1%E5%9E%8B%E6%8E%A8%E7%90%86%E7%9A%84%E5%BC%95%E6%93%8E%E3%80%82%20%E5%BE%AE%E8%BD%AF%E8%81%94%E5%90%88Facebook%E7%AD%89%E5%9C%A82017%E5%B9%B4%E6%90%9E%E4%BA%86%E4%B8%AA%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0%E4%BB%A5%E5%8F%8A%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E6%A8%A1%E5%9E%8B%E7%9A%84%E6%A0%BC%E5%BC%8F%E6%A0%87%E5%87%86--ONNX%EF%BC%8C%E9%A1%BA%E8%B7%AF%E6%8F%90%E4%BE%9B%E4%BA%86%E4%B8%80%E4%B8%AA%E4%B8%93%E9%97%A8%E7%94%A8%E4%BA%8EONNX%E6%A8%A1%E5%9E%8B%E6%8E%A8%E7%90%86%E7%9A%84%E5%BC%95%E6%93%8E%EF%BC%8Connxruntime%E3%80%82
https://zhuanlan.zhihu.com/p/350833729
https://mp.weixin.qq.com/s/H1tDcmrg0vTcSw9PgpgIIQ
https://docs.microsoft.com/zh-cn/azure/machine-learning/concept-onnx
https://www.jianshu.com/p/476478c17b8e
https://blog.csdn.net/m0_38133212/article/details/108905496
https://zhuanlan.zhihu.com/p/346544539
https://blog.51cto.com/b217dgy/1316600
https://blog.csdn.net/Hu_helloworld/article/details/109692337
https://www.jianshu.com/p/4d3ec56e7d05
https://www.cnblogs.com/wj-1314/p/9592346.html
https://blog.csdn.net/qianqing13579/article/details/42323397
https://blog.csdn.net/qq_22764813/article/details/52787553
https://zhuanlan.zhihu.com/p/108408180
https://www.jianshu.com/p/d9e982f6046a
https://www.cnblogs.com/bjxqmy/p/12306276.html
https://blog.csdn.net/chezhai/article/details/53229699

标签: deep_learning

添加新评论