Ultralytics中的RT-DETR模块的RepC3 bug

在跑U版本的RT-DETR,我修改了RepC3的e的默然参数,e 不等于1的时候,程序就会报错,在检查代码的时候,发现官方的代码有问题。

原来的代码:

python 复制代码
class RepC3(nn.Module):
    """Rep C3."""

    def __init__(self, c1, c2, n=3, e=1.0):
        """Initialize CSP Bottleneck with a single convolution using input channels, output channels, and number."""
        super().__init__()
        c_ = int(c2 * e)  # hidden channels
        self.cv1 = Conv(c1, c2, 1, 1)
        self.cv2 = Conv(c1, c2, 1, 1)
        self.m = nn.Sequential(*[RepConv(c_, c_) for _ in range(n)])
        self.cv3 = Conv(c_, c2, 1, 1) if c_ != c2 else nn.Identity()

    def forward(self, x):
        """Forward pass of RT-DETR neck layer."""
        return self.cv3(self.m(self.cv1(x)) + self.cv2(x))

在当前的代码实现中,self.cv1self.cv2的输出通道数应为隐藏层通道数c_而非最终输出通道数c2,否则会导致维度不匹配的问题。

问题分析:

  1. 维度不匹配: 当扩展系数 e ≠ 1 时,c_ = c2 * e 会改变通道数。若 self.cv1 的输出通道为 c2,而后续模块 self.m 中的 RepConv 层要求输入通道为 c_,将引发维度错误。

  2. 设计逻辑: RepC3 的结构预期是先将输入通道通过 cv1/cv2 调整到隐藏层 c_,经过处理后再通过 cv3 调整到目标输出 c2

修正后的代码:

python 复制代码
class RepC3(nn.Module):
    """Rep C3."""

    def __init__(self, c1, c2, n=3, e=1.0):
        super().__init__()
        c_ = int(c2 * e)  # 隐藏通道数
        self.cv1 = Conv(c1, c_, 1, 1)  # 修正为c_
        self.cv2 = Conv(c1, c_, 1, 1)  # 修正为c_
        self.m = nn.Sequential(*[RepConv(c_, c_) for _ in range(n)])
        self.cv3 = Conv(c_, c2, 1, 1) if c_ != c2 else nn.Identity()

    def forward(self, x):
        return self.cv3(self.m(self.cv1(x)) + self.cv2(x))

修改说明:

  • self.cv1self.cv2 的输出通道从 c2 改为 c_,确保与后续 RepConv 层的输入通道一致。

  • self.cv3 负责将隐藏通道 c_ 映射到目标输出通道 c2,保证最终输出尺寸正确。

此修正确保了在任意扩展系数 e 下,网络层的维度计算均正确,避免了潜在的错误。已将bug报告给了官方。

相关推荐
sg_knight13 小时前
Claude Code 如何辅助定位 Bug 和问题代码
java·前端·bug·ai编程·claude·code·claude-code
读忆14 小时前
在前端开发中使用组件后, 若是出了bug, 应该如何排查, 怎么排查, 解决方式是什么?
前端·javascript·vue.js·bug
IT二叔2 天前
Git Flow04-bug修改流程
git·bug
万粉变现经纪人3 天前
如何解决 pip install shapely 报错 GEOS C 库未找到 问题
c语言·开发语言·python·pycharm·bug·pandas·pip
cyforkk3 天前
前后端联调实战:解决业务异常被误判为成功的“幽灵 Bug”
bug·状态模式
li9056632803 天前
hanzi-writer-miniprogram Path2D问题以及Bug修复
微信小程序·bug
万粉变现经纪人3 天前
如何解决 pip install cx_Oracle 报错 未找到 Oracle Instant Client 问题
数据库·python·mysql·oracle·pycharm·bug·pip
ChoSeitaku5 天前
Git分支|创建分支|切换分支|合并分支|删除分支|合并冲突分支|分支策略|bug分支|强制删除分支
bug
Lxinccode5 天前
BUG(23) : node版claude code启动报错Failed to connect to api.anthropic.com: ETIMEDOUT
bug·claude·claude启动报错
buyulian6 天前
Bug防御体系:技术方案的优与劣
java·经验分享·bug·软件工程