paddleseg学习记录
Posted weightOneMillion
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了paddleseg学习记录相关的知识,希望对你有一定的参考价值。
1总体介绍
paddleseg飞桨旗下主要用于图像分割的开发套件,配置和使用都很简单方便,本篇基于paddleseg2.3进行学习记录与讲解。
源码地址可以从github上获取:https://github.com/PaddlePaddle/PaddleSeg
,其中包含使用文档,本篇基于使用文档和查阅的资料进行学习记录。
首先paddleseg主要包含以下几个目录:
configs:保存不同网络的配置文件。(主要修改的地方)
docs:文档
paddleseg:PaddleSeg核心代码,包含训练、评估、推理等文件。(核心的文件)
tools:工具脚本
train.py:训练入口文件
eval.py:评估模型文件
predict.py:预测文件
首先来学习一下数据的准备,我们想要使用paddleseg做自己的数据分割,那么首先就需要将数据处理成paddleseg支持的格式。
2 准备数据
假设我们已经有了数据和标注数据,将训练集、验证集、测试集都放在一个文件夹里。
(未标注的数据集需要自己进行标注,这里不再讲解,标注数据格式为灰度图,PddleSeg已支持2种标注工具:LabelMe、EISeg交互式分割标注工具。)
2.1 灰度图转为伪彩色图(如果不需要转换,直接看2.2)
PaddleSeg采用单通道的标注图片,每一种像素值代表一种类别,像素标注类别需要从0开始递增,例如0,1,2,3表示有4种类别。
注: 标注图像请使用PNG无损压缩格式的图片。标注类别最多为256类。
一般的分割库使用单通道灰度图作为标注图片,往往显示出来是全黑的效果。灰度标注图的弊端:
对图像标注后,无法直接观察标注是否正确。
模型测试过程无法直接判断分割的实际效果。
PaddleSeg支持伪彩色图作为标注图片,在原来的单通道图片基础上,注入调色板。在基本不增加图片大小的基础上,却可以显示出彩色的效果。
同时PaddleSeg也兼容灰度图标注,用户原来的灰度数据集可以不做修改,直接使用。
因为灰度图的弊端,我们常常将灰度图转变成伪彩色图。
如果您希望将指定目录下的所有灰度标注图转换为伪彩色标注图,则执行以下命令,指定灰度标注所在的目录即可。
python tools/gray2pseudo_color.py <dir_or_file> <output_dir>
2.2数据的划分与txt的生成
我们希望将图像的路径写入到train.txt,val.txt,test.txt和labels.txt三个文件夹中,因为PaddleSeg是通过读取这些文本文件来定位图像路径的。 train.txt,val.txt和test.txt文本以空格为分割符分为两列,第一列为图像文件相对于dataset的相对路径,第二列为标注图像文件相对于dataset的相对路径。如下所示:
images/xxx1.jpg annotations/xxx1.png
images/xxx2.jpg annotations/xxx2.png
...
labels.txt: 每一行为一个单独的类别,相应的行号即为类别对应的id(行号从0开始),如下所示:
labelA
labelB
...
labels.txt可以手动写入
使用脚本对自定义数据集按比例随机切分,并生成文件列表
在根目录下新建一个data文件夹,数据文件结构如下:
./data/ # 数据集根目录
|--images # 原图目录
| |--xxx1.jpg
| |--...
| └--...
|
|--annotations # 标注图目录
| |--xxx1.png
| |--...
| └--...
其中,相应的文件名可根据需要自行定义。
使用命令如下,支持通过不同的Flags来开启特定功能。
python tools/split_dataset_list.py <dataset_root> <images_dir_name> <labels_dir_name> $FLAGS
参数说明:
dataset_root: 数据集根目录
images_dir_name: 原图目录名
labels_dir_name: 标注图目录名
FLAGS说明:
|FLAG|含义|默认值|参数数目| |-|-|-|-| |--split|数据集切分比例|0.7 0.3 0|3| |--separator|文件列表分隔符|" "|1| |--format|图片和标签集的数据格式|"jpg" "png"|2| |--label_class|标注类别|'\\_\\_background\\_\\_' '\\_\\_foreground\\_\\_'|若干| |--postfix|按文件主名(无扩展名)是否包含指定后缀对图片和标签集进行筛选|"" ""(2个空字符)|2|
运行后将在数据集根目录下生成train.txt,val.txt,test.txt和labels.txt.
注: 生成文件列表要求:要么原图和标注图片数量一致,要么只有原图,没有标注图片。若数据集缺少标注图片,将生成不含分隔符和标注图片路径的文件列表。
使用示例
python tools/split_dataset_list.py <dataset_root> images annotations --split 0.6 0.2 0.2 --format jpg png
最后,我准备的数据文件格式参考如下:
如果用户想要生成数据集的文件列表,需要整理成如下的目录结构(类似于Cityscapes数据集)。你可以手动划分,亦可参照上述使用脚本自动切分生成的方式。
./dataset/ # 数据集根目录
├── annotations # 标注图像目录
│ ├── test
│ │ ├── ...
│ │ └── ...
│ ├── train
│ │ ├── ...
│ │ └── ...
│ └── val
│ ├── ...
│ └── ...
└── images # 原图像目录
├── test
│ ├── ...
│ └── ...
├── train
│ ├── ...
│ └── ...
└── val
├── ...
└── ...
注:以上目录名可任意
但如果整理成这种格式,PaddleSeg也提供了生成文件列表的使用脚本,具体参考paddleseg文档here,不再讲解。
3配置文件configs
PaddleSeg的配置文件包括超参、训练数据集、验证数据集、优化器、损失函数、模型等信息。所有的配置文件在PaddleSeg/configs文件夹下面。大家可以灵活修改配置文件的内容,如自定义模型使用的骨干网络、模型使用的损失函数以及关于网络结构等配置,自定义配置数据处理的策略,如改变尺寸、归一化和翻转等数据增强的策略。
3.1 配置文件详解:
以PaddleSeg/configs/quick_start/pp_liteseg_optic_disc_512x512_1k.yml为例,详细解读配置文件如下:
(注意pp_liteseg_optic_disc_512x512_1k.yml在最新的2.7版本中有,2.3没有,但是可以提供一下参考)
batch_size: 4 #设定batch_size的值即为迭代一次送入网络的图片数量,一般显卡显存越大,batch_size的值可以越大
iters: 1000 #模型迭代的次数
train_dataset: #训练数据设置
type: Dataset #数据集名字
dataset_root: data/optic_disc_seg #数据集路径
train_path: data/optic_disc_seg/train_list.txt #数据集中用于训练的标识文件
num_classes: 2 #指定目标的类别个数(背景也算为一类)
mode: train #表示用于训练
transforms: #数据预处理/增强的方式
- type: ResizeStepScaling #将原始图像和标注图像随机缩放为0.5~2.0倍
min_scale_factor: 0.5
max_scale_factor: 2.0
scale_step_size: 0.25
- type: RandomPaddingCrop #从原始图像和标注图像中随机裁剪512x512大小
crop_size: [512, 512]
- type: RandomHorizontalFlip #采用水平反转的方式进行数据增强
- type: RandomDistort #亮度、对比度、饱和度随机变动
brightness_range: 0.5
contrast_range: 0.5
saturation_range: 0.5
- type: Normalize #将图像归一化
val_dataset: #验证数据设置
type: Dataset #数据集名字
dataset_root: data/optic_disc_seg #数据集路径
val_path: data/optic_disc_seg/val_list.txt #数据集中用于验证的标识文件
num_classes: 2 #指定目标的类别个数(背景也算为一类)
mode: val #表示用于验证
transforms: #数据预处理/增强的方式
- type: Normalize #图像进行归一化
optimizer: #设定优化器的类型,目前只支持'sgd'和'adam'
type: sgd #采用SGD(Stochastic Gradient Descent)随机梯度下降方法为优化器
momentum: 0.9 #动量优化
weight_decay: 4.0e-5 #权值衰减,使用的目的是防止过拟合。L2正则化的值
lr_scheduler: # 学习率的相关设置
type: PolynomialDecay # 一种学习率类型。共支持12种策略
learning_rate: 0.01
power: 0.9
end_lr: 0
loss: #设定损失函数的类型
types:
- type: CrossEntropyLoss #损失函数类型
coef: [1, 1, 1] # PP-LiteSeg有一个主loss和两个辅助loss,coef表示权重: total_loss = coef_1 * loss_1 + .... + coef_n * loss_n
model: #模型说明
type: PPLiteSeg #设定模型类别
backbone: # 设定模型的backbone,包括名字和预训练权重
type: STDC2
pretrained: https://bj.bcebos.com/paddleseg/dygraph/PP_STDCNet2.tar.gz
建议:可以自己在configs目录下新建一个文件夹,如quick_start,将所需配置文件从configs的其他目录下----》复制到----》configs/quick_start/下进行修改。
配置项可以查看官方文档here。
3.2数据集类型
在train_dataset和val_dataset下面都有一个type,这个type该如何修改。
1、用户自定义的数据类型:Dataset
class paddleseg.datasets.Dataset(transforms, dataset_root, num_classes, mode='train', train_path=None, val_path=None, test_path=None, separator=' ', ignore_index=255, edge=False)
传入符合格式的自定义数据集。
大部分情况都是写这个,以下例外。
2、Cityscapes
3、PascalVOC
4、ADE20K
5、OpticDiscSeg
具体参考paddleseg官方文档,不再讲解here。
4 模型训练
使用以下代码,可以快速开始训练:
python train.py \\
--config configs/quick_start/bisenet_optic_disc_512x512_1k.yml \\
--do_eval \\
--use_vdl \\
--save_interval 500 \\
--save_dir output
5模型评估
6模型预测
7可视化
参考
1、图像分割套件PaddleSeg全面解析(一)https://www.codenong.com/cs111029854/
2、PaddleSeg实现自动驾驶语义分割:https://aistudio.baidu.com/aistudio/projectdetail/4203976?channelType=0&channel=0
3、2.7官方文档:https://github.com/PaddlePaddle/PaddleSeg/blob/release/2.7/README_CN.md
4、2.3官方文档:https://github.com/PaddlePaddle/PaddleSeg/blob/release/2.3/README_CN.md
以上是关于paddleseg学习记录的主要内容,如果未能解决你的问题,请参考以下文章