深度学习汇总(二)


——————————————————————————————————————————

SENet

概述

对于CNN网络来说,其核心计算是卷积算子,其通过卷积核从输入特征图学习到新特征图。从本质上讲,卷积是对一个局部区域进行特征融合,这包括空间上(H和W维度)以及通道间(C维度)的特征融合。
SENet:特征U首先通过一个squeeze操作,将特征图聚合获得维度为WxH的特征图以此作为特征描述器,经过池化操作将各个特征图的全局感受野的空间信息置入到特征图中这个特征图成为descriptor(描述器),而后面的网络层就能够根据这个descriptor特征图获得全局感受野的信息——这就是整个squeeze操作。随后再接着进行excitation操作,在excitation操作中,每层卷积操作之后都接着一个样例特化(sample-specific)激活函数,基于通道之间的依赖关系对每各个通道过一种筛选机制(self-gating mechanism)操作,以此来对各个通道进行权值评比(excitation),特征图组U在经过这种筛选机制对feature maps中的特征图进行权值评估(excitation)后就是SE网络模块的最终输出了,之后再将这些特征图组作为后续网络层的输入。
我们的目标是增强网络对于含信息量多的特征的敏感度,使他们能被接下来的变换利用,并且抑制无用的特征。

Squeeze-and-Excitation

在这里插入图片描述

压缩-Squeeze

为了解决通道间相关性的利用问题,我们首先输出特征图中每个通道的信号。每个卷积核都是作用在局部感受野上,这导致每个变换输出U的单元不能利用这个范围之外的环境(上下文)信息。这个问题在感受野很小的较低层级中更加严重。
  为了减轻这个问题,我们将全局空间信息压缩成一个通道描述符(将一个channel上整个空间特征编码为一个全局特征)。利用全局平均池化得到一个通道维度(特征维度)上的统计数据。
统计值 z ∈ R C z∈R^C zRC是压缩具有空间维度 H × W H×W H×W U U U得到的:
z c = F s q ( u c ) = 1 H × W ∑ i = 1 H ∑ j = 1 W u c ( i , j ) z_c = F_sq(u_c) =\frac{1}{H \times W} \sum_{i=1}^{H} \sum_{j=1}^{W} u_c(i,j) zc=Fsq(uc)=H×W1i=1Hj=1Wuc(i,j)
总结:就是对输入的特征进行全局平均池化:对 H × W × C H \times W \times C H×W×C进行全局平均池化,得到 1 × 1 × C 1 \times 1 \times C 1×1×C大小的特征图,这个特征图可以理解为具有全局感受野。

激发-Excitation

从代码实现上来看,激发这块,就是对压缩后的特征(全局平均池化的特征)先进行全连接(Tricks:这块可以将全连接替换成卷积),然后经过激活函数-ReLu,在经过一次全连接(同样可以将全连接替换成卷积),再将全连接后的特征输入给 Sigmoid 激活函数。(注: σ \sigma σ S i g m o i d Sigmoid Sigmoid函数, δ \delta δ R e l u Relu Relu函数)
s = F e x ( z , W ) = σ ( W 2 δ ( W 1 z ) ) s = F_ex(z,W) = \sigma(W_2 \delta(W_1z)) s=Fex(z,W)=σ(W2δ(W1z))
为了降低模型复杂度以及提升泛化能力,采用两个全连接层的 b o t t l e n e c k bottleneck bottleneck结构,其中第一个 F C FC FC起到将维的作用,第二个 F C FC FC层恢复原始的维度。这样可以,具有更多的非线性,更好地拟合通道间复杂的相关性;极大地减少了参数量和计算量。
最后将学习到的各个通道(channel)的激活值( S i g m o i d Sigmoid Sigmoid激活,值0~1)乘上最开始输入的原始特征。(如模型结构所示,它是分为两条支路,一条支路相当于提炼各个通道特征的重要程度,然后和下面支路的原始特征加权,就得到了每个通道不同重要程度的特征图)

亮点:

1.SE网络模块的提出就是一种轻量级的门机制,针对特征图通道中的关系以一种高效的计算方式进行建模并在网络中被设计用于增强网络模块的表达能力
2.更注意输入进网络特征图通道内含有有用信息的通道,降低对信息量少的通道的关注(个人理解)

