图像分割:从 PaddleLabel 到 PaddleSeg
PaddleLabel 标注数据+PaddleSeg 训练预测=快速完成一次图像分割的任务
1. 数据准备
- 首先使用
PaddleLabel
对自制的狗子数据集进行标注,其次使用Split Dataset
功能分割数据集,最后导出数据集 - 从
PaddleLabel
导出后的内容全部放到自己的建立的文件夹下,例如dog_seg_dataset
,其目录结构如下:
├── dog_seg_dataset
│ ├── Annotations
│ ├── JPEGImages
│ ├── labels.txt
│ ├── test_list.txt
│ ├── train_list.txt
│ ├── val_list.txt
2. 训练
2.1 安装必备的库
2.1.1 安装 paddlepaddle
# 您的机器安装的是 CUDA9 或 CUDA10,请运行以下命令安装
pip install paddlepaddle-gpu -i https://mirror.baidu.com/pypi/simple
# 您的机器是CPU,请运行以下命令安装
# pip install paddlepaddle
2.1.2 安装 paddleseg 以及依赖项
git clone https://gitee.com/paddlepaddle/PaddleSeg.git
cd PaddleSeg
pip install -r requirements.txt
python setup.py install
2.2 准备自制的狗子分割数据集
cd ./PaddleSeg/data/
mkdir dog_seg_dataset
cd ../../
cp -r ./dog_seg_dataset/* ./PaddleSeg/data/dog_seg_dataset
2.3 修改配置文件
这里改了FCN
模型的配置文件,改完后拷贝了一份放置到了configs
目录下并重命名为mynet.yml
,关于自定义数据集的配置可以参考PaddleSeg
在GitHub
上的说明配置文件说明
PaddleSeg/configs/mynet.yml
batch_size: 4 # 迭代一次送入网络的图片数量
iters: 10000 # 模型迭代次数
train_dataset:
type: Dataset # 数据集格式,自定义数据集用Dataset
dataset_root: ../data/dog_seg_dataset # 训练数据集存放的目录
train_path: ../data/dog_seg_dataset/train_list.txt
num_classes: 2 # 像素类别数(背景也算为一类
transforms: # 数据变换与数据增强
- type: ResizeStepScaling # 对图像按照某一个比例进行缩放,这个比例以scale_step_size为步长
min_scale_factor: 0.5 # 缩放过程中涉及的参数
max_scale_factor: 2.0
scale_step_size: 0.25
- type: RandomPaddingCrop # 对图像和标注图进行随机裁剪
crop_size: [512, 512]
- type: RandomHorizontalFlip # 以一定的概率对图像进行水平翻转
- type: RandomDistort # 对图像像素进行处理
brightness_range: 0.4
contrast_range: 0.4
saturation_range: 0.4
- type: Normalize # 对图像进行标准化
mode: train # 训练模式
val_dataset:
type: Dataset
dataset_root: ../data/dog_seg_dataset # 验证数据集存放的目录
val_path: ../data/dog_seg_dataset/val_list.txt
transforms:
- type: Normalize
mode: val # 验证模式
num_classes: 2
optimizer: # 设定优化器的类型
type: sgd # 随机梯度下降
momentum: 0.9 # 动量
weight_decay: 0.0005 # 权值衰减,使用的目的是防止过拟合
lr_scheduler: # 学习率的相关设置
type: PolynomialDecay # 一种学习率类型。共支持12种策略
learning_rate: 0.01
power: 0.9
end_lr: 0
loss: # 损失函数设置
types:
- type: CrossEntropyLoss # 交叉熵损失函数
coef: [1] # 当使用了多种损失函数,可在 coef 中为每种损失指定配比
model: # 使用何种语义分割模型
type: FCN
backbone: # 使用何种骨干网络
type: HRNet_W48
pretrained: https://bj.bcebos.com/paddleseg/dygraph/hrnet_w48_ssld.tar.gz # 预训练模型
num_classes: 2
pretrained: Null
backbone_indices: [-1]
2.4 开始训练
export CUDA_VISIBLE_DEVICES=0
# 开始训练
# 边训练边测试
# --config 参数表示指定使用哪个配置文件
# --do_eval 参数表示一遍训练一遍验证
# --save_interval 参数表示每经过100个iters,进行一个模型的保存
python PaddleSeg/train.py \
--config PaddleSeg/configs/mynet.yml \
--do_eval \
--use_vdl \
--save_interval 100 \
--save_dir PaddleSeg/output
3. 模型评估
3.1 评估
# 评估 默认使用训练过程中保存的model_final.pdparams
python PaddleSeg/val.py \
--config PaddleSeg/configs/mynet.yml \
--model_path PaddleSeg/output/best_model/model.pdparams
3.2 预测
# image_path参数表示选择预测的图片
# save_dir参数表示预测保存的结果地址
python PaddleSeg/predict.py \
--config PaddleSeg/configs/mynet.yml \
--model_path PaddleSeg/output/best_model/model.pdparams \
--image_path PaddleSeg/data/dog_seg_dataset/JPEGImages/e619b17a9c1b9f085dc2712eb603171f.jpeg \
--save_dir PaddleSeg/output/result
预测的原图是data/dog_seg_dataset/JPEGImages/e619b17a9c1b9f085dc2712eb603171f.jpeg
预测的结果PaddleSeg/output/result
目录里面,如下图所示: