1,本文介绍
本文介绍了 SENet(Squeeze-and-Excitation Networks)这一改进机制,它通过调整卷积网络中的通道关系来提升模型性能。SENet 并不是一个独立的网络模型,而是一个可与任何现有模型结合的模块,类似于通道型的注意力机制。SENet 的“挤压和激励”(Squeeze-and-Excitation)操作被作为一个单元嵌入到传统的卷积网络结构中,如残差单元(后文将提供修改后的代码,供直接使用)。这种方法能够增强模型对通道间关系的理解,提高特征表达能力,无需重新设计网络架构。因此,SENet 作为现有模型的改进和增强手段,经实测在大、中、小目标检测任务上均表现出显著的性能提升。
关于SENetV1的详细介绍可以看论文:https://arxiv.org/pdf/1709.01507.pdf
本文将讲解如何将SENetV1融合进yolov8
话不多说,上代码!
2, 将SENetV1融合进yolov8
2.1 步骤一
找到如下的目录'ultralytics/nn/modules',然后在这个目录下创建一个SENetV1.py文件,文件名字可以根据你自己的习惯起,然后将SENetV1的核心代码复制进去
import torch
from torch import nn
from .conv import Conv
class SELayerV1(nn.Module):
def __init__(self, channel, reduction=16):
super(SELayerV1, self).__init__()
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()
y = self.avg_pool(x).view(b, c)
y = self.fc(y).view(b, c, 1, 1)
return x * y.expand_as(x)
class Bottleneck(nn.Module):
"""Standard bottleneck."""
def __init__(self, c1, c2,