文章目录
以下内容是对YOLOv4总结出的Bag of specials进行一个汇总记录,也就是另外的一个分支。(以下内容的图片大部分来自于参考链接,比较多的内容参考了博主 xxZkj 的文章 )
对于那些只增加少量推理成本,却能显著提高目标检测准确率的插件模块和后处理方法,我们称之为“Bag of specials”。一般来说,这些插件模块是为了增强模型中的某些属性,如扩大接受域、引入注意机制、增强特征整合能力等,后处理是筛选模型预测结果的一种方法。
1.提升模型感受野
1)SPP
论文:Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition
论文地址:https://arxiv.org/pdf/1406.4729.pdf
SPPNet称为空间金字塔池化网络,其思路其实很简单,就是为了让网络能够适应不同尺度的图像输入,避免对图片进行裁剪或者缩放,导致位置信息丢失。
由于卷积层在面对不同尺度的输入图像时,会生成大小不一样的特征图,会对网络的训练带来较大的麻烦,因而SPPNet就通过将卷积层最后一层的池化层替换为金字塔池化层,固定输入的特征向量的大小。
- SPP的核心在于使用多个不同尺寸sliding window pooling(上图中的蓝色4x4、青色2x、灰色1x1窗口)对上层(卷积层)获得的feature maps 进行采样(池化,文中使用最大池化),将分别得到的结果进行合并就会得到固定长度的输出。
- 上图可以看出SPP层就是在前一卷积层得到的feature maps上进行了3个池化操作(实际情况根据自己设定的池化个数,控制全连接层的输入,下面会讲)。最右边的就是原图像,中间的是把图像分成大小是4的特征图,最右边的就是把图像分成大小是16的特征图。这样每一个feature map就会变成固定的21(16+4+1)个feature maps。
YOLOv4中的SPP结构如下图所示,该SPP结构就是存在于YOLOv3_SPP版本采用到的SPP结构。
作者在SPP模块中,使用k={1x1,5x5,9x9,13x13}的最大池化的方式,再将不同尺度的特征图进行Concat操作。其中的1x1卷积其实相当于不处理,直接是一个残差相加。
注意:这里最大池化采用padding操作,其实根据公式:
对于卷积之后的输出size的计算公式:
outsize = (insize - filtersize + 2*padding)/stride + 1
我们可以计算出对于不同卷积核大小其添加的padding是多少。(以下计算均以stride=1处理),输入与输出的尺寸都相同,假设均是13,计算过程如下:
- 对于5x5的卷积:13=(13 - 5 + 2*padding)/ 1 + 1 可以计算出padding=2
- 对于9x9的卷积:13=(13 - 9 + 2*padding)/ 1 + 1 可以计算出padding=4
- 对于13x13的卷积:13=(13 - 13 + 2*padding)/ 1 + 1 可以计算出padding=6
采用SPP模块的方式,比单纯的使用k*k最大池化的方式,更有效的增加主干特征的接收范围,显著的分离了最重要的上下文特征。
Yolov4的作者在使用608*608大小的图像进行测试时发现,在COCO目标检测任务中,以0.5%的额外计算代价将AP50增加了2.7%,因此Yolov4中也采用了SPP模块。
2)ASPP
论文:DeepLab: Semantic Image Segmentation with Deep Convolutional Nets, Atrous Convolution,and Fully Connected CRFs
论文地址:http://export.arxiv.org/pdf/1606.00915
在介绍ASPP之间,需要先介绍dilated convolution(空洞卷积),顾名思义,空洞卷积就是通过在卷积核中填充空洞,来增大感受野。在空洞卷积中,卷积核的元素是间隔的,间隔的大小取决于空洞率。(dilated rate)
红色圆点为卷积核对应的输入“像素”,绿色为其在原输入中的感受野。
- 图a对应3x3的扩张率为1的卷积,和普通的卷积操作一样;
- 图b对应3x3的扩张率为2的卷积,实际的卷积核还是3x3,但是空洞率为2,也就是对于一个7x7的图像块,只有9个红色的点也就是3x3的卷积核发生卷积操作,其余的点略过。也可以理解为卷积核的大小为7x7,但是只有图中的9个点的权重不为0,其余都为0。可以看到虽然卷积核的大小只有3x3,但是这个卷积的感受野已经增大到了7x7。如果考虑到这个2-dilated convolution的前一层有一个1-dilated convolution的话,那么每个红点就是1-dilated的卷积输出,感受野为3x3,所以1-dilated和2-dilated合起来就能达到7x7的卷积;
- 图c是4-dilated convolution操作,同理跟在1-dilated和2-dilated convolution的后面,能达到15x15的感受野;
其中,需要注意一些概念:
- 空洞卷积实际大小为RF = k + (k - 1)×(rate - 1)。也就是对于图a来说,其卷积的实际感受野大小就只是3;而对于图b来说,其卷积的实际感受野大小是3+(3-1)x(2-1)=5,也就是红点框大小为5,所以感受野为5;同理,对于图c来说其实际感受野大小为9.
- 可以通过堆叠不同大小的空洞卷积可以增加感受野的大小 RF = RF1 + RF2 - 1。例如1-dilated convolution之后加一个2-dilated convolution,感受野才能达到7 × 7(3 + 5 - 1)的大小;而此时在后面再加一个4-dilated convolution,感受野就会达到 7 + 9 -1 = 15的大小。如果用普通的3 × 3卷积,即需要7层堆叠感受野才能达到15,RF = (k - 1)×layers + 1。(k = kernel size,rate = dilated rate)
对比传统的卷积操作,感受野的增加与层数layer成线性关系,而dilated conv的感受野是指数级的增长。(因为需要考虑这一层的实际感受野与上一层的实际感受野的大小RF = RF1 + RF2 - 1)
补充:dilated的好处是不做pooling损失信息的情况下,加大了感受野,让每个卷积输出都包含较大范围的信息。在图像需要全局信息或者语音文本需要较长的sequence信息依赖的问题中,都能很好的应用dilated conv,比如图像分割、语音合成WaveNet、机器翻译ByteNet中。
ASPP称为空洞空间金字塔池化网络,与SPP类似的,只是ASPP中采用了空洞卷积对输入的特征图进行不同空洞率进行卷积操作,然后将这些不同空洞率的分支再进行一个融合。由于同一类的物体在图像中可能有不同的比例,ASPP有助于考虑不同的物体比例,这可以提高准确性。(DeepLab v2中就有用到ASPP模块)
3)RFB
论文:Receptive Field Block Net for Accurate and Fast Object Detection
论文地址:https://arxiv.org/pdf/1711.07767.pdf
RFB的每个分支上使用不同尺度的常规卷积 + 虫洞卷积,通过常规卷积的不同卷积核尺度来模拟pRFs中的不同感受野,各个分支上通过各自dilated conv所得到的离心率,来模拟pRF的尺度与离心率的比例,其实就是为了模拟人类的视觉感知模式。
由图可知,RFB其实就是先使用1×1卷积降低特征图通道数,并行使用3个不同大小的正常卷积提取特征图的特征信息,然后再接与正常卷积大小相同的dilated rate的3×3空洞卷积,最后再concat起来,使用1×1卷积恢复通道数。(类似bottleneck结构,只不过增加了空洞卷积)
与上面提到的ASPP的区别就是,ASPP在对特征图进行提取特征时,使用的是同一大小的3×3正常卷积,然后再接dilated rate不同的空洞卷积,提取的特征可判别性不高。而RFB在对特征图提取特征时,是使用了3个不同大小的正常卷积,再接空洞卷积,提取的特征符合人类视觉感知。
在MS COCO上,RFB只花费7%的额外推断时间来增加SSD的ap50的5.7%。
2.注意力机制
1)SE
论文:Squeeze-and-Excitation Networks
论文地址:https://arxiv.org/pdf/1709.01507.pdf
SENet的思路其实很简单,就是想对每张特征图添加权重,并让网络自动学习调整权重信息。一般来说,SE模块适合使用与CPU中,比如MobileNetV3中就使用了SE模块,而在GPU中一般不建议使用,因为其会增加10%的损耗计算。
具体的操作过程其实就是对C张大小为H × W的特征图(总维度就是 C × H × W)进行全局平均池化,也就是上图的Global pooling操作,然后输出就是C张大小为1 × 1的特征图(总维度是C × 1 × 1),跟着全连接层,全连接层主要是为了减少通道数量,r的大小关系到通道压缩比例,文中r取了16,就是把通道数缩小到原来的1/16(MobileNetv3中是1/4),然后进行ReLU激活,再通过全连接层将通道数恢复到C,经过Sigmoid(MobileNetv3中使用的h-swish激活函数函数)激活后(维度为C × 1 × 1)直接与C张大小为H×W的特征图相乘,这样就可以理解为每张特征图都被添加了权重信息。个人理解,全连接层可以用1 × 1卷积来解决,都是为了降升通道数,没啥区别。
SE模块可以改善resnet50在分类任务上提高 1%精度,但是会增加GPU推理时间10%。
2)SAM
论文:CBAM: Convolutional block attention module
论文地址:https://arxiv.org/pdf/1807.06521.pdf
CBAM就是为了解决对特征图内部的空间位置添加权重而提出来的注意力机制模型。它分成了两部分,一个是CAM(Channel Attention Module,通道注意力模块),另一个是SAM(Spatial Attention Module,空间注意力模块)。也就是时候这里的SAM只是CBAM中的其中一个模块。
CAM(Channel Attention Module)
首先我们来分析CAM模块,其和SE模块的思路几乎差不多,只不过它额外添加了一次全局最大值池化,然后将全局最大值池化得到的C×1×1的特征向量和全局平均池化得到的C×1×1的特征向量依次通过MLP层(也就是SE的FC层,用来先降维后升维),再将输出的特征向量按像素相加,再经过Sigmoid激活与特征图相乘。(与SE的唯一区别就是额外添加了一次全局最大值池化)
SAM(Spatial Attention Module)
SAM就是用来对特征图内部的空间位置添加注意力机制的模块,假定输入的特征图还是C×H×W(也就是C张大小为H×W的特征图),这次我们对特征图的每个点(H×W内)进行通道数为C的最大值池化,这样最大值池化输出的特征图大小就是1×H×W,同时也进行通道数为C的平均值池化,输出的特征图大小也是1×H×W,将最大值池化输出的特征图和平均值池化输出的特征图进行拼接形成2×H×W的拼接特征图,然后通过1×1卷积进行通道降维成1×H×W的输出特征图,再经过Sigmoid激活形成空间注意力权重,然后和原来的C×H×W的特征图进行相乘。这样相当于给每张H×W的特征图乘于一个H×W的空间权重,从而形成空间注意力模块。
按我的理解就是将每一个channels继续最大池化与平均池化然后再压缩得到的数值再与原channel上的每个点进行相乘。
总结:通俗上理解CAM对于每一层channels作权重处理;而SAM对每一组channel作权重处理;侧重的方向不同。
SAM可以改善resnet50在分类任务上提 高0.5%精度,并且不增加GPU推理时间。
3)modified SAM
Modified SAM是YOLOv4的一个创新点,称为像素注意力机制,它的思路也非常简单,就是把SAM模块的池化层全部去除,对C×H×W的特征图进行1×1卷积(既没有降通道也没有升通道),得到C×H×W的输出特征图,然后使用Sigmoid激活,再与原来的C×H×W进行像素点相乘。
3.特征融合模块
卷积神经网络有一个很大的特点就是,高层的特征图包含丰富的语义信息,但位置信息由于卷积和池化的操作会有较大的损失,而低层的特征图虽然语义信息较少,但是由于卷积和池化的操作次数较少,保留了较为完整的位置信息,目标检测既需要丰富的语义信息来判别物体的类别,也需要精确的位置信息来定位物体的位置,因而如何把低层的特征图和高层的特征图信息相互融合,就是特征融合所需要解决的问题。
1)Skip Connection
残差连接,也没什么多说的,其将较小的梯度变化放大,从而对权重调整更大。
2)Hyper Column
论文:Hypercolumns for Object Segmentation and Fine-grained Localization
论文地址:https://arxiv.org/pdf/1411.5752.pdf
超列(hypercolumn),指一个输入像素位置往后的所有对应位置的卷积网络单元激活值,组成一列向量。超列,借鉴于神经科学,其区别在于不仅仅指边缘检测器,还包含更多具有语义信息的神经单元。超列的idea,如下图所示:
超列的计算,是取得一个检测框(可能是正方形),resize到分类网络的固定输入大小(分类网络使用了全连接层),resized图像分块进入分类网络,把各个层的特征图进行bilinear插值,恢复到图像分块大小,取得各个层的对应位置的超列(级联多通道激活值)。
3)FPN
之前有介绍过FPN结构,详细的见链接:https://blog.csdn.net/weixin_44751294/article/details/117638189
4)SFAM
论文:M2Det: A Single-Shot Object Detector based on Multi-Level Feature Pyramid
论文地址:https://arxiv.org/pdf/1811.04533.pdf
SFAM的主要思想是利用SE模块对多尺度级联特征映射进行通道级加权。
SFAM是将TUM产生的多层次特征图聚合为特征金字塔,第一阶段是将同一分辨率特征进行拼接,注意是同一分辨率的,TUM产生的有6个尺度不一样的特征图,论文中一共有8个TUM模块,因而每个TUM模块产生的特征图均是128×S×S(S为1,3,5,10,20,40),因而通道拼接后大小为128×8=1024,与图示相同。第二阶段是对通道添加权重,也就是SE模块。
在检测阶段,在6层特征金字塔后面接两个卷积层来进行位置回归和分类,六个特征图的默认框的检测范围遵循原始SSD的设置。在特征图的每个点,设置三种不同比例总共六个锚点框。之后,使用0.05的概率分数作为阈值来过滤掉分数较低的大多数锚点。使用soft-NMS作为后处理过程。
详细参考:https://blog.csdn.net/weixin_38688399/article/details/106768281
5)ASFF
论文:Learning Spatial Fusion for Single-Shot Object Detection
论文地址:https://arxiv.org/pdf/1911.09516.pdf
ASFF通过学习权重参数的方式将不同层的特征融合到一起,作者证明了这样的方法要优于通过concatenation或者element-wise的方式
ASFF称为自适应空间特征融合,其思路非常简单,就是为了改进FPN进行特征融合时只是暴力地将高层特征图上采样然后进行像素级的相加操作。ASFF通过对每张融合的特征图设置自学习的权重来进行加权融合。
例如上图中有三张不同尺度的特征图,称为Level1、Level2、Level3,分别α3,β3和γ3相乘在相加,就构成了ASFF-3。
具体怎么操作呢,以生成ASFF-3为例,Level1是高层语义特征图,比Level3的低层语义特征图相比,分辨率是其四分之一,并且通道数也不同(Level1为512×,Level2为256×,Level3为128×),所以Level1需要先进行1×1卷积压缩通道数到128×,然后再进行4倍上采样从而变成和Level3相同维度的待融合特征图Level1_resized,同理Level2也需要1×1卷积压缩通道并进行2倍上采样变成Level2_resized,然后 A S F F − 3 = α 3 × L e v e l 1 r e s i z e d + β 3 × L e v e l 2 r e s i z e d + γ 3 × L e v e l 3 ASFF-3 = α3 × Level1_resized + β3 × Level2_resized + γ3 × Level3 ASFF−3=α3×Level1resized+β3×Level2resized+γ3×Level3
详细参考:https://blog.csdn.net/weixin_38688399/article/details/106791333
6)BiFPN
论文:EfficientDet: Scalable and Efficient Object Detection
论文地址:https://arxiv.org/pdf/1911.09070.pdf
EfficientDet-D7最重要的贡献就是提出了BiFPN的特征融合。
- 经过作者观察,PAN性能比FPN和NAS-FPN要好,但是需要更多参数和计算成本。
- 作者从PAN出发,移除了只有一个输入的节点,并假定这个只有一个输入的节点对特征融合贡献不大。
- 在相同level层添加一个skip connection,为了能融合更多的特征信息。
- 以一个自顶向下和一个自低向上的连法作为一个基础层,不断重复这个模块,就形成了BiFPN特征融合模块。
最后来一个EfficientDet的整体架构图:
可以说,最后时网络自适应地去学习一个是借鉴了ASFF的思想,也就是相当于是FPN与ASFF的融合了。
4.激活函数
文中提到了ReLU,LReLU,PReLU,ReLU6,ELU,SELU,Swish,hard-Swish和Mish一系列的激活函数。
其中,部分激活函数我之前的笔记有提到,参考链接:https://blog.csdn.net/weixin_44751294/article/details/115281926
1)Swish、hard-Swish
对于swish与hard-swish激活函数中,在mobileNetv3中有提及到,mobileNetv3中部分就用到了这个激活函数,详细见参考链接:https://blog.csdn.net/weixin_44751294/article/details/116903680
-
Swish
swish非线性激活函数作为ReLU的替代,可以可以显着提高神经网络的准确性,其定义如下:
尽管这种非线性提高了准确性,但在嵌入式环境中却带来了非零成本,因为S型函数在移动设备上的计算成本更高。主要是计算、求导复杂,
对量化过程不友好。
-
hard-Swish
改进的h-swish函数如下:
2)Mish
Mish是一个state-of-the-art激活函数,ReLU继任者
大概是这个样子的,注意,其实处处可微的。
参考链接:
https://blog.csdn.net/qq_27871973/article/details/81037751
https://www.cnblogs.com/yymn/articles/13672236.html
https://blog.csdn.net/weixin_38688399/article/details/106732929
https://blog.csdn.net/program_developer/article/details/81023592
https://blog.csdn.net/yx868yx/article/details/107383857
https://blog.csdn.net/weixin_44751294/article/details/117638189
https://www.cnblogs.com/monologuesmw/p/12955951.html