不怕YOLOv10高歌猛进,我有YOLOv8稳扎稳打

在这里插入图片描述

YOLOv10 出来有几天时间了,这次我没有选择第一时间出文章解析,如此频繁的发布数字版本的 YOLO 着实让人头疼,虽然数字的更新并非旧版技术的过时, 但是这肯定会让很多在校同学增加很多焦虑情绪。这里还是请大家辩证看待。

v10 这次的改动不是很多,甚至很多新手同学都觉得没改动什么。网络结构上改动确实不多,主要贡献还是 NMS free,这个点并不体现在模型的 yaml 文件里,所以只看 yaml 也看不出什么,从效果角度讲 v10 就是比 v8 强,这是没法狡辩的。

在这里插入图片描述

值得注意的是 v10 用的依然是 yolov8 的框架,也就是说到目前为止,YOLOv5/v7/v9 都是一个框架,YOLOv8/v10 是一个框架,并且这两套框架都是 ultralytics 团队在维护的,这也验证了前几年(22年)我写的一段文字,一个好的基线框架是至关重要的,一个超级活跃的开源项目也是可遇不可求的,它带给你的帮助是无法估量的。

那这意味什么呢,你 v5/v7/v9 会玩一个就代表三个全会,v8/v10 会玩一个就代表两个全会;并且我们可以无脑将 v10 的改进点放到 v8 里,所以大家不必纠结 v8 旧于 v10 ,以后的任何数字版本 yolo ,对你们来说不过是一个改进点而已。

如何选择一个合适的基线?

  1. 从硬件性能角度考虑
    即考虑自己的硬件条件,本身是否具备训练一个大模型的硬件环境,比如显卡性能或者显存很小,那么就无法训练参数量过大的模型。
  2. 从训练成本角度考虑
    即考虑自身的资金成本或者时间成本,如果实验室没有GPU,那么就要使用云平台,通常实验都会有几十次,所以资金成本很大,这时可以考虑使用参数量较小的基线,这样训练时间快,对硬件的要求也没有那么高。
  3. 从评价指标角度考虑
    我们通常在发论文时都会加上一个应用场景,加场景的作用就是满足实际的使用,我们知道理想情况下,模型的精度和参数量是成正比的,假如满足实际使用要求的mAP值是0.9,YOLOv5s的mAP只有0.6,那么无论你怎样优化,模型也很难达到要求,所以这时候就要考虑使用一个更大的基线,比如5L\X等。
  4. 从代码开源角度考虑
    现在开源工作做得很好,有时候我们自己忙了一个月编写的代码甚至不如GitHub上一个开源的项目,所以在选择优化算法时要考虑自身的代码水平,即这个算法的有没有开源的源代码,这个代码是否清清晰易读,是否方便改进。

为什么我总是推荐大家用 yolov8 呢,因为这个框架真的真的很好用,对小白也很友好,不管是论文还是工作,这个框架我认为真的值得学习。

目前这个框架支持 分类、检测、分割、关键点、开集目标检测、未来会加入深度估计等任务,学会了对自己帮助很大。

下面简单回顾下论文,并且对 v10 的三个模块加到 v8 做个简单教程。


论文回顾


下面快速回顾下原始论文,这是我借助 Ai Drive 总结的,基本就是这些东西,如果对模块效果感兴趣请大家直接看论文的消融实验。

引言

在过去的几年中,YOLO系列(You Only Look Once)模型凭借其在计算成本和检测性能之间的卓越平衡,已经成为实时目标检测领域的主流。近日,由清华大学团队提出的最新论文《YOLOv10: Real-Time End-to-End Object Detection》进一步推进了YOLO模型的性能与效率边界。本文将详细介绍这篇论文的创新点、主要贡献及其实验结果。

论文背景

YOLO模型的检测管道主要包括模型前向过程和非极大值抑制(NMS)后处理。然而,NMS的依赖使得YOLO模型在端到端部署中存在一定的效率瓶颈。此外,YOLO模型各组件的设计也缺乏全面细致的优化,导致计算冗余明显,限制了模型的性能提升。

主要贡献

这篇论文针对以上问题,提出了两个关键创新点:一致的双重分配策略和整体效率-准确性驱动的模型设计策略。
在这里插入图片描述
在这里插入图片描述

  1. 一致的双重分配策略

    • 双标签分配:传统的YOLO模型在训练时通常采用一对多的标签分配策略,这虽然能带来丰富的监督信号,但也需要在推理时依赖NMS。为解决这一问题,论文提出了一种双标签分配策略,通过同时采用一对多和一对一的标签分配,既保证了训练时的丰富监督信号,又消除了推理时对NMS的依赖。
    • 一致匹配度量:通过采用统一的匹配度量,优化一对一分配头和一对多分配头,使两者能够一致和谐地进行优化,从而在推理时提供更高质量的样本。
  2. 整体效率-准确性驱动的模型设计策略

    • 轻量级分类头:通过简化分类头的架构,减少计算开销,同时不显著影响性能。
    • 空间通道解耦下采样:提出了一种新的下采样方法,先进行通道维度的变换,然后进行空间维度的下采样,最大程度地保留信息。
    • 秩引导块设计:通过分析各阶段的内在秩,提出紧凑倒置块结构(CIB),并采用秩引导的块分配策略,以适应不同阶段的冗余情况,从而提高模型的效率。
  3. 大核卷积和部分自注意力模块(PSA)

    • 大核卷积:在深层阶段采用大核卷积,扩大感受野,增强模型能力。
    • 部分自注意力模块:通过将特征分为两部分,仅对一部分应用多头自注意力机制(MHSA),在提升模型性能的同时降低计算复杂度。

