deeplab v3+ 源码详解

article/2025/10/23 17:22:31

训练模型:

        下载好voc数据集,并传入所需的参数即可进行训练。

参数配置:

"""
训练:
--model deeplabv3plus_mobilenet 
--gpu_id 0 
--year 2012_aug 
--crop_val 
--lr 0.01 
--crop_size 513 
--batch_size 4
--output_stride 16
测试:
--model deeplabv3plus_mobilenet 
--gpu_id 0 --year 2012_aug 
--crop_val 
--lr 0.01 
--crop_size 513 
--batch_size 16 
--output_stride 16 
--ckpt checkpoints/best_deeplabv3plus_mobilenet_voc_os16.pth 
--test_only 
--save_val_results
"""

 

1.数据预处理部分

        deeplab v3+默认使用voc数据集和cityspace数据集,图片预处理部分仅仅读取图片和对应的标签,同时对图片进行随机翻转、随机裁剪等常见图片预处理方式。

def get_dataset(opts):""" Dataset And Augmentation"""if opts.dataset == 'voc':train_transform = et.ExtCompose([#et.ExtResize(size=opts.crop_size),et.ExtRandomScale((0.5, 2.0)),et.ExtRandomCrop(size=(opts.crop_size, opts.crop_size), pad_if_needed=True),et.ExtRandomHorizontalFlip(),   # 以给定的概率水平翻转给定的图像et.ExtToTensor(),et.ExtNormalize(mean=[0.485, 0.456, 0.406],std=[0.229, 0.224, 0.225]),])if opts.crop_val:val_transform = et.ExtCompose([et.ExtResize(opts.crop_size),et.ExtCenterCrop(opts.crop_size),et.ExtToTensor(),et.ExtNormalize(mean=[0.485, 0.456, 0.406],std=[0.229, 0.224, 0.225]),])else:val_transform = et.ExtCompose([et.ExtToTensor(),et.ExtNormalize(mean=[0.485, 0.456, 0.406],std=[0.229, 0.224, 0.225]),])# 读取数据train_dst = VOCSegmentation(root=opts.data_root, year=opts.year,image_set='train', download=opts.download, transform=train_transform)val_dst = VOCSegmentation(root=opts.data_root, year=opts.year,image_set='val', download=False, transform=val_transform)if opts.dataset == 'cityscapes':train_transform = et.ExtCompose([#et.ExtResize( 512 ),et.ExtRandomCrop(size=(opts.crop_size, opts.crop_size)),et.ExtColorJitter( brightness=0.5, contrast=0.5, saturation=0.5 ),et.ExtRandomHorizontalFlip(),et.ExtToTensor(),et.ExtNormalize(mean=[0.485, 0.456, 0.406],std=[0.229, 0.224, 0.225]),])val_transform = et.ExtCompose([#et.ExtResize( 512 ),et.ExtToTensor(),et.ExtNormalize(mean=[0.485, 0.456, 0.406],std=[0.229, 0.224, 0.225]),])train_dst = Cityscapes(root=opts.data_root,split='train', transform=train_transform)val_dst = Cityscapes(root=opts.data_root,split='val', transform=val_transform)return train_dst, val_dst

2.网络结构:

 

Ecoder部分

        使用resnet作为网络的ecoder部分,resnet作为图像分类模型,将图像下采样了32倍,特征图信息损失比较大,尤其是目标分割而言,无法再下采样32倍的特征图中恢复细节信息,因此,resnet的最后三层,将根据需要的特征图的大小,将下采样换为空洞卷积。输出layer4经过ASPP层的结果(下采样16倍或者8倍),同时也输出layer1的结果。

        ASPP层:

        如图所示,ASPP由不同空洞率的空洞卷积组成。以实现不同感受野的特征信息融合。此外,还有一个细节是空洞卷积的padding=空洞率,以保证输入输出特征图大小不改变。

class ASPPConv(nn.Sequential):def __init__(self, in_channels, out_channels, dilation):modules = [nn.Conv2d(in_channels, out_channels, 3, padding=dilation, dilation=dilation, bias=False),nn.BatchNorm2d(out_channels),nn.ReLU(inplace=True)]super(ASPPConv, self).__init__(*modules)class ASPPPooling(nn.Sequential):def __init__(self, in_channels, out_channels):super(ASPPPooling, self).__init__(nn.AdaptiveAvgPool2d(1),nn.Conv2d(in_channels, out_channels, 1, bias=False),nn.BatchNorm2d(out_channels),nn.ReLU(inplace=True))def forward(self, x):size = x.shape[-2:]x = super(ASPPPooling, self).forward(x)return F.interpolate(x, size=size, mode='bilinear', align_corners=False)class ASPP(nn.Module):def __init__(self, in_channels, atrous_rates):super(ASPP, self).__init__()out_channels = 256modules = []modules.append(nn.Sequential(nn.Conv2d(in_channels, out_channels, 1, bias=False),nn.BatchNorm2d(out_channels),nn.ReLU(inplace=True)))rate1, rate2, rate3 = tuple(atrous_rates)modules.append(ASPPConv(in_channels, out_channels, rate1))modules.append(ASPPConv(in_channels, out_channels, rate2))modules.append(ASPPConv(in_channels, out_channels, rate3))modules.append(ASPPPooling(in_channels, out_channels))self.convs = nn.ModuleList(modules)self.project = nn.Sequential(nn.Conv2d(5 * out_channels, out_channels, 1, bias=False),nn.BatchNorm2d(out_channels),nn.ReLU(inplace=True),nn.Dropout(0.1),)def forward(self, x):res = []for conv in self.convs:#print(conv(x).shape)res.append(conv(x))res = torch.cat(res, dim=1)return self.project(res)

 

        Decoder部分 

        Layer4的输出首先会经过ASPP模块,然后经过1*1的卷积调整通道数至256,然后上采样至layer1输出结果的大小,将layer1的输出结果的通道数经过1*1的卷积调整至48,将这两个结果进行拼接。经过3*3的卷积后,再经过1*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()def forward(self, feature):#print(feature.shape)low_level_feature = self.project( feature['low_level'] )#return_layers = {'layer4': 'out', 'layer1': 'low_level'}#print(low_level_feature.shape)output_feature = self.aspp(feature['out'])#print(output_feature.shape)output_feature = F.interpolate(output_feature, size=low_level_feature.shape[2:], mode='bilinear', align_corners=False)#print(output_feature.shape)return self.classifier( torch.cat( [ low_level_feature, output_feature ], dim=1 ) )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)

        dcoder的输出的特征图还是下采样4倍的结果,最终的输出需要继续进行双线性插值,调整到原特征图大小,最终代码如下:

class _SimpleSegmentationModel(nn.Module):def __init__(self, backbone, classifier):super(_SimpleSegmentationModel, self).__init__()self.backbone = backboneself.classifier = classifierdef forward(self, x):input_shape = x.shape[-2:]features = self.backbone(x)x = self.classifier(features)x = F.interpolate(x, size=input_shape, mode='bilinear', align_corners=False)return x

 

        

 


http://chatgpt.dhexx.cn/article/ACdnFntX.shtml

相关文章

Deeplabcut教程(二)使用

因为很久没用这个了所以就一直没更使用教程,写的安装教程收到好几条私信要使用教程,这几天在帮一个朋友跑这个,于是就有了这个使用教程 安装教程:Deeplabcut教程(一)安装(GPU&CPU版本&…

概述DeepLab系列(deeplab v1, deeplab v2, deeplab v3, deeplab v3+)

前言:图像分割是指像素级别的图像识别,即标注出图像中每个像素所属的对象类别。 语义分割更注重类别之间的区分,而实例分割更注重个体之间的区别。 DeepLab是由Google团队提出的一系列图像分割算法。 DeepLab v1 (2014年&#xf…

DeepLab系列理解

原文Blog:https://zhuanlan.zhihu.com/p/61208558 1、deeplab v1 针对标准的深度卷积神经网络的两个主要问题:1.Striding操作使得输出尺寸减小; 2.Pooling对输入小变化的不变性,v1 使用空洞卷积(atrous)条件随机场(CRFs)来解决这…

Deep Lab 系列总结

Deep Lab v1 结合了深度卷积神经网络(DCNNs)和概率图模型(Dense CRFs)的方法 问题1:DCNN s做语义分割时精准度不够,根本原因是DCNNs的高级特征的平移不变性,即高层次特征映射,根…

DeepLab V3+:DeepLab系列的极致?

这篇文章提交在arXiv上的,对应代码也已经开源。 理解DeepLab V3的构架首先需要理解DeepLab V3(可以参考博主的前一篇博客),V3基本上可以理解成在原始的基础上增加了encoder-decoder模块,进一步保护物体的边缘细节信息…

【Deep Learning】DeepLab

【论文】SEMANTIC IMAGE SEGMENTATION WITH DEEP CONVOLUTIONAL NETS AND FULLY CONNECTED CRFS 前段时间学习了DeepLab,这里花时间记录一下,感谢几位小伙伴的分享。DeepLab的主体结构事实上是参照VGG改造的,它的几个优点:首先是速…

Deeplab笔记

一、Deeplab v2 对应论文是 DeepLab: Semantic Image Segmentiation with Deep Convolutional Nets, Atrous Convolution, and Fully Connected CRFs Deeplab 是谷歌在FCN的基础上搞出来的。FCN为了得到一个更加dense的score map,将一张500x500的输入图像&#…

deeplab-v3+原理详解

入门小菜鸟,希望像做笔记记录自己学的东西,也希望能帮助到同样入门的人,更希望大佬们帮忙纠错啦~侵权立删。 目录 一、deeplab-v3提出原因与简单介绍 二、deeplab-v3网络结构图 三、Encoder 1、Backbone(主干网络&#xff09…

深度学习 | MATLAB Deep Learning Toolbox Deeper Networks 创建

深度学习 | MATLAB Deep Learning Toolbox Deeper Networks 目录 深度学习 | MATLAB Deep Learning Toolbox Deeper NetworksDeeper Networks创建类比深度网络深度记忆原理深度学习层输入层卷积和全连接层序列层激活层归一化、丢弃和裁剪层池化和去池化层组合层输出层 参考资料…

深度学习(11)——DeepLab v1

DeepLab v1 DeepLab 由谷歌团队提出的,至今有了四个版本,也就是v1-v4。其结合了深度卷积神经网络(DCNNs)和概率图模型。 在论文《Semantic image segmentation with deep convolutional nets and fully connected CRFs》中提出&…

改进 DeepLabV3+

网络整体结构图 CFF结构图 import torch import torch.nn as nn import torch.nn.functional as F from nets.xception import xception from nets.mobilenetv2 import mobilenetv2class MobileNetV2(nn.Module):def __init__(self, downsample_factor8, pretrainedTrue):supe…

DeepFaceLab

DeepFaceLab从半脸(Half Face)到全脸(Full Face)再到整脸(Whole Face),脸部替换的区域愈来愈大,适用的范围也越来越广,效果也越来越震撼。当然很多人已经不满足与单纯换脸…

DeepLab系列总结

DeepLab系列总结 DeepLab系列DeepLab V1DeepLab V2DeepLab V3DeepLab V3 DeepLab系列 DeepLab网络是由Liang-Chieh Chen(下文以大神指代)与google团队提出来的,是一个专门用来处理语义分割的模型。目前推出了4个(或者说3.5个&…

DeepLab系列学习

DeepLab系列 文章目录 DeepLab系列DeepLabV1简介atrous algorithm利用全卷积增加感受野并加速运算条件随机场CRF实验结果多尺度预测VOC数据集上对比 DeepLabV2主要改进简介模型主体ASPP实验结果 DeepLabV3相应的改进实验 DeepLabV3(DeepLabV3 plus)相应改进整体结构解码器结构m…

deeplab系列总结(deeplab v1 v2 v3 v3+)

最近花了几天时间把deeplab系列撸了一遍,直观感受是不如当初看RCNN系列来的激动啊......像RPN这种划时代的改变没有看到--直奔主题。 Deeplab v1&v2 paper: deeplab v1 && deeplab v2 远古版本的deeplab系列,就像RCNN一样&…

我对DeepLab V3的理解(基于V1和V2)

一、概述 1.前言 1.1 DeepLab v1 创新点&#xff1a; 空洞卷积&#xff08;Atrous Conv&#xff09;; <解决编码过程中信号不断被下采样&#xff0c;细节丢失的问题> 全连接条件随机场&#xff08;Fully-connected Conditional Random Field&#xff09;。 <由于co…

deeplab介绍

■ 论文 | Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation ■ 链接 | https://www.paperweekly.site/papers/1676 DeepLab 是结合了深度卷积神经网络&#xff08;DCNNs&#xff09;和概率图模型&#xff08;DenseCRFs&#xff09;的方法…

DeepLab一家

DeepLab是谷歌为了语义分割又做的一系列工作&#xff0c;在多个开源数据集中都取得了不错的成果&#xff0c;DeepLabv1发表于2014年&#xff0c;后于2016、2017、2018分别提出了V2&#xff0c;V3以及V3的版本&#xff0c;在mmsegmentation里面主要集成了V3以及V3的版本&#xf…

深度学习论文精读[13]:Deeplab v3+

Deeplab v3是Deeplab系列最后一个网络结构&#xff0c;也是基于空洞卷积和多尺度系列模型的集大成者。相较于Deeplab v3&#xff0c;v3版本参考了UNet系列网络&#xff0c;对基于空洞卷积的Deeplab网络引入了编解码结构&#xff0c;一定程度上来讲&#xff0c;Deeplab v3是编解…

语义分割网络系列3——DeepLab

DeepLab 1 介绍1.1 背景1.2 Deeplab V1介绍1.3 结构1.4 特点1.4.1 空洞卷积的使用1.4.2 CRF的应用 1.5 DeepLab系列总结 2 代码3 总结参考资料 1 介绍 相比于传统的视觉算法(SIFT或HOG)&#xff0c;Deep-CNN以其end-to-end方式获得了很好的效果。这样的成功部分可以归功于Deep…