一种基于YOLOv10的高精度工业油污缺陷检测算法(原创自研)

 💡💡💡本文内容:提出了一种基于YOLOv10的高精度工业油污缺陷检测算法,包括1)具有切片操作的SimAM注意力,魔改SimAM;2)BRA注意力替换 PSA中的多头自注意力模块MHSA注意力;

原始mAP50为 0.584提升至0.618

消融实验如下:

 💡💡💡BRA注意力替换 PSA中的多头自注意力模块MHSA注意力,原始mAP50为 0.584提升至0.596

  💡💡💡 具有切片操作的SimAM注意力,魔改SimAM,原始mAP50为 0.584提升至0.614

   博主简介

AI小怪兽,YOLO骨灰级玩家,1)YOLOv5、v7、v8、v9、v10优化创新,涨点和模型轻量化;2)目标检测、语义分割、OCR、分类等技术孵化,赋能智能制造,工业项目落地经验丰富;

原创自研系列, 2024年计算机视觉顶会创新点

《YOLOv8原创自研》

《YOLOv5原创自研》

《YOLOv7原创自研》

《YOLOv9魔术师》

​《YOLOv10魔术师》 ​

23年最火系列,加入24年改进点内涵100+优化改进篇,涨点小能手,助力科研,好评率极高

《YOLOv8魔术师》

 《YOLOv7魔术师》

《YOLOv5/YOLOv7魔术师》

《RT-DETR魔术师》

应用系列篇:

《YOLO小目标检测》

《深度学习工业缺陷检测》

《YOLOv8-Pose关键点检测》

 1.YOLOv10介绍

论文: https://arxiv.org/pdf/2405.14458

代码: GitHub - THU-MIG/yolov10: YOLOv10: Real-Time End-to-End Object Detection

摘要:在过去的几年里,由于其在计算成本和检测性能之间的有效平衡,YOLOS已经成为实时目标检测领域的主导范例。研究人员已经探索了YOLOS的架构设计、优化目标、数据增强策略等,并取得了显著进展。然而,对用于后处理的非最大抑制(NMS)的依赖妨碍了YOLOS的端到端部署,并且影响了推理延迟。此外,YOLOS中各部件的设计缺乏全面和彻底的检查,导致明显的计算冗余,限制了模型的性能。这导致次优的效率,以及相当大的性能改进潜力。在这项工作中,我们的目标是从后处理和模型架构两个方面进一步推进YOLOS的性能-效率边界。为此,我们首先提出了用于YOLOs无NMS训练的持续双重分配,该方法带来了有竞争力的性能和低推理延迟。此外,我们还介绍了YOLOS的整体效率-精度驱动模型设计策略。我们从效率和精度两个角度对YOLOS的各个组件进行了全面优化,大大降低了计算开销,增强了性能。我们努力的成果是用于实时端到端对象检测的新一代YOLO系列,称为YOLOV10。广泛的实验表明,YOLOV10在各种模型规模上实现了最先进的性能和效率。例如,在COCO上的类似AP下,我们的YOLOV10-S比RT-DETR-R18快1.8倍,同时具有2.8倍更少的参数和FLOPS。与YOLOV9-C相比,YOLOV10-B在性能相同的情况下,延迟减少了46%,参数减少了25%。

​​​

1.1  C2fUIB介绍

为了解决这个问题,我们提出了一种基于秩的块设计方案,旨在通过紧凑的架构设计降低被证明是冗余的阶段复杂度。我们首先提出了一个紧凑的倒置块(CIB)结构,它采用廉价的深度可分离卷积进行空间混合,以及成本效益高的点对点卷积进行通道混合

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

实现代码ultralytics/nn/modules/block.py

​​​

​​​

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介绍

具体来说,我们在1×1卷积后将特征均匀地分为两部分。我们只将一部分输入到由多头自注意力模块(MHSA)和前馈网络(FFN)组成的NPSA块中。然后,两部分通过1×1卷积连接并融合。此外,遵循将查询和键的维度分配为值的一半,并用BatchNorm替换LayerNorm以实现快速推理。

实现代码ultralytics/nn/modules/block.py

​​​

class Attention(nn.Module):
    def __init__(self, dim, num_heads=8,
                 attn_ratio=0.5):
        super().__init__()
        self.num_heads = num_heads
        self.head_dim = dim // num_heads
        self.key_dim = int(self.head_dim * attn_ratio)
        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)
        q, k, v = qkv.view(B, self.num_heads, -1, N).split([self.key_dim, self.key_dim, self.head_dim], dim=2)

        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)。同时,它最大限度地保留了下采样过程中的信息,从而在减少延迟的同时保持了有竞争力的性能。

实现代码ultralytics/nn/modules/block.py

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.工业油污缺陷检测识别数据集介绍    

