PaddleSeg的训练与测试推理全流程(超级详细)

2024-01-13 17:20

本文主要是介绍PaddleSeg的训练与测试推理全流程(超级详细),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

LeNet模型量化

  • 参考文档
  • 一.下载
    • 项目地址:https://gitee.com/paddlepaddle/PaddleSeg/tree/release%2F2.5/
    • 特别注意下载版本:
  • 二.paddlepaddle-gpu安装
    • 1.环境安装参考文档:https://gitee.com/paddlepaddle/PaddleSeg/blob/release/2.8/docs/install_cn.md
    • 2.地址:https://www.paddlepaddle.org.cn/
  • 三.测试案例运行
    • 1.文档地址:https://gitee.com/paddlepaddle/PaddleSeg/blob/release/2.8/docs/quick_start_cn.md
  • 四.使用自己数据训练推理
    • 参考文档地址
    • 1.准备数据
    • 2.根据自己实际情况修改配置文件
      • 参数type如何选择
    • 2.训练
      • 1.训练时报错
    • 3.导出模型
      • 参考文档:https://gitee.com/paddlepaddle/PaddleSeg/blob/release/2.8/docs/model_export_cn.md
    • 4.模型推理预测
      • 参考文档:https://gitee.com/paddlepaddle/PaddleSeg/blob/release/2.8/docs/predict/predict_cn.md
    • 5.将模型转为onnx模型
      • 参考文档:https://gitee.com/paddlepaddle/PaddleSeg/blob/release/2.8/docs/model_export_onnx_cn.md
  • 五.优化
    • Q1:如果一张图特别大 ,而瑕疵占比特别小怎么办,训练的交叉验证结果瑕疵类别的识别IOU等数据都为0怎么办

参考文档

  • PaddleSeg 自建训练集训练+评估+模型部署:http://t.csdnimg.cn/Ik5Fr
  • PaddleSeg官网:https://gitee.com/paddlepaddle/PaddleSeg

一.下载

项目地址:https://gitee.com/paddlepaddle/PaddleSeg/tree/release%2F2.5/

特别注意下载版本:

我之前找到了一个paddleSeg的链接就下载了,结果调试的时候怎么都不对,会有奇奇怪怪的错误,并且非常棘手,解决不了
请添加图片描述
结果我后来发现
在这里插入图片描述
我原来是0.4版本,太旧了,所以出现各种由于不适配导致的问题,现在已经出到2.8版本了,怕版本太新导致的不适配,我保守的选择了2.5版本
在这里插入图片描述

二.paddlepaddle-gpu安装

1.环境安装参考文档:https://gitee.com/paddlepaddle/PaddleSeg/blob/release/2.8/docs/install_cn.md

2.地址:https://www.paddlepaddle.org.cn/

在这里插入图片描述
按照自己的cuda版本下载

三.测试案例运行

1.文档地址:https://gitee.com/paddlepaddle/PaddleSeg/blob/release/2.8/docs/quick_start_cn.md

四.使用自己数据训练推理

参考文档地址

https://gitee.com/paddlepaddle/PaddleSeg/blob/release/2.8/docs/whole_process_cn.md

1.准备数据

我是用自己的软件标注的,标注出来的图有两类,黑色为背景,白色为瑕疵。后来发现训练这个,标注图像的标签从 0,1 依次取值,不可间隔。若有需要忽略的像素,则按 255 进行标注。

  • 报错
The value of label expected >= 0 and < 2, or == 255, but got 70. Please check label value.

因为这个paddleSeg的标注图像是按照像素来的,有几类像素就有几个类别,我的原标注图是灰度图,与config文件里写的两个类别不符,所以会报这个错
于是我先将所有标注图片二值化,参考这个博文,http://t.csdnimg.cn/y4Ian,后来才发现需要忽略的像素才标注为255像素,也就是白色,所以我将原二值化的代码稍微改动了下,使得背景像素值为0,背景像素值为1,标注出来的图片近乎全黑,肉眼是看不到区别的

  • cv2.threshold()函数解读:http://t.csdnimg.cn/hm3Ud
    请添加图片描述
