YOLO论文分享(1):MHAF-YOLO,基于多分支异构辅助融合的YOLO高精度目标检测模型,优于YOLO各个系列,25年最新成果

 💡💡💡本文摘要:这篇论文提出了一种基于多分支异构辅助融合的 YOLO 检测框架旨在解决传统路径聚合 FPN(PAFPN)在多尺度特征融合中的局限性,特别是在同时集成高层语义信息和低层空间信息方面的不足

                                                             博主简介

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

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

《YOLO11魔术师》

《YOLOv8原创自研》

《YOLOv5原创自研》

《YOLOv7原创自研》

《YOLOv9魔术师》

​《YOLOv10魔术师》 ​

应用系列篇:

《YOLO小目标检测》

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

《YOLOv8-Pose关键点检测》

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

《YOLOv8魔术师》

 《YOLOv7魔术师》

《YOLOv5/YOLOv7魔术师》

《RT-DETR魔术师》

1. MHAF-YOLO

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

摘要:由于路径聚合特征金字塔网络(PAFPN)具备高效的多尺度特征融合能力,其已成为基于YOLO的检测器中广泛采用的核心组件。然而,PAFPN在整合高层语义线索与低层空间细节方面存在局限性,这影响了其在现实场景(尤其是目标尺度变化显著时)的性能表现。本文提出MHAF-YOLO——一种创新的检测框架,其核心为多功能颈部结构"多分支辅助特征金字塔网络(MAFPN)",该结构包含两大关键模块:浅层辅助融合(SAF)与深层辅助融合(AAF)。SAF通过融合浅层特征连接骨干网络与颈部结构,实现关键低层空间信息的高保真传递;而AAF则在深层颈部中融合多尺度特征信息,向输出层输送更丰富的梯度信息以增强模型学习能力。为配合MAFPN,我们提出全局异构灵活卷积核选择机制(GHFKS)与重参数化异构多尺度模块(RepHMS)以优化特征融合。RepHMS通过GHFKS全局选择各特征层的大尺寸卷积核,扩展垂直感受野以捕获跨空间层级的上下文信息;局部层面则通过同层大小卷积核并行处理优化计算,扩展水平感受野以保留小目标检测的关键细节。实验表明,MHAF-YOLO小型版本仅需710万参数即在COCO数据集实现48.9% AP,较YOLO11s参数量减少24.4%的同时性能提升1.9%。此外,该模型在实例分割与旋转目标检测任务中也展现出卓越的泛化性能。

图1:图(a)展示了YOLOv10中PAFPN的结构,而图(b)和图(c)则分别展示了传统PAFPN结构和所提出的MAFPN结构在相同输出头下的特征图结果的GradCAM++可视化效果。 

图2:与其他先进实时目标检测器在参数-准确率(左)和每秒浮点运算次数-准确率(右)权衡方面的比较。

实验结果:

 检测

分割:

 

 OBB:

 

2 源码分析

 yolov10n-mafpn.yaml

# Parameters
nc: 80 # number of classes
scales: # model compound scaling constants, i.e. 'model=yolov8n.yaml' will call yolov8.yaml with scale 'n'
  # [depth, width, max_channels]
  n: [0.33, 0.25, 1024] 

# YOLOv8.0n backbone
backbone:
  # [from, repeats, module, args]
  - [-1, 1, Conv, [64, 3, 2]] # 0-P1/2
  - [-1, 1, Conv, [128, 3, 2]] # 1-P2/4
  - [-1, 3, C2f, [128, True]]
  - [-1, 1, Conv, [256, 3, 2]] # 3-P3/8
  - [-1, 6, C2f, [256, True]]
  - [-1, 1, SCDown, [512, 3, 2]] # 5-P4/16
  - [-1, 6, C2f, [512, True]]
  - [-1, 1, SCDown, [1024, 3, 2]] # 7-P5/32
  - [-1, 3, C2f, [1024, True]]
  - [-1, 1, SPPF, [1024, 5]] # 9
  - [-1, 1, PSA, [1024]] # 10

# YOLOv8.0n head
head:
  - [6, 1, AVG, []]
  - [[-1, 10], 1, Concat, [1]]
  - [-1, 1, RepHMS, [512, 2, 1, 3, 9]] #13

  - [-1, 1, nn.Upsample, [None, 2, "nearest"]]
  - [4, 1, AVG, []]
  - [[-1, 6, -2], 1, Concat, [1]]
  - [-1, 1, RepHMS, [384, 2, 1, 3, 7]] #17

  - [-1, 1, nn.Upsample, [None, 2, "nearest"]]
  - [2, 1, AVG, []]
  - [[-1, 4, -2], 1, Concat, [1]]
  - [-1, 1, RepHMS, [384, 2, 1, 3, 5]] #21

  - [[-1, 18], 1, Concat, [1]]
  - [-1, 1, RepHMS, [384, 2, 1, 3, 5]] # 23

  - [-1, 1, Conv, [384, 3, 2]]
  - [21, 1, AVG, []]
  - [[-2, -1, 17, 14], 1, Concat, [1]]
  - [-1, 1, RepHMS, [384, 2, 1, 3, 7]] # 27

  - [-1, 1, Conv, [384, 3, 2]]
  - [17, 1, AVG, []]
  - [[-2, -1, 13], 1, Concat, [1]]
  - [-1, 1, RepHMS, [512, 2, 1, 3, 9]] # 31


  - [[23, 27, 31], 1, v10Detect, [nc]] # Detect(P3, P4, P5)

2.1 mafyolo.py

核心代码如下:

class RepHMS(nn.Module):
    def __init__(self, in_channels, out_channels, width=3, depth=1, depth_expansion=2, kersize=5, shortcut=True,
                 expansion=0.5,
                 small_kersize=3, use_depthwise=True):
        super(RepHMS, self).__init__()
        self.width = width
        self.depth = depth
        c1 = int(out_channels * expansion) * width
        c_ = int(out_channels * expansion)
        self.c_ = c_
        self.conv1 = Conv(in_channels, c1, 1, 1)
        self.RepElanMSBlock = nn.ModuleList()
        for _ in range(width - 1):
            DepthBlock = nn.ModuleList([
                DepthBottleneckUniv2(self.c_, self.c_, shortcut, kersize, depth_expansion, small_kersize, use_depthwise)
                for _ in range(depth)
            ])
            self.RepElanMSBlock.append(DepthBlock)

        self.conv2 = Conv(c_ * 1 + c_ * (width - 1) * depth, out_channels, 1, 1)

    def forward(self, x):
        x = self.conv1(x)
        x_out = [x[:, i * self.c_:(i + 1) * self.c_] for i in range(self.width)]
        x_out[1] = x_out[1] + x_out[0]
        cascade = []
        elan = [x_out[0]]
        for i in range(self.width - 1):
            for j in range(self.depth):
                if i > 0:
                    x_out[i + 1] = x_out[i + 1] + cascade[j]
                    if j == self.depth - 1:
                        #cascade = [cascade[-1]]
                        if self.depth > 1:
                            cascade =[cascade[-1]]
                        else:
                            cascade = []
                x_out[i + 1] = self.RepElanMSBlock[i][j](x_out[i + 1])
                elan.append(x_out[i + 1])
                if i < self.width - 2:
                    cascade.append(x_out[i + 1])

        y_out = torch.cat(elan, 1)
        y_out = self.conv2(y_out)
        return y_out

3.总结

可以将该创新融入到YOLO11,进行二次创新优化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

AI小怪兽

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

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

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

打赏作者

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

抵扣说明:

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

余额充值