DETR源码学习(一)之网络模型构建

该文详细介绍了DETR模型的构建过程,包括使用ResNet50作为backbone,构建Transformer的编码器和解码器,以及位置编码器的设置。DETR模型通过Transformer将backbone的输出转换为检测结果,涉及多头注意力机制和残差连接等关键组件。

在这里插入图片描述

这篇文章主要为记录DETR模型的构建过程
首先明确DETR模型的搭建顺序:首先是backbone的搭建,使用的是resnet50,随后是Transformer模型的构建,包含编码器的构建与解码器的构建,完成后则是整个DETR模型的构建
构建代码在detr.py文件中

	# 搭建主干网络
    backbone = build_backbone(args)
    # 搭建transfoemer
    transformer = build_transformer(args)
    # 搭建DETR模型
    model = DETR(
        backbone,
        transformer,
        num_classes=num_classes,
        num_queries=args.num_queries,
        aux_loss=args.aux_loss,
    )

我们来沿着这个代码逐步了解其构造

骨干网络构建

进入 backbone.py 的 build_backbone() 方法

def build_backbone(args):
    #搭建位置编码器
    position_embedding = build_position_encoding(args)
    #args.lr_backbone默认为1e-5,则train_backbone默认为true,通过设置backbone的lr来设置是否训练网络时
    # 接收backbone的梯度从而让backbone也训练。
    train_backbone = args.lr_backbone > 0

    #是否需要记录backbone的每层输出
    return_interm_layers = args.masks
    #构建骨干网络 args.backbone默认为resnet50,args.dilatyion默认为false。
    backbone = Backbone(args.backbone, train_backbone, return_interm_layers, args.dilation)
    # 将backbone和位置编码器集合在一起放在一个model里
    model = Joiner(backbone, position_embedding)
    # 设置model的输出通道数
    model.num_channels = backbone.num_channels
    return model

位置编码器构建