三星油污缺陷类别:头发丝和小黑点,["TFS","XZW"] 

数据集大小:660张

细节图如下:

类别分布情况 

3.YOLOv10魔改提升精度

3.1原始结果

原始YOLOv10n结果如下:

原始mAP50为 0.584 

YOLOv10n summary (fused): 285 layers, 2695196 parameters, 0 gradients, 8.2 GFLOPs
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100%|██████████| 3/3 [00:03<00:00,  1.31s/it]
                   all         66        187      0.588      0.489      0.584      0.278
                   TFS         66        130      0.471      0.431      0.499      0.226
                   XZW         66         57      0.706      0.547      0.669       0.33

3.2  一种基于YOLOv10的高精度工业油污缺陷检测算法(原创自研)

 提出了一种基于YOLOv10的高精度工业油污缺陷检测算法,包括1)具有切片操作的SimAM注意力,魔改SimAM;2)BRA注意力替换 PSA中的多头自注意力模块MHSA注意力;

原始mAP50为 0.584提升至0.618

 改进结果如下:

原始mAP50为 0.584提升至0.618

YOLOv10n-Conv_SWS-PSBRA summary (fused): 303 layers, 2711884 parameters, 0 gradients, 8.3 GFLOPs
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100%|██████████| 3/3 [00:03<00:00,  1.30s/it]
                   all         66        187      0.625      0.547      0.618      0.289
                   TFS         66        130      0.555      0.392      0.497      0.232
                   XZW         66         57      0.695      0.702      0.738      0.345

3.3 动态稀疏注意力的双层路由方法BiLevelRoutingAttention | CVPR2023

原文链接:YOLOv10涨点改进:注意力魔改 | 动态稀疏注意力的双层路由方法BiLevelRoutingAttention | CVPR2023_yolov10改进-CSDN博客

  💡💡💡本文改进:替换YOLOv10中的PSA进行二次创新,1)BRA注意力替换 PSA中的多头自注意力模块MHSA注意力;2) BRA直接替换 PSA;

改进1结构图:

改进2结构图: 

改进结果如下:

原始mAP50为 0.584提升至0.596

YOLOv10n-PSBRA summary (fused): 287 layers, 2711708 parameters, 0 gradients, 8.2 GFLOPs
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100%|██████████| 3/3 [00:03<00:00,  1.31s/it]
                   all         66        187      0.562      0.562      0.596      0.286
                   TFS         66        130      0.466      0.415      0.479      0.205
                   XZW         66         57      0.658      0.709      0.714      0.367

3.4 具有切片操作的SimAM注意力,魔改SimAM

原文链接:YOLOv10全网首发:注意力独家魔改 | 具有切片操作的SimAM注意力,魔改SimAM助力小目标检测-CSDN博客

💡💡💡本文创新:魔改SimAM注意力,引入切片操作,增强小目标特征提取能力

💡💡💡问题点:SimAM计算整张特征图的像素差平均值时加权可能会忽略小目标的重要性,同时与整体平均值相比可能和背景信息相似,导致加权增强较弱,进而使得SimAM对小目标的增强能力较差。

💡💡💡本文解决对策:引入了切片操作,当特征图被切成不同的块后,大目标由于其纹理特征明显会影响所在块的平均值,导致其获得的额外加权减少,而合并特征图后,大目标依然可以保持高可识别度甚至获得进一步增强;而小目标的特征与局部平均值差距更大,从而获得更多加权,小目标特征得到增强,即sws模块保证了大、小目标都获得了公正的关注和增强。

 💡💡💡如何创新到YOLOv10

1)直接作为注意力使用,效果秒杀SimAM;

2)高效和卷积结合,代替原始网络的卷积操作;

改进结果如下:

原始mAP50为 0.584提升至0.614


YOLOv10n-Conv_SWS summary (fused): 301 layers, 2695372 parameters, 0 gradients, 8.3 GFLOPs
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100%|██████████| 3/3 [00:04<00:00,  1.53s/it]
                   all         66        187      0.706      0.493      0.614      0.284
                   TFS         66        130      0.586      0.408      0.495      0.223
                   XZW         66         57      0.825      0.579      0.733      0.345

 4.系列篇

1)  BRA注意力替换 PSA中的多头自注意力模块MHSA注意力(一)

2) 具有切片操作的SimAM注意力,魔改SimAM助力缺陷检测(二) 

3) 一种基于YOLOv10的高精度工业油污缺陷检测算法(原创自研) 

欢迎点赞关注  订阅专栏,文末附微信!!!

欢迎点赞关注  订阅专栏,文末附微信!!!

欢迎点赞关注  订阅专栏,文末附微信!!!

  • 11
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

AI小怪兽

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

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

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

打赏作者

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

抵扣说明:

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

余额充值