从本文开始记录YOLOv8的改进策略,其中的操作都亲自走过一遍,应该问题不大。
写在前面:每一种改进方法的好坏取决于“天时、地利、人和”,三者缺一不可,具体效果怎么样,要具体分析,这也是炼丹师的快乐。
先从增加SE注意力机制开始吧!
【一、SE注意力机制简介】
SE(Squeeze-and-Excitation Networks)
,顾名思义,主要包括Squeeze(全局信息嵌入)
以及Excitiation(自适应调整)
两个部分。它是通过显式地建模卷积特征通道之间的相互依赖来提高网络产生的表征的质量;同时允许网络进行特征重新校准,通过该机制网络可以学习使用全局信息,选择性地强调信息特征和抑制无用的特征。(注:这里的选择性就是所谓的“注意力”)
至于具体是怎么设计的,请看论文原文的细节:https://arxiv.org/pdf/1709.01507.pdf
SE官方代码::https://github.com/hujie-frank/SENet
【二:SE结构图】
【三:SE在目标检测任务上的表现(COCO数据集)】
【四:增加SE注意力到YOLOv8模型上】
(1: .../ultralytics/nn/modules/conv.py
)
(2:...ultralytics-main/ultralytics/nn/modules/__init__.py
)
(3:...ultralytics-main/ultralytics/nn/tasks.py
)
(4:
构造YOLOv8-SE
模型.yaml
文件)
注:主要就是修改上面的前三个文件,认准路径!!!
如下图:
(1):.../ultralytics/nn/modules/conv.py
这个文件中用来添加SE注意力模块,代码如下: 把它放到文件的末尾就好了!养成一个习惯,做一个注释。
class SEAttention(nn.Module):
def __init__(self, channel=512, reduction=16):
super().__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 init_weights(self):
for m in self.modules():
if isinstance(m, nn.Conv2d):
init.kaiming_normal_(m.weight, mode='fan_out')
if m.bias is not None:
init.constant_(m.bias, 0)
elif isinstance(m, nn.BatchNorm2d):
init.constant_(m.weight, 1)
init.constant_(m.bias, 0)