YOLO11-seg分割:SPPF_attention,重新设计加入注意力机制,助力分割

 

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

优点:为了利用不同的池化核尺寸提取特征的方式可以获得更多的特征信息,提高网络的识别精度。

如何优化:在此基础上加入注意力机制,能够在不同尺度上更好的、更多的获取特征信息从而获取全局视角信息并减轻不同尺度大小所带来的影响

强烈推荐,适合直接使用,paper创新级别

💡💡💡本文内容:通过 SPPF_attention,重新设计加入注意力机制提升YOLO11-seg的分割能力

💡💡💡Mask mAP50 从原始的0.673 提升至0.693,实现暴力涨点

  《YOLOv11魔术师专栏》将从以下各个方向进行创新:

YOLO11魔术师

原创自研模块】【多组合点优化】【注意力机制】【卷积魔改】【block&多尺度融合结合】【损失&IOU优化】【上下采样优化 【小目标性能提升】前沿论文分享】【训练实战篇】

pose关键点检测】【yolo11-seg分割】

定期向订阅者提供源码工程,配合博客使用。

订阅者可以申请发票,便于报销 

💡💡💡为本专栏订阅者提供创新点改进代码,改进网络结构图,方便paper写作!!!

💡💡💡适用场景:红外、小目标检测、工业缺陷检测、医学影像、遥感目标检测、低对比度场景

💡💡💡适用任务:所有改进点适用【检测】、【分割】、【pose】、【分类】等

💡💡💡全网独家首发创新,【自研多个自研模块】,【多创新点组合适合paper 】!!!

☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️ ☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️

包含注意力机制魔改、卷积魔改、检测头创新、损失&IOU优化、block优化&多层特征融合、 轻量级网络设计、24年最新顶会改进思路、原创自研paper级创新等

🚀🚀🚀 本项目持续更新 | 更新完结保底≥80+ ,冲刺100+ 🚀🚀🚀

🍉🍉🍉 联系WX: AI_CV_0624 欢迎交流!🍉🍉🍉

⭐⭐⭐专栏涨价趋势 159 ->199->259->299,越早订阅越划算⭐⭐⭐

💡💡💡 2024年计算机视觉顶会创新点适用于Yolov5、Yolov7、Yolov8、Yolov9等各个Yolo系列,专栏文章提供每一步步骤和源码,轻松带你上手魔改网络 !!!

💡💡💡重点:通过本专栏的阅读,后续你也可以设计魔改网络,在网络不同位置(Backbone、head、detect、loss等)进行魔改,实现创新!!!

☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️ ☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️

 1.YOLO11介绍

Ultralytics YOLO11是一款尖端的、最先进的模型,它在之前YOLO版本成功的基础上进行了构建,并引入了新功能和改进,以进一步提升性能和灵活性。YOLO11设计快速、准确且易于使用,使其成为各种物体检测和跟踪、实例分割、图像分类以及姿态估计任务的绝佳选择。

​​

​​

Segmentation 官方在COCO数据集上做了更多测试: 

2.数据集介绍

道路裂纹分割数据集是一个全面的4029张静态图像集合,专门为交通和公共安全研究而设计。它非常适合自动驾驶汽车模型开发和基础设施维护等任务。该数据集包括训练、测试和验证集,有助于精确的裂缝检测和分割。 

训练集3712张,验证集200张,测试集112张

 标签可视化:

3.如何训练YOLO11-seg模型

3.1 修改 crack-seg.yaml

# Ultralytics YOLO 🚀, AGPL-3.0 license
# Crack-seg dataset by Ultralytics
# Documentation: https://docs.ultralytics.com/datasets/segment/crack-seg/
# Example usage: yolo train data=crack-seg.yaml
# parent
# ├── ultralytics
# └── datasets
#     └── crack-seg  ← downloads here (91.2 MB)

# Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
path: D:/ultralytics-seg/data/crack-seg # dataset root dir
train: train/images # train images (relative to 'path') 3717 images
val: valid/images # val images (relative to 'path') 112 images
test: test/images # test images (relative to 'path') 200 images

# Classes
names:
  0: crack

3.2 如何开启训练

import warnings
warnings.filterwarnings('ignore')
from ultralytics import YOLO

if __name__ == '__main__':
    model = YOLO('ultralytics/cfg/models/11/yolo11-seg.yaml')
    #model.load('yolov8n.pt') # loading pretrain weights
    model.train(data='data/crack-seg.yaml',
                cache=False,
                imgsz=640,
                epochs=200,
                batch=16,
                close_mosaic=10,
                device='0',
                optimizer='SGD', # using SGD
                project='runs/train',
                name='exp',
                )


3.3  训练结果可视化


YOLO11-seg summary (fused): 265 layers, 2,834,763 parameters, 0 gradients, 10.2 GFLOPs
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95)     Mask(P          R      mAP50  mAP50-95): 100%|██████████| 7/7 [00:07<00:00,  1.06s/it]
                   all        200        249       0.83      0.784      0.816      0.632      0.746      0.707      0.673      0.228

Mask mAP50 为 0.673 

MaskPR_curve.png

BoxPR_curve.png 

3.4  SPPF_attention,重新设计加入注意力机制

 YOLOv5最初采用SPP结构在v6.0版本(repo)后开始使用SPPF,主要目的是融合更大尺度(全局)信息,对每个特征图,使用三种不同尺寸(5×5、9×9、13×13)的池化核进行最大池化,分别得到预设的特征图尺寸,最后将所有特征图展开为特征向量并融合,过程如下图所示
