首页 > 其他分享 >关于 YOLOv8 和 YOLOv11 的 Detect 的大坑问题 | 科研人一定注意

关于 YOLOv8 和 YOLOv11 的 Detect 的大坑问题 | 科研人一定注意

时间:2024-12-08 18:29:43浏览次数:11  
标签:Detect Conv nn self YOLOv8 Sequential YOLOv11 c3 DWConv

问题

这篇文章写于 2024年12月2日,主要讨论 YOLO11 的变化,以及这些变化对模型性能和兼容性的影响。

在这里插入图片描述

首先,YOLO11 已经发布了两个月,对于这次更新的主要改动,我不再赘述。概括来说,新加入了两个模块:C3k2C2PSA。此外,还有一个容易被忽略的变化,就是 Detect 模块的更新。这个改动并没有直接在 yaml 文件中体现,但实际上影响很大,也是我接下来要说的 “坑” 所在。

在这里插入图片描述
YOLO11 中,虽然 Detect 模块的名字没有变,但内部结构发生了变化,具体来说是增加了一个 DWConv 卷积头。实际上,这个新头更准确地应该叫做 v11Detect,然而开发团队并没有这样命名。这种做法的影响非常明显:从 YOLOv8.3.0 开始,YOLOv8 的检测头就变成了 v11Detect(包含 DWConv),这与 8.3.0 之前的版本完全不同。如果你在实验中混用不同版本的模型,这个细节可能会影响你的结果,因为你没有保持变量的唯一性,也就是没有遵循控制变量的原则。

在这里插入图片描述
一个最典型的问题就像这个同学提到的:同样的模型,在不同版本中运行,参数量竟然不同。这显然是不合理的,但如果你不仔细阅读源码,根本不容易发现这个问题。

在这里插入图片描述
针对这个问题,作者团队似乎也意识到了其潜在的影响,所以在 v8.3.17 版本中引入了一个新的机制,增加了 legacy 参数。这个参数通过 C3k2 模块来控制。直白地讲,如果你使用了 C3k2 模块,那么默认的检测头就是 v11Detect(包含 DWConv);如果你没有使用 C3k2 模块,那么检测头仍然是最初的 YOLOv8Detect(不包含 DWConv)。

这种设计使得在使用新模块时自动切换到更新的检测头,但仍然提供了保留旧模块的选择。对于各位用YOLO写论文的同学来说,了解这一点非常重要,尤其是在进行实验对比时。因为如果没有明确意识到这个变化,实验结果可能会由于模型结构的差异而产生误导,导致实验结论不准确。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

直白来讲,这种变化对参数量、计算量以及模型的性能都会带来不同程度的影响。增加 DWConv 后的检测头,相比于旧版的检测头,会减少一些参数量和计算量。然而,这种改变的影响取决于具体的应用场景和数据集,因此在实验对比中一定要确保模型版本的一致性,以避免偏差。

对于使用 YOLOv8 做实验的同学来说,特别需要注意两个时间节点:v8.3.0v8.3.17。如果混合使用这两个版本,可能会出现我上面提到的问题,导致实验结果不一致。对于使用我开源框架的同学不必担心,因为遵循了控制变量原则。这一点希望大家注意到,后续如果有版本改动我会及时和大家同步。

总结来看,YOLO11 的这次更新在模块结构上引入了不少新特性,但也带来了潜在的兼容性问题。用户在升级模型版本时,需要特别留意这些细节,以确保实验的可靠性和结论的可信度。特别是在你混用不同版本时,一定要注意这些隐藏的改动对模型性能的潜在影响。


怎么修复错误

如果大家出现了我上面说的问题,不需要更换版本,直接更改一个代码就可以切换 v11Detect 头到老 v8头,
ultralytics/nn/modules/head.py 文件中,将绿色代码改成红色的就行了,