实验结果

在这里插入图片描述

论文通过在COCO数据集上的大量实验,验证了YOLOv10在各个模型规模上的优越性能和效率:

  • 高效的参数利用:YOLOv10-L和YOLOv10-X分别比YOLOv8-L和YOLOv8-X减少1.8倍和2.3倍的参数,同时在相同或更好的性能下实现了更低的延迟。
  • 先进的性能和延迟权衡:YOLOv10在标准目标检测基准上显著优于以前的最先进模型。例如,YOLOv10-S比RT-DETR-R18快1.8倍,参数和FLOPs减少2.8倍。

代码改动

如果将 v10 全部的改动合并到 v8 的主分支,大概到 14python 文件和 6yaml 文件,详细的代码大家直接看这个 PR 就行了,https://github.com/ultralytics/ultralytics/pull/13113/files,

由于我对大家比较了解,就不给大家展示怎么改这 14 个文件了,用 Ultralytics 框架的同学等待官方合并就好了。咱们直接改除 NMS free 外的其他贡献点,有三个模块,大家自行拆解使用 :

  1. 空间通道解耦下采样 SCDown
  2. 紧凑倒置块结构 CIB
  3. 大核卷积和部分自注意力模块 PSA

第一步

ultralytics/ultralytics/nn/modules/block.py 添加如下代码:

from ultralytics.utils.torch_utils import fuse_conv_and_bn


class RepVGGDW(torch.nn.Module):
    """RepVGGDW is a class that represents a depth wise separable convolutional block in RepVGG architecture."""

    def __init__(self, ed) -> None:
        super().__init__()
        self.conv = Conv(ed, ed, 7, 1, 3, g=ed, act=False)
        self.conv1 = Conv(ed, ed, 3, 1, 1, g=ed, act=False)
        self.dim = ed
        self.act = nn.SiLU()

    def forward(self, x):
        """
        Performs a forward pass of the RepVGGDW block.
        Args:
            x (torch.Tensor): Input tensor.
        Returns:
            (torch.Tensor): Output tensor after applying the depth wise separable convolution.
        """
        return self.act(self.conv(x) + self.conv1(x))

    def forward_fuse(self, x):
        """
        Performs a forward pass of the RepVGGDW block without fusing the convolutions.
        Args:
            x (torch.Tensor): Input tensor.
        Returns:
            (torch.Tensor): Output tensor after applying the depth wise separable convolution.
        """
        return self.act(self.conv(x))

    @torch.no_grad()
    def fuse(self):
        """
        Fuses the convolutional layers in the RepVGGDW block.
        This method fuses the convolutional layers and updates the weights and biases accordingly.
        """
        conv = fuse_conv_and_bn(self.conv.conv, self.conv.bn)
        conv1 = fuse_conv_and_bn(self.conv1.conv, self.conv1.bn)

        conv_w = conv.weight
        conv_b = conv.bias
        conv1_w = conv1.weight
        conv1_b = conv1.bias

        conv1_w = torch.nn.functional.pad(conv1_w, [2, 2, 2, 2])

        final_conv_w = conv_w + conv1_w
        final_conv_b = conv_b + conv1_b

        conv.weight.data.copy_(final_conv_w)
        conv.bias.data.copy_(final_conv_b)

        self.conv = conv
        del self.conv1