import cv2
import osdef read_path(file_pathname):#遍历该目录下的所有图片文件for filename in os.listdir(file_pathname):print(filename)image = cv2.imread(file_pathname+'/'+filename)####change to gray#(下面第一行是将RGB转成单通道灰度图,第二步是将单通道灰度图转成3通道灰度图)image = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)  # 二值化函数 cvtcolor不能有中文路径!!!# cv2.threshold(image, 140, 255, 0, image)  # 二值化函数# retval, dst = cv2.threshold(image, 0, 1, cv2.THRESH_OTSU)#像素值小于50的全都设置为0,像素值大于50的设置为1		retval, dst = cv2.threshold(image, 50, 1, cv2.THRESH_BINARY)# # 腐蚀和膨胀是对白色部分而言的,膨胀,白区域变大,最后的参数为迭代次数# dst = cv2.dilate(dst, None, iterations=1)# # 腐蚀,白区域变小# dst = cv2.erode(dst, None, iterations=4)# cv2.namedWindow("Image")  # 图片显示框的名字 这行没啥用# cv2.imshow("Image", dst)  # 图片显示# cv2.waitKey(0)cv2.imwrite('/home/wjp/PaddleSeg-release-2.5/data/mianhua_128/savelabel/'+filename, dst)  # 保存当前灰度值处理过后的文件# 图像的二值化,就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的只有黑和白的视觉效果。# 一幅图像包括目标物体、背景还有噪声,要想从多值的数字图像中直接提取出目标物体,常用的方法就是设定一个阈值T,用T将图像的数据分成两部分:大于T的像素群和小于T的像素群。这是研究灰度变换的最特殊的方法,称为图像的二值化(Binarization)。# Python-OpenCV中提供了阈值(threshold)函数:# cv2.threshold()# 函数:# 1. src 指原图像,原图像应该是灰度图。# 2. x 指用来对像素值进行分类的阈值。# 3. y 指当像素值高于(有时是小于)阈值时应该被赋予的新的像素值# 4. Methods 指不同的阈值方法,
read_path("/home/wjp/PaddleSeg-release-2.5/data/mianhua_128/savelabel0")

2.根据自己实际情况修改配置文件

最一般需要改的几个参数是batch_size,iters,type,dataset_root,train_path,num_classes,val_path,crop_size

batch_size: 4  #设定batch_size的值即为迭代一次送入网络的图片数量,一般显卡显存越大,batch_size的值可以越大。如果使用多卡训练,总得batch size等于该batch size乘以卡数。
iters: 1000    #模型训练迭代的轮数train_dataset:  #训练数据设置type: Dataset  #OpticDiscSeg等 #指定加载数据集的类。数据集类的代码在`PaddleSeg/paddleseg/datasets`目录下。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.5max_scale_factor: 2.0scale_step_size: 0.25- type: RandomPaddingCrop #从原始图像和标注图像中随机裁剪512x512大小crop_size: [512, 512]- type: RandomHorizontalFlip  #对原始图像和标注图像随机进行水平反转- type: RandomDistort #对原始图像进行亮度、对比度、饱和度随机变动,标注图像不变brightness_range: 0.5contrast_range: 0.5saturation_range: 0.5- type: Normalize #对原始图像进行归一化,标注图像保持不变val_dataset:  #验证数据设置type: Dataset #指定加载数据集的类。数据集类的代码在`PaddleSeg/paddleseg/datasets`目录下。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.9end_lr: 0loss: #设定损失函数的类型types:- type: CrossEntropyLoss  #CE损失coef: [1, 1, 1] # PP-LiteSeg有一个主loss和两个辅助loss,coef表示权重,所以 total_loss = coef_1 * loss_1 + .... + coef_n * loss_nmodel:  #模型说明type: PPLiteSeg  #设定模型类别backbone:  # 设定模型的backbone,包括名字和预训练权重type: STDC2pretrained: https://bj.bcebos.com/paddleseg/dygraph/PP_STDCNet2.tar.gz

