【霹雳吧啦】手把手带你入门语义分割の番外7:DeepLabv3 源码讲解(PyTorch)

发布时间:2023年12月30日

目录

前言

Preparation

一、学习率更新策略

1、create_lr_scheduler 函数

二、构建 DeepLabV3?模型

1、create_model 函数

2、deeplabv3_resnet50 函数

(1)预训练权重?

(2)重构模型

三、DeepLabV3 网络结构

1、DeepLabV3 网络结构图

2、DeepLabHead 类

3、ASPP 类

4、DeepLabV3 类

四、deeplabv3_mobilenetv3_large 函数

回顾:学习率的变化策略(Learning rate policy)


前言

文章性质:学习笔记 📖

视频教程:DeepLabV3 源码讲解(Pytorch)

主要内容:根据 视频教程 中提供的 DeepLabV3 源代码(PyTorch),对?train.py、deeplabv3_model.py 文件进行具体讲解。

Preparation

源代码:https://github.com/WZMIAOMIAO/deep-learning-for-image-processing/tree/master/pytorch_segmentation/deeplab_v3

? ├── src: 模型的backbone以及DeepLabv3的搭建
? ├── train_utils: 训练、验证以及多GPU训练相关模块
? ├── my_dataset.py: 自定义dataset用于读取VOC数据集
? ├── train.py: 以deeplabv3_resnet50为例进行训练
? ├── train_multi_GPU.py: 针对使用多GPU的用户使用
? ├── predict.py: 简易的预测脚本,使用训练好的权重进行预测测试
? ├── validation.py: 利用训练好的权重验证/测试数据的mIoU等指标,并生成record_mAP.txt文件
? └── pascal_voc_classes.json: pascal_voc标签文件?

【补充】PASCAL VOC2012 数据集下载地址:http://host.robots.ox.ac.uk/pascal/VOC/voc2012/VOCtrainval_11-May-2012.tar

一、学习率更新策略

在 train.py 文件的 main 主函数中,创建了学习率更新策略,每个 step 更新一次:

?【补充】这里使用的学习率下降策略就是 poly 策略,大家可以看看【回顾】中的公式和图表~

1、create_lr_scheduler 函数

在 train_and_eval.py 文件的 create_lr_scheduler?函数中,num_step 表示训练一个 epoch 需要迭代多少步,warmup 表示热身训练。

二、构建 DeepLabV3?模型

在 create_model 中默认使用的是 deeplabv3_resnet50 ,若想使用其他模型,就在开头 import 导入对应的模型,然后进行实例化即可:

1、create_model 函数

在 train.py 文件的 create_model 函数,传入的参数包括:

  • aux 是否使用辅助分类器,传入为 True 就使用
  • num_classes 包含背景的类别个数
  • pretrain 是否使用预训练模型,需要提前下载预训练权重文件

2、deeplabv3_resnet50 函数

(1)预训练权重?

?deeplabv3_resnet50?中使用的 backbone 和 FCN 中相同(结合下图):

  • pretrain_backbone=True 只会载入 resnet50 backbone 预训练权重,需要提前下载对应权重:resnet50_imagenet
  • pretrain_backbone=False 使用官方默认在 COCO 数据集上的预训练权重,需要提前下载对应权重:deeplabv3_resnet50_coco

resnet50_imagenet 下载地址:https://download.pytorch.org/models/resnet50-0676ba61.pth

deeplabv3_resnet50_coco 下载地址:https://download.pytorch.org/models/deeplabv3_resnet50_coco-cd0a2569.pth

(2)重构模型

使用 IntermediateLayerGetter 方法去重构模型,将 resnet 中没有使用到的层结构全都移除掉。

DeepLabHead 传入的 out_inplanes 对应 backbone 输出特征图的 channel ,num_classes 对应包含背景的分类类别个数。

三、DeepLabV3 网络结构

1、DeepLabV3 网络结构图

2、DeepLabHead 类

DeepLabHead 继承自 nn.Sequential 父类,在 __init__ 中传入要搭建的结构:

【说明】ASPP 的 in_channels 对应 backbone 输出特征图的 channels,而 12,24 和 36 表示膨胀卷积的膨胀系数。?

【说明】DeepLabHead 中的最后这个卷积层将 channels 调整为包含背景的类别个数 num_classes,因此后面不再通过 BN 层和 ReLU 层。

3、ASPP 类

ASPP 继承自 nn.Module 父类,atrous_rates 是要构建的膨胀卷积分支所使用的膨胀系数列表,out_channels 表示通过膨胀卷积后的通道数。?

【说明】第五个分支先通过全局平均池化层将其池化成 1x1 大小,再使用 1x1 的卷积层调整其 channel,最后通过双线性插值还原至输入宽高。

【说明】在 forward 正向传播中,遍历 5 个分支,将输出结果放入 _res 中,再进行 cat 拼接,dim=1 表示在 channel 方向进行拼接。

【说明】这是 ASPP 卷积层和池化层的构建代码。

4、DeepLabV3 类

在 deeplabv3_model.py 文件的 deeplabv3_resnet50 函数中,构建模型时使用了 DeepLabV3 类:?

【说明】在 DeepLabV3 中用 __init__ 函数进行简单的赋值,用 input_shape 记录输入数据的宽高,使数据通过 backbone 得到 features,将主输出 out 提取出来,将其输入到主分类器 classifier 中,得到主分支上的输出。

四、deeplabv3_mobilenetv3_large 函数

在 deeplabv3_model.py 文件的 deeplabv3_mobilenetv3_large 函数中(与之前的 LRASPP 相似):

回顾:学习率的变化策略(Learning rate policy)

在 DeepLab V2 中训练时采用的学习率变化策略为 poly 策略,相比 step 策略(每间隔一定步数就降低一次学习率)效果要更好。

【公式】poly 学习率变化策略:lr x ( 1 - iter / max_iter ) ^ power

式中:lr 初始学习率,iter 当前迭代的 step 数,max_iter 训练过程中总的迭代步数,power = 0.9 。

【说明】通过上表可知,相比 step 策略, poly 策略最高可以将 mean IoU 提升 3.63 个点!

文章来源:https://blog.csdn.net/nanzhou520/article/details/135162434
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。