class CIB(nn.Module):
    """
    Conditional Identity Block (CIB) module.
    Args:
        c1 (int): Number of input channels.
        c2 (int): Number of output channels.
        shortcut (bool, optional): Whether to add a shortcut connection. Defaults to True.
        e (float, optional): Scaling factor for the hidden channels. Defaults to 0.5.
        lk (bool, optional): Whether to use RepVGGDW for the third convolutional layer. Defaults to False.
    """

    def __init__(self, c1, c2, shortcut=True, e=0.5, lk=False):
        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 pass of the CIB module.
        Args:
            x (torch.Tensor): Input tensor.
        Returns:
            (torch.Tensor): Output tensor.
        """
        return x + self.cv1(x) if self.add else self.cv1(x)


class C2fCIB(C2f):
    """
    C2fCIB class represents a convolutional block with C2f and CIB modules.
    Args:
        c1 (int): Number of input channels.
        c2 (int): Number of output channels.
        n (int, optional): Number of CIB modules to stack. Defaults to 1.
        shortcut (bool, optional): Whether to use shortcut connection. Defaults to False.
        lk (bool, optional): Whether to use local key connection. Defaults to False.
        g (int, optional): Number of groups for grouped convolution. Defaults to 1.
        e (float, optional): Expansion ratio for CIB modules. Defaults to 0.5.
    """

    def __init__(self, c1, c2, n=1, shortcut=False, lk=False, g=1, e=0.5):
        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))


class Attention(nn.Module):
    """
    Attention module that performs self-attention on the input tensor.
    Args:
        dim (int): The input tensor dimension.
        num_heads (int): The number of attention heads.
        attn_ratio (float): The ratio of the attention key dimension to the head dimension.
    Attributes:
        num_heads (int): The number of attention heads.
        head_dim (int): The dimension of each attention head.
        key_dim (int): The dimension of the attention key.
        scale (float): The scaling factor for the attention scores.
        qkv (Conv): Convolutional layer for computing the query, key, and value.
        proj (Conv): Convolutional layer for projecting the attended values.
        pe (Conv): Convolutional layer for positional encoding.
    """

    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):
        """
        Forward pass of the Attention module.
        Args:
            x (torch.Tensor): The input tensor.
        Returns:
            (torch.Tensor): The output tensor after self-attention.
        """
        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):
    """
    Position-wise Spatial Attention module.
    Args:
        c1 (int): Number of input channels.
        c2 (int): Number of output channels.
        e (float): Expansion factor for the intermediate channels. Default is 0.5.
    Attributes:
        c (int): Number of intermediate channels.
        cv1 (Conv): 1x1 convolution layer to reduce the number of input channels to 2*c.
        cv2 (Conv): 1x1 convolution layer to reduce the number of output channels to c.
        attn (Attention): Attention module for spatial attention.
        ffn (nn.Sequential): Feed-forward network 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):
        """
        Forward pass of the PSA module.
        Args:
            x (torch.Tensor): Input tensor.
        Returns:
            (torch.Tensor): Output tensor.
        """
        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))


class SCDown(nn.Module):
    def __init__(self, c1, c2, k, s):
        """
        Spatial Channel Downsample (SCDown) module.
        Args:
            c1 (int): Number of input channels.
            c2 (int): Number of output channels.
            k (int): Kernel size for the convolutional layer.
            s (int): Stride for the convolutional layer.
        """
        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):
        """
        Forward pass of the SCDown module.
        Args:
            x (torch.Tensor): Input tensor.
        Returns:
            (torch.Tensor): Output tensor after applying the SCDown module.
        """
        return self.cv2(self.cv1(x))

第二步

ultralytics/ultralytics/nn/modules/block.py 添加如下代码:

在这里插入图片描述

    "RepVGGDW",
    "CIB",
    "C2fCIB",
    "Attention",
    "PSA",
    "SCDown",

第三步

ultralytics/ultralytics/nn/tasks.py 导包, 添加模块

在这里插入图片描述

    RepVGGDW,
    CIB,
    C2fCIB,
    Attention,
    PSA,
    SCDown,

在这里插入图片描述

                if isinstance(m, RepVGGDW):
                    m.fuse()
                    m.forward = m.forward_fuse

在这里插入图片描述

PSA, SCDown, C2fCIB
C2fCIB

第四步

更换 yaml ,开始训练,注意不同尺寸不是简单的调整深度宽度!

yolov10n.yaml

# Ultralytics YOLO 🚀, AGPL-3.0 license
# YOLOv10 object detection model. For Usage examples see https://docs.ultralytics.com/tasks/detect

# 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] 

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:
  - [-1, 1, nn.Upsample, [None, 2, "nearest"]]
  - [[-1, 6], 1, Concat, [1]] # cat backbone P4
  - [-1, 3, C2f, [512]] # 13

  - [-1, 1, nn.Upsample, [None, 2, "nearest"]]
  - [[-1, 4], 1, Concat, [1]] # cat backbone P3
  - [-1, 3, C2f, [256]] # 16 (P3/8-small)

  - [-1, 1, Conv, [256, 3, 2]]
  - [[-1, 13], 1, Concat, [1]] # cat head P4
  - [-1, 3, C2f, [512]] # 19 (P4/16-medium)

  - [-1, 1, SCDown, [512, 3, 2]]
  - [[-1, 10], 1, Concat, [1]] # cat head P5
  - [-1, 3, C2fCIB, [1024, True, True]] # 22 (P5/32-large)

  - [[16, 19, 22], 1, Detect, [nc]] # Detect(P3, P4, P5)

yolov10b.yaml

# Ultralytics YOLO 🚀, AGPL-3.0 license
# YOLOv10 object detection model. For Usage examples see https://docs.ultralytics.com/tasks/detect

# 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]
  b: [0.67, 1.00, 512] 

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, C2fCIB, [1024, True]]
  - [-1, 1, SPPF, [1024, 5]] # 9
  - [-1, 1, PSA, [1024]] # 10

