开始讲解之前推荐一下我的专栏本专栏的内容支持(分类、检测、分割、追踪、关键点检测),专栏目前为限时折扣欢迎大家订阅本专栏本专栏每周更新5-7篇最新机制更有包含我所有改进的文件和交流群提供给大家本人定期在群内分享发表论文方法和经验。一、本文介绍本文给大家带来的最新改进机制是由Hype-YOLO提出的MANet结构其是一种C3、C2f、C3k2的升级版用于增强特征提取能力。MANet可以理解为C2f的升级版其整合了DSConv和C2f结构这些模块的组合使得信息流动更加丰富有助于在训练过程中提高梯度流动从而增加基础特征的语义深度。官方发布的数据中HypeYOLO的精度是高于YOLOv26的本文内容包含MAnet替换C3k2的教程以及原理介绍。欢迎大家订阅我的专栏一起学习YOLO购买专栏读者联系读者入群获取进阶项目文件文字学不会的读者作者可提供视频学习方法.专栏链接YOLOv26有效涨点专栏包含Conv、注意力机制、主干/Backbone、损失函数、优化器、后处理等改进机制目录一、本文介绍二、原理介绍三、核心代码四、添加方法4.1 修改一4.2 修改二4.3 修改三4.4 修改四4.5 修改五4.6 修改六五、正式训练5.1 yaml文件5.2 训练代码5.3 训练过程截图五、本文总结二、原理介绍论文链接官方论文链接点击此处即可跳转代码链接官方代码链接点击此处即可跳转MANet混合聚合网络由多个模块组成旨在增强网络的特征提取能力。主要组成如下输入和初步卷积输入的特征通过一个 1×1 卷积 层产生通道数为 2c 的特征。深度可分离卷积DSConv通过 DSConv 处理特征这种卷积方法通常用于优化计算效率减少模型参数。接着通过 1×1 卷积再经过 深度可分离卷积处理后生成 4c 的特征。然后进行 1×1 点卷积生成最终 c 通道的特征。特征拆分与聚合特征被拆分并传入多个 ConvNeck 模块进行进一步的处理多个 ConvNeck 模块串联后得到多层特征输出。每个 ConvNeck 模块由 3×3 卷积 组成用于进一步抽取特征。拼接与输出所有特征拼接在一起并通过一个 1×1 卷积 将通道数转换为 c_out最终输出。MANet 的核心思想是通过将多种卷积结构结合使用不仅增强了网络的信息流还提高了梯度流动效率从而增强了网络的特征提取能力。通过这种方法MANet 能够有效地提升 Hyper-YOLO 等模型在目标检测任务中的表现。三、核心代码核心代码的使用方式看章节四import torch.nn as nn import torch import math __all__ [MANet] def autopad(k, pNone, d1): # kernel, padding, dilation Pad to same shape outputs. if d 1: k d * (k - 1) 1 if isinstance(k, int) else [d * (x - 1) 1 for x in k] # actual kernel-size if p is None: p k // 2 if isinstance(k, int) else [x // 2 for x in k] # auto-pad return p class Conv(nn.Module): Standard convolution with args(ch_in, ch_out, kernel, stride, padding, groups, dilation, activation). default_act nn.SiLU() # default activation def __init__(self, c1, c2, k1, s1, pNone, g1, d1, actTrue): Initialize Conv layer with given arguments including activation. super().__init__() self.conv nn.Conv2d(c1, c2, k, s, autopad(k, p, d), groupsg, dilationd, biasFalse) self.bn nn.BatchNorm2d(c2) self.act self.default_act if act is True else act if isinstance(act, nn.Module) else nn.Identity() def forward(self, x): Apply convolution, batch normalization and activation to input tensor. return self.act(self.bn(self.conv(x))) def forward_fuse(self, x): Perform transposed convolution of 2D data. return self.act(self.conv(x)) class GroupConv(Conv): Depth-wise convolution. def __init__(self, c1, c2, k1, s1, d1, actTrue): # ch_in, ch_out, kernel, stride, dilation, activation super().__init__(c1, c2, k, s, gmath.gcd(c1, c2), dd, actact) class Bottleneck(nn.Module): Standard bottleneck. def __init__(self, c1, c2, shortcutTrue, g1, k(3, 3), e0.5): Initializes a bottleneck module with given input/output channels, shortcut option, group, kernels, and expansion. super().__init__() c_ int(c2 * e) # hidden channels self.cv1 Conv(c1, c_, k[0], 1) self.cv2 Conv(c_, c2, k[1], 1, gg) self.add shortcut and c1 c2 def forward(self, x): forward() applies the YOLO FPN to input data. return x self.cv2(self.cv1(x)) if self.add else self.cv2(self.cv1(x)) class MANet(nn.Module): def __init__(self, c1, c2, n1, shortcutFalse, p1, kernel_size3, g1, e0.5): super().__init__() self.c int(c2 * e) self.cv_first Conv(c1, 2 * self.c, 1, 1) self.cv_final Conv((4 n) * self.c, c2, 1) self.m nn.ModuleList(Bottleneck(self.c, self.c, shortcut, g, k((3, 3), (3, 3)), e1.0) for _ in range(n)) self.cv_block_1 Conv(2 * self.c, self.c, 1, 1) dim_hid int(p * 2 * self.c) self.cv_block_2 nn.Sequential(Conv(2 * self.c, dim_hid, 1, 1), GroupConv(dim_hid, dim_hid, kernel_size, 1), Conv(dim_hid, self.c, 1, 1)) def forward(self, x): y self.cv_first(x) y0 self.cv_block_1(y) y1 self.cv_block_2(y) y2, y3 y.chunk(2, 1) y list((y0, y1, y2, y3)) y.extend(m(y[-1]) for m in self.m) return self.cv_final(torch.cat(y, 1))四、添加方法下面的步骤如果你不会或者不想麻烦操作可以联系作者获得本专栏添加所有项目文件的源代码可直接训练.4.1 修改一第一还是建立文件我们找到如下ultralytics/nn文件夹下建立一个目录名字呢就是Addmodules文件夹4.2 修改二然后在Addmodules文件夹内建立一个新的py文件将本文章节三中的“核心代码复制粘贴进去。4.3 修改三第二步我们在该目录下创建一个新的py文件名字为__init__.py然后在其内部导入我们的文件如下图所示。4.4 修改四第三步我门中到如下文件ultralytics/nn/tasks.py进行导入和注册我们的模块(此处只需要添加一次即可如果你用我其它的改进机制这里的步骤只需要添加一次)4.5 修改五在ultralytics/nn/tasks.py文件内的parse_model方法函数内位置大概在1500行左右按照图示位置添加即可此处需要自己有一定的判别能力如果不会可联系作者获得视频教程。4.6 修改六在ultralytics/nn/tasks.py文件内的parse_model方法函数内位置大概在1600行左右按照图示位置进行代码的替换即可此处不改如果你yaml文件中的所有C3k2都被改名了则检测头会使用老版本的v8检测头参数量会大幅度增加但不影响运行很多人都忽略了这一步。if C3k2 in getattr(m, __name__, str(m)): legacy False if scale in mlx: args[3] True到此就修改完成了大家可以复制下面的yaml文件运行更多使用方式可以联系作者获得使用视频本文仅列出常见的使用方式。五、正式训练5.1 yaml文件训练信息YOLO26-C3k2-MANet summary: 231 layers, 4,014,284 parameters, 4,014,284 gradients, 11.1 GFLOPs# Ultralytics AGPL-3.0 License - https://ultralytics.com/license # Ultralytics YOLO26 object detection model with P3/8 - P5/32 outputs # Model docs: https://docs.ultralytics.com/models/yolo26 # Task docs: https://docs.ultralytics.com/tasks/detect # Parameters nc: 80 # number of classes end2end: True # whether to use end-to-end mode reg_max: 1 # DFL bins scales: # model compound scaling constants, i.e. modelyolo26n.yaml will call yolo26.yaml with scale n # [depth, width, max_channels] n: [0.50, 0.25, 1024] # summary: 260 layers, 2,572,280 parameters, 2,572,280 gradients, 6.1 GFLOPs s: [0.50, 0.50, 1024] # summary: 260 layers, 10,009,784 parameters, 10,009,784 gradients, 22.8 GFLOPs m: [0.50, 1.00, 512] # summary: 280 layers, 21,896,248 parameters, 21,896,248 gradients, 75.4 GFLOPs l: [1.00, 1.00, 512] # summary: 392 layers, 26,299,704 parameters, 26,299,704 gradients, 93.8 GFLOPs x: [1.00, 1.50, 512] # summary: 392 layers, 58,993,368 parameters, 58,993,368 gradients, 209.5 GFLOPs # YOLO26n 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, 2, MANet, [256, False, 0.25]] - [-1, 1, Conv, [256, 3, 2]] # 3-P3/8 - [-1, 2, MANet, [512, False, 0.25]] - [-1, 1, Conv, [512, 3, 2]] # 5-P4/16 - [-1, 2, MANet, [512, True]] - [-1, 1, Conv, [1024, 3, 2]] # 7-P5/32 - [-1, 2, MANet, [1024, True]] - [-1, 1, SPPF, [1024, 5, 3, True]] # 9 - [-1, 2, C2PSA, [1024]] # 10 # YOLO26n head head: - [-1, 1, nn.Upsample, [None, 2, nearest]] - [[-1, 6], 1, Concat, [1]] # cat backbone P4 - [-1, 2, MANet, [512, True]] # 13 - [-1, 1, nn.Upsample, [None, 2, nearest]] - [[-1, 4], 1, Concat, [1]] # cat backbone P3 - [-1, 2, MANet, [256, True]] # 16 (P3/8-small) - [-1, 1, Conv, [256, 3, 2]] - [[-1, 13], 1, Concat, [1]] # cat head P4 - [-1, 2, MANet, [512, True]] # 19 (P4/16-medium) - [-1, 1, Conv, [512, 3, 2]] - [[-1, 10], 1, Concat, [1]] # cat head P5 - [-1, 1, MANet, [1024, True, 0.5, True]] # 22 (P5/32-large) - [[16, 19, 22], 1, Detect, [nc]] # Detect(P3, P4, P5)5.2 训练代码大家可以创建一个py文件将我给的代码复制粘贴进去配置好自己的文件路径即可运行。import warnings warnings.filterwarnings(ignore) from ultralytics import YOLO if __name__ __main__: model YOLO(模型配置文件地址,也就是5.1你保存到本地文件的地址) # 如何切换模型版本, 上面的ymal文件可以改为 yolo26s.yaml就是使用的26s, # 类似某个改进的yaml文件名称为yolo26-XXX.yaml那么如果想使用其它版本就把上面的名称改为yolo26l-XXX.yaml即可改的是上面YOLO中间的名字不是配置文件的 # model.load(yolo26n.pt) # 是否加载预训练权重,科研不建议大家加载否则很难提升精度 model.train( datar数据集文件地址, # 如果大家任务是其它的ultralytics/cfg/default.yaml找到这里修改task可以改成detect, segment, classify, pose cacheFalse, imgsz640, epochs20, single_clsFalse, # 是否是单类别检测 batch16, close_mosaic0, workers0, device0, optimizerMuSGD, # using SGD/MuSGD # resume, # 这里是填写last.pt地址 ampTrue, # 如果出现训练损失为Nan可以关闭amp projectruns/train, nameexp, )5.3 训练过程截图五、本文总结到此本文的正式分享内容就结束了在这里给大家推荐我的YOLOv26改进有效涨点专栏本专栏目前为新开的平均质量分98分后期我会根据各种最新的前沿顶会进行论文复现也会对一些老的改进机制进行补充如果大家觉得本文帮助到你了订阅本专栏关注后续更多的更新~专栏链接
yolov26改进 | Conv/卷积篇 | 利用Hype-YOLO提出MANet增强YOLOv26特征提取能力(附独家网络结构图)
发布时间:2026/6/1 15:59:34
开始讲解之前推荐一下我的专栏本专栏的内容支持(分类、检测、分割、追踪、关键点检测),专栏目前为限时折扣欢迎大家订阅本专栏本专栏每周更新5-7篇最新机制更有包含我所有改进的文件和交流群提供给大家本人定期在群内分享发表论文方法和经验。一、本文介绍本文给大家带来的最新改进机制是由Hype-YOLO提出的MANet结构其是一种C3、C2f、C3k2的升级版用于增强特征提取能力。MANet可以理解为C2f的升级版其整合了DSConv和C2f结构这些模块的组合使得信息流动更加丰富有助于在训练过程中提高梯度流动从而增加基础特征的语义深度。官方发布的数据中HypeYOLO的精度是高于YOLOv26的本文内容包含MAnet替换C3k2的教程以及原理介绍。欢迎大家订阅我的专栏一起学习YOLO购买专栏读者联系读者入群获取进阶项目文件文字学不会的读者作者可提供视频学习方法.专栏链接YOLOv26有效涨点专栏包含Conv、注意力机制、主干/Backbone、损失函数、优化器、后处理等改进机制目录一、本文介绍二、原理介绍三、核心代码四、添加方法4.1 修改一4.2 修改二4.3 修改三4.4 修改四4.5 修改五4.6 修改六五、正式训练5.1 yaml文件5.2 训练代码5.3 训练过程截图五、本文总结二、原理介绍论文链接官方论文链接点击此处即可跳转代码链接官方代码链接点击此处即可跳转MANet混合聚合网络由多个模块组成旨在增强网络的特征提取能力。主要组成如下输入和初步卷积输入的特征通过一个 1×1 卷积 层产生通道数为 2c 的特征。深度可分离卷积DSConv通过 DSConv 处理特征这种卷积方法通常用于优化计算效率减少模型参数。接着通过 1×1 卷积再经过 深度可分离卷积处理后生成 4c 的特征。然后进行 1×1 点卷积生成最终 c 通道的特征。特征拆分与聚合特征被拆分并传入多个 ConvNeck 模块进行进一步的处理多个 ConvNeck 模块串联后得到多层特征输出。每个 ConvNeck 模块由 3×3 卷积 组成用于进一步抽取特征。拼接与输出所有特征拼接在一起并通过一个 1×1 卷积 将通道数转换为 c_out最终输出。MANet 的核心思想是通过将多种卷积结构结合使用不仅增强了网络的信息流还提高了梯度流动效率从而增强了网络的特征提取能力。通过这种方法MANet 能够有效地提升 Hyper-YOLO 等模型在目标检测任务中的表现。三、核心代码核心代码的使用方式看章节四import torch.nn as nn import torch import math __all__ [MANet] def autopad(k, pNone, d1): # kernel, padding, dilation Pad to same shape outputs. if d 1: k d * (k - 1) 1 if isinstance(k, int) else [d * (x - 1) 1 for x in k] # actual kernel-size if p is None: p k // 2 if isinstance(k, int) else [x // 2 for x in k] # auto-pad return p class Conv(nn.Module): Standard convolution with args(ch_in, ch_out, kernel, stride, padding, groups, dilation, activation). default_act nn.SiLU() # default activation def __init__(self, c1, c2, k1, s1, pNone, g1, d1, actTrue): Initialize Conv layer with given arguments including activation. super().__init__() self.conv nn.Conv2d(c1, c2, k, s, autopad(k, p, d), groupsg, dilationd, biasFalse) self.bn nn.BatchNorm2d(c2) self.act self.default_act if act is True else act if isinstance(act, nn.Module) else nn.Identity() def forward(self, x): Apply convolution, batch normalization and activation to input tensor. return self.act(self.bn(self.conv(x))) def forward_fuse(self, x): Perform transposed convolution of 2D data. return self.act(self.conv(x)) class GroupConv(Conv): Depth-wise convolution. def __init__(self, c1, c2, k1, s1, d1, actTrue): # ch_in, ch_out, kernel, stride, dilation, activation super().__init__(c1, c2, k, s, gmath.gcd(c1, c2), dd, actact) class Bottleneck(nn.Module): Standard bottleneck. def __init__(self, c1, c2, shortcutTrue, g1, k(3, 3), e0.5): Initializes a bottleneck module with given input/output channels, shortcut option, group, kernels, and expansion. super().__init__() c_ int(c2 * e) # hidden channels self.cv1 Conv(c1, c_, k[0], 1) self.cv2 Conv(c_, c2, k[1], 1, gg) self.add shortcut and c1 c2 def forward(self, x): forward() applies the YOLO FPN to input data. return x self.cv2(self.cv1(x)) if self.add else self.cv2(self.cv1(x)) class MANet(nn.Module): def __init__(self, c1, c2, n1, shortcutFalse, p1, kernel_size3, g1, e0.5): super().__init__() self.c int(c2 * e) self.cv_first Conv(c1, 2 * self.c, 1, 1) self.cv_final Conv((4 n) * self.c, c2, 1) self.m nn.ModuleList(Bottleneck(self.c, self.c, shortcut, g, k((3, 3), (3, 3)), e1.0) for _ in range(n)) self.cv_block_1 Conv(2 * self.c, self.c, 1, 1) dim_hid int(p * 2 * self.c) self.cv_block_2 nn.Sequential(Conv(2 * self.c, dim_hid, 1, 1), GroupConv(dim_hid, dim_hid, kernel_size, 1), Conv(dim_hid, self.c, 1, 1)) def forward(self, x): y self.cv_first(x) y0 self.cv_block_1(y) y1 self.cv_block_2(y) y2, y3 y.chunk(2, 1) y list((y0, y1, y2, y3)) y.extend(m(y[-1]) for m in self.m) return self.cv_final(torch.cat(y, 1))四、添加方法下面的步骤如果你不会或者不想麻烦操作可以联系作者获得本专栏添加所有项目文件的源代码可直接训练.4.1 修改一第一还是建立文件我们找到如下ultralytics/nn文件夹下建立一个目录名字呢就是Addmodules文件夹4.2 修改二然后在Addmodules文件夹内建立一个新的py文件将本文章节三中的“核心代码复制粘贴进去。4.3 修改三第二步我们在该目录下创建一个新的py文件名字为__init__.py然后在其内部导入我们的文件如下图所示。4.4 修改四第三步我门中到如下文件ultralytics/nn/tasks.py进行导入和注册我们的模块(此处只需要添加一次即可如果你用我其它的改进机制这里的步骤只需要添加一次)4.5 修改五在ultralytics/nn/tasks.py文件内的parse_model方法函数内位置大概在1500行左右按照图示位置添加即可此处需要自己有一定的判别能力如果不会可联系作者获得视频教程。4.6 修改六在ultralytics/nn/tasks.py文件内的parse_model方法函数内位置大概在1600行左右按照图示位置进行代码的替换即可此处不改如果你yaml文件中的所有C3k2都被改名了则检测头会使用老版本的v8检测头参数量会大幅度增加但不影响运行很多人都忽略了这一步。if C3k2 in getattr(m, __name__, str(m)): legacy False if scale in mlx: args[3] True到此就修改完成了大家可以复制下面的yaml文件运行更多使用方式可以联系作者获得使用视频本文仅列出常见的使用方式。五、正式训练5.1 yaml文件训练信息YOLO26-C3k2-MANet summary: 231 layers, 4,014,284 parameters, 4,014,284 gradients, 11.1 GFLOPs# Ultralytics AGPL-3.0 License - https://ultralytics.com/license # Ultralytics YOLO26 object detection model with P3/8 - P5/32 outputs # Model docs: https://docs.ultralytics.com/models/yolo26 # Task docs: https://docs.ultralytics.com/tasks/detect # Parameters nc: 80 # number of classes end2end: True # whether to use end-to-end mode reg_max: 1 # DFL bins scales: # model compound scaling constants, i.e. modelyolo26n.yaml will call yolo26.yaml with scale n # [depth, width, max_channels] n: [0.50, 0.25, 1024] # summary: 260 layers, 2,572,280 parameters, 2,572,280 gradients, 6.1 GFLOPs s: [0.50, 0.50, 1024] # summary: 260 layers, 10,009,784 parameters, 10,009,784 gradients, 22.8 GFLOPs m: [0.50, 1.00, 512] # summary: 280 layers, 21,896,248 parameters, 21,896,248 gradients, 75.4 GFLOPs l: [1.00, 1.00, 512] # summary: 392 layers, 26,299,704 parameters, 26,299,704 gradients, 93.8 GFLOPs x: [1.00, 1.50, 512] # summary: 392 layers, 58,993,368 parameters, 58,993,368 gradients, 209.5 GFLOPs # YOLO26n 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, 2, MANet, [256, False, 0.25]] - [-1, 1, Conv, [256, 3, 2]] # 3-P3/8 - [-1, 2, MANet, [512, False, 0.25]] - [-1, 1, Conv, [512, 3, 2]] # 5-P4/16 - [-1, 2, MANet, [512, True]] - [-1, 1, Conv, [1024, 3, 2]] # 7-P5/32 - [-1, 2, MANet, [1024, True]] - [-1, 1, SPPF, [1024, 5, 3, True]] # 9 - [-1, 2, C2PSA, [1024]] # 10 # YOLO26n head head: - [-1, 1, nn.Upsample, [None, 2, nearest]] - [[-1, 6], 1, Concat, [1]] # cat backbone P4 - [-1, 2, MANet, [512, True]] # 13 - [-1, 1, nn.Upsample, [None, 2, nearest]] - [[-1, 4], 1, Concat, [1]] # cat backbone P3 - [-1, 2, MANet, [256, True]] # 16 (P3/8-small) - [-1, 1, Conv, [256, 3, 2]] - [[-1, 13], 1, Concat, [1]] # cat head P4 - [-1, 2, MANet, [512, True]] # 19 (P4/16-medium) - [-1, 1, Conv, [512, 3, 2]] - [[-1, 10], 1, Concat, [1]] # cat head P5 - [-1, 1, MANet, [1024, True, 0.5, True]] # 22 (P5/32-large) - [[16, 19, 22], 1, Detect, [nc]] # Detect(P3, P4, P5)5.2 训练代码大家可以创建一个py文件将我给的代码复制粘贴进去配置好自己的文件路径即可运行。import warnings warnings.filterwarnings(ignore) from ultralytics import YOLO if __name__ __main__: model YOLO(模型配置文件地址,也就是5.1你保存到本地文件的地址) # 如何切换模型版本, 上面的ymal文件可以改为 yolo26s.yaml就是使用的26s, # 类似某个改进的yaml文件名称为yolo26-XXX.yaml那么如果想使用其它版本就把上面的名称改为yolo26l-XXX.yaml即可改的是上面YOLO中间的名字不是配置文件的 # model.load(yolo26n.pt) # 是否加载预训练权重,科研不建议大家加载否则很难提升精度 model.train( datar数据集文件地址, # 如果大家任务是其它的ultralytics/cfg/default.yaml找到这里修改task可以改成detect, segment, classify, pose cacheFalse, imgsz640, epochs20, single_clsFalse, # 是否是单类别检测 batch16, close_mosaic0, workers0, device0, optimizerMuSGD, # using SGD/MuSGD # resume, # 这里是填写last.pt地址 ampTrue, # 如果出现训练损失为Nan可以关闭amp projectruns/train, nameexp, )5.3 训练过程截图五、本文总结到此本文的正式分享内容就结束了在这里给大家推荐我的YOLOv26改进有效涨点专栏本专栏目前为新开的平均质量分98分后期我会根据各种最新的前沿顶会进行论文复现也会对一些老的改进机制进行补充如果大家觉得本文帮助到你了订阅本专栏关注后续更多的更新~专栏链接