赞
踩
PaddleSeg是基于飞桨PaddlePaddle的端到端图像分割套件,内置45+模型算法及140+预训练模型,支持配置化驱动和API调用开发方式,打通数据标注、模型开发、训练、压缩、部署的全流程,提供语义分割、交互式分割、Matting、全景分割四大分割能力,助力算法在医疗、工业、遥感、娱乐等场景落地应用。
具有模块化、高性能、模块化和全流程的特性。
PaddleSeg是一个开源的平台,PaddleSeg开源地址如下:
PaddleSeg Github
Paddle Gitee 【国内上不了Github的使用这个】
- configs:里面存储着许多yml的模型结构参数文件
- contirb:一些真实案例相关配置与数据
- deploy:一些模型部署和模型剪枝优化相关的内容
- docs:里面存放着丰富的文档内容,包含重要的教程以及模型结构参数配置文件的解释
- EISeg:一个基于PaddleSeg的交互式图像标注工具
- Matting: 百度的Matting算法相关内容
- paddleseg:Paddleseg的核心代码
- test_tipc:飞桨训推一体认证 (Training and Inference Pipeline Certification(TIPC)) 信息和测试工具(可以查阅每种模型的训练推理部署打通情况,并进行一键测试的工具)
- tests:一些分析模型速度和精度、还有检测安装脚本,
- tools:一些工具,包括训练,预测,模型评估,以及模型导出等工具。
对于使用Paddleseg中预设的模型,数据一般要么采用的是大型的公开数据集例如:CityScapes数据集、ADE20K数据集和Pascal VOC 2012数据集,等,要么就使用自建的数据集,这里不对公开数据集进行赘述,详细请看:PaddleSeg-develop\PaddleSeg-develop\docs\data\pre_data_cn.md 文档。
这里主要介绍自建的数据集:
我这里使用的数据集是从网上找的,只用JPEGImages和SegmentationClass,两个文件夹,一个存放原始图像,一个存放标签图像。
PaddleSeg对于自建的数据集,建议按照下面的格式存放:
custom_dataset | |--images | |--image1.jpg | |--image2.jpg | |--... | |--labels | |--label1.jpg | |--label2.png | |--... | |--train.txt | |--val.txt | |--test.txt
在PaddleSeg中,对于图像分割任务而言,图像的分类的标签,不是文本表现的,而是通过标签集中图像的二值化的像素值来表现的,例如,一张二值化的标签图像的像素值为0~255,像素值0为一般为背景(背景也归为一类),像素值为1的为第二类,像素值为2的为第三类,依次类推。
但通常,以人眼来说根本看不出二值化图像中0和1的区别,例如下图,里面有两个像素值,两个类别,一个为0(背景),另一个为1(手机的油污):
上图是给计算机使用的,但是人无法分别,所以我们一般会将标签图像转换成假彩色图像来观察制作的标签是否正确,上图转换为假彩色图像后如下(请注意,假彩色不能用来训练,只能用来人眼观测):
对于假彩色的制作,PaddlSge提供了一个工具:gray2pseudo_color.py(PaddleSeg-develop\tools\data\gray2pseudo_color.py)
当我们在网上获取训练数据时,数据集中可能没有标签图像,只有假彩色图像,我们可以使用一些手段,将假彩色图像转换为标签图像:
- import cv2
- import os
- import numpy as np
-
- def rgb2binary(input_path, output_path):
- img = cv2.imread(input_path)
- img = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
- #注意这里是将像素值为2~255的转换为1,但是假彩色中因为插值算法的问题可能存在,
- #像素值不0,但却依旧是背景的情况,或者显著目标的可能,也就是存在过渡带
- #这里的阈值2~255 要根据实际情况选择
- ret,img = cv2.threshold(img, 2, 255, cv2.THRESH_BINARY)
- img= np.uint8(np.double(img) / 255)
- cv2.imwrite(output_path,img)
-
- #输入的假彩色图像文件夹
- intput_root = r'C:\Users\delight\Downloads\PaddleSeg-develop\PaddleSeg-develop\custom_data\Oil\labels'
- #输出的标签图像文件夹
- output_root = r'C:\Users\delight\Downloads\PaddleSeg-develop\PaddleSeg-develop\custom_data\Oil\annotations'
-
- os.mkdir(output_root)
- names = os.listdir(intput_root)
- for i,name in enumerate(names):
- if name[-2] == 'n':
- input_path = os.path.join(intput_root,name)
- output_path = os.path.join(output_root,name)
- rgb2binary(input_path,output_path)
左边是转换前,右边是转换后(有重命名)。
当我们拥有原始图像数据(images)和标注好的训练标签图像(annotations)时(一般原始图像格式为.jpg,标签图像为.png),我们可以使用split_dataset_list.py,来生成PaddleSeg中的Dataset数据集读取父类中所需要的文件列表(train.txt和val.txt)
split_dataset_list.py在tools\data路径下:
一般我们只需要设置四个参数即可,下面划分的权重代表的含义为:数据的70%划分为训练集 数据的20%划分,为验证集 ,剩下数据的10%划分为测试集。运行脚本后将会在数据集根目录下得到。
文件中内容如下(图像与标签一 一对应):
以PaddleSeg/configs/quick_start/pp_liteseg_optic_disc_512x512_1k.yml为例,详细解读配置文件如下。
- batch_size: 4 #设定batch_size的值即为迭代一次送入网络的图片数量,一般显卡显存越大,batch_size的值可以越大。如果使用多卡训练,总得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: #设定优化器的类型
- type: sgd #采用SGD(Stochastic Gradient Descent)随机梯度下降方法为优化器
- momentum: 0.9 #设置SGD的动量
- weight_decay: 4.0e-5 #权值衰减,使用的目的是防止过拟合
-
- lr_scheduler: # 学习率的相关设置
- type: PolynomialDecay # 一种学习率类型。共支持12种策略
- learning_rate: 0.01 # 初始学习率
- power: 0.9
- end_lr: 0
-
- loss: #设定损失函数的类型
- types:
- - type: CrossEntropyLoss #CE损失
- 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\u2net目录下的配置文件u2net_cityscapes_1024x512_160k.yml为例
我们主要把type修改为Dataset,train_dataset和val_dataset的num_classes改为实际类别数量(背景也为一类),训练集和验证集路径修改为实际路径。
--config
指定配置文件。--save_interval
指定每训练特定轮数后,就进行一次模型保存或者评估(如果开启模型评估)。--do_eval
开启模型评估。具体而言,在训练save_interval指定的轮数后,会进行模型评估。--use_vdl
开启写入VisualDL日志信息,用于VisualDL可视化训练过程。--save_dir
指定模型和visualdl日志文件的保存根路径。进入训练
在训练过程中,训练日志会输出到你设定的目录中
打开Anaconda Prompt
输入:
- activate <your_env>
- visualdl --logdir <your output dir>
如下:
使用浏览器打开:http://localhost:8040/ 可实时查看网络训练过程。
这里有两个指标:
mIOU:IOU是指分割结果与真实分割结果之间的交集与并集之比,将所有类别的IOU求平均,得到整个图像的平均IOU也即是mIOU。IOU越高,说明分割结果与真实结果越接近,分割性能越好。ACC:所有类别的像素分类正确率的平均值。
我们,可以使用tool文件夹下的val.py工具和配置文件中的验证数据集来对模型进行评估。
--is_slide 是否开启滑动窗口
......
配置示例如下:
模型评估结果如下:
这里的Kappa系数也是图像分割类型任务中三种常用的分析模型性能的参数之一:
Kappa :一个用于一致性检验的指标,可以用于衡量分类的效果。kappa系数的计算是基于混淆矩阵的,取值为-1到1之间,通常大于0。Kappa系数越高模型质量越好。
使用analyse.py模型来对验证集的每个图像进行预测和评估,与val.py类似
配置如下
执行后会在默认路径下:./output/result输入以下两个文件夹和一个分析结果json(存储着每张图像的每个类别的IOU和mIOU)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。