# YOLOv8.0n head
head:
  - [-1, 1, nn.Upsample, [None, 2, "nearest"]]
  - [[-1, 6], 1, Concat, [1]] # cat backbone P4
  - [-1, 3, C2fCIB, [512, True]] # 13

  - [-1, 1, nn.Upsample, [None, 2, "nearest"]]
  - [[-1, 4], 1, Concat, [1]] # cat backbone P3
  - [-1, 3, C2f, [256]] # 16 (P3/8-small)

  - [-1, 1, Conv, [256, 3, 2]]
  - [[-1, 13], 1, Concat, [1]] # cat head P4
  - [-1, 3, C2fCIB, [512, True]] # 19 (P4/16-medium)

  - [-1, 1, SCDown, [512, 3, 2]]
  - [[-1, 10], 1, Concat, [1]] # cat head P5
  - [-1, 3, C2fCIB, [1024, True]] # 22 (P5/32-large)

  - [[16, 19, 22], 1, Detect, [nc]] # Detect(P3, P4, P5)

yolov10s.yaml

# Ultralytics YOLO 🚀, AGPL-3.0 license
# YOLOv10 object detection model. For Usage examples see https://docs.ultralytics.com/tasks/detect

# 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]
  s: [0.33, 0.50, 1024]

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, C2fCIB, [1024, True, True]]
  - [-1, 1, SPPF, [1024, 5]] # 9
  - [-1, 1, PSA, [1024]] # 10

# YOLOv8.0n head
head:
  - [-1, 1, nn.Upsample, [None, 2, "nearest"]]
  - [[-1, 6], 1, Concat, [1]] # cat backbone P4
  - [-1, 3, C2f, [512]] # 13

  - [-1, 1, nn.Upsample, [None, 2, "nearest"]]
  - [[-1, 4], 1, Concat, [1]] # cat backbone P3
  - [-1, 3, C2f, [256]] # 16 (P3/8-small)

  - [-1, 1, Conv, [256, 3, 2]]
  - [[-1, 13], 1, Concat, [1]] # cat head P4
  - [-1, 3, C2f, [512]] # 19 (P4/16-medium)

  - [-1, 1, SCDown, [512, 3, 2]]
  - [[-1, 10], 1, Concat, [1]] # cat head P5
  - [-1, 3, C2fCIB, [1024, True, True]] # 22 (P5/32-large)

  - [[16, 19, 22], 1, Detect, [nc]] # Detect(P3, P4, P5)

相关推荐

想了解 YOLOv8 其他改进的同学欢迎订阅我的专栏~

🎀基础入门篇🎀

  1. 从零开始学习目标检测:YOLO算法详解
  2. YOLOv8原理解析:重新定义实时目标检测的速度和精度🌟
  3. 小白安装环境教程!没一个字废话,看一遍不踩坑!
  4. 使用YOLOv8训练自己的目标检测数据集-【收集数据集】-【标注数据集】-【划分数据集】-【配置训练环境】-【训练模型】-【评估模型】-【导出模型】🚀
  5. YOLOv8 训练自己的【分割数据集】
  6. 【强烈推荐🚀】基础入门篇 | YOLOv8 项目【训练】【验证】【推理】最简单教程 | 打印FPS在这里!!🚀
  7. 【全网首发🥇】万字长文,YOLOv8 yaml 文件解析 | 一文搞定 YOLOv8 分类任务,检测任务,分割任务,关键点任务🍀🍀🍀
  8. 【哔哩哔哩】云服务器训练教程视频
  9. YOLO-Magic 系列框架介绍 【订阅必读】

🍀官方项目最新更新动态及其它优化教程🍀

  1. 关于 YOLOv8 modules.py 拆分成了 init.py block.py conv.py head.py trasnformer.py utils.py
  2. 【关键Bug解析🤖】YOLOv8 Bug 及解决方案汇总 【环境安装】【训练 & 断点续训】【KeyError】
  3. 【便利性优化👾】YOLOv8 标签透明度调节 | 标签文字大小调节 | 框粗细调节
  4. YOLOv5/v6/v7/v8/RT-DETR 对比试验的一些想法🍀