YOLOV8使用SPPF

SPPF顾名思义,就是为了保证准确率相似的条件下,减少计算量,以提高速度,使用3个5×5的最大池化,代替原来v5之前的5×5、9×9、13×13最大池化。使用SPPF的目的是为了利用不同的池化核尺寸提取特征的方式可以获得更多的特征信息,提高网络的识别精度。
 

​左边是SPP,右边是SPPF。

SPPF源代码

class SPPF(nn.Module):
    """Spatial Pyramid Pooling - Fast (SPPF) layer for YOLOv5 by Glenn Jocher."""

    def __init__(self, c1, c2, k=5):  # equivalent to SPP(k=(5, 9, 13))
        super().__init__()
        c_ = c1 // 2  # hidden channels
        self.cv1 = Conv(c1, c_, 1, 1)
        self.cv2 = Conv(c_ * 4, c2, 1, 1)
        self.m = nn.MaxPool2d(kernel_size=k, stride=1, padding=k // 2)

    def forward(self, x):
        """Forward pass through Ghost Convolution block."""
        x = self.cv1(x)
        y1 = self.m(x)
        y2 = self.m(y1)
        return self.cv2(torch.cat((x, y1, y2, self.m(y2)), 1))

 3.5 如何创新优化SPPF

优点:为了利用不同的池化核尺寸提取特征的方式可以获得更多的特征信息,提高网络的识别精度。

如何优化:在此基础上加入注意力机制,能够在不同尺度上更好的、更多的获取特征信息,从而提高网络的识别精度。

 原文链接:

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

YOLO11-seg-SPPF_attention summary (fused): 274 layers, 3,361,101 parameters, 0 gradients, 10.6 GFLOPs
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95)     Mask(P          R      mAP50  mAP50-95): 100%|██████████| 7/7 [00:08<00:00,  1.23s/it]
                   all        200        249       0.89      0.777      0.844      0.659      0.799      0.679      0.693      0.232

 
Mask mAP50 从原始的0.673 提升至0.693,实现暴力涨点

### 实现SPPF结合注意力机制深度学习领域,空间金字塔池化(Spatial Pyramid Pooling, SPP)是一种有效处理不同尺度目标的技术[^2]。对于SPPF(Spatial Pyramid Pooling-Fast),这是YOLOv5中的一个模块变体,在FastestDet框架下引入注意力机制可以进一步提升模型的表现。 #### 方法描述 通过修改`ultralytics.nn.sppf.SPPF_attention`模块来集成注意力机制SPPF层中。这种做法不仅能够增强特征图的空间信息表达能力,还能突出重要区域并抑制不相关背景噪声的影响[^1]。 具体来说,可以在原有SPPF结构基础上增加一个多头自注意(Multi-head Self-Attention)组件作为预处理步骤,使得输入特征经过加权聚合后再送入后续的标准卷积操作。此过程有助于捕捉更复杂的上下文依赖关系,并提高对细粒度模式识别的能力。 #### Python代码示例 以下是基于PyTorch的一个简化版本实现: ```python import torch from torch import nn class MultiHeadSelfAttention(nn.Module): """Multi Headed Attention Layer""" def __init__(self, d_model=512, num_heads=8): super().__init__() self.d_k = d_model // num_heads self.h = num_heads self.q_linear = nn.Linear(d_model, d_model) self.v_linear = nn.Linear(d_model, d_model) self.k_linear = nn.Linear(d_model, d_model) self.out = nn.Linear(d_model, d_model) def forward(self, q, k, v): bs = q.size(0) # Perform linear operation and split into h heads k = self.k_linear(k).view(bs, -1, self.h, self.d_k) q = self.q_linear(q).view(bs, -1, self.h, self.d_k) v = self.v_linear(v).view(bs, -1, self.h, self.d_k) # Transpose to get dimensions bs * h * sl * d_model k = k.transpose(1, 2) q = q.transpose(1, 2) v = v.transpose(1, 2) scores = torch.matmul(q, k.transpose(-2, -1)) / ((self.d_k)**0.5) softmax_scores = F.softmax(scores, dim=-1) output = torch.matmul(softmax_scores, v) concat_output = output.transpose(1, 2).contiguous().view(bs, -1, self.h * self.d_k) final_output = self.out(concat_output) return final_output class Improved_SPPF(nn.Module): """Improved Spatial Pyramid Pooling with attention mechanism""" def __init__(in_channels, out_channels): super().__init__() self.attention_layer = MultiHeadSelfAttention(in_channels) self.conv1 = ConvBlock(in_channels=in_channels, out_channels=out_channels, kernel_size=(3, 3), stride=1, padding='same') self.maxpool = MaxPool(kernel_size=(5, 5), stride=1, padding='same') def forward(x): attended_features = self.attention_layer(x, x, x) convolved_features = self.conv1(attended_features) pooled_feature_maps = [convolved_features] for _ in range(3): # Apply max pooling three times as per original design. convolved_features = self.maxpool(convolved_features) pooled_feature_maps.append(convolved_features) concatenated_tensors = torch.cat(pooled_feature_maps, dim=1) result_tensor = self.conv1(concatenated_tensors) return result_tensor ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI小怪兽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值