RT-DETR改进策略【Backbone/主干网络】| ICLR-2023 替换骨干网络为:RevCol 一种新型神经网络设计范式

一、本文介绍

本文记录的是基于RevCol的RT-DETR目标检测改进方法研究RevCol是一种新型神经网络设计范式,它由多个子网(列)及多级可逆连接构成,正向传播时特征逐渐解缠结且保持信息。可逆变换借鉴可逆神经网络思想,设计多级可逆单元用于解决模型对特征图形状的限制以及与信息瓶颈原则的冲突。本文将其应用到RT-DETR中,并配置了原论文中的revcol_tinyrevcol_smallrevcol_baserevcol_largerevcol_xlarge五种不同大小的模型,以适应不同的需求。


专栏目录:RT-DETR改进目录一览 | 涉及卷积层、轻量化、注意力、损失函数、Backbone、SPPF、Neck、检测头等全方位改进

专栏地址:RT-DETR改进专栏——以发表论文的角度,快速准确的找到有效涨点的创新点!


二、RevCol模型设计

2.1出发点

  • 信息瓶颈原则的局限:传统监督学习网络遵循信息瓶颈原则(IB),如图所示,靠近输入的层包含更多低级信息靠近输出的层富含语义信息,即与目标无关的信息在逐层传播中逐渐被压缩。但这种方式可能导致下游任务性能不佳,尤其当学习到的特征过度压缩或语义信息与目标任务无关,且源任务和目标任务存在领域差距时。

在这里插入图片描述

  • 解缠结特征学习的需求:提出构建网络学习解缠结表示,不同于IB学习,解缠结特征学习旨在将任务相关概念或语义分别嵌入到几个解耦维度,同时保持整个特征向量大致与输入有相同信息量,类似于生物细胞机制。

在计算机视觉任务中,学习解缠结特征是合理的,例如在Imag

### 3.1 替换主干网络的模块结构 在 RT-DETR 中,主干网络的作用是提取输入图像的多尺度特征。原始模型通常采用 ResNet18 作为主干网络,而 ConvNeXt V2 是一种基于深度卷积和全局响应归一化的全卷积架构,具有更强的特征表达能力和更少的参数量。 为了实现替换,首先需要导入 ConvNeXt V2 的结构,并确保其输出的特征图结构与 RT-DETR 的特征处理模块兼容。以下是一个基于 PyTorch 的示例实现: ```python import torch import torch.nn as nn from convnext import convnextv2_tiny # 假设 ConvNeXt V2 的实现已导入 class RTDETRBackbone(nn.Module): def __init__(self, backbone_name='convnextv2_tiny', pretrained=True): super(RTDETRBackbone, self).__init__() if backbone_name == 'convnextv2_tiny': self.backbone = convnextv2_tiny(pretrained=pretrained) else: raise NotImplementedError(f"Unsupported backbone: {backbone_name}") # 根据 ConvNeXt 输出通道数定义特征金字塔的输入通道 self.feat_channels = [96, 192, 384, 768] # ConvNeXt V2 Tiny 输出通道 def forward(self, x): features = self.backbone(x) return features ``` 该模块将 ConvNeXt V2 集成到 RT-DETR主干网络中,并返回多尺度特征图,供后续的特征金字塔网络(FPN)或 Transformer 模块使用。 ### 3.2 调整特征金字塔网络(FPN) 由于 ConvNeXt V2 的输出通道数与 ResNet18 不同,需要调整特征金字塔网络的输入维度。例如,假设 RT-DETR 原始 FPN 的输入通道为 `[64, 128, 256, 512]`,则应将其修改为 `[96, 192, 384, 768]`,以匹配 ConvNeXt V2 的输出特征维度。 以下是一个调整 FPN 的示例代码: ```python from detectron2.modeling import FPN class RTDETRFPN(nn.Module): def __init__(self, backbone_channels, out_channels=256): super(RTDETRFPN, self).__init__() self.fpn = FPN( bottom_up=None, # 使用自定义主干网络 in_features=["p0", "p1", "p2", "p3"], # 假设 ConvNeXt 输出的特征层名称 in_channels_list=backbone_channels, # 修改为 ConvNeXt 的输出通道 out_channels=out_channels, norm="" ) def forward(self, features): return self.fpn(features) ``` ### 3.3 集成主干网络与检测头 在完成主干网络和 FPN 的替换后,需要将它们集成到 RT-DETR 的完整模型中。以下是一个简化版的集成代码: ```python class RTDETRWithConvNeXt(nn.Module): def __init__(self, num_classes=80): super(RTDETRWithConvNeXt, self).__init__() self.backbone = RTDETRBackbone() self.fpn = RTDETRFPN(backbone_channels=self.backbone.feat_channels) self.transformer = ... # RT-DETR 的 Transformer 模块 self.head = ... # 检测头模块 def forward(self, x): features = self.backbone(x) features = self.fpn(features) outputs = self.transformer(features) return self.head(outputs) ``` ### 3.4 预训练权重加载与微调 在完成模型结构替换后,可以加载 ConvNeXt V2 的预训练权重,以加速收敛并提升检测性能。以下是一个加载权重的示例代码: ```python model = RTDETRWithConvNeXt() state_dict = torch.load("convnextv2_tiny_1k_224_ema.pt") # 加载预训练权重 model.backbone.load_state_dict(state_dict, strict=False) # 允许部分匹配 ``` 随后,可以冻结主干网络的部分层,并对检测头和 FPN 进行微调: ```python for param in model.backbone.parameters(): param.requires_grad = False # 冻结主干网络 # 仅训练 FPN 和检测头 optimizer = torch.optim.AdamW([ {'params': model.fpn.parameters()}, {'params': model.transformer.parameters()}, {'params': model.head.parameters()} ], lr=1e-4) ``` 通过上述步骤,可以将 ConvNeXt V2 成功集成到 RT-DETR 中,并实现主干网络替换与优化。这种改进方法一方面利用全卷积掩码自动编码器在训练时优化特征学习,减少模型对大规模标注数据的依赖;另一方面,通过全局响应归一化层增强特征竞争,缓解特征坍塌问题,提高特征多样性[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Limiiiing

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

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

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

打赏作者

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

抵扣说明:

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

余额充值