参数type如何选择

这个目录下都是数据集type,可在里面找与你的类别相同的数据集直接使用
在这里插入图片描述
比如我的类别是2,我就可以直接使用这个数据集,写type:OpticDiscSeg
在这里插入图片描述

  • 每一个yml文件需要的关键字不一样,如果你写了不需要的关键字,就会报KeyError: ‘xxx’

2.训练

export CUDA_VISIBLE_DEVICES=0 # Linux上设置1张可用的卡
# set CUDA_VISIBLE_DEVICES=0  # Windows上设置1张可用的卡python tools/train.py \--config configs/quick_start/pp_liteseg_optic_disc_512x512_1k.yml \--save_interval 500 \--do_eval \--use_vdl \--save_dir output

在这里插入图片描述

1.训练时报错

valueError: (InvalidArgument) The axis is expected to be in range of [0, 0), but got 0
在这里插入图片描述

  • 解决办法:https://github.com/PaddlePaddle/PaddleSeg/issues/3353
    在这里插入图片描述
  • 源代码
    在这里插入图片描述
    改之后
    在这里插入图片描述
    就可以继续正常训练了

3.导出模型

参考文档:https://gitee.com/paddlepaddle/PaddleSeg/blob/release/2.8/docs/model_export_cn.md

python tools/export.py \--config configs/quick_start/pp_liteseg_optic_disc_512x512_1k.yml \--model_path output/best_model/model.pdparams \--save_dir output/infer_model

在这里插入图片描述
在这里插入图片描述

4.模型推理预测

参考文档:https://gitee.com/paddlepaddle/PaddleSeg/blob/release/2.8/docs/predict/predict_cn.md

python deploy/python/infer.py \--config output/infer_model/deploy.yaml \--image_path data/optic_disc_seg/JPEGImages/H0002.jpg \--save_dir output/result

在这里插入图片描述

5.将模型转为onnx模型

参考文档:https://gitee.com/paddlepaddle/PaddleSeg/blob/release/2.8/docs/model_export_onnx_cn.md

pip install paddle2onnx
paddle2onnx --model_dir output \--model_filename model.pdmodel \--params_filename model.pdiparams \--opset_version 11 \--save_file output.onnx
  • 报错
paddle2onnx --model_dir . --model_filename model.pdmodel --params_filename model.pdiparams --save_file model.onnx --enable_dev_version True --opset_version 15
[ERROR][Paddle2ONNX][pool2d: pool2d_1.tmp_0] Adaptive only support static input shape.
[Paddle2ONNX] Due to the operator: pool2d, this model cannot be exported to ONNX.
[ERROR][Paddle2ONNX][pool2d: pool2d_2.tmp_0] Adaptive only support static input shape.
[Paddle2ONNX] Due to the operator: pool2d, this model cannot be exported to ONNX.

解决办法:https://github.com/PaddlePaddle/Paddle2ONNX/issues/813
在这里插入图片描述
–input_shape 1 3 1024 1024
设置模型的输入shape (NCH*W)
NCHW中,“N”batch批量大小,“C”channels特征图通道数,“H”特征图的高,和“W”特征图的宽。其中N表示这批图像有几张,H表示图像在竖直方向有多少像素,仿团W表示水平方向像素数,C表示通道数(例如黑白图像的通道数C=1,而RGB彩色图像的通道数C=3)

五.优化

Q1:如果一张图特别大 ,而瑕疵占比特别小怎么办,训练的交叉验证结果瑕疵类别的识别IOU等数据都为0怎么办

A1:可以将图片裁剪小,将其中的有瑕疵小图全部挑出来,与无瑕疵小图控制挑出来控制一个比例,再训练,训练后拿这个小图的模型来识别原图,就可以识别出来那些小瑕疵

这篇关于PaddleSeg的训练与测试推理全流程(超级详细)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/602211

相关文章

SQL Server中行转列方法详细讲解

