问题
这篇文章写于 2024年12月2日
,主要讨论 YOLO11
的变化,以及这些变化对模型性能和兼容性的影响。
首先,YOLO11
已经发布了两个月,对于这次更新的主要改动,我不再赘述。概括来说,新加入了两个模块:C3k2
和 C2PSA
。此外,还有一个容易被忽略的变化,就是 Detect
模块的更新。这个改动并没有直接在 yaml
文件中体现,但实际上影响很大,也是我接下来要说的 “坑” 所在。
在 YOLO11
中,虽然 Detect
模块的名字没有变,但内部结构发生了变化,具体来说是增加了一个 DWConv
卷积头。实际上,这个新头更准确地应该叫做 v11Detect
,然而开发团队并没有这样命名。这种做法的影响非常明显:从 YOLOv8.3.0
开始,YOLOv8
的检测头就变成了 v11Detect
(包含 DWConv
),这与 8.3.0
之前的版本完全不同。如果你在实验中混用不同版本的模型,这个细节可能会影响你的结果,因为你没有保持变量的唯一性,也就是没有遵循控制变量的原则。
一个最典型的问题就像这个同学提到的:同样的模型,在不同版本中运行,参数量竟然不同。这显然是不合理的,但如果你不仔细阅读源码,根本不容易发现这个问题。
针对这个问题,作者团队似乎也意识到了其潜在的影响,所以在 v8.3.17
版本中引入了一个新的机制,增加了 legacy
参数。这个参数通过 C3k2
模块来控制。直白地讲,如果你使用了 C3k2
模块,那么默认的检测头就是 v11Detect
(包含 DWConv
);如果你没有使用 C3k2
模块,那么检测头仍然是最初的 YOLOv8
的 Detect
(不包含 DWConv
)。
这种设计使得在使用新模块时自动切换到更新的检测头,但仍然提供了保留旧模块的选择。对于各位用YOLO
写论文的同学来说,了解这一点非常重要,尤其是在进行实验对比时。因为如果没有明确意识到这个变化,实验结果可能会由于模型结构的差异而产生误导,导致实验结论不准确。
直白来讲,这种变化对参数量、计算量以及模型的性能都会带来不同程度的影响。增加 DWConv
后的检测头,相比于旧版的检测头,会减少一些参数量和计算量。然而,这种改变的影响取决于具体的应用场景和数据集,因此在实验对比中一定要确保模型版本的一致性,以避免偏差。
对于使用 YOLOv8
做实验的同学来说,特别需要注意两个时间节点:v8.3.0
和 v8.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