ASCII码 ASCII码

内存256KB设备也能人脸检测,微软提出用RNN代替CNN | NeurIPS 2020

发布于:2020-12-19 11:17:15  栏目:技术文档

  来源:量子位

  蕾师师发自凹非寺

  量子位报道公众号 QbitAI

  为了让更多 IoT 设备用上 AI,在条件“简陋”的单片机上跑图像识别模型也成为一种需求。

  但是图像识别对内存有较高的要求,一般搭载 MCU 的设备内存都不高,怎样才能解决这个问题呢?

  最近,微软提出了一种 RNNPool 方法,甚至可在内存只有 256 KB 的 STM32 开发板上运行人脸检测模型。

  这篇论文也发表在近期举行的顶会 NeurIPS2020 上,相关代码已经开源。

  CNN 难以适应单片机低内存

  目前,计算机视觉领域的主要架构都是基于 CNN,但是 CNN 对处理器的内存要求比较高,所以对于微型处理器,更加不友好。

  CNN 主要分成两个部分,一是卷积层,用来提取被输入图像的视觉特征。二是池化层,用来组合特征,并且简单表达出来。

  但这样的结构真的非常消耗内存,假如我们输入一张 56×56 的 8 位图像,在处理的过程中,至少需要 800KB 的内存。

  边缘 AI 往往内存和功耗都有限,大多数 Arm Cortex-M4 微控制器设备的内存都少于 256 KB。

  显然,CNN 方法应用在这类边缘设备上是不现实的。

  虽然压缩激活图的大小可以减少输出通道的数量,但这可能会导致精度大大降低。

  另一种方法是对图的行/列数量进行下采样。

  假设是一个 28×28×256 的激活图取代 56×56×256 激活图。那么,一个图像就可以压缩到 200 KB 内。

  池化算子和带状卷积是下采样激活图的标准方法,但这个方法依赖于相对简单和有损的聚合。若将其应用于较大的接收域,或者图像模块进行更激进的下采样,则可能会导致其精度降低。

  因此,如上图中所示,在大多数标准 CNN 架构中,这种运算符仅限于在2×2 的接收域才能保证它的准确度。

  而且这种方法只将激活图大小减少了四倍,满足不了我们的要求。

  因此,我们需要找到一个池化算子,它既可以总结激活图的大模块,并可以一次性降低激活图的大小。

  这种方法就叫做 RNNPool。

  RNNPool 所需内存减少 80~90%

  RNNPool 在语法上等效于池化算子,可以快速减小中间图的大小。它的模型层数更少,对内存要求更低,可以在内存受限的小型设备上分析图像。

  RNNPool 由两个学习递归神经网络(RNN)组成,它们以每个模块为单个向量,在水平和垂直方向上扫过激活图的每个模块。

  RNNPool 获取一个激活图的模块并将其汇总为1×1 体素,然后逐步执行下采样步骤。RNNPool 可以支持8×8,甚至 16×16 的模块大小,并且可以以步长 s = 4 或 s = 8 采样,而不会显著降低精度。

  第一个 RNN 遍历每一行和每一列,并将它们全部汇总为 h1 维的1×1 体素,第二个 RNN 双向遍历这些体素,并且生成一个最终的1×4×h2 向量。其中,h1 是第一遍 RNN 隐藏状态的大小,其中 h2 是第二个 RNN 隐藏状态的大小。

  因此,它可以在不损失准确度的情况下大幅降低激活图的采样率。

  由于 RNNPool 与池化算子等价,所以它可用于替换 CNN 中的所有池化运算符,降低对内存需求。

  将 RNNPool 放在 CNN 架构的开头,可以快速采样激活图,降低峰值内存需求。

  在大多数情况下,研究人员发现基于 RNNPool 的模型所需的内存可以减少至原来的 10~20%。同时,仍能保持几乎相同的准确度。

  实验测试结果

  研究人员将基于 RNNPool 的人脸检测模型(称为 RNNPool-Face-M4)在一个叫做 SeeDot 的工具上编译。

  RNNPool-Face-M4 用在 Arm Cortex-M4 微控制器的 STM32F439-M4 器件上,通过测试,它能在 10.45 秒内处理单个图像,它的峰值内存仅需要 188 KB。

  再通过跟 EagleEye(小型设备领域的 SOTA 技术)比较,可以看到,RNNPool-Face-Quant 在内存消耗上的 225KB 明显明显优于 EagleEye 的 1.17MB。

  Demo

  微软团队还基于 RNNPool 制作了两个图像任务 Demo。

  其中一个是脸部识别。

  在训练时,根据参数不同,输入图像将为 640x640 的 RGB 图,或者为 320x320 的的单色图。

  在测试时,主要运用了两种模式。一是为一组样本图像生成边界框的评估模式,二是计算诸如 mAP 分数之类的测试模式。

  测试方法一是将图像保存在特定的文件夹中,并在具有高置信度的脸部周围标志上边框。如下图所示:

  测试方法二对于每个图像,都提供了单独的预测文件,文件中的每一行都对应一个标识框。对于每个框,将生成五个数字:框的长度,框的高度,x轴偏移,y轴偏移,存在脸部的置信度值。

  除了面部识别的程序代码外,他们还贴出了一个 Visual_Wakeword 的代码库,这是一个二元的识别程序,即判断图像里面,是否有人的出现。

  官方介绍:

  https://www.microsoft.com/en-us/research/blog/seeing-on-tiny-battery-powered-microcontrollers-with-rnnpool/

  论文地址:

  https://www.microsoft.com/en-us/research/publication/rnnpool-efficient-non-linear-pooling-for-ram-constrained-inference/

  开源代码:

  https://github.com/microsoft/EdgeML/blob/master/pytorch/edgeml_pytorch/graph/rnnpool.py

  https://github.com/microsoft/EdgeML/tree/master/examples/pytorch/vision

相关推荐
阅读 +