绿色代码:

        self.cv3 = (
            nn.ModuleList(nn.Sequential(Conv(x, c3, 3), Conv(c3, c3, 3), nn.Conv2d(c3, self.nc, 1)) for x in ch)
            if self.legacy
            else nn.ModuleList(
                nn.Sequential(
                    nn.Sequential(DWConv(x, x, 3), Conv(x, c3, 1)),
                    nn.Sequential(DWConv(c3, c3, 3), Conv(c3, c3, 1)),
                    nn.Conv2d(c3, self.nc, 1),
                )
                for x in ch

或:

        self.cv3 = nn.ModuleList(
            nn.Sequential(
                nn.Sequential(DWConv(x, x, 3), Conv(x, c3, 1)),
                nn.Sequential(DWConv(c3, c3, 3), Conv(c3, c3, 1)),
                nn.Conv2d(c3, self.nc, 1),
            )
            for x in ch
        )

红色代码:

        self.cv3 = (
            nn.ModuleList(nn.Sequential(Conv(x, c3, 3), Conv(c3, c3, 3), nn.Conv2d(c3, self.nc, 1)) for x in ch)

标签:Detect,Conv,nn,self,YOLOv8,Sequential,YOLOv11,c3,DWConv
From: https://blog.csdn.net/weixin_43694096/article/details/144192396

相关文章

  • 轻量化特征融合 | YOLOv11 引入一种基于增强层间特征相关性的轻量级特征融合网络 | 北
    本改进已同步到Magic框架摘要—无人机图像中的小目标检测由于分辨率低和背景融合等因素具有挑战性,导致特征信息有限。多尺度特征融合可以通过捕获不同尺度的信息来增强检测,但传统策略效果不佳。简单的连接或加法操作无法充分利用多尺度融合的优势,导致特征之间的相关性不......
  • 如何使用YOLOv8训练自动驾驶路面分类模型。涵数据集准备、模型训练、等步骤,并提供自动
    自动驾驶路面分类数据集,按照不同的天气条件,即干燥、湿润、水上、新雪、融化的雪和冰。不同的道路材料属性包括沥青、混凝土、泥浆和碎石。不同的道路平整性分为光滑、轻微不平和严重不平。共27类,37万张图像,13GB数据好的,让我们从数据集准备开始,逐步介绍如何使用深度学习框......
  • 如何使用yolov8纽扣电池缺陷检测数据集进行训练,并提供详细的步骤和代码示例 纽扣电池
    纽扣电池缺陷检测数据集包含3种缺陷类别(脏污、凹陷、划痕),已经划分为训练集和验证集,有xml和txt标签,yolo可用,共1110张类别名称names:0:dirty1:depression2:scratch数据集包含3种缺陷类别(脏污、凹陷、划痕),已经划分为训练集和验证集,并且标注为YOLO格式和VOC格式,亲......
  • YOLOv8实战bdd100k自动驾驶目标识别
      本文采用YOLOv8作为核心算法框架,结合PyQt5构建用户界面,使用Python3进行开发。YOLOv8以其高效的实时检测能力,在多个目标检测任务中展现出卓越性能。本研究针对BDD100K自动驾驶目标数据集进行训练和优化,该数据集包含丰富的自动驾驶车辆目标图像样本,为模型的准确性和泛化......
  • 在 MMDetection 中,数据增强
    在MMDetection中,数据增强是提升模型性能的关键部分。除了你提到的基本数据增强方法外,MMDetection提供了许多其他数据增强方式。以下是一些常用的数据增强方法:常用数据增强方法调整尺寸Resize:调整图像大小,可以指定固定尺寸、最大短边或按比例缩放。MinIoURandomCrop:随机......
  • 实战 | C# 中使用YOLOv11实现实例分割 (步骤 + 源码)
    导 读    本文主要介绍在C#中使用YOLOv11实现实例检测,并给详细步骤和源码。C#YOLO11实例分割——本文实现效果:......
  • YOLOv8-ultralytics-8.2.103部分代码阅读笔记-augment.py
    augment.pyultralytics\data\augment.py目录augment.py1.所需的库和模块2.classBaseTransform: 3.classCompose: 4.classBaseMixTransform: 5.classMosaic(BaseMixTransform): 6.classMixUp(BaseMixTransform): 7.classRandomPerspective: 8.classRand......
  • YOLOv8车牌识别系统 深度学习 LPRNet算法 pytorch 大数据 毕业设计(源码)✅
    YOLOv8车牌识别系统深度学习LPRNet算法pytorch大数据毕业设计(源码)✅1、项目介绍技术栈:Python3.8YOLOv8深度学习LPRNet算法pytorch2、项目界面(1)上传图片进行车牌识别(2)上传图片进行车牌识别2(3)多车牌号码进行车牌识别(4)上传视频进行车牌识别实时检测(5)连接......
  • YOLOv8车牌识别系统 深度学习 LPRNet算法 pytorch 大数据 毕业设计(源码)✅
    YOLOv8车牌识别系统深度学习LPRNet算法pytorch大数据毕业设计(源码)✅1、项目介绍技术栈:Python3.8YOLOv8深度学习LPRNet算法pytorch2、项目界面(1)上传图片进行车牌识别(2)上传图片进行车牌识别2(3)多车牌号码进行车牌识别(4)上传视频进行车牌识别实时检测(5)连接......
  • YOLOv8实战道路裂缝缺陷识别
      本文采用YOLOv8作为核心算法框架,结合PyQt5构建用户界面,使用Python3进行开发。YOLOv8以其高效的实时检测能力,在多个目标检测任务中展现出卓越性能。本研究针对道路裂缝数据集进行训练和优化,该数据集包含丰富的道路裂缝图像样本,为模型的准确性和泛化能力提供了有力保障。......