由于后面工作方向的需要,也是自己的兴趣,我决定补习下计算机视觉算法相关的知识点,参考的学习资料主要是B站Up主霹雳吧啦Wz,强推一下,Up主的分享非常的细致认真,从他这里入门是个不错的选择,Up主也有自己的CSDN博客,我这里主要是作为课程的笔记,也会加入一些自己的理解,我也只是个入门的小白,如果有错误还请读者指正。
要入门基于DNN的计算机视觉,分类网络构架是基础,分类网络会作为各种衍生网络的backbone,也就是重要组成部分,起到了提取特征等作用,下面开始逐个总结各个图像分类网络的特点。
AlexNet是2012年CVPR发表的一篇革命性的论文,现在的引用量都快接近8w了,它的主要创新点是:
AlexNet网络由五层卷积加三层最大池化层,以及最后三层的全连接层构成,那会儿由于GPU显存不够大,因此作者采用的方式是将一张图一份为二,分别使用两张GPU训练,在进行第三层卷积时会将两张GPU的输出进行联合输入,在其他层数据都是独立的。
AlexNet中主要是使用了卷积和最大池化层,卷积后特征尺寸计算公式为: N = ( W − F + 2 P ) / S + 1 N=(W-F+2 P) / S+1 N=(W−F+2P)/S+1其中,输入特征尺寸为 W W W,卷积核的大小为 F × F F \times F F×F,卷积步daxiao长为 S S S,padding的像素数为 P P P,那么输出特征尺寸即为 N N N。池化可以看作一种特殊的卷积核,因此池化后特征尺寸计算同样满足上述规律。
ReLU非线性激活函数有如下优势:
AlexNet中使用两种方法减少过拟合,分别是:
VGG是2014年由牛津大学提出的,是应用非常广泛的一种backbone,此方法在提出时主要的贡献是:
VGG网络的具体参数如下:
其中网络D包含16个隐藏层,称为VGG16,网络D包含19个隐藏层,称为VGG19,VGG16的结构如下图所示:
这里值得注意的一点是,在网络D中,卷积层中卷核大小为 3 × 3 3 \times 3 3×3,步距为1,padding为1,最大池化层的尺寸为2, 步距为2,因此我们可以计算经过卷积层后的特征尺寸不变,经过最大池化层后特征尺寸减半。此外最后三层为全连接层,占据了网络的绝大多数参数数量。
这是VGG网路中最大的亮点,首先我们来了解下什么是感受野:在卷积神经网络中,决定某一层输出结果中一个元素对应的输入层的区域大小,称作感受野,也可以说是feature map上的一个单元对应输入层的区域的大小,如下图的例子:
在上图中我们设置卷积核大小为 3 × 3 3\times3 3×3,步距为1,padding为0,按照前文的特征尺寸计算公式, 5 × 5 5\times5 5×5的特征,经过一层卷积后大小为 3 × 3 3\times3 3×3,再经过一层卷积后大小为 1 × 1 1\times1 1×1,感受野就是反过来推导, 1 × 1 1\times1 1×1的特征单元在两层卷积前对应的区域的大小即 5 × 5 5\times5 5×5,因此两层 3 × 3 3\times3 3×3的卷积核的感受野的大小即 5 × 5 5\times5 5×5,即可以代替一个 5 × 5 5\times5 5×5的卷积核。我们来计算下两种方法需要的参数数量,对于 5 × 5 5\times5 5×5的卷积核,参数数量为: 5 × 5 × C × C = 25 C 2 5 \times 5 \times C \times C = 25C^2 5×5×C×C=25C2对于两层 3 × 3 3\times3 3×3的卷积核,参数数量为: 3 × 3 × C × C + 3 × 3 × C × C = 18 C 2 3 \times 3 \times C \times C + 3 \times 3 \times C \times C = 18C^2 3×3×C×C+3×3×C×C=18C2由此可见,在感受野相同的情况下,叠加小卷积核的数量更小,并且网络更深,效果更有,并且有文章称 3 × 3 3\times3 3×3更有利于保持图像性质。
GoogLeNet的网络的亮点主要有:
我们可以注意到,在AlexNet和VGG中都是串行处理,而在GoogLeNet通过Inception结构实现了并行处理,下面我们对Inception结构的细节进行讨论,
Inception结构设计的核心思想是,通过多个卷积核提取图像不同尺度的信息,最后进行融合,以得到图像更好的表征,我们以第三层的Inception结构为例,结构图如下:
具体来说,分别是:
最后将四个结果进行连接,对这四部分输出结果的第三维并联,即64+128+32+32=256,最终输出28x28x256,这一步操作称为concate。
1 × 1 1 \times 1 1×1卷积层引起人们重视是在NIN的网络结构中,在GoogLeNet网络中, 1 × 1 1 \times 1 1×1卷积层主要是用于降维和升维,目的在与减少网络计算量,同样以上述第三层的Inception结构为例,我们计算参数量: 1 × 1 × 192 × 64 + ( 1 × 1 × 192 × 96 + 3 × 3 × 96 × 128 ) + ( 1 × 1 × 192 × 16 + 5 × 5 × 16 × 32 ) 1 \times 1 \times 192 \times 64+(1 \times 1 \times 192 \times 96+3 \times 3 \times 96 \times 128)+(1 \times 1 \times 192 \times 16+5 \times 5 \times 16 \times 32) 1×1×192×64+(1×1×192×96+3×3×96×128)+(1×1×192×16+5×5×16×32)
如果去掉网络中的 1 × 1 1 \times 1 1×1的模块,参数量如下: 1 × 1 × 192 × 64 + 3 × 3 × 192 × 128 + 5 × 5 × 192 × 32 1 \times 1 \times 192 \times 64+3 \times 3 \times 192 \times 128+5 \times 5 \times 192 \times 32 1×1×192×64+3×3×192×128+5×5×192×32由此可见,如果去掉网络中的 1 × 1 1 \times 1 1×1模块,参数量将增加到原来网络的三倍
辅助分类器在训练的过程中同样会计算损失,在GoogLeNet论文中,辅助分类器的损失被乘以0.3后加到主分类器的损失中作为最终的损失来训练网络,主分类器的结果如下:
辅助分类器的结构如下:
结构的细节具体说来:
辅助分类器的作用的是一方面增加了反向传播的梯度信号,帮助低层特征训练,从而低层特征也有很好的区分能力,另一方面辅助分类器提供了额外的正则化效果,对于整个网络的训练很有裨益。
ResNet是2015年由微软实验室提出的,网络的亮点主要有:
网络结构如下图所示,其中ResNet为下图中最上层的网络
可以看到ResNet其实就是对residual模块的反复堆叠,随着网络层数的增加,深层网络中主要会出现如下两个问题而导致网络效果变差:
residual模块主要解决了深层网络出现的退化问题,退化问题具体表现就是层数深的网络反而没有层数浅的好,residual模块结构如下图所示:
其中,左侧为34层网络的residual模块,右侧为50、101、152层网络的residual模块,右侧residual模块的主要特点是增加 1 × 1 1\times1 1×1卷积核来进行升维和降维,减少网络参数量,以不至于过深的网络带来巨大的参数量导致难以学习。另一个值得注意的点是这里的residual是通过add操作将特征合并,而不是通过concate操作,这里我们来说明下concate操作和add操作的区别:
batch normalization是2015年的论文《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》提出的,其目的是使得我们同一通道的feature map满足均值为0,方差为1的分布规律,batch normalization的具体操作如下:假设小批量输入为 B = { x 1 … m } \mathcal{B}=\left\{x_{1 \ldots m}\right\} B={ x1…m},学习的参数为 γ , β \gamma, \beta γ,β,那么操作主要有如下四个步骤:
其中batch normalization的结果为 { y i = B N γ , β ( x i ) } \left\{y_{i}=\mathrm{BN}_{\gamma, \beta}\left(x_{i}\right)\right\} { yi=BNγ,β(xi)}具体操作可以如下图所示:
这里值得注意的是:
ResNeXt是ResNet与Inception的结合体,利用分组卷积的形式在没有增加参数数量的前提下降低了错误率
其网络结构与ResNet类似,都是通过模块堆叠而成,唯一的区别是堆叠的模块不同,如下图所示:
注意到,在参数数量接近的前提下,ResNeXt中的residual模块的通道数要比ResNet多,网络的表达能力相应更强。
ResNeXt中堆叠的模块本质就是就是采用分组卷积的residual模块,因此首先我们来了解下分组卷积,如下图所示为标准卷积操作:
对应卷积层的参数数量为: ( h 1 × w 1 × c 1 ) × c 2 \left({h}_{1} \times {w}_{1} \times {c}_{1}\right) \times {c}_{2} (h1×w1×c1)×c2而分组卷积操作图示如下,将输入按照通道分组后进行卷积后在进行Concate操作:
对应的卷积层参数数量为: h 1 × w 1 × ( c 1 g ) × ( c 2 g ) × g = h 1 × w 1 × c 1 × c 2 × 1 g h_{1} \times w_{1} \times\left(\frac{c_{1}}{g}\right) \times\left(\frac{c_{2}}{g}\right) \times g={h}_{1} \times {w}_{1} \times c_{1} \times c_{2} \times \frac{ {1}}{ {g}} h1×w1×(gc1)×(gc2)×g=h1×w1×c1×c2×g1因此,分组卷积的数量是标准卷积的 1 g \frac{ {1}}{ {g}} g1
ResNeXt论文中首先提出的是上图中(a)的形式,通过一系列等价变换,最终可以得到如图©所示分组卷积的形式
MobileNet目前一共有三个版本,分别是MoblileNet V1, MobileNet V2和MOblieNet V3:
MobileNet V1网络是2017年google团队在2017年提出的,在准确率小幅度降低的前提下大大减少模型参数和运算量,网络的主要亮点有:
MobileNet V2网络是2018年google团队在2018年提出的,相比Mobile V1网络准确率更高,模型更小,网络的亮点主要有:
MoblieNet V3网络在V2的基础上进一步减少了计算量和提高了精度,网路的主要两点如下:
MobileNet V1的网络结构与VGG类似,结构如下所示:
其中Conv dw指的就是Depthwise Separable Convolution,下文介绍
MobileNet V2的网路结构如下所示:
其中bottleneck指的就是Inverted Residual Block和Linear Bottleneck结构。
MobileNet V3中后面涉及到这一部分工作的时候再详读论文进行补充。
Depthwise Separable Convolution即深度可分卷积,传统卷积如下图所示:
而Depthwise Separable Convolution由两部分组成,分别是Depthwise Convolution和Pointwise Convolution,其中Depthwise Convolution操作如下图所示:
Pointwise Convolution操作如下图所示:
假设输入矩阵维度为 D K × D K × M D_K \times D_K \times M DK×DK×M,卷积核大小为 D F × D F × M D_F \times D_F \times M DF×DF×M,数量为 N N N,因此普通卷积计算量为 D K ⋅ D K ⋅ M ⋅ N ⋅ D F ⋅ D ˉ F D_{K} \cdot D_{K} \cdot M \cdot N \cdot D_{F} \cdot \bar{D}_{F} DK⋅DK⋅M⋅N⋅DF⋅DˉF可分卷积计算量为: D K ⋅ D K ⋅ M ⋅ D F ⋅ D F + M ⋅ N ⋅ D F ⋅ D F D_{K} \cdot D_{K} \cdot M \cdot D_{F} \cdot D_{F}+M \cdot N \cdot D_{F} \cdot D_{F} DK⋅DK⋅M⋅DF⋅DF+M⋅N⋅DF⋅DF因此理论上普通卷积计算量是可分卷积的8到9倍。在实验过程中发现Depthwise Convolution参数大部分为零,这是不合理的,在MobileNet V2网络中对这个问题有所优化
在ResNet中提出了Residual Block模块,如下图所示:
在该“两头大中间小“的结构中,步骤如下:
而在Inverted Residual Block模块的结构如下图所示:
具体步骤如下:
在inverted residual block中使用的Relu6激活函数: y = ReLU 6 ( x ) = min ( max ( x , 0 ) , 6 ) y=\operatorname{ReLU} 6(x)=\min (\max (x, 0), 6) y=ReLU6(x)=min(max(x,0),6)此外,在Inverted Residual Block模块中的最后一个卷积层使用的是线性激活函数,论文中通过实验发现Relu激活函数对低维度特征信息造成大量损失,而Inverted Residual Block中使是"中间大两头小"的结构,因此输出是相对低维度的特征,因此需要使用线性激活函数来替代Relu函数来避免对低维度特征信息造成损失。具体结构如下:
当stride = 1 且输入特征矩阵与输出特征矩阵shape相同时才有shortcut连接
ShuffleNet有两个版本,ShuffleNet V1网络的特点主要如下:
ShuffleNet V2网络中提出了四条高效网络设计准则:
并基于这四条准则重新优化了网络结构,ShuffleNet V2相对硬核,有很多有意义的实验,这里仅仅总结Shuffle V1中的知识点,以后工作中设计到Shuffle V2要使用的相关知识在去仔细读读论文。
ShuffleNet V1的网络结构如下:
从网络结构看,仍然是模块的堆叠,但是不同的是,在ShuffleNet V1中采用的全部都是Group Convolution和Depthwise Separable Convolution,如下图所示:
上图中(a)是ResNeXt中的卷积结构,计算量为: h w ( 1 × 1 × c × m ) + h w ( 3 × 3 × m × m ) / g + h w ( 1 × 1 × m × c ) = h w ( 2 c m + 9 m 2 / g ) h w(1 \times 1 \times c \times m)+h w(3 \times 3 \times m \times m) / g+h w(1 \times 1 \times m \times c)=h w\left(2 c m+9 m^{2} / g\right) hw(1×1×c×m)+hw(3×3×m×m)/g+hw(1×1×m×c)=hw(2cm+9m2/g)图(b)和图©分别是stride=1和stride=2的ShuffleNet V1中的结构,我们计算图(b)的计算量为: h w ( 1 × 1 × c × m ) / g + h w ( 3 × 3 × m ) + h w ( 1 × 1 × m × c ) / g = h w ( 2 c m / g + 9 m ) h w(1 \times 1 \times c \times m) / g+h w(3 \times 3 \times m)+h w(1 \times 1 \times m \times c) / g=h w(2 c m / g+9 m) hw(1×1×c×m)/g+hw(3×3×m)+hw(1×1×m×c)/g=hw(2cm/g+9m)由此可见ShuffleNet中计算量会小很多。
ResNeXt网络中使用的Group Convolution虽然可以减少参数与计算量,但是Group Convolution中不同组之间的信息没有交流,那么Channel Shuffle的基本思想就如下图所示:
具体说来,就是将经过第一次Group Convolution之后的结果,将不同Group间的Channel混乱后再进行第二次Group Convolution
这篇文论是google在2019年发表的文章,文章同事探讨了输入分辨率,网路分辨率和宽度的影响:
这篇博客我流水账式地总结了一些经典的网络框架,MobileNet V3、ShuffleNet V2和EfficintNet网络应该都是高效网络设计的较新的成果,这三个网络框架我之后再详读论文进行补充。