PaddleSeg 20分钟快速入门教程:从数据标注到模型部署全流程
前言
PaddleSeg是飞桨(PaddlePaddle)生态下的图像分割开发套件,采用模块化设计思想,通过配置文件驱动整个流程,实现了从数据标注到模型部署的全流程支持。本文将带您快速了解如何使用PaddleSeg完成一个完整的图像分割任务。
1. 环境准备
在开始之前,需要确保您的环境满足以下要求:
- Python 3.6+
- PaddlePaddle 2.2+
- 推荐使用CUDA 10.2+和cuDNN 7.6+
可以通过以下命令安装PaddleSeg:
pip install paddleseg
2. 数据准备
2.1 数据集介绍
本教程使用视盘分割数据集作为示例。这是一个医学图像分割数据集,包含267张训练图像、76张验证图像和38张测试图像。
数据集中的原始图像和分割标签如下图所示,我们的任务是分割出眼底图像中的视盘区域。
2.2 数据集结构
PaddleSeg支持的数据集需要按照以下结构组织:
dataset_root
├── images
│ ├── image1.jpg
│ ├── image2.jpg
│ └── ...
├── annotations
│ ├── image1.png
│ ├── image2.png
│ └── ...
├── train_list.txt
├── val_list.txt
└── test_list.txt
其中,train_list.txt
等文件记录了图像和标签的对应关系,每行格式为:图像路径 标签路径
。
3. 模型训练
3.1 模型选择
我们选择PP-LiteSeg模型进行训练。PP-LiteSeg是PaddleSeg团队提出的实时语义分割模型,具有以下特点:
- 轻量级解码器(FLD):减少计算开销
- 统一注意力融合模块(UAFM):结合空间和通道注意力增强特征表示
- 简单金字塔池化模块(SPPM):以低计算成本聚合全局上下文
3.2 配置文件详解
PaddleSeg使用YAML格式的配置文件驱动整个训练流程。以pp_liteseg_optic_disc_512x512_1k.yml
为例,配置文件主要包含以下部分:
# 训练配置
batch_size: 4 # 批大小
iters: 1000 # 迭代次数
# 训练数据集配置
train_dataset:
type: Dataset
dataset_root: data/optic_disc_seg
train_path: data/optic_disc_seg/train_list.txt
num_classes: 2 # 类别数(包含背景)
transforms: # 数据增强策略
- type: ResizeStepScaling # 随机缩放
- type: RandomPaddingCrop # 随机裁剪
- type: RandomHorizontalFlip # 水平翻转
- type: RandomDistort # 色彩扰动
- type: Normalize # 归一化
# 验证数据集配置
val_dataset:
type: Dataset
dataset_root: data/optic_disc_seg
val_path: data/optic_disc_seg/val_list.txt
num_classes: 2
transforms:
- type: Normalize
# 优化器配置
optimizer:
type: sgd # 随机梯度下降
momentum: 0.9
weight_decay: 4.0e-5
# 学习率策略
lr_scheduler:
type: PolynomialDecay # 多项式衰减
learning_rate: 0.01
power: 0.9
end_lr: 0
# 损失函数配置
loss:
types:
- type: CrossEntropyLoss # 交叉熵损失
coef: [1, 1, 1] # 主损失和辅助损失的权重
# 模型结构配置
model:
type: PPLiteSeg
backbone:
type: STDC1
pretrained: https://bj.bcebos.com/paddleseg/dygraph/PP_STDCNet1.tar.gz
3.3 启动训练
单卡训练命令如下:
python tools/train.py \
--config configs/quick_start/pp_liteseg_optic_disc_512x512_1k.yml \
--do_eval \ # 开启边训练边验证
--use_vdl \ # 启用VisualDL日志
--save_interval 500 \ # 保存间隔
--save_dir output # 输出目录
多卡训练(4卡)命令:
export CUDA_VISIBLE_DEVICES=0,1,2,3
python -m paddle.distributed.launch tools/train.py \
--config configs/quick_start/pp_liteseg_optic_disc_512x512_1k.yml \
--do_eval \
--use_vdl \
--save_interval 500 \
--save_dir output
3.4 训练参数说明
| 参数 | 说明 | 是否必选 | 默认值 | |------|------|---------|-------| | config | 配置文件路径 | 是 | - | | save_dir | 模型保存目录 | 否 | output | | do_eval | 是否边训练边验证 | 否 | False | | use_vdl | 是否使用VisualDL | 否 | False | | save_interval | 模型保存间隔(iter) | 否 | 1000 | | log_iters | 日志打印间隔 | 否 | 10 | | resume_model | 恢复训练路径 | 否 | None |
4. 训练可视化
PaddleSeg集成了VisualDL工具,可以方便地可视化训练过程中的各项指标:
- 启动VisualDL服务:
visualdl --logdir output/
- 在浏览器中访问提示的URL,可以看到以下指标变化:
- 损失变化趋势
- 学习率变化
- 训练时间
- 数据读取时间
- mIoU变化趋势(开启do_eval时)
- 像素准确率变化趋势(开启do_eval时)
5. 模型评估
训练完成后,可以使用评估脚本评估模型性能:
python tools/val.py \
--config configs/quick_start/pp_liteseg_optic_disc_512x512_1k.yml \
--model_path output/iter_1000/model.pdparams
支持多尺度翻转评估:
python tools/val.py \
--config configs/quick_start/pp_liteseg_optic_disc_512x512_1k.yml \
--model_path output/iter_1000/model.pdparams \
--aug_eval \ # 开启多尺度翻转评估
--scales 0.75 1.0 1.25 \ # 尺度列表
--flip_horizontal # 水平翻转
6. 模型预测与可视化
使用训练好的模型进行预测并可视化结果:
python tools/predict.py \
--config configs/quick_start/pp_liteseg_optic_disc_512x512_1k.yml \
--model_path output/iter_1000/model.pdparams \
--image_path data/optic_disc_seg/test_images/1.jpg \ # 预测图像路径
--save_dir output/result # 结果保存目录
预测结果会保存在指定目录中,包含原始图像、预测结果和叠加效果图。
7. 模型导出
为了部署模型,需要将训练好的模型导出为静态图模型:
python tools/export.py \
--config configs/quick_start/pp_liteseg_optic_disc_512x512_1k.yml \
--model_path output/iter_1000/model.pdparams \
--save_dir output/inference_model
导出的模型包含:
model.pdmodel
:模型结构文件model.pdiparams
:模型权重文件deploy.yaml
:部署配置文件
8. 模型部署
PaddleSeg支持多种部署方式,这里以Python部署为例:
import paddle
from paddleseg.core import predict
model = paddle.jit.load("output/inference_model/model")
transforms = paddle.vision.transforms.Compose([
paddle.vision.transforms.Normalize()
])
# 单张图像预测
result = predict(
model,
model_path="output/inference_model",
transforms=transforms,
image_list=["data/test.jpg"],
save_dir="output/results"
)
# 视频流预测
predict(
model,
model_path="output/inference_model",
transforms=transforms,
video_path="data/test.mp4",
save_dir="output/results"
)
总结
通过本教程,您已经掌握了使用PaddleSeg完成图像分割任务的全流程,包括:
- 环境准备
- 数据准备与处理
- 模型训练与调优
- 训练过程可视化
- 模型评估
- 预测与可视化
- 模型导出与部署
PaddleSeg提供了丰富的预训练模型和灵活的配置方式,可以快速适配各种图像分割任务。希望本教程能帮助您快速上手PaddleSeg,在实际项目中应用图像分割技术。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考