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报告给了官方。

相关推荐
Swift社区14 小时前
RN 项目中“页面存在 ≠ 页面可见”会导致哪些隐藏 Bug?
react native·bug·react
tongyue15 小时前
天问esp32驱动DHT11官方程序BUG修复
bug
laocooon5238578862 天前
写代码 调bug相关信息
bug
鸿儒5172 天前
记录一个C++操作8位影像的一个bug
开发语言·c++·bug
·云扬·2 天前
【Bug】 Elasticsearch启动失败(exit code 78):2个bootstrap检查问题排查与解决
elasticsearch·bootstrap·bug
BrianGriffin3 天前
get_download_file_path: command not found (asdf bug已解决)
bug
咸虾米_3 天前
解决九两酒商城[uni-pay-co]: Error:执行失败,积 分需要大于等于1的bug
bug·unicloud云开发·微信小程序商城·uniapp项目
凯子坚持 c3 天前
Git分支实战指南:如何优雅地管理版本、修复Bug并解决合并冲突
git·bug
北冥有渔jy3 天前
BT6.0常见的BUG
网络·安全·bug·蓝牙
测试19983 天前
一个只能通过压测发现Bug
自动化测试·软件测试·python·selenium·测试工具·bug·压力测试