模型结构:

在这里插入图片描述

解决的问题:

SE模块主要为了提升模型对channel(通道)特征的敏感性。
SENet是一个通道注意力机制网络,它的核心思想在于通过损失函数去学习特征权重,使得有效的feature map权重大,效果小的feature map权重小。以达到网络关注重要特征的效果。

不足:

实际中,因为有全连接层,训练受到限制,所以在精度方面,可能不存在提升,反而更差。

代码

SE模块是非常简单的,实现起来也比较容易,这里给出PyTorch版本的实现

class SELayer(nn.Module):
    def __init__(self, channel, reduction=16):
        super(SELayer, self).__init__()
        #返回1X1大小的特征图,通道数不变
        self.avg_pool = nn.AdaptiveAvgPool2d(1)
        self.fc = nn.Sequential(
            nn.Linear(channel, channel // reduction, bias=False),
            nn.ReLU(inplace=True),
            nn.Linear(channel // reduction, channel, bias=False),
            nn.Sigmoid()
        )

    def forward(self, x):
        b, c, _, _ = x.size()
        #全局平均池化,batch和channel和原来一样保持不变
        y = self.avg_pool(x).view(b, c)
        #全连接层+池化
        y = self.fc(y).view(b, c, 1, 1)
        #和原特征图相乘
        return x * y.expand_as(x)

DenseNet

概述:

ResNet模型的核心是通过建立前面层与后面层之间的“短路连接”(shortcuts,skip connection),这有助于训练过程中梯度的反向传播,从而能训练出更深的CNN网络。今天我们要介绍的是DenseNet模型,它的基本思路与ResNet一致,但是它建立的是前面所有层与后面层的密集连接(dense connection),它的名称也是由此而来。DenseNet的另一大特色是通过特征在channel上的连接来实现特征重用(feature reuse)。这些特点让DenseNet在参数和计算成本更少的情形下实现比ResNet更优的性能,DenseNet也因此斩获CVPR 2017的最佳论文奖。

亮点:

1.减轻了vanishing-gradient梯度消失,因为残差路径更多
2.加强了各层级特征图的传递(密集连接)
3.有效地利用了不同级(深度)的特征信息
4.一定程度上减少了参数数量

模型结构:

下面是dense block的结构图。在传统的卷积神经网络中,如果你有L层,那么就会有L个连接,但是在DenseNet中,会有L(L+1)/2个连接。简单讲,就是每一层的输入来自前面所有层的输出。
如下图: x 0 x_0 x0是 input, H 1 H_1 H1的输入是 x 0 x_0 x0(input), H 2 H_2 H2的输入是 x 0 x_0 x0 x 1 x_1 x1 x 1 x_1 x1 H 1 H_1 H1的输出)以此类推

在这里插入图片描述
下图是包含三个 Dense block的DenseNet结构。
在这里插入图片描述
下图是DenseNet不同网络深度的模型结构图。其中 K K K代表每个dense block中每层输出的feature map个数。根据dense block的设计,后面几层可以得到前面所有层的输入,因此 c o n c a t concat concat后的输入channel(通道数)还是比较大的。另外这里每个dense block的33卷积前面都包含了一个11的卷积操作,就是所谓的bottleneck layer,目的是减少输入的feature map特征的维度(降维:11的卷积,在没有步长的条件下,特征的尺寸应该不会变,但是维度会改变,维度改变应该也是根据卷积核的个数决定的)。至于transition layer,放在两个Dense Block中间,是因为每个Dense Block结束后的输出channel个数很多,需要用11的卷积核来降维。1*1的卷积在两处都是降维的作用,因为dense block中存在多层的特征复用,特征整合在一起选择的concat方式(通道上叠加),导致维度很大。
在这里插入图片描述

不足:

densenet 与resnet相比,densenet的跨层连接更加密集,除此之外,将resnet的加法改为了concat操作,但这也导致了若实现不当就会引入巨大的内存消耗。这也是为什么densenet通常没有前面两者用得多的原因之一。但是不可否认的是densenet仍然是一个十分强大的网络结构。

检测经典模型

目标检测模型整体总结:大概就是输入特征首先进入特征提取的主干网络(backbone),然后经过特征金字塔(FPN)将不同深度的特征进行上采样和下采样,然后引出三条路径作为检测的尺度。三条检测的尺度分别经过head进行处理(这个head我认为是为后面计算损失的一个提前处理),YOLO loss会计算分类和回归。
在这里插入图片描述

V4

参考:
https://zhuanlan.zhihu.com/p/150127712
https://www.shuzhiduo.com/A/qVdeERkndP/
下图是v4的模型结构图,主要有以下三部分组成:

  • BackBone:CSPDarknet53
  • Neck:SPP+PAN
  • Head:YOLO Head
    Head设计融合了网络head输出+loss计算+预测结果解析三个部分。其中方法forward()负责网络的原始输出, 方法loss()负责计算loss,方法get_bboxes()负责从网络原始输出解析预测box, 方法forward_train()组织整个训练的loss计算。而对于 Y o l o v 3 Yolov3 Yolov3的head,其loss计算可以归纳为以下七个步骤:
  • 网络head输出:利用2层卷积操作输出我们想要尺寸的tensor,也是网络原始输出;
  • anchor生成:利用设置的anchor(利用聚类算法,每个分支有3个共9组尺寸的anchor)生成整个特征图上所有的anchor,方便后续计算。
  • gt box网格的分配:gt box按照中心落入那个网格,那个网格负责的原则提前分配好,方便后续计算。
  • 正负样本分配:将全部anchor根据和gt box的iou以及分配的网络,划分为正、负、忽略样本;
  • 样本采样:为了平衡正负样本,按照一定规则(例如随机采样)选择部分anchor进行后续loss计算,yolov3全部采样;
  • gt box编码:将gt box编码为网络输出的相同形式,方便直接计算loss;
  • loss 计算:计算分类、confidence、矩形框位置和宽高的loss,并加权求和最终输出,供计算梯度和反向传播;
    在这里插入图片描述

EfficientNet

参考文章:
https://zhuanlan.zhihu.com/p/96773680
https://blog.csdn.net/qq_37541097/article/details/114434046
https://zhuanlan.zhihu.com/p/67834114

概述:

作者希望找到一个可以同时兼顾速度与精度的模型放缩方法,为此,作者重新审视了前人提出的模型放缩的几个维度:网络深度、网络宽度、图像分辨率,前人的文章多是放大其中的一个维度以达到更高的准确率。作者跳出了前人对放缩模型的理解,从一个高度去审视这些放缩维度。作者认为这三个维度之间是互相影响的并探索出了三者之间最好的组合,在此基础上提出了最新的网络 EfficientNet。

  • 根据以往的经验,增加网络的深度depth能够得到更加丰富、复杂的特征并且能够很好的应用到其它任务中。但网络的深度过深会面临梯度消失,训练困难的问题。
  • 增加网络的width能够获得更高细粒度的特征并且也更容易训练,但对于width很大而深度较浅的网络往往很难学习到更深层次的特征。
  • 增加输入网络的图像分辨率能够潜在得获得更高细粒度的特征模板,但对于非常高的输入分辨率,准确率的增益也会减小。并且大分辨率图像会增加计算量。
    然后作者从模型的宽度,深度,和输入图像分辨率这三个要素,结合这三个要素,综合考虑他们三个对模型精度的影响,目的找到最优的模型宽度,深度,输入特征的分辨率这三个要素之间的关系,以及最佳的系数。
    作者在论文中对整个网络的运算进行抽象
    在这里插入图片描述
    其中的系数参考如下表格
    在这里插入图片描述
    其中:
    在这里插入图片描述
    为了探究d , r , w 这三个因子对最终准确率的影响,则将d , r , w 加入到公式中,我们可以得到抽象化后的优化问题(在指定资源限制下),其中s.t.代表限制条件:
    在这里插入图片描述
    其中
    在这里插入图片描述
    接着作者又提出了一个混合缩放方法 ( compound scaling method) 在这个方法中使用了一个混合因子 ϕ \phi ϕ去统一的缩放width,depth,resolution参数,具体的计算公式如下,其中s . t 代表限制条件:
    在这里插入图片描述

亮点:

不在单一的从网络的宽度(通道数),深度(层数),输入特征的分辨率来提升网络的精度。而是同时聚合了这三个指标,综合考虑来提升模型的精度。

模型结构:

MBConv结构
MBConv其实就是MobileNetV3网络中的InvertedResidualBlock,但也有些许区别。一个是采用的激活函数不一样(EfficientNet的MBConv中使用的都是Swish激活函数),另一个是在每个MBConv中都加入了SE(Squeeze-and-Excitation)模块。
简单的来说MBConv就是有两个特点:
1)采用了Depthwise Convlution,因此相比于传统卷积,Depthwise Conv的参数能够大大减少;
2)采用了“倒瓶颈”的结构,也就是说在卷积过程中,特征经历了升维和降维两个步骤,这样做的目的应该是为了提高模型的学习能力。下图是我自己绘制的MBConv结构。
在这里插入图片描述
在这里插入图片描述