💡主干网络篇💡

  1. 使用 Timm 库替换 YOLOv8 主干网络 | 1000+ 主干融合YOLOv8 🚀🚀🚀

  2. 【2023🏅】YOLOv8 更换主干网络之 FasterNet | 《Ran, Don‘t Walk: 追求更高 FLOPS 的快速神经网络》

  3. 【2023🏅】YOLOv8 更换主干网络之 VanillaNet |《华为方舟实验室最新成果》新增多个尺寸🍀

  4. 【2023🏅】YOLOv8 更换主干网络之 HGNetV2 |《RTDETR主干网络》

  5. YOLOv8 更换骨干网络之 SwinTransformer | 《基于位移窗口的层次化视觉变换器》

  6. YOLOv8 更换主干网络之 GhostNetV2 | 《GhostNetV2:利用长距离注意力增强廉价操作》

  7. YOLOv8 更换主干网络之 PP-LCNet | 《PP-LCNet: 一种轻量级CPU卷积神经网络》

  8. YOLOv8 更换主干网络之 MobileNeXt |《重新思考瓶颈结构以实现高效移动网络设计》

  9. YOLOv8 更换主干网络之 ShuffleNetv2 | 《ShuffleNet v2:高效卷积神经网络架构设计的实用指南》

  10. YOLOv8 更换主干网络之 EfficientNet | 《EfficientNet:重新思考卷积神经网络的模型缩放》

  11. YOLOv8 更换骨干网络之 MobileNetV3 | 《搜寻 MobileNetV3》

  12. YOLOv8 更换骨干网络之 GhostNet | 《从廉价操作中获取更多特征》

  13. YOLOv8 更换主干网络之 ConvNext | 《纯卷积结构超越 ViTs》

  14. YOLOv8 更换主干网络之 MobileViT |《轻巧、通用、便于移动的视觉转换器》

  15. YOLOv8 更换骨干网络之 ResNet50/ResNet101 | 原论文一比一复现

  16. 【双主干】YOLOv8 如何实现多主干特征融合方式 | GhostNet+ShuffleNet / SwinTransformer+ShuffleNet🚀🚀🚀


🚀即插即用篇🚀

  1. 手把手教你 YOLOv8 添加注意力机制 | 适用于【检测/分类/分割/关键点任务】【包含20+种注意力代码及教程】🚀
  2. 在 C2F 模块中添加【SE】 【CBAM】【 ECA 】【CA 】注意力机制 | 附详细结构图
  3. 在 C2F 模块中添加【SimAM】 【CoTAttention】【SKAttention】【Double】注意力机制 | 附详细结构图
  4. 在 C2F 模块中添加【EffectiveSE】【GlobalContext】【GatherExcite】【MHSA】注意力机制 | 附详细结构图
  5. 在 C2F 模块中添加【Triplet】【SpatialGroupEnhance】【NAM】【S2】注意力机制 | 附详细结构图
  6. 在 C2F 模块中添加【ParNet】【CrissCross】【GAM】【ParallelPolarized】【Sequential】注意力机制 | 附详细结构图
  7. 即插即用篇 | YOLOv8 引入 SimAM 注意力机制 | 《SimAM: A Simple, Parameter-Free Attention Module for Convolutional》
  8. 即插即用篇 | YOLOv8 引入 Contextual Trans 注意力机制 | 《Contextual Transformer Networks for Visual Recognition》
  9. 即插即用篇 | YOLOv8 引入 SKAttention 注意力机制 | 《Selective Kernel Networks》
  10. 即插即用篇 | YOLOv8 引入 DoubleAttention 注意力机制 | 《A2-Nets: Double Attention Networks》
  11. 即插即用篇 | YOLOv8 引入 EffectiveSE 注意力机制 | 《CenterMask : Real-Time Anchor-Free Instance Segmentation》
  12. 即插即用篇 | YOLOv8 引入 GlobalContext 注意力机制 | 《GCNet: Non-local Networks Meet Squeeze-Excitation Networks》
  13. 即插即用篇 | YOLOv8 引入 GatherExcite 注意力机制 | 《Gather-Excite: Exploiting Feature Context in Convolutional》
  14. 即插即用篇 | YOLOv8 引入 MHSA 注意力机制 | 《Bottleneck Transformers for Visual Recognition》
  15. 即插即用篇 | YOLOv8 引入 Triplet 注意力机制 | 《Rotate to Attend: Convolutional Triplet Attention Module》
  16. 即插即用篇 | YOLOv8 引入 SpatialGroupEnhance 注意力机制 | 《Improving Semantic Feature Learning in Convolutional》
  17. 即插即用篇 | YOLOv8 引入 NAM 注意力机制 | 《NAM: Normalization-based Attention Module》
  18. 即插即用篇 | YOLOv8 引入 S2 注意力机制 | 《S^2-MLPV2: IMPROVED SPATIAL-SHIFT MLP ARCHITECTURE FOR VISION》
  19. 即插即用篇 | YOLOv8 引入 ParNetAttention 注意力机制 | 《NON-DEEP NETWORKS》
  20. 即插即用篇 | YOLOv8 引入 轴向注意力 Axial Attention | 多维变换器中的轴向注意力🍀

  1. 【2023🏅】YOLOv8 引入最新注意力BiFormer | 《BiFormer:视觉变换器与双层路由注意力》

  2. 【CVPR🏅】YOLOv8 引入 RepVGG 重参数化模块 |《RepVGG:让VGG风格的卷积神经网络再次伟大》

  3. 【小目标🤏】用于低分辨率图像和小物体的新 CNN 模块SPD-Conv | 《一种适用于低分辨率图像和小物体的新卷积模块》

  4. 【2023🏅】 YOLOv8 引入具备跨空间学习的高效多尺度注意力 《Efficient Multi-Scale Attention》

  5. 【2023🏅】 YOLOv8 引入选择性注意力 LSK 模块 | 《ICCV Large Selective Kernel Network》

  6. 【2023🏅】YOLOv8 引入空间通道重组卷积 | 《CVPR 2023 Spatial and Channel Reconstruction Convolution》

  7. 【2023🏅】YOLOv8 引入Dynamic Snake Convolution | 动态蛇形卷积

  8. 【2023🏅】YOLOv8 引入基于注意力机制的尺度内特征交互 | Attention-based Intra-scale Feature Interaction (AIFI)

  9. 【2023🏅】YOLOv8 引入反向残差注意力模块 iRMB | 《ICCV 2023 最新论文》

  10. 【2023🏅】YOLOv8 引入Super Token Sampling ViT | 《CVPR 2023 最新论文》

  11. 【2023🏅】YOLOv8 引入 RFAConv:创新空间注意力和标准卷积操作 | YOLO全系列涨点!

  12. 【2023🏅】YOLOv8 引入 AKConv:具有任意采样形状和任意参数数量的卷积核

  13. 【2023🏅】UniRepLKNet:用于音视频、点云、时间序列和图像识别的通用感知大卷积神经网络 | DRepConv

  14. 【2023🏅】超越自注意力:面向医学图像分割的可变形大卷积核注意力

  15. 【2023🏅】即插即用篇 | YOLOv8 引入 SENetv2 | 多套版本配合使用

  16. 【2023🏅】即插即用篇 | EfficientViT:用于高分辨率密集预测的多尺度线性注意力 | ICCV 2023

  17. 【2023🏅】即插即用篇 | YOLOv8引入Haar小波下采样 | 一种简单而有效的语义分割下采样模块

  18. 【AICV🏅】即插即用篇 | YOLOv8引入PSAModule | 高效金字塔压缩注意力模块🍀

  19. 【CVPR🏅】即插即用篇 | YOLOv8引入局部自注意力 HaloAttention | 为参数高效的视觉主干网络扩展局部自注意力🍀

  20. 【CVPR🏅】即插即用篇 | YOLOv8 引入 Strip Pooling | 重新思考场景解析的空间池化🍀

  21. 【ICCV🏅】即插即用篇 | YOLOv8 引入多光谱通道注意力 | 频率领域中的通道注意力网络


