深度学习模块C2f代码详解

C2f 是一个用于构建卷积神经网络(CNN)的模块,特别是在 YOLOv5 和 YOLOv8 等目标检测模型中。这个模块是一个改进的 CSP(Cross Stage Partial)Bottleneck 结构,旨在提高计算效率和特征提取能力。下面是对 C2f 类的详细解释:

类定义和初始化

Python复制

class C2f(nn.Module):

"""Faster Implementation of CSP Bottleneck with 2 convolutions."""

复制代码
def __init__(self, c1, c2, n=1, shortcut=False, g=1, e=0.5):
    """Initializes a CSP bottleneck with 2 convolutions and n Bottleneck blocks for faster processing."""
    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, k=((3, 3), (3, 3)), e=1.0) for _ in range(n))

c1: 输入通道数。

c2: 输出通道数。

n: Bottleneck 模块的数量,默认为 1。

shortcut: 是否使用残差连接,默认为 False。

g: 分组卷积的组数,默认为 1。

e: 扩展系数,用于计算隐藏层的通道数,默认为 0.5。

属性解释

self.c: 隐藏层的通道数,计算为 int(c2 * e)。

self.cv1: 第一个卷积层,将输入通道数 c1 转换为 2 * self.c。

self.cv2: 第二个卷积层,将 (2 + n) * self.c 转换为 c2。

self.m: 一个 ModuleList,包含 n 个 Bottleneck 模块。

前向传播方法

forward 方法

Python复制

python 复制代码
def forward(self, x):
    """Forward pass through C2f layer."""
    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))

self.cv1(x): 将输入 x 通过第一个卷积层 cv1,输出通道数为 2 * self.c。
.chunk(2, 1)****: 将输出张量沿着通道维度分成两部分,每部分的通道数为 self.c。
y.extend(m(y-1) for m in self.m): 将每个 Bottleneck 模块的输出依次添加到 y 列表中。y-1 表示上一个模块的输出。
torch.cat(y, 1): 将 y 列表中的所有张量沿着通道维度拼接在一起。
self.cv2(torch.cat(y, 1)): 将拼接后的张量通过第二个卷积层 cv2,输出通道数为 c2。

forward_split 方法

Python复制

python 复制代码
def forward_split(self, x):
    """Forward pass using split() instead of chunk()."""
    y = self.cv1(x).split((self.c, self.c), 1)
    y = [y[0], y[1]]
    y.extend(m(y[-1]) for m in self.m)
    return self.cv2(torch.cat(y, 1))

self.cv1(x).split((self.c, self.c), 1): 将输出张量沿着通道维度分成两部分,每部分的通道数为 self.c。
y = y\[0, y1]: 将分成的两部分存储在列表 y 中。
y.extend(m(y-1) for m in self.m): 将每个 Bottleneck 模块的输出依次添加到 y 列表中。y-1示上一个模块的输出。
torch.cat(y, 1):
将 y 列表中的所有张量沿着通道维度拼接在一起。
self.cv2(torch.cat(y, 1)): 将拼接后的张量通过第二个卷积层 cv2,输出通道数为 c2。

总结

C2f 模块通过以下步骤实现高效的特征提取和融合:

初始卷积:将输入通道数 c1 转换为 2 * self.c。

特征分割:将输出张量分成两部分,每部分的通道数为 self.c。

Bottleneck 模块:将每个 Bottleneck 模块的输出依次添加到特征列表中。

特征拼接:将所有特征沿着通道维度拼接在一起。

最终卷积:将拼接后的特征通过第二个卷积层,输出通道数为 c2。

相关推荐
星栈2 小时前
oh-my-pi工程级AI编码工使用体验
人工智能·后端·agent
建筑工程企业管理系统2 小时前
erp工程项目管理系统落地价值:实现工程多项目成本精细化核算与管控
大数据·数据库·人工智能
万岳科技系统开发3 小时前
校园跑腿外卖搭建助力高校周边商家拓展线上业务
大数据·人工智能·小程序
冬奇Lab3 小时前
开源项目第173期:AI For Beginners — 微软出品的 12 周 24 课 AI 完整课程
人工智能·开源·资讯
陈彬深大3 小时前
《AI 渐进编程》之二十三:自适应调度——什么时候启用多Agent流水线
人工智能
invicinble3 小时前
搭建智能体--skill和mcp的进一步理解
人工智能
周末程序猿3 小时前
LLM智能路由实践:通过 Harness 工程节约模型成本
人工智能·agent
冬奇Lab3 小时前
代码库知识库系列(04):三种 Chunking 策略对比——AST 精确分割反而输了?
人工智能
宋哥转AI3 小时前
深入理解 AI Agent 02|混合检索与重排序实战:BM25、RRF 与 Cross-Encoder 的工程实践
人工智能
LaughingZhu4 小时前
Product Hunt 每日热榜 | 2026-08-01
人工智能·深度学习·神经网络·搜索引擎·百度