Github地址:https://github.com/Microsoft/EdgeML
RNNPool为微软提出的可跑在RAM只有256KB的STM32上的人脸检测模型,主要是通过将其中的大部分卷积部分替换为文中提到的RNNPool layer部分,使之在计算量/内存峰值占用最大的地方替换为相应的较小的方法,作者通过实验,将经典网络中的一部分卷积替代为该部分,能够明显的降低参数量大小的同时,保证其准确率不会有较大损失。
文章最后还将标准的S3FD网络架构中的某一部分用RNNPool组件进行了替代,然后将其放在了ARM Cortex-M4的仅有256KB RAM的STM32F439-M4嵌入式设备上,在该设备上图像分辨率为320*240*1上的单帧图像推理速度为10.45 sec,并且达到了State-of-the-art的MAP,该方法对于工业上在性能受限的设备上有很好的借鉴意义。
通过这里就可以发现,RNNPool layer相当于一个广义的池化操作,故它是一个component,可以在任何的基于卷积网络的部分进行替代,而通过名字就可以看出,RNNPool则是借鉴了RNN网络中的方法,用overlapping patches将feature map中的各层之间的权重进行关联,使之更加注重抓取局部特征并且依赖后续的卷积层来抓取全局内容。RNNPool具体的操作方式如下图:
从上图可以看出,利用RNNPool组件可以将尺寸为r*c*k的kernel size大小的feature map转化为一个大小为4*h2长度的一个向量。其中每一个h2长度的向量都是通过FASTGRNN的方式得到,FASTGRNN具体操作可看相关文献(paper:FastGRNN: A Fast, Accurate, Stable and Tiny Kilobyte Sized Gated Recurrent Neural Network)
文章中就将RNNPool在GoogleNet、Mobilenet等经典网络上进行了替代,然后分析了替代后的网络和原网络在参数量、计算量等方面的差异。我将其在mobilenetV2网络上替代后的结构进行了打印,具体如下:
MobilenetV2 RNNPool layer层前后输入尺寸变化情况
官方给出的代码RNNPool(6, 6, 8, 8, input_channel)中前两个参数代表了输入尺寸的kernel size 的大小,及每个窗口的大小,第三个参数代表了kernel的通道数,第四个参数代表了输出向量h2的长度,input_channel则为滑动窗口的个数*batch_size大小。
故原图经过卷积后变为112*112*8,将batch_size=1,输入大小为112*112*8的feature_map经过RNNPool 操作后每个6*6*8大小的kernel尺寸则变为4*8=32,而根据步长stride=2计算出滑动窗口个数为729(27*27)个,故经过RNNPool后feature_map尺寸从batch_size*112*112*8变为batch_size*32*27*27,显著降低了运算量。
原文又以DenseNet121举例,给出了原图和替换为RNNPool后的网络结构图,如下:
DenseNet121与DenseNet121-RNNPool比较示意图
文章给出了经典模型在Imagenet-10数据集下的准确率,参数量,峰值内存,加法参数量等信息,并与更改为RNNPool的对应网络的指标进行比较,如下:
可以看出,RNNPool层的加入不仅峰值内存、参数量有所降低,准确率在某些网络上甚至有一定的提升,而且RNNPool组件的特点可以方便的进行网络的搭建。
以上就是关于微软推出的RNNPool内容的解读,更详细的内容可去网上参看原文和代码,有任何错误的地方也请指出,如果文章对同行业/爱好者有帮助的话,那就随手点个赞吧,笔芯~ ~