图像分割实战-系列教程15:deeplabV3+ VOC分割实战3-------网络结构1

2024-01-21 01:20

本文主要是介绍图像分割实战-系列教程15:deeplabV3+ VOC分割实战3-------网络结构1,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述

🍁🍁🍁图像分割实战-系列教程 总目录

有任何问题欢迎在下面留言
本篇文章的代码运行界面均在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_stride==8: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](pretrained=pretrained_backbone, replace_stride_with_dilation=replace_stride_with_dilation)inplanes = 2048low_level_planes = 256
  • 使用指定的ResNet版本构建backbone
  • resnet.__dict__是一个指向不同ResNet模型的字典
  • pretrained=pretrained_backbone指定是否加载预训练权重
  • replace_stride_with_dilation用于控制网络中卷积层的步长和膨胀
  • inplanes = 2048:设置网络最后一层的通道数
  • low_level_planes = 256:设置低层特征的通道数
    if name=='deeplabv3plus':return_layers = {'layer4': 'out', 'layer1': 'low_level'}#classifier = DeepLabHeadV3Plus(inplanes, low_level_planes, num_classes, aspp_dilate)elif name=='deeplabv3':return_layers = {'layer4': 'out'}classifier = DeepLabHead(inplanes , num_classes, aspp_dilate)# 提取网络的第几层输出结果并给一个别名backbone = IntermediateLayerGetter(backbone, return_layers=return_layers)model = DeepLabV3(backbone, classifier)return model
  • return_layers 是一个字典,定义返回层,这个键值不用管,out对应的是带有高维度特征的输出对应的是比较大的物体的分割,low_level即小物体
  • classifier 初始化分类器,inplanes 传入分类器的特征通道数, low_level_planes 是低层特征的通道数,num_classes 是目标分类的类别数,aspp_dilate 是ASPP模块中使用的膨胀率
  • IntermediateLayerGetter(backbone, return_layers=return_layers),这里的backbone是之前定义的基础网络如resnet,return_layers定义了要从哪些层输出,IntermediateLayerGetter使得我们可以在后续的网络部分中使用这些特定层的输出进行进一步的处理和特征融合,最后得到修改后的backbone
  • model = 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, bias=False),nn.BatchNorm2d(48),nn.ReLU(inplace=True),)self.aspp = ASPP(in_channels, aspp_dilate)self.classifier = nn.Sequential(nn.Conv2d(304, 256, 3, padding=1, bias=False),nn.BatchNorm2d(256),nn.ReLU(inplace=True),nn.Conv2d(256, num_classes, 1))self._init_weight()
  1. self.project,定义一个执行序列,包含一个二维卷积、一个批归一化、一个ReLU激活
  2. self.aspp,调用ASPP类初始化一个对象
  3. self.classifier,定义一个执行序列包含一个二维卷积、一个批归一化、一个ReLU激活、一个二维卷积
  4. 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, size=low_level_feature.shape[2:], mode='bilinear', align_corners=False)return self.classifier( torch.cat( [ low_level_feature, output_feature ], dim=1 ) )
  1. 前向传播函数
  2. 从前面的定义中获取低纬度的特征,再经过一个卷积、归一化、激活的执行序列也就是1*1的卷积,得到最终的low_level_feature
  3. 从前面的定义中获取高纬度的特征,经过一个ASPP特征提取网络,得到最终的output_feature
  4. 使用双线性插值调整output_feature 匹配low_level_feature 的维度
  5. 最后将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)
  1. 初始化权重函数
  2. 遍历模型 DeepLabHeadV3Plus 中的所有层
  3. 如果当前这个层是卷积层,则:
  4. 使用Kaiming初始化
  5. 如果是批量标准化(BatchNorm)或组标准化(GroupNorm)层,则:
  6. 将这些层的权重初始化为1
  7. 将这些层的偏置初始化为0

deeplab系列算法概述
deeplabV3+ VOC分割实战1
deeplabV3+ VOC分割实战2
deeplabV3+ VOC分割实战3
deeplabV3+ VOC分割实战4
deeplabV3+ VOC分割实战5

这篇关于图像分割实战-系列教程15:deeplabV3+ VOC分割实战3-------网络结构1的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/627959

相关文章

Elasticsearch 在 Java 中的使用教程

《Elasticsearch在Java中的使用教程》Elasticsearch是一个分布式搜索和分析引擎,基于ApacheLucene构建,能够实现实时数据的存储、搜索、和分析,它广泛应用于全文... 目录1. Elasticsearch 简介2. 环境准备2.1 安装 Elasticsearch2.2 J

Linux系统中卸载与安装JDK的详细教程

《Linux系统中卸载与安装JDK的详细教程》本文详细介绍了如何在Linux系统中通过Xshell和Xftp工具连接与传输文件,然后进行JDK的安装与卸载,安装步骤包括连接Linux、传输JDK安装包... 目录1、卸载1.1 linux删除自带的JDK1.2 Linux上卸载自己安装的JDK2、安装2.1

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

MyBatis 动态 SQL 优化之标签的实战与技巧(常见用法)

《MyBatis动态SQL优化之标签的实战与技巧(常见用法)》本文通过详细的示例和实际应用场景,介绍了如何有效利用这些标签来优化MyBatis配置,提升开发效率,确保SQL的高效执行和安全性,感... 目录动态SQL详解一、动态SQL的核心概念1.1 什么是动态SQL?1.2 动态SQL的优点1.3 动态S

Pandas使用SQLite3实战

《Pandas使用SQLite3实战》本文主要介绍了Pandas使用SQLite3实战,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录1 环境准备2 从 SQLite3VlfrWQzgt 读取数据到 DataFrame基础用法:读

Linux卸载自带jdk并安装新jdk版本的图文教程

《Linux卸载自带jdk并安装新jdk版本的图文教程》在Linux系统中,有时需要卸载预装的OpenJDK并安装特定版本的JDK,例如JDK1.8,所以本文给大家详细介绍了Linux卸载自带jdk并... 目录Ⅰ、卸载自带jdkⅡ、安装新版jdkⅠ、卸载自带jdk1、输入命令查看旧jdkrpm -qa

Java使用Curator进行ZooKeeper操作的详细教程

《Java使用Curator进行ZooKeeper操作的详细教程》ApacheCurator是一个基于ZooKeeper的Java客户端库,它极大地简化了使用ZooKeeper的开发工作,在分布式系统... 目录1、简述2、核心功能2.1 CuratorFramework2.2 Recipes3、示例实践3

springboot简单集成Security配置的教程

《springboot简单集成Security配置的教程》:本文主要介绍springboot简单集成Security配置的教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录集成Security安全框架引入依赖编写配置类WebSecurityConfig(自定义资源权限规则

MySQL Workbench 安装教程(保姆级)

《MySQLWorkbench安装教程(保姆级)》MySQLWorkbench是一款强大的数据库设计和管理工具,本文主要介绍了MySQLWorkbench安装教程,文中通过图文介绍的非常详细,对大... 目录前言:详细步骤:一、检查安装的数据库版本二、在官网下载对应的mysql Workbench版本,要是

通过Docker Compose部署MySQL的详细教程

《通过DockerCompose部署MySQL的详细教程》DockerCompose作为Docker官方的容器编排工具,为MySQL数据库部署带来了显著优势,下面小编就来为大家详细介绍一... 目录一、docker Compose 部署 mysql 的优势二、环境准备与基础配置2.1 项目目录结构2.2 基