💖特征融合篇💖

  1. YOLOv8 应用轻量级通用上采样算子CARAFE | 《特征的内容感知重组》
  2. YOLOv8 应用全维动态卷积 |《 OMNI-DIMENSIONAL DYNAMIC CONVOLUTION》
  3. YOLOv8 应用 BiFPN 结构 | 《 EfficientDet: 可扩展和高效的目标检测》
  4. YOLOv8 应用Slim-Neck,更好的Neck设计范式 | 《Slim-Neck by GSConv:自动驾驶车辆检测器架构的更好设计范式》
  5. 【2023🏅】YOLOv8 引入中心化特征金字塔 EVC 模块 | 《Centralized Feature Pyramid for Object Detection》
  6. 【2023🏅】YOLOv8 引入渐进特征金字塔网络 AFPN 结构 | 《2023年6月28见刊的最新文章》🚀🚀🚀
  7. 【2023🏅】BGF-YOLO | 增强版YOLOV8 | 用于脑瘤检测的多尺度注意力特征融合
  8. 【2023🏅】YOLOv8 引入长颈特征融合网络 Giraffe FPN
  9. 【2023🏅】YOLO-MS: 重新思考实时目标检测的多尺度表示学习
  10. 【2024🏅】YOLOv8 引入通用高效层聚合网络 GELAN | YOLOv9新模块
  11. 【2024🏅】特征融合篇 | YOLOv8 (ultralytics) 实现 YOLOv9 辅助可逆分支架构【试读🚀🚀】
  12. 【双主干】【2024🏅】特征融合篇 | 结合内容引导注意力 DEA-Net 思想 实现双主干特征融合新方法 | IEEE TIP 2024
  13. 【2023🏅】特征融合篇 | YOLOv8 引入动态上采样模块 | 超过了其他上采样器

😎调参篇😎

  1. 【全网首发🥇】YOLOv8超参数调优教程! 使用Ray Tune进行高效的超参数调优!
  2. 【全网首发🥇】YOLOv8实现【K折交叉验证】教程:解决数据集样本稀少和类别不平衡的难题🍀🍀🍀

🌈损失函数篇🌈

  1. YOLOv8 更换损失函数之 CIoU / DIoU / EIoU / GIoU / SIoU / WIoU / Focal_xIoU 最全汇总版
  2. 【2023🏅】损失函数篇 | YOLOv8 更换损失函数之 MPDIoU
  3. 【2023🏅】损失函数篇 | YOLOv8 引入 Shape-IoU 考虑边框形状与尺度的度量
  4. 【2023🏅】损失函数篇 | YOLOv8 引入 Inner-IoU 基于辅助边框的IoU损失

💻算法联调篇💻

  1. 【小目标🤏】YOLOv8 结合切片辅助超推理算法 | 这才叫让小目标无处遁形!
  2. 【算法联调】低照度图像增强算法—传统算法篇🚀🚀
  3. 【算法联调】YOLOv8结合SCI低光照图像增强算法!让夜晚目标无处遁形🚀🚀
  4. 【算法联调】YOLOv8结合CVPR2024最新图像增强算法!让你的模型无惧风雨🚀🚀

