From 0a60a9ac6549e8c9c65168802ad573763c8be33a Mon Sep 17 00:00:00 2001 From: pennypm <34053581+pennypm@users.noreply.github.com> Date: Thu, 12 Sep 2019 15:08:21 +0800 Subject: [PATCH] add pspnet turtorial (#24) * add pspnet turtorial * add model --- README.md | 1 + configs/pspnet.yaml | 9 ++- docs/model_zoo.md | 1 + pdseg/utils/config.py | 2 +- pretrained_model/download_model.py | 4 +- turtorial/finetune_pspnet.md | 121 +++++++++++++++++++++++++++++ 6 files changed, 133 insertions(+), 5 deletions(-) create mode 100644 turtorial/finetune_pspnet.md diff --git a/README.md b/README.md index 067fae93..4a321028 100644 --- a/README.md +++ b/README.md @@ -49,6 +49,7 @@ PaddleSeg支持多进程IO、多卡并行、跨卡Batch Norm同步等训练加 * [如何训练DeepLabv3+](./turtorial/finetune_deeplabv3plus.md) * [如何训练U-Net](./turtorial/finetune_unet.md) * [如何训练ICNet](./turtorial/finetune_icnet.md) +* [如何训练PSPNet](./turtorial/finetune_pspnet.md) ### 预测部署 diff --git a/configs/pspnet.yaml b/configs/pspnet.yaml index 10ad2949..fdc960d6 100644 --- a/configs/pspnet.yaml +++ b/configs/pspnet.yaml @@ -25,11 +25,14 @@ FREEZE: MODEL: MODEL_NAME: "pspnet" DEFAULT_NORM_TYPE: "bn" + PSPNET: + DEPTH_MULTIPLIER: 1 + LAYERS: 50 TEST: - TEST_MODEL: "pretrained_model/pspnet50_ADE20K/" + TEST_MODEL: "snapshots/cityscapes_pspnet50/final" TRAIN: - MODEL_SAVE_DIR: "snapshots/cityscape_pspnet50/" - PRETRAINED_MODEL_DIR: u"pretrained_model/pspnet50_ADE20K/" + MODEL_SAVE_DIR: "snapshots/cityscapes_pspnet50/" + PRETRAINED_MODEL_DIR: u"pretrained_model/pspnet50_bn_cityscapes/" SNAPSHOT_EPOCH: 10 SOLVER: LR: 0.001 diff --git a/docs/model_zoo.md b/docs/model_zoo.md index 817acd5d..e82d6c6c 100644 --- a/docs/model_zoo.md +++ b/docs/model_zoo.md @@ -42,3 +42,4 @@ train数据集合为Cityscapes训练集合,测试为Cityscapes的验证集合 | DeepLabv3+/Xception65/gn | Cityscapes |[deeplabv3p_xception65_cityscapes.tgz](https://paddleseg.bj.bcebos.com/models/deeplabv3p_xception65_cityscapes.tgz) |16|false| 0.7804 | | DeepLabv3+/Xception65/bn | Cityscapes |[Xception65_deeplab_cityscapes.tgz](https://paddleseg.bj.bcebos.com/models/xception65_bn_cityscapes.tgz) | 16 | false | 0.7715 | | ICNet/bn | Cityscapes |[icnet_cityscapes.tgz](https://paddleseg.bj.bcebos.com/models/icnet6831.tar.gz) |16|false| 0.6831 | +| PSPNet/bn | Cityscapes |[pspnet50_cityscapes.tgz](https://paddleseg.bj.bcebos.com/models/pspnet50_cityscapes.tgz) |16|false| 0.6968 | diff --git a/pdseg/utils/config.py b/pdseg/utils/config.py index 332a5143..12a3e1ba 100644 --- a/pdseg/utils/config.py +++ b/pdseg/utils/config.py @@ -201,7 +201,7 @@ cfg.MODEL.ICNET.LAYERS = 50 ########################## PSPNET模型配置 ###################################### # RESNET backbone scale 设置 cfg.MODEL.PSPNET.DEPTH_MULTIPLIER = 1 -# RESNET 层数 设置 50或101 +# RESNET backbone 层数 设置 cfg.MODEL.PSPNET.LAYERS = 50 ########################## 预测部署模型配置 ################################### diff --git a/pretrained_model/download_model.py b/pretrained_model/download_model.py index b175e17b..7b44c803 100644 --- a/pretrained_model/download_model.py +++ b/pretrained_model/download_model.py @@ -56,7 +56,9 @@ model_urls = { "unet_bn_coco": "https://paddleseg.bj.bcebos.com/models/unet_coco_v3.tgz", "icnet_bn_cityscapes": - "https://paddleseg.bj.bcebos.com/models/icnet_cityscapes.tar.gz" + "https://paddleseg.bj.bcebos.com/models/icnet_cityscapes.tar.gz", + "pspnet50_bn_cityscapes": + "https://paddleseg.bj.bcebos.com/models/pspnet50_cityscapes.tgz" } if __name__ == "__main__": diff --git a/turtorial/finetune_pspnet.md b/turtorial/finetune_pspnet.md new file mode 100644 index 00000000..931c3c5f --- /dev/null +++ b/turtorial/finetune_pspnet.md @@ -0,0 +1,121 @@ +# PSPNET模型训练教程 + +* 本教程旨在介绍如何通过使用PaddleSeg提供的 ***`PSPNET`*** 预训练模型在自定义数据集上进行训练 + +* 在阅读本教程前,请确保您已经了解过PaddleSeg的[快速入门](../README.md#快速入门)和[基础功能](../README.md#基础功能)等章节,以便对PaddleSeg有一定的了解 + +* 本教程的所有命令都基于PaddleSeg主目录进行执行 + +## 一. 准备待训练数据 + +我们提前准备好了一份数据集,通过以下代码进行下载 + +```shell +python dataset/download_pet.py +``` + +## 二. 下载预训练模型 + +关于PaddleSeg支持的所有预训练模型的列表,我们可以从[模型组合](#模型组合)中查看我们所需模型的名字和配置。 + +接着下载对应的预训练模型 + +```shell +python pretrained_model/download_model.py pspnet50_bn_cityscapes +``` + +## 三. 准备配置 + +接着我们需要确定相关配置,从本教程的角度,配置分为三部分: + +* 数据集 + * 训练集主目录 + * 训练集文件列表 + * 测试集文件列表 + * 评估集文件列表 +* 预训练模型 + * 预训练模型名称 + * 预训练模型的backbone网络 + * 预训练模型的Normalization类型 + * 预训练模型路径 +* 优化策略 + * 学习率 + * Batch Size + * ... + +在三者中,预训练模型的配置尤为重要,如果模型或者BACKBONE配置错误,会导致预训练的参数没有加载,进而影响收敛速度。预训练模型相关的配置如第二步所示。 + +数据集的配置和数据路径有关,在本教程中,数据存放在`dataset/mini_pet`中 + +其他配置则根据数据集和机器环境的情况进行调节,最终我们保存一个如下内容的yaml配置文件,存放路径为`configs/test_pet.yaml` + +```yaml +# 数据集配置 +DATASET: + DATA_DIR: "./dataset/mini_pet/" + NUM_CLASSES: 3 + TEST_FILE_LIST: "./dataset/mini_pet/file_list/test_list.txt" + TRAIN_FILE_LIST: "./dataset/mini_pet/file_list/train_list.txt" + VAL_FILE_LIST: "./dataset/mini_pet/file_list/val_list.txt" + VIS_FILE_LIST: "./dataset/mini_pet/file_list/test_list.txt" + + +# 预训练模型配置 +MODEL: + MODEL_NAME: "pspnet" + DEFAULT_NORM_TYPE: "bn" + PSPNET: + DEPTH_MULTIPLIER: 1 + LAYERS: 50 + +# 其他配置 +TRAIN_CROP_SIZE: (512, 512) +EVAL_CROP_SIZE: (512, 512) +AUG: + AUG_METHOD: "unpadding" + FIX_RESIZE_SIZE: (512, 512) +BATCH_SIZE: 4 +TRAIN: + PRETRAINED_MODEL_DIR: "./pretrained_model/pspnet50_bn_cityscapes/" + MODEL_SAVE_DIR: "./saved_model/pspnet_pet/" + SNAPSHOT_EPOCH: 10 +TEST: + TEST_MODEL: "./saved_model/pspnet_pet/final" +SOLVER: + NUM_EPOCHS: 100 + LR: 0.005 + LR_POLICY: "poly" + OPTIMIZER: "sgd" +``` + +## 四. 配置/数据校验 + +在开始训练和评估之前,我们还需要对配置和数据进行一次校验,确保数据和配置是正确的。使用下述命令启动校验流程 + +```shell +python pdseg/check.py --cfg ./configs/test_pet.yaml +``` + + +## 五. 开始训练 + +校验通过后,使用下述命令启动训练 + +```shell +python pdseg/train.py --use_gpu --cfg ./configs/test_pet.yaml +``` + +## 六. 进行评估 + +模型训练完成,使用下述命令启动评估 + +```shell +python pdseg/eval.py --use_gpu --cfg ./configs/test_pet.yaml +``` + +## 模型组合 + +|预训练模型名称|BackBone|Norm|数据集|配置| +|-|-|-|-|-| +|pspnet50_bn_cityscapes|ResNet50|bn|Cityscapes|MODEL.MODEL_NAME: pspnet
MODEL.DEFAULT_NORM_TYPE: bn
MODEL.PSPNET.LAYERS: 50| +|pspnet101_bn_cityscapes|ResNet101|bn|Cityscapes|MODEL.MODEL_NAME: pspnet
MODEL.DEFAULT_NORM_TYPE: bn
MODEL.PSPNET.LAYERS: 101| -- GitLab