解决的问题:

网络的宽度,深度,输入分辨率都综合考虑,来改善模型的精度。

不足:

占用显存;还有人说他这种搜索关于模型宽度、深度、输入分辨率的方式,可能存在过拟合的问题,总之实现很难,费算力。

ASFF(自适应特征融合)

参考文章:
https://zhuanlan.zhihu.com/p/110205719
https://zhuanlan.zhihu.com/p/129363523

亮点:

1.与基础网络无关,可以应用于所有具有特征金字塔结构的单阶检测器
2.实现简单,附加计算成本很小

模型结构:

在这里插入图片描述
从上图的输出来看,level1、level2、level3三个有效特征层分别乘以对应的权重然后相加得到ASFF1、ASFF2、ASFF3三个自适应的有效特征层。其中stride 32,假如其feature map为1313,那么stide 16的feature map就为2626,stride 8的feature map就为52*52。对于ASFF3来说:
A S F F 3 = X 1 × α + X 2 × β + X 3 × γ ASFF3 = X_1\times\alpha + X_2\times \beta + X_3\times\gamma ASFF3=X1×α+X2×β+X3×γ
其中: X 1 、 X 2 、 X 3 X_1、X_2、X_3 X1X2X3分别为 l e v e l 1 、 l e v e l 2 、 l e v e l 3 level1、level2、level3 level1level2level3三个有效特征层的特征图。 α , β , γ \alpha, \beta, \gamma α,β,γ可以认为是分别对应每层输出特征图的权值系数。最后是相加操作,所以要保证相加的三个特征图的尺寸是一致的,而且通道数也是一致的,所以需要对不同的特征层做上采样或者下采样并调整通道数来满足条件。

  • 1.对于上公式的ASFF3,level3层的特征尺寸作为输出的标准(5252),需要将level1(1313)的特征图调整到和level3(5252)的特征图尺寸一致,采用的方式是先通过 1 × 1 1\times1 1×1卷积调整到和level3通道数一致,再用插值的方式将尺寸调整到一致。level2(2626)的特征图也要经过 1 × 1 1\times1 1×1的卷积调整通道数和level3一致,然后再插值的方式把尺寸调到一致。
  • 2.对于ASFF1,level1层的特征尺寸作为输出标准(1313),需要将level2(2626)的特征图调整到和level1(13*13)的特征尺寸一致,直接可以采用 3 × 3 3\times3 3×3卷积,设置合适的步长即可,至于通道数则可以设置卷积核的个数来控制。
  • 3.从上面分析来看,特征的尺寸和通道数已经一致了,现在唯一不理解的就是 α , β , γ \alpha, \beta, \gamma α,β,γ这三个参数是什么?---->对于权重参数 α , β , γ \alpha, \beta, \gamma α,β,γ,则是通过resize后的level1~level3特征图经过 1 × 1 1\times1 1×1卷积获得的。并且参数 α , β , γ \alpha, \beta, \gamma α,β,γ经过 c o n c a t concat concat之后通过 s o f t m a x softmax softmax使得它们的范围都在[0,1]并且和为1。
  • 1和2可以概括为恒等缩放:1/2下采样、33 conv/stride=2;1/4下采样、33 conv/stride=2 + max pooling/stride=2。上采样:1*1 conv/stride=1 + interpolation
  • 3可以概括为自适应融合:融合后空间位置 ( i , j ) (i, j) (i,j)处的向量是融合前三个特征图 ( i , j ) (i, j) (i,j)处的向量的加权融合,系数(特征图的空间重要性权重)是由网络自适应学习到的,他们在所有通道间是共享的。 α + β + γ = 1 \alpha+\beta+\gamma=1 α+β+γ=1 α , β , γ ϵ [ 0 , 1 ] \alpha, \beta, \gamma \epsilon[0,1] α,β,γϵ[0,1]