🥇原创改进🥇

  1. 【原创自研🌟】YOLOv8 更换 挤压激励增强精准头 | 附详细结构图
  2. 【原创自研🌟】检测头篇 YOLOv8 更换 SEResNeXtBottleneck 头 | 附详细结构图
  3. 【原创自研🌟】分割头篇 YOLOv8 更换 SEResNeXtBottleneck 头 | 附详细结构图
  4. 【原创自研🌟】OBB头篇 YOLOv8 更换 SEResNeXtBottleneck 头 | 附详细结构图

🤖改进头篇🤖

  1. 【小目标🤏】YOLOv8 添加 大目标检测头 | 小目标检测头 | 四头加BiFPN
  2. 【原创自研🌟】YOLOv8 更换 挤压激励增强精准头 | 附详细结构图
  3. 【原创自研🌟】检测头篇 YOLOv8 更换 SEResNeXtBottleneck 头 | 附详细结构图
  4. 【原创自研🌟】分割头篇 YOLOv8 更换 SEResNeXtBottleneck 头 | 附详细结构图
  5. 【原创自研🌟】OBB头篇 YOLOv8 更换 SEResNeXtBottleneck 头 | 附详细结构图
  6. 【原创自研🌟】检测头篇 YOLOv8 更换光晕自注意力 Halo 头 | 附详细结构图

🧮优化器篇🧮

  1. 【2023🏅】YOLOv8 引入谷歌 Lion 优化器

😼激活函数篇😼

  1. 激活函数汇总篇 | YOLOv8 更换激活函数 | 20+ 种汇总

✂️后处理方式篇✂️

  1. YOLOv8 更换 DIoU-NMS / CIoU-NMS / EIoU-NMS/ GIoU-NMS / SIoU-NMS/ Soft-NMS 教程

🤓脚本汇总🤓

  1. YOLO格式数据集【数据增强】终极脚本 | 70+种顶级数据增强方法 | 可带标签增强 🚀🚀🚀 [未发布博客]

  2. 【前端页面】YOLOv8 Gradio | 支持 【分类】【检测】【分割】【关键点】 任务🍀

  3. YOLOv8 如何进行目标追踪

  4. YOLOv8 CAM 热力图可视化 | 已适配最新版

  5. YOLOv8 热力图可视化深度指南 | 支持多种颜色主题🌈

  6. YOLOv8 区域计数 | 入侵检测 | 人员闯入

  7. YOLOv8 目标过线计数 | 车流 | 物流 | 流量

  8. YOLOv8 图片目标计数 | 特定目标计数

  9. YOLOv8 置信度保留多位浮点数 & 特征图可视化

  10. 【软件系统】YOLOv8-PySide系统页面 — 基于 ultralytics 8.1.0 发行版优化💖💖💖

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/654033.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言编译链接

