图像分割实战-系列教程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

相关文章

python使用Akshare与Streamlit实现股票估值分析教程(图文代码)

《python使用Akshare与Streamlit实现股票估值分析教程(图文代码)》入职测试中的一道题,要求:从Akshare下载某一个股票近十年的财务报表包括,资产负债表,利润表,现金流量表,保存... 目录一、前言二、核心知识点梳理1、Akshare数据获取2、Pandas数据处理3、Matplotl

精选20个好玩又实用的的Python实战项目(有图文代码)

《精选20个好玩又实用的的Python实战项目(有图文代码)》文章介绍了20个实用Python项目,涵盖游戏开发、工具应用、图像处理、机器学习等,使用Tkinter、PIL、OpenCV、Kivy等库... 目录① 猜字游戏② 闹钟③ 骰子模拟器④ 二维码⑤ 语言检测⑥ 加密和解密⑦ URL缩短⑧ 音乐播放

Python pandas库自学超详细教程

《Pythonpandas库自学超详细教程》文章介绍了Pandas库的基本功能、安装方法及核心操作,涵盖数据导入(CSV/Excel等)、数据结构(Series、DataFrame)、数据清洗、转换... 目录一、什么是Pandas库(1)、Pandas 应用(2)、Pandas 功能(3)、数据结构二、安

SQL Server跟踪自动统计信息更新实战指南

《SQLServer跟踪自动统计信息更新实战指南》本文详解SQLServer自动统计信息更新的跟踪方法,推荐使用扩展事件实时捕获更新操作及详细信息,同时结合系统视图快速检查统计信息状态,重点强调修... 目录SQL Server 如何跟踪自动统计信息更新:深入解析与实战指南 核心跟踪方法1️⃣ 利用系统目录

java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)

《java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)》:本文主要介绍java中pdf模版填充表单踩坑的相关资料,OpenPDF、iText、PDFBox是三... 目录准备Pdf模版方法1:itextpdf7填充表单(1)加入依赖(2)代码(3)遇到的问题方法2:pd

2025版mysql8.0.41 winx64 手动安装详细教程

《2025版mysql8.0.41winx64手动安装详细教程》本文指导Windows系统下MySQL安装配置,包含解压、设置环境变量、my.ini配置、初始化密码获取、服务安装与手动启动等步骤,... 目录一、下载安装包二、配置环境变量三、安装配置四、启动 mysql 服务,修改密码一、下载安装包安装地

电脑提示d3dx11_43.dll缺失怎么办? DLL文件丢失的多种修复教程

《电脑提示d3dx11_43.dll缺失怎么办?DLL文件丢失的多种修复教程》在使用电脑玩游戏或运行某些图形处理软件时,有时会遇到系统提示“d3dx11_43.dll缺失”的错误,下面我们就来分享超... 在计算机使用过程中,我们可能会遇到一些错误提示,其中之一就是缺失某个dll文件。其中,d3dx11_4

Linux下在线安装启动VNC教程

《Linux下在线安装启动VNC教程》本文指导在CentOS7上在线安装VNC,包含安装、配置密码、启动/停止、清理重启步骤及注意事项,强调需安装VNC桌面以避免黑屏,并解决端口冲突和目录权限问题... 目录描述安装VNC安装 VNC 桌面可能遇到的问题总结描js述linux中的VNC就类似于Window

PyTorch中的词嵌入层(nn.Embedding)详解与实战应用示例

《PyTorch中的词嵌入层(nn.Embedding)详解与实战应用示例》词嵌入解决NLP维度灾难,捕捉语义关系,PyTorch的nn.Embedding模块提供灵活实现,支持参数配置、预训练及变长... 目录一、词嵌入(Word Embedding)简介为什么需要词嵌入?二、PyTorch中的nn.Em

Python实现PDF按页分割的技术指南

《Python实现PDF按页分割的技术指南》PDF文件处理是日常工作中的常见需求,特别是当我们需要将大型PDF文档拆分为多个部分时,下面我们就来看看如何使用Python创建一个灵活的PDF分割工具吧... 目录需求分析技术方案工具选择安装依赖完整代码实现使用说明基本用法示例命令输出示例技术亮点实际应用场景扩