YOLOv8目标检测创新改进与实战案例专栏
专栏目录: YOLOv8有效改进系列及项目实战目录 包含卷积,主干 注意力,检测头等创新机制 以及 各种目标检测分割项目实战案例
专栏链接: YOLOv8基础解析+创新改进+实战案例
介绍
摘要
卷积神经网络(CNNs)通过提取空间特征彻底改变了图像分类,并在基于视觉的任务中实现了最先进的准确性。提出的Squeeze-and-Excitation网络模块收集输入的通道表示。多层感知器(MLP)从数据中学习全局表示,并在大多数图像分类模型中用于学习图像的提取特征。本文中,我们引入了一种新型的聚合多层感知器,一个多分支密集层,嵌入到Squeeze-and-Excitation残差模块中,旨在超越现有架构的性能。我们的方法结合了Squeeze-and-Excitation网络模块和密集层。这种融合增强了网络捕捉通道模式和全局知识的能力,从而提高了特征表示。与SENet相比,所提出的模型参数增加可以忽略不计。我们在基准数据集上进行了广泛的实验,以验证模型并与已建立的架构进行比较。实验结果表明,所提出模型在分类准确性上有显著提高。
文章链接
论文地址:论文地址
代码地址:代码地址
参考代码:代码地址
基本原理
SENetV2是一种图像分类模型,其核心特征是引入了聚合稠密层(Aggregated Dense Layer)用于通道和全局表示,是一种结合了Squeeze-and-Excitation(SE)模块和密集层的图像分类模型。该模型旨在通过增强特征表示来提高图像分类性能。SENet V2的核心思想是通过对通道特征和全局特征进行重新校准和激活,从而使网络更加专注于关键特征,提高分类准确性。
SENet V2的关键特点包括:
- Squeeze-and-Excitation(SE)模块:SE模块通过对通道特征进行重新校准,使网络能够更好地捕获关键特征。在SE模块中,通过全局信息来动态调整通道特征的重要性,从而提高网络的表达能力。
- 密集层:SENet V2引入了密集层,用于进一步优化特征表示。密集层有助于增强通道特征的全局表示能力,从而提高网络的分类性能。
- Squeeze Aggregated Excitation(SaE)模块:SENet V2还提出了SaE模块,将聚合的密集层与SE模块相结合,进一步优化特征表示。SaE模块通过增加层间的基数来优化关键特征的传输,提高网络的性能。
- 实验结果:SENet V2在多个数据集上进行了实验评估,包括CIFAR-10、CIFAR-100和ImageNet。实验结果表明,SENet V2相较于传统架构在图像分类任务中取得了更高的准确性。
核心代码
# 定义 SaE 模块
class SaELayer(nn.Module):
def __init__(self, in_channel, reduction=32):
super(SaELayer, self).__init__()
# 检查输入通道数是否满足条件
assert in_channel >= reduction and in_channel % reduction == 0, 'invalid in_channel in SaElayer'
self.reduction = reduction
self.cardinality = 4
# 全局平均池化层
self.avg_pool = nn.AdaptiveAvgPool2d(1)
# cardinality 1
self.fc1 = nn.Sequential(
nn.Linear(in_channel, in_channel // self.reduction, bias=False),
nn.ReLU(inplace=True)
)
# cardinality 2
self.fc2 = nn.Sequential(
nn.Linear(in_channel, in_channel // self.reduction, bias=False),
nn.ReLU(inplace=True)
)
# cardinality 3
self.fc3 = nn.Sequential(
nn.Linear(in_channel, in_channel // self.reduction, bias=False),
nn.ReLU(inplace=True)
)
# cardinality 4
self.fc4 = nn.Sequential(
nn.Linear(in_channel, in_channel // self.reduction, bias=False),
nn.ReLU(inplace=True)
)
# 最终的全连接层
self.fc = nn.Sequential(
nn.Linear(in_channel // self.reduction * self.cardinality, in_channel, bias=False),
nn.Sigmoid()
)
def forward(self, x):
b, c, _, _ = x.size() # 获取输入的维度
y = self.avg_pool(x).view(b, c) # 全局平均池化并改变维度
# 分别通过4个全连接层
y1 = self.fc1(y)
y2 = self.fc2(y)
y3 = self.fc3(y)
y4 = self.fc4(y)
# 将4个输出拼接在一起
y_concate = torch.cat([y1, y2, y3, y4], dim=1)
# 最终通过全连接层并改变维度
y_ex_dim = self.fc(y_concate).view(b, c, 1, 1)
return x * y_ex_dim.expand_as(x) # 按通道加权输入
task与yaml配置
详见:https://blog.csdn.net/shangyanaf/article/details/139610187