AIoT的人脸识别方案(下)

PLAY

这是本文的下半部分,本文的上半部分以一个演示视频介绍了该人脸识别方案,并介绍了方案的软硬件环境和框架。

模型的优化

嵌入式环境的模型部署必须考虑模型的大小,而不是仅仅看网络结构,比如VGGnet、Resnet等动辄几十兆甚至几百兆都不适合于在端侧的部署,当然为了大幅度降低模型大小和参数数量,以深度换取空间大小。从原理上来讲就是将更高维度的卷积运算分解成两个低一级维度的卷积运算相加,大幅降低模型参数量及运算量但精度不受影响,基本上能减掉80%~90%的参数数量,但是模型的深度会增加一倍甚至更多,因为在多了一层卷积运算的基础上需要增加某些操作。

针对优化设计的网络结构重新训练模型,然后继续进行模型本身的优化,想尽一切可行的方案最后终于取得了满意的结果。主要基于以下三个方面:

  • 参数裁剪 ( 训练最关键的一步,模型必须保持很高的原始训练精度 )
  • 模型量化 ( 大概率会造成精度下降,所以必须控制好降精度的范围 )
  • 大量中间层的归类合并,( 按照算法的理论依据进行合并,几乎没有精度损失 )

关于模型的量化我们需要讨论一下,量化的结果会导致增加很多隐含的运算层,由于每一个卷积层的参数被定点化,但实际上还是表示浮点数,所以在进入卷积运算之前都会做Scaling,然后在完成卷积运算后做Descaling,通常是乘以一个浮点数,由量化脚本自动算出,可以尝试量化脚本始终保持参数Qm.n (m+n=7)格式,然后把Scaling和Descaling采用左右移位的操作,大家都知道移位操作是非常快的,相当于乘以2的N次方,N可以是正负数,但是带来的结果是有可能导致某些层的精度下降超出预期,最终还是要基于精度测试结果来决定是否采用快速移位操作。在MCU人脸识别模型通过增加层数降低参数复杂度的前提下,这样的量化证明存在比较大的精度下降风险,对于我们模型的量化测试发现精度下降了2个百分点,尤其是在最后全连接层的输出精度衰减较大,无法接受,所以我们暂时放弃了使用移位作为Scaling和Descaling保持精度的方式,推荐直接采用浮点数相乘来保持精度。

通过以上提到的模型参数裁剪,量化和中间层的合并,最后我们得到的模型尺寸在1MB以内,并且精度始终控制在99%,您完全不用担心因为太帅而无法在MCU设备上被识别!

预测引擎代码的优化

几乎在优化模型的同时,我们就开始代码和算法的局部优化,事实上最主要的运算都来自于大量的矩阵卷积运算,采用深度优先卷积和点积卷积相结合的运算会带来大量的卷积操作,我们主要围绕这些卷积运算的优化,使性能得到了大幅度的提升。

优化就是个绣花活,本着苍蝇也是肉的精神,很多细微的代码优化累积在一起就达到了很好的效果,要让MCU飞起来需要很大的耐心和技巧。

综合上面两个大的优化方向的提升,我们在保持低精度损耗的前提下终于得到了令人满意的人脸识别性能,基于i.MX RT的人脸识别从最初的9.8秒提升到现在的472毫秒,嗯——总算没让老板买GPU服务器的钱白花。同时也让我们更自信的把这颗神奇的MCU,推向了人脸识别方案的市场,并且把AI IoT解决方案中国团队的软件架构方案公开化。

i.MX RT上的软件框架

接下来我们看下这个软件框架设计图,基于MCU的设计就是简单明了,采用FreeRTOS (也可以使用Zephyr) 加上各硬件驱动模块,再往上就是中间层和应用层,作为一个完整的系统,需要加入一些通用部件,比如MQTT、LwIP、eMBedTLS、Connectivity等,除此之外就是框图中最最重要的”OASIS”运行库,所有AI相关的算法都封装在这个库里面。

基于i.MX RT人脸识别方案的整体软件框架

