【YOLOv8改进】MSBlock : 分层特征融合策略 (论文笔记+引入代码)

简介: YOLO-MS是一个创新的实时目标检测器,通过多尺度构建块(MS-Block)和异构Kernel选择(HKS)协议提升多尺度特征表示能力。它在不依赖预训练权重和大型数据集的情况下,在MS COCO上超越了YOLO-v7和RTMDet,例如YOLO-MS XS版本(4.5M参数,8.7G FLOPs)达到了43%+的AP,比RTMDet高2%+。MS-Block利用分层特征融合和不同大小的卷积,而HKS协议根据网络深度调整Kernel大小,优化多尺度语义信息捕获。此外,YOLO-MS的模块化设计允许其作为即插即用的组件集成到其他YOLO模型中,提升它们的检测性能。

YOLO目标检测创新改进与实战案例专栏

专栏目录: YOLO有效改进系列及项目实战目录 包含卷积,主干 注意力,检测头等创新机制 以及 各种目标检测分割项目实战案例

专栏链接: YOLO基础解析+创新改进+实战案例

摘要

我们旨在为目标检测领域提供一种高效且性能卓越的目标检测器,称为YOLO-MS。其核心设计基于一系列调查研究,关于不同核心大小的卷积如何影响不同尺度物体的检测性能。研究结果是一种新策略,能够显著增强实时目标检测器的多尺度特征表示能力。为验证我们策略的有效性,我们构建了一个网络架构,命名为YOLO-MS。我们从零开始在MS COCO数据集上训练我们的YOLO-MS,不依赖于任何其他大规模数据集,如ImageNet,或预训练权重。无需任何附加装置,我们的YOLO-MS就超越了最新的实时目标检测器,包括YOLO-v7和RTMDet,当使用可比较的参数数量和FLOPs时。以YOLO-MS的XS版本为例,仅有4.5M的可学习参数和8.7G FLOPs,就能在MS COCO上达到43%+的AP得分,比相同模型大小的RTMDet高出约2%+。此外,我们的工作还可以作为一个即插即用的模块用于其他YOLO模型。通常,我们的方法显著提高了YOLOv8的AP,从37%+提高到了40%+,而且使用的参数和FLOPs还更少。

创新点

  1. 多尺度构建块(MS-Block)设计:YOLO-MS引入了MS-Block,一个具有分层特征融合策略的构建块,旨在增强实时目标检测器在提取多尺度特征时的能力。MS-Block通过将输入特征分割并传递到多个分支中,并在每个分支中应用具有不同Kernel大小的Inverted Bottleneck Block,来编码不同尺度的特征。

  2. 异构Kernel选择(HKS)协议:为了更有效地捕捉多尺度语义信息,YOLO-MS提出了一种在不同阶段中采用不同大小Kernel的策略。具体地,在编码器的浅层使用小Kernel卷积处理高分辨率特征,在深层使用大Kernel卷积捕捉更广泛的信息。这种设计使得YOLO-MS能够在保持高效推理的同时,提升对不同尺寸目标的检测性能。

  3. 高效性能与准确性的平衡:YOLO-MS在保持较低计算复杂度的条件下,实现了优于当时最先进实时目标检测器的性能。这得益于其精心设计的网络结构和创新的特征表示策略,如MS-Block和HKS协议,使得模型在不依赖任何大规模数据集预训练的情况下,也能在公开数据集上达到高精度。

  4. 即插即用的模块化设计:YOLO-MS不仅作为一个独立的目标检测模型存在,其核心组件如MS-Block也可以作为即插即用的模块,集成到其他YOLO系列模型中,以提升这些模型在多尺度目标检测任务上的性能。# MSBlock模块,包含多个MSBlockLayer,用于处理不同尺度的特征

