空洞卷积的 ResNet-50 提取特征和 ASPP 结构
1. 空洞卷积(Atrous Convolution)
空洞卷积是一种特殊的卷积操作,通过在卷积核中插入“空洞”(即跳过一些像素),扩大卷积核的感受野,而不增加计算量。空洞卷积的核心参数是膨胀率(Dilation Rate),它决定了卷积核中像素的间隔。
-
优点:
-
增大感受野,捕获更多上下文信息。
-
不增加额外的计算量。
-
适用于多尺度特征提取。
-
2. ResNet-50 提取特征
ResNet-50 是一种经典的深度卷积神经网络,包含 50 层深的结构。它通过残差模块(Residual Blocks)解决了深层网络中的梯度消失问题。在 ResNet-50 中,每个残差模块包含三个卷积层(1×1、3×3 和 1×1),并通过跳跃连接(Skip Connection)将输入直接加到输出上。
-
特征提取:
-
ResNet-50 通过多个阶段(Stage)逐步提取特征,每个阶段包含多个残差模块。
-
最终输出的特征图可以用于多种任务,如分类、目标检测等。
-
3. ASPP(Atrous Spatial Pyramid Pooling)结构
ASPP 是一种用于多尺度特征提取的结构,广泛应用于语义分割任务(如 DeepLab 系列)。它通过结合不同膨胀率的空洞卷积和全局平均池化,捕获多尺度信息。
-
ASPP 的组成:
-
1×1 卷积:用于降维。
-
多个 3×3 空洞卷积:使用不同的膨胀率(如 6、12、18),捕获不同尺度的特征。
-
全局平均池化(GAP):将特征图压缩为 1×1,再通过 1×1 卷积降维,并上采样到原始尺寸。
-
特征融合:将上述所有分支的输出在通道维度上拼接,再通过 1×1 卷积进行融合。
-
-
代码实现:Python复制
class ASPP(nn.Module):def __init__(self, in_channels, atrous_rates, out_channels=256):super(ASPP, self).__init__()modules = []# 1×1 卷积modules.append(nn.Sequential(nn.Conv2d(in_channels, out_channels, 1, bias=False),nn.BatchNorm2d(out_channels),nn.ReLU()))# 多尺度空洞卷积for rate in atrous_rates:modules.append(ASPPConv(in_channels, out_channels, rate))# 全局平均池化modules.append(ASPPPooling(in_channels, out_channels))self.convs = nn.ModuleList(modules)# 输出层self.project = nn.Sequential(nn.Conv2d(len(self.convs) * out_channels, out_channels, 1, bias=False),nn.BatchNorm2d(out_channels),nn.ReLU(),nn.Dropout(0.5))def forward(self, x):_res = []for conv in self.convs:_res.append(conv(x))# 按通道拼接res = torch.cat(_res, dim=1)return self.project(res)
4. 应用场景
-
语义分割:ASPP 结构广泛应用于 DeepLab 系列模型中,用于捕获多尺度特征,提升分割精度。
-
目标检测:结合 ResNet-50 提取的特征,ASPP 可以进一步增强特征的多尺度表示,适用于少样本目标检测等任务。