因为包含了各种类型的功能和实现了最小化的算法函数库,不能用功能性的名字来命名一个大杂杂烩,取个名字还真是难!一想到在MCU上去实现如此复杂而挑战的应用,真的犹如在荒凉的沙漠里独行,相比于Linux下各种丰富的库和支持显得非常绝望,我们需要一片绿洲保证我们的生存,那就对了,就叫”OASIS”吧!我想将来如果我们又开发出了其他算法运行库,那就叫”Camel”吧。。。

OASIS算法库包含了人脸检测、防欺诈算法、人脸姿态调整,以及人脸识别。MCU不可能安装OpenCV,为了实现某些算法,我们又扩展了实现了MiniCV,以最小化的代码实现需要用到的视觉处理函数,比如一些图像的预处理集合,矩阵的仿射变换等函数集。

举个栗子,当人脸在快速运动过程中被检测到,但图像比较模糊或人脸姿态很偏,通过OASIS特殊的算法就能及时丢弃,重新捕捉更好的人脸帧,防止低质量的帧输入人脸识别模型最后影响到识别精度和结果,浪费运算时间。

除此以外,OASIS包含了核心的Inference Engine来运行不同的AI模型,事实上我们特别优化了量化模型参数的处理,因为MCU跑量化过的模型至少提升一倍的效率。

OASIS是一个超轻量级的运行库,不算入AI模型的话整个大小只有300KB,目前支持纯Arm的软件运算,具有较高的可扩展性,未来还会增加专用AI加速硬件的支持。

软件的核心流程

下图是MCU人脸识别算法的核心流程图:

基于iMX RT人脸识别方案核心运算流程的实现

最左边开始摄像头抓取到一帧包含人脸信息的图像输入,经过图像预处理,输入到OASIS运行库,由于OASIS是个纯软件算法,为了保护IP,我们加入了SoC的鉴权算法,只有恩智浦的MCU才能正常工作,想要破解是非常困难的,因为你不知道哪里出错返回了,反正结果不对就是了,暗暗地鄙视一下自己。

在顺利通过SoC鉴权后,进入人脸识别的主要算法流程。首先检测到人脸,然后进行活体检测(可选,某些应用不需要),通过对原始人脸图像进行姿态调整,然后RESIZE成人脸识别模型匹配的格式,进行推理得到该人脸的特征值集合,最后比对注册数据库得到一个最高的可信度值,也就是Confidence Level,看是否达到预设的要求。参看上图会比较清楚。

基于FreeRTOS我们实现了多任务和任务间的消息处理机制,并集成了复杂图形界面的支持,除了OASIS核心算法代码,所有的代码都开放给用户,基于这些参考代码和OASIS API SDK的支持,用户可以快速的开发定制自己的人脸识别应用。

另外我们正在开发一个更低成本的通过手机端APK来注册和管理人脸数据的方案,APK直接内置OASIS库(OASIS库是跨平台的)来生成人脸特征,并将很小的数据集通过BLE传递给MCU设备,大大降低了MCU的额外运算,而设备端只做识别,这样就不需要人机交互带来的硬件成本。此处其实需要一张图,以后有机会补上。。。

与其它方案的对比

在我们进行相关工作期间,了解到有个第三方AI公司,也在i.MX RT上进行人脸识别的相关工作。经过与该方案的比较,我们发现虽然AI公司精通算法,但并不一定非常了解基于MCU的开发技巧,需要深入地在推理性能和精度这两个方面保持完美平衡。

目前觉得我们的这个MCU人脸识别方案更好一些。以下是两个方案的一些参数对比:

总结

总体来说,基于恩智浦MCU的人脸识别方案将会带给客户一个高性价比的选择。目前市场上能提供的几乎都是基于MPU的人脸识别方案,从这个角度看,本文介绍的绝对是一个创新型的整体解决方案。重要的事情说三遍:“低成本!低成本!低成本!”

本文分享自微信公众号 - 人人都是极客(rrgeek)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-04-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券