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

训练详解另见下一篇文章
官方直达here

5模型评估

6模型预测

详解见另一篇文章here
官方直达here

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学习记录的主要内容,如果未能解决你的问题,请参考以下文章

深度学习|飞桨图像分割利器PaddleSeg技术分享

Python学习记录-安装

(原创)记录书籍和教程

python之感知器-从零开始学深度学习

s7day1学习记录

人工智能时代,应立即学习python