# YOLOv10实战：SPPF原创自研 | SPPF_attention，重新设计加入注意力机制 | NEU-DET为案列进行展开

💡💡💡本文原创自研创新改进：

💡💡💡SPPF_attention，重新设计加入注意力机制  ，在NEU-DEU任务中mAP50从0.683提升至0.703

YOLOv10涨点改进：SPPF原创自研 | SPPF_attention，重新设计加入注意力机制，能够在不同尺度上更好的、更多的关注注意力特征信息-CSDN博客

# 1.YOLOv10介绍

## 1.1  C2fUIB介绍

C2fUIB只是用CIB结构替换了YOLOv8中 C2f的Bottleneck结构

class CIB(nn.Module):
"""Standard bottleneck."""
def __init__(self, c1, c2, shortcut=True, e=0.5, lk=False):
"""Initializes a bottleneck module with given input/output channels, shortcut option, group, kernels, and
expansion.
"""
super().__init__()
c_ = int(c2 * e)  # hidden channels
self.cv1 = nn.Sequential(
Conv(c1, c1, 3, g=c1),
Conv(c1, 2 * c_, 1),
Conv(2 * c_, 2 * c_, 3, g=2 * c_) if not lk else RepVGGDW(2 * c_),
Conv(2 * c_, c2, 1),
Conv(c2, c2, 3, g=c2),
)
self.add = shortcut and c1 == c2
def forward(self, x):
"""'forward()' applies the YOLO FPN to input data."""
return x + self.cv1(x) if self.add else self.cv1(x)
class C2fCIB(C2f):
"""Faster Implementation of CSP Bottleneck with 2 convolutions."""
def __init__(self, c1, c2, n=1, shortcut=False, lk=False, g=1, e=0.5):
"""Initialize CSP bottleneck layer with two convolutions with arguments ch_in, ch_out, number, shortcut, groups,
expansion.
"""
super().__init__(c1, c2, n, shortcut, g, e)
self.m = nn.ModuleList(CIB(self.c, self.c, shortcut, e=1.0, lk=lk) for _ in range(n))

## 1.2  PSA介绍

class Attention(nn.Module):
attn_ratio=0.5):
super().__init__()
self.scale = self.key_dim ** -0.5
nh_kd = nh_kd = self.key_dim * num_heads
h = dim + nh_kd * 2
self.qkv = Conv(dim, h, 1, act=False)
self.proj = Conv(dim, dim, 1, act=False)
self.pe = Conv(dim, dim, 3, 1, g=dim, act=False)
def forward(self, x):
B, _, H, W = x.shape
N = H * W
qkv = self.qkv(x)
attn = (
(q.transpose(-2, -1) @ k) * self.scale
)
attn = attn.softmax(dim=-1)
x = (v @ attn.transpose(-2, -1)).view(B, -1, H, W) + self.pe(v.reshape(B, -1, H, W))
x = self.proj(x)
return x
class PSA(nn.Module):
def __init__(self, c1, c2, e=0.5):
super().__init__()
assert(c1 == c2)
self.c = int(c1 * e)
self.cv1 = Conv(c1, 2 * self.c, 1, 1)
self.cv2 = Conv(2 * self.c, c1, 1)