《SQLServer中行转列方法详细讲解》SQL行转列、列转行可以帮助我们更方便地处理数据,生成需要的报表和结果集,:本文主要介绍SQLServer中行转列方法的相关资料,需要的朋友可以参考下... 目录前言一、为什么需要行转列二、行转列的基本概念三、使用PIVOT运算符进行行转列1.创建示例数据表并插入数

Python + Streamlit项目部署方案超详细教程(非Docker版)

《Python+Streamlit项目部署方案超详细教程(非Docker版)》Streamlit是一款强大的Python框架,专为机器学习及数据可视化打造,:本文主要介绍Python+St... 目录一、针对 Alibaba Cloud linux/Centos 系统的完整部署方案1. 服务器基础配置(阿里

JAVA SpringBoot集成Jasypt进行加密、解密的详细过程

《JAVASpringBoot集成Jasypt进行加密、解密的详细过程》文章详细介绍了如何在SpringBoot项目中集成Jasypt进行加密和解密,包括Jasypt简介、如何添加依赖、配置加密密钥... 目录Java (SpringBoot) 集成 Jasypt 进行加密、解密 - 详细教程一、Jasyp

CPython与PyPy解释器架构的性能测试结果对比

《CPython与PyPy解释器架构的性能测试结果对比》Python解释器的选择对应用程序性能有着决定性影响,CPython以其稳定性和丰富的生态系统著称;而PyPy作为基于JIT(即时编译)技术的替... 目录引言python解释器架构概述CPython架构解析PyPy架构解析架构对比可视化性能基准测试测

Java 操作 MinIO详细步骤

《Java操作MinIO详细步骤》本文详细介绍了如何使用Java操作MinIO,涵盖了从环境准备、核心API详解到实战场景的全过程,文章从基础的桶和对象操作开始,到大文件分片上传、预签名URL生成... 目录Java 操作 MinIO 全指南:从 API 详解到实战场景引言:为什么选择 MinIO?一、环境

在DataGrip中操作MySQL完整流程步骤(从登录到数据查询)

《在DataGrip中操作MySQL完整流程步骤(从登录到数据查询)》DataGrip是JetBrains公司出品的一款现代化数据库管理工具,支持多种数据库系统,包括MySQL,:本文主要介绍在D... 目录前言一、登录 mysql 服务器1.1 打开 DataGrip 并添加数据源1.2 配置 MySQL

Redis的安全机制详细介绍及配置方法

《Redis的安全机制详细介绍及配置方法》本文介绍Redis安全机制的配置方法,包括绑定IP地址、设置密码、保护模式、禁用危险命令、防火墙限制、TLS加密、客户端连接限制、最大内存使用和日志审计等,通... 目录1. 绑定 IP 地址2. 设置密码3. 保护模式4. 禁用危险命令5. 通过防火墙限制访问6.

Python操作Excel的实用工具与库openpyxl/pandas的详细指南

《Python操作Excel的实用工具与库openpyxl/pandas的详细指南》在日常数据处理工作中,Excel是最常见的数据文件格式之一,本文将带你了解openpyxl和pandas的核心用法,... 目录一、openpyxl:原生 Excel 文件操作库1. 安装 openpyxl2. 创建 Exc

Nginx分布式部署流程分析

《Nginx分布式部署流程分析》文章介绍Nginx在分布式部署中的反向代理和负载均衡作用,用于分发请求、减轻服务器压力及解决session共享问题,涵盖配置方法、策略及Java项目应用,并提及分布式事... 目录分布式部署NginxJava中的代理代理分为正向代理和反向代理正向代理反向代理Nginx应用场景

Spring Boot分层架构详解之从Controller到Service再到Mapper的完整流程(用户管理系统为例)

《SpringBoot分层架构详解之从Controller到Service再到Mapper的完整流程(用户管理系统为例)》本文将以一个实际案例(用户管理系统)为例,详细解析SpringBoot中Co... 目录引言:为什么学习Spring Boot分层架构?第一部分:Spring Boot的整体架构1.1