YOLOv8之C2f模块——与YOLOv5的C3模块对比

文章对比了YOLOv8中的C2f模块和YOLOv5中的C3模块,两者在初始化参数、源码实现及结构上的差异。C2f模块默认不使用shortcut,而C3模块则默认使用,但两者的shortcut位置在网络结构中相同。C2f设计灵感来源于C3和ELAN,旨在轻量级网络中增强梯度流信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、源码对比

  YOLOv8完整工程代码下载:ultralytics/ultralytic
  C2f模块源码在ultralytics/nn/modules.py下,源码如下:

class C2f(nn.Module):
    # CSP Bottleneck with 2 convolutions
    def __init__(self, c1, c2, n=1, shortcut=False, g=1, e=0.5):  # ch_in, ch_out, number, shortcut, groups, expansion
        super().__init__()
        self.c = int(c2 * e)  # hidden channels
        self.cv1 = Conv(c1, 2 * self.c, 1, 1)
        self.cv2 = Conv((2 + n) * self.c, c2, 1)  # optional act=FReLU(c2)
        self.m = nn.ModuleList(Bottleneck(self.c, self.c, shortcut, g, e=1.0) for _ in range(n))

    def forward(self, x):
        y = list(self.cv1(x).chunk(2, 1))
        y.extend(m(y[-1]) for m in self.m)
        return self.cv2(torch.cat(y, 1))

    def forward_split(self, x):
        y = list(self.cv1(x).split((self.c, self.c), 1))
        y.extend(m(y[-1]) for m in self.m)
        return self.cv2(torch.cat(y, 1))

  YOLOv5的完整工程代码下载:ultralytic/yolov5
  C3模块源码在models/common.py下,源码如下:

class C3(nn.Module):
    # CSP Bottleneck with 3 convolutions
    def __init__(self, c1, c2, n=1, shortcut=True, g=1, e=0.5):  # ch_in, ch_out, number, shortcut, groups, expansion
        super().__init__()
        c_ = int(c2 * e)  # hidden channels
        self.cv1 = Conv(c1, c_, 1, 1)
        self.cv2 = Conv(c1, c_, 1, 1)
        self.cv3 = Conv(2 * c_, c2, 1)  # optional act=FReLU(c2)
        self.m = nn.Sequential(*(Bottleneck(c_, c_, shortcut, g, e=1.0) for _ in range(n)))

    def forward(self, x):
        return self.cv3(torch.cat((self.m(self.cv1(x)), self.cv2(x)), 1))
  • C2f模块和C3模块的对外接口保持一致,都是(ch_in, ch_out, number, shortcut, groups, expansion),方便在yolov5中直接调用C2f模块。
  • C2f模块默认不使用shortcut连接,C3模块默认使用shortcut连接,但二者在网络结构中shortcut的位置无差别,即都是在Backbone中使用shortcut连接,在Head中不使用shortcut连接,代码的调用格式有差别。

二、结构图对比

在这里插入图片描述

图2-1 C3模块结构图

在这里插入图片描述

图2-2 C2f模块结构图
  • C2f模块参考了C3模块以及ELAN的思想进行的设计,让YOLOv8可以在保证轻量化的同时获得更加丰富的梯度流信息。
### C3K2 模块 C2F 的功能对比 #### 1. **C3K2 模块的功能** C3K2 是一种基于 C2F 构建的改进版本模块,其核心设计目标在于通过引入额外的选择机制来提升性能并优化计算效率。以下是 C3K2 的主要特点: - **继承自 C2F**: C3K2 继承了 C2F 的基本架构,并在其基础上进行了扩展。它调用了父类 `C2f` 的构造函数以初始化必要的参数[^1]。 - **动态选择子模块**: 根据输入参数 `c3k` 的布尔值判断,C3K2 可以灵活切换内部使用的子模块类型。如果 `c3k=True`,则使用 `C3k`;否则,默认采用传统的 `Bottleneck` 结构。 - **灵活性增强**: 这种动态选择的设计使得 C3K2 更加适应不同的应用场景需求。当需要更高的精度时可以选择复杂的 `C3k` 子模块;而在追求速度的情况下可以回退到轻量级的 `Bottleneck`[^2]。 #### 2. **C2F 模块的功能** 相比之下,C2F 则是一个更为基础的标准实现形式,主要用于构建卷积神经网络中的瓶颈层(bottleneck layers)。它的特性如下所示: - **固定结构配置**: 不具备像 C3K2 那样的条件分支逻辑,始终按照固定的模式执行操作——即仅由多个标准 Bottleneck 单元组成而无其他变体选项存在。 - **简化版处理流程**: 缺少针对特定场景定制化调整的能力,在面对复杂任务或者资源受限环境下的表现可能不如经过专门优化后的衍生型号那样理想高效。 #### 3. **两者之间的差异总结** | 特性 | C3K2 | C2F | |---------------------|------------------------------------------------------------------------------------------|------------------------------| | **继承关系** | 基于 C2F 扩展而来 | 独立的基础组件 | | **子模块支持** | 支持两种不同类型的子模块 (`C3k`, `Bottleneck`) | 固定为单一类型 (`Bottleneck`) | | **适用范围** | 更适合高性能要求的任务 | 较通用的应用场合 | | **运行效率 vs 准确率** | 提供了一个权衡点,允许开发者根据实际需求平衡模型大小、推理时间以及最终效果 | 主要关注简单性和稳定性 | 综上所述,C3K2不仅保留了原有C2F的优点还增加了更多可能性让使用者可以根据具体情况做出最佳决策从而达到更好的整体效益. ```python class ExampleUsage: def example_c3k2(): model = C3k2(c1=64, c2=128, n=3, c3k=True) print(model) def example_c2f(): model = C2f(c1=64, c2=128, n=3) print(model) ```
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晓shuo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值