论文地址:
《Pelee: A Real-Time Object Detection System on Mobile Devices》
文章总体上参考DenseNet的设计思路,提出了三个核心模块进行改进,有一定参考价值。
PeleeNet实际上是DenseNet的变体,使用的依然是DenseNet的连接方法,核心的设计原则也和DenseNet相仿(特征重用)。
1. Two-Way Dense Layer:
如下图所示:左边(a)图是DenseNet中设计的基本模块,其中k、4k代表filter的个数;右边(b)图代表PeleeNet中设计的基本模块,除了将原本的主干分支的filter减半(主干分支感受野为3x3),还添加了一个新的分支,在新的分支中使用了两个3x3的卷积,这个分支感受野为5x5(2个3*3卷积堆叠等于1个5*5的卷积核感受野;这样就提取得到的特征就不只是单一尺度,能够同时兼顾小目标和大目标。
2. Stem Block
这个模块设计受Inceptionv4和DSOD的启发,想要设计一个计算代价比较小的模块。ResNet和DenseNet在第一层都是用的是一个7x7、stride为2的卷积层,浅层网络的作用一般是提取图像的边缘、纹理等信息;Stem Block的设计就是打算以比较小的代价取代7x7的卷积,这个模块可以在几乎不增加计算量的情况下提升特征的表达能力;block先使用strided=2的3x3卷积进行快速降维,然后用了两分支的结构,一个分支用1*1卷积进行降维、strided=2的3x3卷积, 另一个分支使用了一个maxpool;这一部分和组合池化非常相似,stem block使用了strided=2的3x3卷积和最大值池化两种的优势引申而来的池化策略(而组合池化使用的是最大值池化和均值池化),可以丰富特征层。
3. 瓶颈层设置动态变化的通道数
瓶颈层(1x1卷积层)的输出通道数随输入形状而变化,而并非DenseNet中growth-rate的4倍(growth-rate表示每经过一个dense block,所增加的通道数),从而确保瓶颈层的计算量不会显著增加;为了维持结构的一致性,PeleeNet仍然给所有稠密层添加了瓶颈层,但是数量是依据输入形式而动态调整的,来保证通道数量不会超过输入通道数。将瓶颈层的通道个数根据输入的形状动态调整。
在DenseNet中,有一个超参数k-growth rate, 用于控制各个卷积层通道个数,在DenseNet的瓶颈层中,将其固定为增长率的4倍,DenseNet中,前几个稠密层的瓶颈通道数比输入通道数多很多,这也意味着对这些层来说,瓶颈层增加了计算开销,PeleeNet将瓶颈层的通道个数根据输入的形状动态调整,节约了28.5%的计算消耗。
4. 无压缩的过渡层
在DenseNet中,过渡层是用于将特征图空间分辨率缩小的,并且过渡层中通道数会小于前一层的通道数:DenseNet在dense layer间使用transition layer进行特征维度压缩,压缩比为0.5,而实验发现这个操作会减弱网络特征的表达能力。在PeleeNet中将过渡层和前一层通道数设置为一样的数值。
5. 卷积+relu+bn组合顺序
为了提高速度,采用了conv+bn+relu的组合(而不是DenseNet中的预激活组合(conv+relu+bn)),post-activation中,在推断阶段所有的BN层可以和卷积层合并,可以促进模型推理加速。为了弥补这个改变给准确度带来的负面影响,使用更浅更宽的网络结构,在最后一个dense block后添加一个1x1的卷积层来获得更强的特征表达能力。
6. 网络结构
整个网络由一个stem block和四阶特征提取器构成。除了最后一个阶段的每个阶段的最后一层都是步长为2的平均池化,四阶段结构是一般大型模型设计的通用结构。尽管ShuffleNet使用三阶段的结构,并在每个阶段的开始都压缩了特征图大小,尽管这样可以提升计算速度,但是本文认为前面的阶段对视觉任务尤为重要,且过早的减小特征图大小会损坏特征表达能力,因此仍然使用四阶段结构,前两阶段的层数是专门控制在一个可接受的范围内的。
参考:
来聊聊DenseNet及其变体PeleeNet、VoVNet
仅为学习记录,侵删