参考paddleseg官网
【PaddleSeg实践范例】PP-HumanSegV2 SOTA人像分割方案
github的readme:
https://github.com/PaddlePaddle/PaddleSeg/blob/release/2.9/README_CN.md
零、准备工作
0.安装Anaconda
1.用 conda 创建虚拟环境
#1. 查询conda环境下有哪些虚拟环境 conda info --envs #2. 创建指定python版本的环境 conda create -n PaddleSeg_py_38 python=3.8 #3. 激活环境 conda activate PaddleSeg_py_38
2.设置conda和pip的镜像(查看镜像有无,没有则设置镜像)
见 https://www.cnblogs.com/loveDodream-zzt/p/17871994.html
2.1 设置conda的镜像源
// 1. 查看镜像源 conda config --show channels // 2. 删除添加源,恢复默认源 conda config --remove-key channels // 3. 添加清华镜像源 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/pro conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/ //终端显示包从哪个channel下载,以及下载地址是什么 conda config --set show_channel_urls yes
2.2 Pip配置清华镜像源(conda和pip都要设置!!!)
临时使用清华镜像源,如下:
// some-package代表你需要安装的包 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple some-package //下面这种方式也是一样的 pip install some-package -i https://pypi.tuna.tsinghua.edu.cn/simple
永久配置清华镜像源, 如下:
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
3.网络
因为涉及到github下载,没有网络大文件啥的很费劲而且github不稳定。
https://www.cnblogs.com/loveDodream-zzt/p/18122955
把系统代理关了,开着不能下载paddlepaddle!!!如图:
———————————————————————————————————————————————————————————
一、安装
1. 安装PaddlePaddle
版本要求
-
PaddlePaddle >= 2.0.2
-
Python >= 3.7+
由于图像分割模型计算开销大,推荐在GPU版本的PaddlePaddle下使用PaddleSeg。推荐安装10.0以上的CUDA环境。
推荐安装10.0以上的CUDA环境。安装教程请见PaddlePaddle官网。
- 查询本机支持的CUDA版本
你先确认你的GPU能装什么版本CUDA, 在命令行中输入:
nvidia-smi
就可以看到你的GPU可以装什么版本的CUDA了,如下图:
但是我虚拟机不好 装gpu版本,这里只能装cpu版本了!!!
Windows 安装
- cpu版本paddlepaddle
conda install paddlepaddle==2.5.2 --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/Paddle/
2. 下载PaddleSeg仓库
# 若您在本地环境运行,使用git下载PaddleSeg代码 git clone https://github.com/PaddlePaddle/PaddleSeg.git
3.安装依赖
cd PaddleSeg # git checkout -b release/2.6 origin/release/2.6 2.6训练的时候报错!!! # 切到2.9分支 git checkout -b release/2.9 origin/release/2.9 # 查看分支 git branch # 安装依赖 pip install -r requirements.txt
二、准备模型和数据
以下所有命令均在PaddleSeg/contrib/PP-HumanSeg
目录下执行。
cd contrib/PP-HumanSeg # linux 每次都要设置,不设置就会报错类似‘No module named ...’ export PYTHONPATH=$PYTHONPATH:`pwd`/../.. # windows # set PYTHONPATH=D:\PaddleSeg # 打印查看设置的值 echo $PYTHONPATH
下载推理模型并将其保存在推理模型中
python src/download_inference_models.py
下载测试数据并保存在数据中
python src/download_data.py
三、测试
使用src/seg_demo.py
脚本实现肖像分割、背景替换等功能的演示。
src/seg_demo.py
脚本的输入数据可以是图片、视频或者摄像头,主要参数说明如下。
参数 | 说明 | 类型 | 是否必选项 | 默认值 |
---|---|---|---|---|
config | 预测模型中deploy.yaml 文件的路径 |
str | 是 | - |
img_path | 待分割图片的路径 | str | 否 | - |
video_path | 待分割视频的路径 | str | 否 | - |
bg_img_path | 背景图片的路径,用于替换图片或视频的背景 | str | 否 | - |
bg_video_path | 背景视频的路径,用于替换视频的背景 | str | 否 | - |
save_dir | 保存输出图片或者视频的路径 | str | 否 | ./output |
vertical_screen | 表明输入图片和视频是竖屏 | store_true | 否 | False |
use_post_process | 设置对输出logit进行后处理,滤除背景干扰 | store_true | 否 | False |
use_optic_flow | 设置使用光流处理 | store_true | 否 | False |
1. 输入图片进行测试
使用背景图片,得到替换背景的图片,结果保存在data/images_result/
目录。大家可以进入该目录下,右键单击图片,选择打开进行查看(如下)。
python src/seg_demo.py \ --config inference_models/portrait_pp_humansegv2_lite_256x144_inference_model_with_softmax/deploy.yaml \ --img_path data/images/portrait_heng.jpg \ --bg_img_path data/images/bg_2.jpg \ --save_dir data/images_result/portrait_heng_v2_withbg.jpg python src/seg_demo.py \ --config inference_models/portrait_pp_humansegv2_lite_256x144_inference_model_with_softmax/deploy.yaml \ --img_path data/images/portrait_shu.jpg \ --bg_img_path data/images/bg_1.jpg \ --save_dir data/images_result/portrait_shu_v2_withbg.jpg \ --vertical_screen
2) 加载data/images/portrait_heng.jpg
横屏图像,使用PP-HumanSeg肖像分割模型进行预测
# Use PP-HumanSegV2-Lite python src/seg_demo.py \ --config inference_models/portrait_pp_humansegv2_lite_256x144_inference_model_with_softmax/deploy.yaml \ --img_path data/images/portrait_heng.jpg \ --save_dir data/images_result/portrait_heng_v2.jpg # Use PP-HumanSegV1-Lite python src/seg_demo.py \ --config inference_models/portrait_pp_humansegv1_lite_398x224_inference_model_with_softmax/deploy.yaml \ --img_path data/images/portrait_heng.jpg \ --save_dir data/images_result/portrait_heng_v1.jpg
3) 加载data/images/portrait_shu.jpg
竖屏图像,使用PP-HumanSeg肖像分割模型进行预测
python src/seg_demo.py \ --config inference_models/portrait_pp_humansegv2_lite_256x144_inference_model_with_softmax/deploy.yaml \ --img_path data/images/portrait_shu.jpg \ --save_dir data/images_result/portrait_shu_v2.jpg \ --vertical_screen
2、输入视频进行分割
1)加载data/videos/video_heng.mp4
横屏视频,使用PP-HumanSeg肖像分割模型进行预测,结果保存在data/videos_result/
目录。
# Use PP-HumanSegV2-Lite python src/seg_demo.py \ --config inference_models/portrait_pp_humansegv2_lite_256x144_inference_model_with_softmax/deploy.yaml \ --video_path data/videos/video_heng.mp4 \ --save_dir data/videos_result/video_heng_v2.avi python src/seg_demo.py \ --config inference_models/portrait_pp_humansegv2_lite_256x144_inference_model_with_softmax/deploy.yaml \ --video_path data/videos/video_heng.mp4 \ --use_post_process \ --save_dir data/videos_result/video_heng_v2_use_post_process.avi # Use PP-HumanSegV1-Lite python src/seg_demo.py \ --config inference_models/portrait_pp_humansegv1_lite_398x224_inference_model_with_softmax/deploy.yaml \ --video_path data/videos/video_heng.mp4 \ --save_dir data/videos_result/video_heng_v1.avi
2)加载data/videos/video_shu.mp4
竖屏视频,使用PP-HumanSeg肖像分割模型进行预测
python src/seg_demo.py \ --config inference_models/portrait_pp_humansegv2_lite_256x144_inference_model_with_softmax/deploy.yaml \ --video_path data/videos/video_shu.mp4 \ --save_dir data/videos_result/video_shu_v2.avi \ --vertical_screen
3)使用背景图片,得到替换背景的视频
python src/seg_demo.py \ --config inference_models/portrait_pp_humansegv2_lite_256x144_inference_model_with_softmax/deploy.yaml \ --video_path data/videos/video_heng.mp4 \ --bg_img_path data/images/bg_2.jpg \ --use_post_process \ --save_dir data/videos_result/video_heng_v2_withbg_usepostprocess.avi
4)此外可以使用 DIS(Dense Inverse Search-basedmethod)光流后处理算法 (要求opencv-python版本大于4.0),减少视频预测前后帧闪烁的问题
python src/seg_demo.py \ --config inference_models/portrait_pp_humansegv2_lite_256x144_inference_model_with_softmax/deploy.yaml \ --video_path data/videos/video_shu.mp4 \ --save_dir data/videos_result/video_shu_v2_use_optic_flow.avi \ --vertical_screen \ --use_optic_flow
四、训练微调
如果不满足业务要求,大家可以收集、标注数据,基于开源模型进行Finetune。
我们以PP-HumanSeg通用人像分割模型为例,介绍训练、评估、导出的方法。
4.1 准备
参考前文"快速体验 - 准备环境",安装Paddle和PaddleSeg。
执行如下命令,下载mini_supervisely
数据集,具体参考前文"快速体验 - 准备模型和数据"。
执行如下命令,下载预训练权重。
cd PaddleSeg/contrib/PP-HumanSeg # 下载mini_supervisely 测试数据集 python src/download_data.py # 下载预训练权重 python src/download_pretrained_models.py
4.2 修改配置文件(选用哪一个模型,就修改哪一个配置!!!)
详细见:https://github.com/PaddlePaddle/PaddleSeg/blob/release/2.9/docs/config/pre_config_cn.md
修改配置文件,配置文件为PaddleSeg/configs/human_pp_humansegv2_lite.yml,
补全路径就可以了!!!
jkdjlfdjfldjfdljfdlfjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj
jfkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
4.3 训练
详细见官文文档:https://github.com/PaddlePaddle/PaddleSeg/blob/release/2.9/docs/train/train_cn.md
准备好配置文件后,我们使用tools/train.py
脚本进行模型训练。
在本文档中我们使用PP-LiteSeg
模型与optic_disc
数据集展示训练过程。请确保已经完成了PaddleSeg的安装工作,并且位于PaddleSeg目录下,执行以下脚本:
cd PaddleSeg/ export CUDA_VISIBLE_DEVICES=0 # Linux上设置1张可用的卡 这里展示的cpu的所以不用设置,gpu版本才设置 # set CUDA_VISIBLE_DEVICES=0 # Windows上设置1张可用的卡 python tools/train.py \ --config configs/human_pp_humansegv2_lite.yml \ --do_eval \ --use_vdl \ --save_interval 500 \ --save_dir output
上述训练命令解释:
--config
指定配置文件。--save_interval
指定每训练特定轮数后,就进行一次模型保存或者评估(如果开启模型评估)。--do_eval
开启模型评估。具体而言,在训练save_interval指定的轮数后,会进行模型评估。--use_vdl
开启写入VisualDL日志信息,用于VisualDL可视化训练过程。--save_dir
指定模型和visualdl日志文件的保存根路径。
在PP-LiteSeg示例中,训练的模型权重保存在output目录下,如下所示。总共训练1000轮,每500轮评估一次并保存模型信息,所以有iter_500
和iter_1000
文件夹。评估精度最高的模型权重,保存在best_model
文件夹。后续模型的评估、测试和导出,都是使用保存在best_model
文件夹下精度最高的模型权重。
train.py
脚本输入参数的详细说明如下:
参数名 | 用途 | 是否必选项 | 默认值 |
---|---|---|---|
iters | 训练迭代次数 | 否 | 配置文件中指定值 |
batch_size | 单卡batch size | 否 | 配置文件中指定值 |
learning_rate | 初始学习率 | 否 | 配置文件中指定值 |
config | 配置文件 | 是 | - |
save_dir | 模型和visualdl日志文件的保存根路径 | 否 | output |
num_workers | 用于异步读取数据的进程数量, 大于等于1时开启子进程读取数据 | 否 | 0 |
use_vdl | 是否开启visualdl记录训练数据 | 否 | 否 |
save_interval | 模型保存的间隔步数 | 否 | 1000 |
do_eval | 是否在保存模型时启动评估, 启动时将会根据mIoU保存最佳模型至best_model | 否 | 否 |
log_iters | 打印日志的间隔步数 | 否 | 10 |
resume_model | 恢复训练模型路径,如:output/iter_1000 |
否 | None |
keep_checkpoint_max | 最新模型保存个数 | 否 | 5 |
五、评估和预测
5.1 评估
训练完成后,大家可以使用评估脚本 tools/val.py
来评估模型的精度,即对配置文件中的验证数据集进行测试。
假设训练过程中迭代次数(iters)为1000,保存模型的间隔为500,即每迭代1000次数据集保存2次训练模型。因此一共会产生2个定期保存的模型,加上保存的最佳模型best_model
,一共有3个模型。
在PP-LiteSeg示例中,执行如下命令进行模型评估。其中,通过--model_path
输入参数来指定评估的模型权重。
python tools/val.py \ --config configs/quick_start/pp_liteseg_optic_disc_512x512_1k.yml \ --model_path output/iter_1000/model.pdparams
注意:如果报错:No module name 'paddleseg'类似这种,如下:
那就是需要添加python path(每次都要添加)!!!!
这里设置如下:
cd contrib/PP-HumanSeg # linux 每次都要设置,不设置就会报错类似‘No module named ...’ export PYTHONPATH=$PYTHONPATH:`pwd`/../.. # windows # set PYTHONPATH=D:\PaddleSeg # 打印查看设置的值 echo $PYTHONPATH
5.2 预测
官网链接:https://github.com/PaddlePaddle/PaddleSeg/blob/release/2.9/docs/predict/predict_cn.md
tools/predict.py
脚本是专门用来可视化预测的,命令格式如下所示:
python tools/predict.py \ --config configs/quick_start/pp_liteseg_optic_disc_512x512_1k.yml \ --model_path output/iter_1000/model.pdparams \ --image_path contrib/PP-HumanSeg/data/optic_disc_seg/JPEGImages/H0003.jpg \ --save_dir output/result
其中image_path
可以是一张图片的路径,也可以是一个包含图片路径的文件列表,也可以是一个目录,这时候将对该图片或文件列表或目录内的所有图片进行预测并保存可视化结果图。
如果报错如下:
则修改--image_path路劲,我的路径为: /home/zzt/ai/PaddleSeg/contrib/PP-HumanSeg/data/optic_disc_seg/JPEGImages/H0003.jpg (全路径)或者 /contrib/PP-HumanSeg/data/optic_disc_seg/JPEGImages/H0003.jpg(这里前面设置了PaddleSeg为pythonpath所以可以省略前边目录)
运行成功打印如下:
六、模型导出
6.1 导出预测模型
官网链接:https://github.com/PaddlePaddle/PaddleSeg/blob/release/2.9/docs/model_export_cn.md
1) 使用PaddleSeg训练好模型后,我们将模型导出为预测模型、使用预测库进行部署,可以实现更快的推理速度。
注意,使用--without_argmax --with_softmax
参数,则模型导出的时候,模型最后面不会添加Argmax算子,而是添加Softmax算子。 所以,输出是浮点数类型,表示前景的概率,
使得图像融合的边缘更为平滑。
结果文件如下:
在PaddleSeg根目录下,执行如下命令,导出预测模型,保存在 PaddleSeg/output/inference_model
目录。
# 现在output文件下,创建inference_model文件夹 cd output mkdir inference_model
python tools/export.py \ --config configs/quick_start/pp_liteseg_optic_disc_512x512_1k.yml \ --model_path output/iter_1000/model.pdparams \--save_dir output/inference_model
成功如下图:
导出脚本参数解释:
参数名 | 用途 | 是否必选项 | 默认值 |
---|---|---|---|
config | 配置文件的路径 | 是 | - |
model_path | 模型权重的路径 | 否 | - |
save_dir | 预测模型保存的目录 | 否 | ./output/inference_model |
input_shape | 设置模型的输入shape (N*C*H*W ),比如传入--input_shape 1 3 1024 1024 。如果不设置input_shape,默认导出模型的输入shape是[-1, 3, -1, -1] 。 预测shape固定时,建议指定input_shape参数。 |
否 | None |
output_op | 设置在模型末端添加的输出算子,支持[argmax , softmax , none ]。PaddleSeg模型默认返回logits (N*C*H*W );添加argmax 算子,可以得到每个像素的分割类别,结果的维度是N*H*W 、数据类型是int32 ;添加softmax 算子,可以得到每个像素每类的概率,结果的维度是N*C*H*W 、数据类型是float32 |
否 | argmax |
with_softmax | 即将废弃的输入参数,建议使用--output_op 。在网络末端添加softmax算子。由于PaddleSeg组网默认返回logits,如果想要部署模型获取概率值,可以置为True |
否 | False |
without_argmax | 即将废弃的输入参数,建议使用--output_op 。由于PaddleSeg组网默认返回logits,为部署模型可以直接获取预测结果,我们默认在网络末端添加argmax算子。如果设置--without_argmax ,则不会在网络末端添加argmax算子。 |
否 | False |
注意:
- 如果部署模型时,出现和shape相关的问题,请尝试指定input_shape。
2) 导出预测模型后,我们可以使用以下方式部署模型:
部署场景 | 使用预测库 | 教程 |
---|---|---|
服务器端(Nvidia GPU和X86 CPU) Python部署 | Paddle Inference | 文档 |
服务器端(Nvidia GPU和X86 CPU) C++端部署 | Paddle Inference | 文档 |
移动端部署 | Paddle Lite | 文档 |
服务化部署 | Paddle Serving | 文档 |
前端部署 | Paddle JS | 文档 |
6.2 导出ONNX格式模型(完成6.1的基础上,再进行6.2!!!)
安装Paddle2ONNX(高于或等于0.6版本)。
pip install paddle2onnx
执行如下命令,使用Paddle2ONNX将output文件夹中的预测模型导出为ONNX格式模型。
paddle2onnx --model_dir output \ --model_filename inference_model/model.pdmodel \ --params_filename inference_model/model.pdiparams \ --opset_version 11 \ --save_file inference_model/output.onnx
导出的ONNX格式模型保存为output.onnx文件。
目前我的执行报错,报错如下:
参考文档:
六、移动端Lite部署
详细见:https://github.com/PaddlePaddle/PaddleSeg/blob/release/2.9/docs/deployment/lite/lite_cn.md
标签:PP,HumanSegV2,--,config,虚拟机,inference,model,data,模型 From: https://www.cnblogs.com/loveDodream-zzt/p/18137335