不足:

2021年10月27日 ASFF类似于在三个有效特征层加了注意力机制,想法非常的棒,对于评论中有人指出至于其中哪个层用于检测,同时抑制了哪个层,还需要从代码深入分析,主要是没看~~

ATSS

概述

自适应的选取正样本的方法(ATSS)

  • 提出自适应训练样本选择,以根据对象的统计特征自动选择正训练样本和负训练样本。
  • 证明在图像上的每个位置平铺多个锚点以检测对象是没啥用的。
  • 该论文主要讨论:基于anchor-based和anchor-free的目标检测算法之间的效果差异到底是由什么原因造成的?
  • 根据以上的讨论,大体阐述比较RetinaNet和FCOS在分配正负样本上的差异。
  • 论文认为两者的性能差异主要来源于正负样本的定义,假如训练过程中使用相同的正负样本,两者的最终性能将会相差无几。为此,论文提出ATSS( Adaptive Training Sample Selection)方法,基于GT的相关统计特征自动选择正负样本,能够消除anchor-based和anchor-free算法间的性能差异。
  • 然后作者使用相同的tricks对比两者的性能差异,发现仍然有些许的不足,最后将这种精度的差异性(正负样本不平衡)归结在:(i) 分类分支上的正负样本定义 (ii) 回归分支上的bbox初始状态
    RetinaNet基于anchor和GT之间的IoU和设定的阈值来确定正负样本,而FCOS通过GT中心点和铺设点之间的距离和尺寸来确定正负样本。
    这表明在训练对象检测器的过程中如何选择正样本和负样本至关重要。
    受此启发,作者深入研究了这一基本问题,并提出了自适应训练样本选择方法,该方法根据目标的统计特征(方差和均值)自动划分正训练样本和负训练样本,弥合了基于锚的探测器与无锚探测器之间的差距。 此外,作者讨论了在每个位置平铺多个锚点的必要性,并证明了在当前情况下这是不费吹灰之力的操作。
    基于以上:
    作者提出了一种自适应的选取正样本的方法,具体方法如下:
    1.对于每个输出的检测层,先计算每个anchor的中心点和目标的中心点的 L 2 L2 L2距离(欧氏距离),选取K(mmdetection的topK是9)个 a n c h o r anchor anchor中心点离目标中心点最近的 a n c h o r anchor anchor为候选正样本(candidate positive samples)
    2.计算每个候选正样本和 g r o u n d t r u t h groundtruth groundtruth之间的IOU,计算这组IOU的均值和方差,根据均值和方差,设置选取正样本的阈值: t = m + g t = m + g t=m+g m为均值,g为方差
    3.根据每一层的 t t t从其候选正样本中选出真正需要加入训练的正样本然后进行训练
    参考文章:
    https://blog.csdn.net/xuzz_498100208
    https://blog.csdn.net/chenzhoujian_/article/details/109166250
    1.首先计算每个anchor的中心点和目标的中心点的 L 2 L2 L2距离(compute center distance between all bbox and gt)
    2.计算每个候选正样本和groundtruth之间的IOU
    3.计算每个候选正样本和groundtruth之间的IOU,计算这组IOU的均值和方差根据方差和均值,设置选取正样本的阈值: t = m + g t = m + g t=m+g m为均值,g为方差
    通过计算候选框与gt的左,右,上,下,距离,继续找出合适的框

(注:参考文章都是性价比最高的,虽不是原创,但是在此基础上加了很多自己的理解,不断更新中 …ing)

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

勇敢牛牛@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值