self.attn = Attention(self.c, attn_ratio=0.5, num_heads=self.c // 64)
self.ffn = nn.Sequential(
Conv(self.c, self.c*2, 1),
Conv(self.c*2, self.c, 1, act=False)
)

def forward(self, x):
a, b = self.cv1(x).split((self.c, self.c), dim=1)
b = b + self.attn(b)
b = b + self.ffn(b)
return self.cv2(torch.cat((a, b), 1))

## 1.3 SCDown

OLOs通常利用常规的3×3标准卷积，步长为2，同时实现空间下采样（从H×W到H/2×W/2）和通道变换（从C到2C）。这引入了不可忽视的计算成本O(9HWC^2)和参数数量O(18C^2)。相反，我们提议将空间缩减和通道增加操作解耦，以实现更高效的下采样。具体来说，我们首先利用点对点卷积来调整通道维度，然后利用深度可分离卷积进行空间下采样。这将计算成本降低到O(2HWC^2 + 9HWC)，并将参数数量减少到O(2C^2 + 18C)。同时，它最大限度地保留了下采样过程中的信息，从而在减少延迟的同时保持了有竞争力的性能。

class SCDown(nn.Module):
def __init__(self, c1, c2, k, s):
super().__init__()
self.cv1 = Conv(c1, c2, 1, 1)
self.cv2 = Conv(c2, c2, k=k, s=s, g=c2, act=False)
def forward(self, x):
return self.cv2(self.cv1(x))

# 2.YOLOv10魔改提升精度

## 2.1 SPPF原创自研 | SPPF_attention

YOLOv10涨点改进：SPPF原创自研 | SPPF_attention，重新设计加入注意力机制，能够在不同尺度上更好的、更多的关注注意力特征信息-CSDN博客

## 2.2 NEU-DET数据集为案列进行对比实验

NEU-DET钢材表面缺陷共有六大类，一共1800张，

## 2.3 实验结果分析

### 2.3.1 训练方式

import warnings
warnings.filterwarnings('ignore')
from ultralytics import YOLOv10
if __name__ == '__main__':
model = YOLOv10('ultralytics/cfg/models/v10/yolov10n-EMA_attention.yaml')
model.train(data='data/NEU-DET.yaml',
cache=False,
imgsz=640,
epochs=200,
batch=16,
close_mosaic=10,
device='0',
optimizer='SGD', # using SGD
project='runs/train',
name='exp',
)

YOLOv10n summary (fused): 285 layers, 2696756 parameters, 0 gradients, 8.2 GFLOPs
Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100%|██████████| 16/16 [00:12<00:00,  1.27it/s]
all        486       1069      0.634      0.662      0.683      0.392
crazing        486        149      0.409      0.248      0.298     0.0996
inclusion        486        222      0.677      0.774      0.768      0.411
patches        486        243      0.789      0.868      0.905      0.582
pitted_surface        486        130      0.752      0.722      0.757      0.492
rolled-in_scale        486        171      0.549      0.561      0.561      0.263
scratches        486        154       0.63      0.797      0.807      0.505

### 2.3.2 SPPF原创自研 | SPPF_attention

mAP50从0.683提升至0.703

YOLOv10n-SPPF_attention summary (fused): 294 layers, 3223094 parameters, 0 gradients, 8.4 GFLOPs
Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100%|██████████| 16/16 [00:10<00:00,  1.52it/s]
all        486       1069       0.66      0.653      0.703      0.394
crazing        486        149      0.489      0.242      0.372       0.13
inclusion        486        222      0.676      0.704       0.73      0.392
patches        486        243      0.787      0.864      0.903      0.578
pitted_surface        486        130      0.701      0.703      0.741      0.456
rolled-in_scale        486        171      0.602      0.538      0.607      0.282
scratches        486        154      0.705       0.87      0.865      0.524

|
3月前
YOLOv5改进 | Neck篇 | 2024.1最新MFDS-DETR的HS-FPN改进特征融合层（轻量化Neck、全网独家首发）
YOLOv5改进 | Neck篇 | 2024.1最新MFDS-DETR的HS-FPN改进特征融合层（轻量化Neck、全网独家首发）
369 4
|
2月前
|

【从零开始学习深度学习】30. 神经网络中批量归一化层（batch normalization）的作用及其Pytorch实现
【从零开始学习深度学习】30. 神经网络中批量归一化层（batch normalization）的作用及其Pytorch实现
157 1
|
2月前
|

【YOLOv8改进】DAT（Deformable Attention）：可变性注意力 (论文笔记+引入代码)
YOLO目标检测创新改进与实战案例专栏探讨了YOLO的有效改进，包括卷积、主干、注意力和检测头等机制的创新，以及目标检测分割项目的实践。专栏介绍了Deformable Attention Transformer，它解决了Transformer全局感受野带来的问题，通过数据依赖的位置选择、灵活的偏移学习和全局键共享，聚焦相关区域并捕获更多特征。模型在多个基准测试中表现优秀，代码可在GitHub获取。此外，文章还展示了如何在YOLOv8中应用Deformable Attention。
86 1
|
2月前
|

【YOLOv8改进】Polarized Self-Attention: 极化自注意力 (论文笔记+引入代码)

165 2
|
3月前
|

YOLOv8改进 | Neck篇 | Slim-Neck替换特征融合层实现超级涨点 (又轻量又超级涨点)
YOLOv8改进 | Neck篇 | Slim-Neck替换特征融合层实现超级涨点 (又轻量又超级涨点)
509 2
|
3月前
YOLOv8改进 | Neck篇 | 2024.1最新MFDS-DETR的HS-FPN改进特征融合层（降低100W参数，全网独家首发）
YOLOv8改进 | Neck篇 | 2024.1最新MFDS-DETR的HS-FPN改进特征融合层（降低100W参数，全网独家首发）
230 2
|
3月前
|

YOLOv5改进 | Neck篇 | Slim-Neck替换特征融合层实现超级涨点 (又轻量又超级涨点)
YOLOv5改进 | Neck篇 | Slim-Neck替换特征融合层实现超级涨点 (又轻量又超级涨点)
322 0
|

400 0
|

271 0
|

253 0