首先是位置编码器构造,进入position_encoding.py文件(注意位置编码最后是加上去的,故其前后维度不会发生变化。

def build_position_encoding(args):
    #args.hidden_dim    transformer的输入张量的channel数,位置编码和backbone的featuremap结合后需要输入到transformer中
    N_steps = args.hidden_dim // 2
    # 余弦编码方式,文章说采用正余弦函数,是根据归纳偏置和经验做出的选择
    if args.position_embedding in ('v2', 'sine'):
        # TODO find a better way of exposing other arguments
        #PositionEmbeddingSine(N_steps, normalize=True):正余弦编码方式,这种方式是将各个位置的各个维度映射到角度上,
        # 因此有个scale,默认是2pi。
        position_embedding = PositionEmbeddingSine(N_steps, normalize=True)
    # 可学习的编码方式
    elif args.position_embedding in ('v3', 'learned'):
        position_embedding = PositionEmbeddingLearned(N_steps)
    else:
        raise ValueError(f"not supported {
     
     args.position_embedding}")

    return position_embedding

返回的位置编码信息如下:

在这里插入图片描述

resnet50网络构建

随后使用pytorch的model库进行resnet50网络的构建

def __init__(self, name: str,
             train_backbone: bool,
             return_interm_layers: bool,
             dilation: bool):
    # getattr(obj,name)获取obj中命名为name的组成。可以理解为获取obj.name
    # 获取torchvision.models中实现的resnet50网络结构
    # replace_stride_with_dilation 决定是否使用膨胀卷积;pretrained 是否使用预训练模型;
    # norm_layer 使用FrozenBatchNorm2d归一化方式
    backbone = getattr(torchvision.models, name)(
        replace_stride_with_dilation=[False, False, dilation],
        pretrained=is_main_process(), norm_layer=FrozenBatchNorm2d)
    #获得resnet50网络结构,并设置输出channels为2048,所以我们的backbone的输出则是
    # (batch, 2048, H // 32,W // 32),在父类BackboneBase.__init__中进行初始化。
    num_channels = 512 if name in ('resnet18', 'resnet34') else 2048
    super().__init__(backbone, train_backbone, num_channels, return_interm_layers)

此时通过pytorch的model库获得的backbone为:其中已进行了相关参数的初始化

在这里插入图片描述
在最后其进入其父类进行进一步设置,逐层设置是否进行梯度更新,其构建的resnet模型中已是预训练模型,有参数。
通过下图可以看到backbone的主要结构,通道数

在这里插入图片描述
在这里插入图片描述

随后通过model = Joiner(backbone, position_embedding)将位置编码器与backbone构建到一个model中。并通过model.num_channels = backbone.num_channels设置新构成的model的通道数与backbone的通道数一致为2048。
Joiner构造后的结构如下:
在这里插入图片描述

Joiner(
  (0): Backbone(
      (layer1): Sequential( )
      (layer2): Sequential( )
      (layer3): Sequential( )
      (layer4): Sequential( )
    )
  (1): PositionEmbeddingSine()
)

详细结构如下:

Joiner(
  (0): Backbone(
    (body): IntermediateLayerGetter(
      (conv1): Conv2d(3, 64, kernel_size=(7, 7), stride=(2, 2), padding=(3, 3), bias=False)
      (bn1): FrozenBatchNorm2d()
      (relu): ReLU(inplace=True)
      (maxpool): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)
      (layer1): Sequential(
        (0): Bottleneck(
          (conv1): Conv2d(64, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)
          (bn1): FrozenBatchNorm2d()
          (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
          (bn2): FrozenBatchNorm2d()
          (conv3): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)
          (bn3): FrozenBatchNorm2d()
          (relu): ReLU(inplace=True)
          (downsample): Sequential(
            (0): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)
            (1): FrozenBatchNorm2d()
          )
        )
        (1): Bottleneck(
          (conv1): Conv2d(256, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)
          (bn1): FrozenBatchNorm2d()
          (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
          (bn2): FrozenBatchNorm2d()
          (conv3): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)
          (bn3): FrozenBatchNorm2d()
          (relu): ReLU(inplace=True)
        )
        (2): Bottleneck(
          (conv1): Conv2d(256, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)
          (bn1): FrozenBatchNorm2d()
          (conv2): Conv2d(64, 64, kernel_size=
### DAB-DETR 源码 GitHub 仓库下载 DAB-DETR种改进 DETR 的目标检测框架,其核心思想是通过动态锚框作为查询替代原始的 Transformer 查询向量[^1]。如果希望获取 DAB-DETR源码,可以通过以下方式访问官方或社区维护的相关资源。 #### 官方 GitHub 仓库地址 DAB-DETR 的官方实现通常托管在研究团队所属机构的公共存储库中。以下是可能找到该项目的地方: 1. **GitHub 地址**: 访问 [https://github.com/IDEA-Research/DAB-DETR](https://github.com/IDEA-Research/DAB-DETR),这是 IDEA Research 提供的个开源项目链接[^2]。此仓库包含了论文中的具体实现细节以及训练脚本。 2. **克隆命令**: 使用以下命令可以将代码克隆到本地环境: ```bash git clone https://github.com/IDEA-Research/DAB-DETR.git ``` 3. **依赖安装**: 在运行代码前,请确保按照 README 文件中的说明完成必要的依赖项安装。般情况下,这涉及 PyTorch 和其他计算机视觉工具包的配置。 4. **数据准备与模型训练**: 参考文档中的指导准备好 COCO 数据集或其他适用的数据集,并调整超参数以适配特定的任务需求[^3]。 --- ### 补充说明 除了上述提到的内容外,还需要注意些扩展性的改动。例如,在 Co-DETR 中引入了种新的标签分配策略——对多标签分配机制,用于解决匹配带来的局限性问题。这种设计能够显著提升小物体检测性能并增强整体鲁棒性。 对于进步的研究者来说,理解 `prepare_for_dn` 函数的作用至关重要,因为它负责生成初始的目标位置预测值(即 positive coordinates),从而帮助构建更高质量的学习信号。 --- ### 示例代码片段 下面是个简单的 Python 脚本来展示如何加载预训练权重文件并与自定义数据配合使用: ```python import torch from models.dab_detr import build_model # 构建模型实例 model, criterion, postprocessors = build_model() # 加载预训练权重 checkpoint = torch.load('path_to_checkpoint.pth', map_location='cpu') model.load_state_dict(checkpoint['model']) # 将模型设置为评估模式 model.eval() ``` 以上代码展示了基本的操作流程,实际应用时需依据具体情况修改路径及相关参数设定。 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

彭祥.

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

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

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

打赏作者

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

抵扣说明:

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

余额充值