AIoT的人脸识别方案(上)

2019-05-13 15:03:48 浏览数 (1)

前言

我一定是对这颗i.MX RT的MCU太过于偏爱,之前已经在上面做了一个语音识别技术方案(见《AIoT的语音识别方案》),但总觉得我们还能挑战一下更复杂的应用,对于高性能和高运算量最有挑战的还是在视觉方面的应用,目前最广泛应用和接受的还是人脸识别,所以打算把下一个目标放在人脸识别上面。

码农们总是不自觉的自我膨胀来挑战各种技术天花板,为此吃尽了苦头撞的一头包,然而当目标达到的时候这一切的付出都是浮云。。。

先来看看关于人工智能是如何通过预训练好的模型,从目标对象的数据获取然后通过深不可测的神经元网络及各种匪夷所思的运算逻辑,最后得到准确的预测结果。

如下图,这是一个典型的关于目标识别的前向推导应用,其实我们只要知道一件事,该过程大量使用了关于矩阵的相乘和相加运算,就是所谓的MAC运算,目前一大批AI芯片初创公司就是在忙活这个高效率矩阵乘加运算硬件加速单元,最后比比谁的MAC的GFLOPS更强但功耗更低。。。

然鹅,我们的i.MX RT作为一个高性价比SoC并不具备这个神器,但我们一样能做到高精度人脸识别应用啊,是不是很牛?

当然,恩智浦在后面的规划中已经包含了这些硬核的集成,一个都不能少!

大致的人脸注册及识别的过程如下图,具体的技术讨论会在后面展开,工科生的文字忽悠能力有限,我想我还是多画点图比较好,既能多占坑又能推卸责任。哈哈。。

人脸注册及识别的流程框图

基于i.MX RT的人脸识别方案

针对MCU的人脸识别方案,我们期望能够拿出MVP BOM的方案,将性价比推到极致,MCU的生命线就是低成本!低功耗!低尺寸!

另外还要强调一点,MCU所采用的RTOS能使系统启动控制在几百毫秒以内,而采用MPU的Linux内核加上GUI通常启动需要10秒以上。从这一点上,IoT人脸识别模块将带来很好的用户体验,哪怕是整个系统断电重启也能快速就绪。

我们这里推荐的MCU人脸识别方案,并不是要取代MPU的方案,而是提供给市场和细分行业更多的选择,作为IoT应用的一个合理选择。

为了使大家对基于MCU人脸识别方案的性能有一个更直观的印象,我们特意录了一段演示视频和大家分享。

方案的硬件框架结构

事实上基于视觉AI应用的硬件设计相对来说比较灵活,除了主处理器之外,其他外围的器件只需要包含摄像头、LCD、SDRAM、Flash存储器基本上就完备了,不同于语音识别,软件和硬件设计的相关性非常密切,尤其涉及到语音前端的各类算法会和硬件以及结构的声学设计紧密耦合。

我们在项目初期的软件和核心算法的开发直接基于iMX RT1050的开发板,这样可以直接导入该开发板的官方SDK,快速的运行各类参考代码。我们只需要专注于应用的开发和核心算法的实现及优化,不需要花费太多的精力在各类硬件驱动的调试上面。下图就是该开发板运行MCU人脸识别的demo界面。

i.MX RT1050 通用开发板

同时,我们也专门设计了i.MX RT针对人脸识别应用的参考板,尽可能优化硬件的BOM成本和尺寸小型化,基于整个硬件设计的复用性考虑,开发板总是尽可能的支持各类扩展子板,该设计也是采用核心板和应用板分离的方式,如下图所示。

i.MX RT1060人脸识别参考开发板

考虑到MCU设计方案专门针对IoT的应用,需要做到更低的成本,更低的功耗和尺寸设计,该硬件和之前的语音识别开发板一样采用30x40mm2的尺寸,有别于通用开发板,我们采用SPI接口的LCD显示屏,该屏幕采用低成本的8位色,每个像素只需要3字节,对于IoT应用已经足够。

下图是关于视觉应用开发板的硬件逻辑框图,核心就是i.MX RT106x跨界处理器,该SoC以MCU的价格提供客户MPU的性能体验,具有极高的性价比。

基于Arm Cortex-M7的内核能达到主频600MHz,并且支持独立的硬件浮点运算单元,这也使我们妄想在MCU上实现高精度的快速人脸识别成为可能。另外她内置了1MB的SRAM,可用于优化某些算法的执行效率。

根据具体方案预估的固件和运行空间的大小来选择外部的NOR Flash和SDRAM。这种方案设计的BOM是选用MPU方案所带来的外围高成本部件BOM所不能比拟的。由于基于MCU和新的工艺制程,使得整个方案的尺寸和功耗非常适合于IoT的模块化应用。

可以看到,该开发板本身也具备语音识别应用所需要的硬件支持,以及各类传感器和WiFi/BT模块的集成,可以更广泛的开发各种IoT应用,当然从成本考虑,最终客户的方案选择可以精简掉不需要的部件以达到更低的成本,我们也在重新设计一个更低成本的人脸识别专用参考板,所有不需要的部件都会拿掉,理论上来说显示部分也不是必须的。

i.MX RT106x人脸识别方案的硬件框架图

方案的软件框架结构

对于AI视觉应用,最复杂和耗费大量研发资源的还是软件的算法实现和优化,这也是本文的重点所在。

通过实现和优化了i.MX8M上的人脸识别应用,在不依赖于任何神经元网络硬件加速的情况下,达到了非常流畅的识别帧率,就开始莫名的自我感觉良好,非常乐观的通过简单的线性换算(1.5GHz x 4核)就开始盘算着理论上在i.MX RT(600MHz单核))上能得到如何的性能,虽然也清楚的知道MPU使用的Arm Cortex-A可以在代码中使用NEON指令加速和OpenMP实现任务并行和数据并行,并且MPU具有一级缓存和大容量的二级缓存。

在埋头苦干了一段时间后终于丑陋的实现了MCU上的人脸识别运算,然而结果非常失望,仅仅识别一张人脸数据的时间就达到了9.8秒,这个大大超出了我们的预期,这样的性能完全无法进行商用,想不到单核MCU和多核MPU的单位频率的算力差距竟然是如此之大!!

但我们并不会就此放弃(否则也不会有这篇文章的问世)。码农们在冷静下来之后提出了很多创新性的优化方案,基本上围绕两个方面进行展开:

  • 人脸识别AI模型的优化
  • 端侧前向推导引擎代码的优化

也就是说攻城狮们必须要扮演两个角色,一是继续做好程序猿,二是成为出色的训魔师,码农参农得样样行。

特别需要感谢老板的鼎力支持和他独到的技术眼光(不是拍马屁哦,他不懂中文),以及恩智浦IT部门的强力支持,我们以最快的速度买到了高性能GPU服务器,原来需要4周完成的一次模型训练现在只需要2天,这样我们就可以很任性的,愉快的进行参数调整和模型训练。如果不采用高性能GPU的话,训练参数的batch size无法设的很大,导致模型很难快速收敛,最终导致模型的精度不会太高,模型的优劣最后不就是那百分之零点几吗?

PAUSE

本文上半部分先到这里,下半部分将重点介绍我们是如何优化模型、优化代码,完美实现前面视频演示的效果,并和另一个第三方的方案进行简单的对比。

0 人点赞