网站开发vue,青岛公司的网站设计,最简短的培训心得,自己做的网站如何在百度搜到#x1f6a9;#x1f6a9;#x1f6a9;Transformer实战-系列教程总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Pycharm中进行 本篇文章配套的代码资源已经上传 点我下载源码 DETR 算法解读 DETR 源码解读1#xff08;项目配置/CocoDetection类#xff09; …Transformer实战-系列教程总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Pycharm中进行 本篇文章配套的代码资源已经上传 点我下载源码 DETR 算法解读 DETR 源码解读1项目配置/CocoDetection类 DETR 源码解读2ConvertCocoPolysToMask类 DETR 源码解读3DETR类 DETR 源码解读4Joiner类/PositionEmbeddingSine类/位置编码/backbone
7、BackboneBase类
位置models/backbone.py/BackboneBase类
7.1 构造函数
class BackboneBase(nn.Module):def __init__(self, backbone: nn.Module, train_backbone: bool, num_channels: int, return_interm_layers: bool):super().__init__()for name, parameter in backbone.named_parameters():if not train_backbone or layer2 not in name and layer3 not in name and layer4 not in name:parameter.requires_grad_(False)if return_interm_layers:return_layers {layer1: 0, layer2: 1, layer3: 2, layer4: 3}else:return_layers {layer4: 0}self.body IntermediateLayerGetter(backbone, return_layersreturn_layers)self.num_channels num_channels定义一个继承nn.Module的类构造函数传入4个参数 backbone一个nn.Module对象代表用于特征提取的骨架网络train_backbone是否训练backbonenum_channelsbackbone通道数return_interm_layers是否返回backbone的中间层输出 初始化遍历backbone的所有参数named_parameters()方法返回网络中所有参数的迭代器包括参数的名称和值如果train_backbone设置为False且不训练layer2、layer3和layer4也就是说如果train_backbone为Falsebackbone的所有层的所有参数都不需要训练即所有层都被冻住不需要训练的参数的requires_grad属性设置为False根据return_interm_layers的值选择性地设置return_layers字典一个层对应一个值这个字典定义了哪些层的输出将被返回创建IntermediateLayerGetter实例它封装了backbone根据return_layers字典决定返回哪些层的输出IntermediateLayerGetter来自torchvisionnum_channels
7.2 前向传播 def forward(self, tensor_list: NestedTensor):xs self.body(tensor_list.tensors)out: Dict[str, NestedTensor] {}for name, x in xs.items():m tensor_list.maskassert m is not Nonemask F.interpolate(m[None].float(), sizex.shape[-2:]).to(torch.bool)[0]out[name] NestedTensor(x, mask)return out前向传播函数接收NestedTensor对象作为输入xs 获取指定层的输出out初始化一个字典存储每个返回层的输出及其对应的新掩码遍历xsitems获取mask确认mask存在计算新的掩码将输出和新掩码封装为NestedTensor对象返回out字典
8、Backbone类
8.1 Backbone类
位置models/backbone.py/Backbone类
class Backbone(BackboneBase):def __init__(self, name: str, train_backbone: bool, return_interm_layers: bool, dilation: bool):backbone getattr(torchvision.models, name)(replace_stride_with_dilation[False, False, dilation],pretrainedis_main_process(), norm_layerFrozenBatchNorm2d)num_channels 512 if name in (resnet18, resnet34) else 2048super().__init__(backbone, train_backbone, num_channels, return_interm_layers)定义一个继承BackboneBase的类初始化方法接受四个参数 name字符串指定要使用的ResNet模型的名称如resnet50、resnet101等train_backbone布尔值指示是否训练backbonereturn_interm_layers布尔值指示是否返回backbone的中间层输出dilation布尔值指示在网络的最后几层是否应用空洞卷积dilation以增加感受野 通过torchvision.models动态获取指定名称的ResNet模型replace_stride_with_dilation最后一个stage应用空洞卷积pretrained根据is_main_process()的返回值决定是否加载预训练权重norm_layer设置为FrozenBatchNorm2d在backbone中使用冻结的批归一化根据ResNet模型的不同设置不同的输出通道数调用基类BackboneBase的初始化方法传递创建的backbone实例和其他参数
这个Backbone类通过提供对ResNet模型的封装允许用户灵活地选择不同的配置例如是否训练Backbone、是否返回中间层输出以及是否在网络后段应用空洞卷积。同时通过使用冻结的批量归一化层可以在不调整BN层参数的情况下利用预训练的模型进行特征提取
8.2 build_backbone()函数
位置models/backbone.py/build_backbone()函数
本项目的backbone主要是调用resnet用来提取图像特征进而构建图像序列做Transformer的输入backbone的构建主要通过这个函数来实现
def build_backbone(args):position_embedding build_position_encoding(args)train_backbone args.lr_backbone 0return_interm_layers args.masksbackbone Backbone(args.backbone, train_backbone, return_interm_layers, args.dilation)model Joiner(backbone, position_embedding)model.num_channels backbone.num_channelsreturn model这段代码定义了一个名为build_backbone的函数用于根据提供的参数构建一个含有位置编码的骨架网络模型。以下是对这段代码的逐行解释
函数build_backbone接收命令行参数position_embedding 调用build_position_encoding函数构建位置编码通过lr_backbonebackbone的学习率是否大于0来决定是否训练backboneargs.masks指示是否需要骨架网络返回中间层的输出通过Backbone类构建backbone通过Joiner类传入backbone和位置编码建立backbone模型
DETR 算法解读 DETR 源码解读1项目配置/CocoDetection类 DETR 源码解读2ConvertCocoPolysToMask类 DETR 源码解读3DETR类 DETR 源码解读4Joiner类/PositionEmbeddingSine类/位置编码/backbone