yolov8 引入


 class MSBlock(nn.Module):
    def __init__(self, inc, ouc, kernel_sizes, in_expand_ratio=3., mid_expand_ratio=2., layers_num=3,
                 in_down_ratio=2.)-> None:
        super().__init__()
        # 根据扩展比例计算中间通道数
        in_channel = int(inc * in_expand_ratio // in_down_ratio)
        self.mid_channel = in_channel // len(kernel_sizes)
        groups = int(self.mid_channel * mid_expand_ratio)
        # 输入卷积层
        self.in_conv = Conv(inc, in_channel)

        self.mid_convs = []
        # 根据给定的核大小创建多个MSBlockLayer
        for kernel_size in kernel_sizes:
            if kernel_size == 1:
                self.mid_convs.append(nn.Identity())
                continue
            mid_convs = [MSBlockLayer(self.mid_channel, groups, k=kernel_size) for _ in range(int(layers_num))]
            self.mid_convs.append(nn.Sequential(*mid_convs))
        self.mid_convs = nn.ModuleList(self.mid_convs)
        # 输出卷积层
        self.out_conv = Conv(in_channel, ouc, 1)

        self.attention = None

    def forward(self, x):
        out = self.in_conv(x)
        channels = []
        # 分别处理每个通道范围内的特征,并合并
        for i, mid_conv in enumerate(self.mid_convs):
            channel = out[:, i * self.mid_channel:(i + 1) * self.mid_channel, ...]
            if i >= 1:
                channel = channel + channels[i - 1]
            channel = mid_conv(channel)
            channels.append(channel)
        out = torch.cat(channels, dim=1)
        out = self.out_conv(out)
        if self.attention is not None:
            out = self.attention(out)
        return out# MSBlock模块,包含多个MSBlockLayer,用于处理不同尺度的特征
class MSBlock(nn.Module):
    def __init__(self, inc, ouc, kernel_sizes, in_expand_ratio=3., mid_expand_ratio=2., layers_num=3,
                 in_down_ratio=2.)-> None:
        super().__init__()
        # 根据扩展比例计算中间通道数
        in_channel = int(inc * in_expand_ratio // in_down_ratio)
        self.mid_channel = in_channel // len(kernel_sizes)
        groups = int(self.mid_channel * mid_expand_ratio)
        # 输入卷积层
        self.in_conv = Conv(inc, in_channel)

        self.mid_convs = []
        # 根据给定的核大小创建多个MSBlockLayer
        for kernel_size in kernel_sizes:
            if kernel_size == 1:
                self.mid_convs.append(nn.Identity())
                continue
            mid_convs = [MSBlockLayer(self.mid_channel, groups, k=kernel_size) for _ in range(int(layers_num))]
            self.mid_convs.append(nn.Sequential(*mid_convs))
        self.mid_convs = nn.ModuleList(self.mid_convs)
        # 输出卷积层
        self.out_conv = Conv(in_channel, ouc, 1)

        self.attention = None

    def forward(self, x):
        out = self.in_conv(x)
        channels = []
        # 分别处理每个通道范围内的特征,并合并
        for i, mid_conv in enumerate(self.mid_convs):
            channel = out[:, i * self.mid_channel:(i + 1) * self.mid_channel, ...]
            if i >= 1:
                channel = channel + channels[i - 1]
            channel = mid_conv(channel)
            channels.append(channel)
        out = torch.cat(channels, dim=1)
        out = self.out_conv(out)
        if self.attention is not None:
            out = self.attention(out)
        return out

task与yaml配置

详见:https://blog.csdn.net/shangyanaf/article/details/137029177

相关文章
|
6月前
|
机器学习/深度学习 计算机视觉
【YOLOv8改进】CoordAttention: 用于移动端的高效坐标注意力机制 (论文笔记+引入代码)
该专栏聚焦YOLO目标检测的创新改进与实战,介绍了一种新的移动网络注意力机制——坐标注意力。它将位置信息融入通道注意力,通过1D特征编码处理,捕获长距离依赖并保持位置精度。生成的注意力图能增强目标表示,适用于MobileNetV2、MobileNeXt和EfficientNet等网络,提高性能,且几乎不增加计算成本。在ImageNet分类和下游任务(目标检测、语义分割)中表现出色。YOLOv8中引入了CoordAtt模块,实现位置敏感的注意力。更多详情及配置见相关链接。
|
2月前
|
机器学习/深度学习 PyTorch 算法框架/工具
CNN中的注意力机制综合指南:从理论到Pytorch代码实现
注意力机制已成为深度学习模型的关键组件,尤其在卷积神经网络(CNN)中发挥了重要作用。通过使模型关注输入数据中最相关的部分,注意力机制显著提升了CNN在图像分类、目标检测和语义分割等任务中的表现。本文将详细介绍CNN中的注意力机制,包括其基本概念、不同类型(如通道注意力、空间注意力和混合注意力)以及实际实现方法。此外,还将探讨注意力机制在多个计算机视觉任务中的应用效果及其面临的挑战。无论是图像分类还是医学图像分析,注意力机制都能显著提升模型性能,并在不断发展的深度学习领域中扮演重要角色。
92 10
|
1月前
|
机器学习/深度学习 网络架构 计算机视觉
目标检测笔记(一):不同模型的网络架构介绍和代码
这篇文章介绍了ShuffleNetV2网络架构及其代码实现,包括模型结构、代码细节和不同版本的模型。ShuffleNetV2是一个高效的卷积神经网络,适用于深度学习中的目标检测任务。
68 1
目标检测笔记(一):不同模型的网络架构介绍和代码
|
4月前
|
机器学习/深度学习 移动开发 自然语言处理
【YOLOv8改进- 多模块融合改进】GhostConv + ContextAggregation 幽灵卷积与上下文聚合模块融合改进,助力小目标高效涨点
【YOLOv8改进- 多模块融合改进】GhostConv + ContextAggregation 幽灵卷积与上下文聚合模块融合改进,助力小目标高效涨点
|
4月前
|
机器学习/深度学习 算法 vr&ar
YOLOv8有效改进系列及项目实战目录 包含卷积,主干 注意力,检测头等创新机制 以及 各种目标检测分割项目实战案例
这个摘要主要涵盖了一个关于YOLO目标检测的深度学习专栏的内容概览。该专栏专注于YOLO算法的历史、前沿研究和实战应用,提供了一系列的文章,详细讲解了YOLO的改进方法,包括卷积优化、损失函数创新、注意力机制、网络结构和主干网络的更新,以及针对不同场景如红外成像、小目标检测等的应用。此外,还提供了每周多次的更新频率以保持内容的时效性,并指导读者进行论文写作和项目实现,包括具体的代码示例和实战项目,如行人检测、对象分割、姿态估计等。该专栏还涉及到面试准备和实习就业指导,帮助读者提升在图像算法领域的专业技能。
|
4月前
|
机器学习/深度学习 大数据 计算机视觉
【YOLOv8改进 - 特征融合】 GELAN:YOLOV9 通用高效层聚合网络,高效且涨点
YOLOv8专栏探讨了深度学习中信息瓶颈问题,提出可编程梯度信息(PGI)和广义高效层聚合网络(GELAN),改善轻量级模型的信息利用率。GELAN在MS COCO数据集上表现优越,且PGI适用于不同规模的模型,甚至能超越预训练SOTA。[论文](https://arxiv.org/pdf/2402.13616)和[代码](https://github.com/WongKinYiu/yolov9)已开源。核心组件RepNCSPELAN4整合了RepNCSP块和卷积。更多详情及配置参见相关链接。
|
6月前
|
计算机视觉
【YOLOv8改进】 AFPN :渐进特征金字塔网络 (论文笔记+引入代码).md
YOLO目标检测专栏介绍了YOLO的有效改进和实战案例,包括AFPN——一种解决特征金字塔网络信息丢失问题的新方法。AFPN通过非相邻层直接融合和自适应空间融合处理多尺度特征,提高检测性能。此外,还展示了YOLOv8中引入的MPDIoU和ASFF模块的代码实现。详情可参考提供的专栏链接。
|
6月前
|
机器学习/深度学习 存储 测试技术
【YOLOv8改进】 YOLOv8 更换骨干网络之 GhostNet :通过低成本操作获得更多特征 (论文笔记+引入代码).md
YOLO目标检测专栏探讨了卷积神经网络的创新改进,如Ghost模块,它通过低成本运算生成更多特征图,降低资源消耗,适用于嵌入式设备。GhostNet利用Ghost模块实现轻量级架构,性能超越MobileNetV3。此外,文章还介绍了SegNeXt,一个高效卷积注意力网络,提升语义分割性能,参数少但效果优于EfficientNet-L2。专栏提供YOLO相关基础解析、改进方法和实战案例。
|
6月前
|
机器学习/深度学习 编解码 算法
YOLOv8改进 | 主干网络 | 增加网络结构增强小目标检测能力【独家创新——附结构图】
YOLOv8在小目标检测上存在挑战,因卷积导致信息丢失。本文教程将原网络结构替换为更适合小目标检测的backbone,并提供结构图。通过讲解原理和手把手教学,指导如何修改代码,提供完整代码实现,适合新手实践。文章探讨了大特征图对小目标检测的重要性,如细节保留、定位精度、特征丰富度和上下文信息,并介绍了FPN等方法。YOLOv8流程包括预处理、特征提取、融合和检测。修改后的网络结构增加了上采样和concatenate步骤,以利用更大特征图检测小目标。完整代码和修改后的结构图可在文中链接获取。
|
6月前
|
机器学习/深度学习 数据可视化 计算机视觉
【YOLOv8改进】MCA:用于图像识别的深度卷积神经网络中的多维协作注意力 (论文笔记+引入代码)
YOLO目标检测专栏介绍了YOLO的创新改进和实战案例,包括多维协作注意力(MCA)机制,它通过三分支架构同时处理通道、高度和宽度注意力,提高CNN性能。MCA设计了自适应组合和门控机制,增强特征表示,且保持轻量化。该模块适用于各种CNN,实验证明其在图像识别任务上的优越性。此外,文章还展示了如何在YOLOv8中引入MCA层的代码实现和相关任务配置。