翻译环境和运行环境 翻译环境 翻译环境就是在这将源代码转换成可执行的二进制指令(机器指令)。 进行编译和链接过程。 .c源程序先单独经过编译器生成对应的目标文件.obj(在windows环境下).o(在Linux环境下&#xff…

CRMEB开源商城系统:全开源、高灵活性的电商解决方案

一、引言 随着电子商务的飞速发展,越来越多的企业和个人开始关注如何快速搭建一个稳定、高效且功能丰富的在线商城系统。在这样的背景下,CRMEB开源商城系统应运而生,凭借其前后端分离的架构、丰富的功能模块以及易用性,成为了众多…

C++模板——非类型模板参数、模板的特化以及模板的分离编译

目录 非类型模板参数 模板的特化 概念 函数模板特化 类模板特化 全特化 偏特化 模板的分离编译 什么是分离编译 模板的分离编译 解决方法 模板总结 非类型模板参数 模板参数可分为类型形参和非类型形参。类型形参: 出现在模板参数列表中,跟…

【python】删除一个列表中的所有的1

删除所有的1 x [1, 1, 6, 3, 9, 4, 5, 1, 1, 2, 1, 9, 6, 4] 使用lambda函数和filter来过滤掉x中的1 filtered_x list(filter(lambda n: n ! 1, x)) 不是1的数字,存进x列表,filter用于插入元素到第二个位置 print(filtered_x) # 输出: [6, 3, 9, …

第13章 层次式架构设计理论与实践

层次式架构的核心思想是将系统组成为一种层次结构,每一层为上层服务,并作为下层客户。其实不管是分层还是其他的架构都是为了解耦,更好的复用,只要秉承着这种思想去理解一切都迎刃而解了。 13.1 层次上体系结构概述 回顾一下软件…

【docker】安装harbor出现问题: Running 1/1 ✘ Network harbor_harbor Error

安装harbor出现问题: [] Running 1/1 ✘ Network harbor_harbor Error 0.2s failed to create network harbor_harbor: Error response from daemon: Fa…

节水“云”科普丨北京昌平VR节水云展馆精彩上线

2024年5月15日上午,由北京昌平区水务局主办的“推进城市节水,建设美丽昌平——2024年全国城市节约用水宣传周暨‘坚持节水优先 树立节水标杆’昌平节水在行动主题实践活动”隆重举办,活动期间,昌平区水务局应用VR虚拟现实技术创新…

目标检测数据集 - 工地工人安全设备佩戴检测数据集下载「包含VOC、COCO、YOLO三种格式」

数据集介绍:工地工人安全设备佩戴检测数据集,真实场景数据生成增强后高质量图片数据,涉及场景丰富,比如楼宇建筑工地工人作业数据、道路建筑工地工人作业数据、室内工地工人作业数据、露天挖掘场景工人作业数据、工地工人自拍摆拍…

【数据分析】Numpy和Pandas库基本用法及实例--基于Japyter notebook实现

各位大佬好 ,这里是阿川的博客 , 祝您变得更强 个人主页:在线OJ的阿川 大佬的支持和鼓励,将是我成长路上最大的动力 阿川水平有限,如有错误,欢迎大佬指正 承接上篇的博客 数据分析—技术栈和开发环境搭…

使用Java 读取PDF表格数据并保存到TXT或Excel

目录 导入相关Java库 Java读取PDF表格数据并保存到TXT Java读取PDF表格数据并保存到Excel 在日常工作中,我们经常需要处理来自各种来源的数据。其中,PDF 文件是常见的数据来源之一。这类文件通常包含丰富的信息,其中可能包含重要的表格数据…

大数据面试题 —— Hive

目录 Hive 是什么为什么要使用 HiveHive 的优缺点Hive的实现逻辑,为什么处理小表延迟比较高你可以说一下 HQL 转换为 MR 的任务流程吗 ***你可以说一下 hive 的元数据保存在哪里吗 ***Hive与传统数据库之间的区别Hive内部表和外部表的区别 ***hive 动态分区与静态分…

28 Debian如何配置PXE网络装机(全自动无人值守)

作者:网络傅老师 特别提示:未经作者允许,不得转载任何内容。违者必究! Debian如何配置PXE网络装机(全自动无人值守) 《傅老师Debian小知识库系列之28》——原创 ==前言== 傅老师Debian小知识库特点: 1、最小化拆解Debian实用技能; 2、所有操作在VMware虚拟机实测完成…

Rocky Linux 9.4 正式版发布 - RHEL 100% 1:1 兼容免费发行版

Rocky Linux 9.4 正式版发布 - RHEL 100% 1:1 兼容免费发行版 Rocky Linux 由 CentOS 项目的创始人 Gregory Kurtzer 领导 请访问原文链接:Rocky Linux 9.4 正式版发布 - RHEL 100% 1:1 兼容免费发行版,查看最新版。原创作品,转载请保留出处…

登录记住密码背景颜色修改

1,在login.vue中&:-webkit-autofill里面的css替换成如下 &:-webkit-autofill {box-shadow: 0 0 0px 1000px $bg inset !important;-webkit-text-fill-color: $cursor !important;}

Postman实现批量发送json请求

最近有一个场景,需要本地批量调用某个接口,从文件中读取每次请求的请求体,实现方法记录一下。 1.读取请求体 在 Postman 中,如果你想在 Pre-request Script 阶段读取文件内容,比如为了将文件内容作为请求的一部分发送…

易查分小程序 学生成绩管理小程序

亲爱的老师们,是不是每次成绩公布后,家长们的连环夺命call让你头大?担心孩子们的成绩信息安全,又想快速分享给家长,这可咋整?别急,易查分小程序来帮忙啦! 安全有保障 智能验证码&a…

老板:2个亿的销售额,利润只有55万!电商这个生意真的到头了?

近来,一段对话轰动了半个电商圈的老板,干拼多多,2亿的销售额,利润只有55万! 其实造成这一现象的原因就是“内卷” 说一句电商行业真实的现状,电商发展了十几年,网友对网购已经完全熟悉&#x…

airtest做web端UI自动化实战

安装 官网下载客户端 airtest库安装 pip install airtest pip install pocoui脚本录制 利用airtest客户端录制脚本 web端辅助插件-selenium windows打开: 设置chrome路径 开始调式录制 脚本运行 # -*- coding: utf-8 -*- """ Time : 2024/5/…

C/C++连接MySQL

本章Gitee仓库地址:mysql连接基本操作 文章目录 1. mysql connect库2. mysql相关接口2.1 mysql_init()2.2 mysql_real_connect()2.3 mysql_query()2.4 mysql_store_result()2.41 mysql_num_rows2.42 mysql_num_fields2.43 mysql_fetch_row2.44 mysql_fetch_fields 2…

openLayers加载wms图层并定位到该图层

openLayers定位到wms图层 我们的wms是加载geoserver发布的服务,wms加载的图层是没法通过layer.getSource().getExtent()来获取到extents(边界)的;实现思路是通过postgis的函数(st_extent(geom))来获取extents; 返回前端后格式化一…