1. 功能解释
Bottleneck CSP(Cross Stage Partial)是一种常用于计算机视觉任务的卷积神经网络(CNN)中的瓶颈层类型。它是传统瓶颈层(如ResNet中常见的Bottleneck,关于Bottleneck介绍请参考文章yolo组件之Bottleneck层总结)的扩展。
瓶颈层旨在减少网络的计算复杂性和内存需求,同时提高性能。它通过使用1x1卷积来减小输入特征图的空间维度,然后应用更复杂的操作(如3x3卷积)。通过减小空间维度,可以减少后续层所需的参数和计算量,同时保持网络的表示能力。
在CSP的背景下,瓶颈层进一步增强,通过引入跨阶段部分连接。这些连接允许信息在网络的不同阶段或块之间流动,有助于改善信息传播和梯度流动。通过连接不同阶段,网络可以利用在不同尺度和抽象级别上学到的特征,从而提高性能。
Bottleneck CSP层通常包括以下操作:
1x1卷积:它减少输入通道的数量以节省内存和计算量。
3x3卷积:它使用更大的感受野执行主要特征提取。
跨阶段部分连接:这些连接将上一阶段/块的输出与当前阶段/块的输出合并。这允许信息在不同阶段之间流动,有助于保留低层次细节并改善梯度流动。
激活函数:通常,会应用非线性激活函数(如ReLU)以引入非线性。
批归一化:通常用于归一化激活并稳定训练过程。
Dropout(可选):可以应用Dropout正则化来在训练过程中随机丢弃一些激活以防止过拟合。
2. 模型结构
CSP瓶颈层结构在Bottleneck部分存在一个可修改的参数n,标识使用的Bottleneck结构个数!这一条也是我们的主分支,是对残差进行学习的主要结构,右侧分支nn.Conv2d实际上是shortcut分支实现不同stage的连接。
3. 代码实现
class BottleneckCSP(nn.Module):# CSP Bottleneck https://github.com/WongKinYiu/CrossStagePartialNetworks# ch_in, ch_out, number, shortcut, groups, expansiondef __init__(self, c1, c2, n=1, shortcut=True, g=1, e=0.5): super(BottleneckCSP, self).__init__()c_ = int(c2 * e) # hidden channelsself.cv1 = Conv(c1, c_, 1, 1)self.cv2 = nn.Conv2d(c1, c_, 1, 1, bias=False)self.cv3 = nn.Conv2d(c_, c_, 1, 1, bias=False)self.cv4 = Conv(2 * c_, c2, 1, 1)self.bn = nn.BatchNorm2d(2 * c_) # applied to cat(cv2, cv3)self.act = nn.LeakyReLU(0.1, inplace=True)self.m = nn.Sequential(*[Bottleneck(c_, c_, shortcut, g, e=1.0) for _ in range(n)])def forward(self, x):y1 = self.cv3(self.m(self.cv1(x)))y2 = self.cv2(x)return self.cv4(self.act(self.bn(torch.cat((y1, y2), dim=1))))
参数说明:
c1:BottleneckCSP 结构的输入通道维度;
c2:BottleneckCSP 结构的输出通道维度;
n:bottleneck 结构 结构的个数;
shortcut:是否给bottleneck 结构添加shortcut连接,添加后即为ResNet模块;
g:groups,通道分组的参数,输入通道数、输出通道数必须同时满足被groups整除;
e:expansion: bottleneck 结构中的瓶颈部分的通道膨胀率,使用0.5即为变为输入的1212;
torch.cat((y1, y2), dim=1):这里是指定在第11个维度上进行合并,即在channel维度上合并;
c_:BottleneckCSP 结构的中间层的通道数,由膨胀率e决定
4. 总结
Bottleneck CSP是一种在卷积神经网络中常用的瓶颈层类型,它通过结合瓶颈结构和跨阶段部分连接的方式,提高了网络的性能和效率。它在图像分类、目标检测、语义分割等计算机视觉任务中得到广泛应用,并取得了良好的效果。