电子商务网站建设报告分析,二级域名搭wordpress,做物流公司网站哪家好,新网站如何做流量#x1f341;#x1f341;#x1f341;图像分割实战-系列教程 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Pycharm中进行 本篇文章配套的代码资源已经上传 deeplab系列算法概述 deeplabV3 VOC分割实战1 deeplabV3 VOC分割实战2 deeplabV3 VOC分割实战3 dee…
图像分割实战-系列教程 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Pycharm中进行 本篇文章配套的代码资源已经上传 deeplab系列算法概述 deeplabV3 VOC分割实战1 deeplabV3 VOC分割实战2 deeplabV3 VOC分割实战3 deeplabV3 VOC分割实战4 deeplabV3 VOC分割实战5
本项目的网络结构在network文件夹中主要在modeling.py和_deeplab.py中 modeling.py指定要用的骨干网络是什么 _deeplab.py根据modeling.py指定的骨干网络构建实际的网络结构
5、modeling.py的 _segm_resnet函数
def _segm_resnet(name, backbone_name, num_classes, output_stride, pretrained_backbone):if output_stride8:replace_stride_with_dilation[False, True, True]aspp_dilate [12, 24, 36]else:replace_stride_with_dilation[False, False, True]aspp_dilate [6, 12, 18]如果输出步长为8则替换步长用膨胀率如果为None设置默认值为[False, False, False]表示不使用空洞卷积通过使用空洞卷积替代增加步长的标准卷积膨胀率为[12, 24, 36]用于调整空洞卷积如果输出步长不是8则设置另外的参数 backbone resnet.__dict__[backbone_name](pretrainedpretrained_backbone, replace_stride_with_dilationreplace_stride_with_dilation)inplanes 2048low_level_planes 256使用指定的ResNet版本构建backboneresnet.__dict__是一个指向不同ResNet模型的字典pretrainedpretrained_backbone指定是否加载预训练权重replace_stride_with_dilation用于控制网络中卷积层的步长和膨胀inplanes 2048设置网络最后一层的通道数low_level_planes 256设置低层特征的通道数 if namedeeplabv3plus:return_layers {layer4: out, layer1: low_level}#classifier DeepLabHeadV3Plus(inplanes, low_level_planes, num_classes, aspp_dilate)elif namedeeplabv3:return_layers {layer4: out}classifier DeepLabHead(inplanes , num_classes, aspp_dilate)# 提取网络的第几层输出结果并给一个别名backbone IntermediateLayerGetter(backbone, return_layersreturn_layers)model DeepLabV3(backbone, classifier)return modelreturn_layers 是一个字典定义返回层这个键值不用管out对应的是带有高维度特征的输出对应的是比较大的物体的分割low_level即小物体classifier 初始化分类器inplanes 传入分类器的特征通道数 low_level_planes 是低层特征的通道数num_classes 是目标分类的类别数aspp_dilate 是ASPP模块中使用的膨胀率IntermediateLayerGetter(backbone, return_layersreturn_layers)这里的backbone是之前定义的基础网络如resnetreturn_layers定义了要从哪些层输出IntermediateLayerGetter使得我们可以在后续的网络部分中使用这些特定层的输出进行进一步的处理和特征融合最后得到修改后的backbonemodel DeepLabV3(backbone, classifier)使用修改后的backbone 和定义好的classifier构建DeepLabHeadV3Plus模型
6、_deeplab.py的 DeepLabHeadV3Plus类
在前面的_segm_resnet函数我们调用了DeepLabHeadV3Plus类来构建我们的网络这部分介绍一下DeepLabHeadV3Plus类
6.1 构造函数
class DeepLabHeadV3Plus(nn.Module):def __init__(self, in_channels, low_level_channels, num_classes, aspp_dilate[12, 24, 36]):super(DeepLabHeadV3Plus, self).__init__()self.project nn.Sequential( nn.Conv2d(low_level_channels, 48, 1, biasFalse),nn.BatchNorm2d(48),nn.ReLU(inplaceTrue),)self.aspp ASPP(in_channels, aspp_dilate)self.classifier nn.Sequential(nn.Conv2d(304, 256, 3, padding1, biasFalse),nn.BatchNorm2d(256),nn.ReLU(inplaceTrue),nn.Conv2d(256, num_classes, 1))self._init_weight()self.project定义一个执行序列包含一个二维卷积、一个批归一化、一个ReLU激活self.aspp调用ASPP类初始化一个对象self.classifier定义一个执行序列包含一个二维卷积、一个批归一化、一个ReLU激活、一个二维卷积self._init_weight()调用此类中一个函数这个函数主要用于初始化权重
6.2 前向传播函数 def forward(self, feature):low_level_feature self.project( feature[low_level] )#return_layers {layer4: out, layer1: low_level}output_feature self.aspp(feature[out])output_feature F.interpolate(output_feature, sizelow_level_feature.shape[2:], modebilinear, align_cornersFalse)return self.classifier( torch.cat( [ low_level_feature, output_feature ], dim1 ) )前向传播函数从前面的定义中获取低纬度的特征再经过一个卷积、归一化、激活的执行序列也就是1*1的卷积得到最终的low_level_feature从前面的定义中获取高纬度的特征经过一个ASPP特征提取网络得到最终的output_feature使用双线性插值调整output_feature 匹配low_level_feature 的维度最后将output_feature 与low_level_feature 拼接后再经过一个分类器执行序列得到最终DeepLabHeadV3Plus类的输出特征
6.3 def _init_weight(self):函数 def _init_weight(self):for m in self.modules():if isinstance(m, nn.Conv2d):nn.init.kaiming_normal_(m.weight)elif isinstance(m, (nn.BatchNorm2d, nn.GroupNorm)):nn.init.constant_(m.weight, 1)nn.init.constant_(m.bias, 0)初始化权重函数遍历模型 DeepLabHeadV3Plus 中的所有层如果当前这个层是卷积层则使用Kaiming初始化如果是批量标准化BatchNorm或组标准化GroupNorm层则将这些层的权重初始化为1将这些层的偏置初始化为0
deeplab系列算法概述 deeplabV3 VOC分割实战1 deeplabV3 VOC分割实战2 deeplabV3 VOC分割实战3 deeplabV3 VOC分割实战4 deeplabV3 VOC分割实战5