1 PaddleSeg/Matting的环境配置

PaddSeg Github:https://github.com/PaddlePaddle/PaddleSeg/,本文使用的为release/2.8版本。

PaddleSeg的有关抠图的Matting的模型都位于:https://github.com/PaddlePaddle/PaddleSeg/tree/release/2.8/Matting下。

从PaddleSeg/Matting的quick_start文档,如果我们需要测试或者训练Matting的相关模型,需要先配置相关环境。

1.1 安装PaddlePaddle

版本要求

  • PaddlePaddle >= 2.0.2
  • Python >= 3.7+

我们用Conda管理python环境,首先使用以下命令创建一个名为PaddleSeg,Python版本为3.9的虚拟环境

conda create -n PaddleSeg python=3.9

然后激活虚拟环境

conda activate PaddleSeg

然后安装PaddlePaddle,进入飞桨的官网根据系统类型、CUDA版本和PaddlePaddle版本要求进行选择,本次使用的命令行为

python -m pip install paddlepaddle-gpu==2.4.2.post112 -f https://www.paddlepaddle.org.cn/whl/windows/mkl/avx/stable.html

等待执行完成,完成PaddlePaddle的安装。

1.2 拉取PaddleSeg仓库

使用以下命令拉取PaddleSeg仓库

git clone https://github.com/PaddlePaddle/PaddleSeg

1.3 安装PaddleSeg/Matting的相关库

切换目录到PaddleSeg/Matting,并根据requirements.txt安装Matting所需依赖库

cd PaddleSeg/Matting
pip install -r requirements.txt

等待所有库安装完成,整个环境配置也完成了。

2 PP-MattingV2模型测试

首先在https://github.com/PaddlePaddle/PaddleSeg/tree/release/2.8/Matting 下载PP-MattingV2-512的最新CheckPoint模型,如下图

PaddlePaddle – 抠图模型PP-MattingV2环境配置与Onnx模型导出-StubbornHuang Blog

将下载的模型放到Matting下的pretrained_models文件夹下,然后在Matting目录执行以下命令进行demo图片的抠图推理

python tools/predict.py \
    --config configs/ppmattingv2/ppmattingv2-stdc1-human_512.yml \
    --model_path pretrained_models/ppmattingv2-stdc1-human_512.pdparams \
    --image_path demo/human.jpg \
    --save_dir ./output/results \
    --fg_estimate True

抠图结果输出到了Matting目录下的./output/results的目录中。

3 PP-MattingV2模型导出Onnx

3.1 PP-MattingV2导出部署模型

在Matting目录下使用以下命令导出PP-MattingV2-512的部署模型

python tools/export.py \
    --config configs/quick_start/ppmattingv2-stdc1-human_512.yml \
    --model_path pretrained_models/ppmattingv2-stdc1-human_512.pdparams \
    --save_dir output/export \
    --input_shape 1 3 512 512

这里的输入图片形状为1x3x512x512,也就是只支持512x512分辨率的图片。

导出的部署模型在Matting文件夹下的output/export文件夹下,包含model.pdmodelmodel.pdiparams两个文件,这也是后面导出Onnx模型所需要使用的。

3.2 PP-MattingV2部署模型导出为Onnx模型

在得到PP-MattingV2-512的部署模型之后,我们需要使用Paddle2ONNX将部署模型转换为Onnx,具体可参考PaddlePaddle – 使用Paddle2Onnx将Paddle模型导出为onnx模型,使用以下命令进行Onnx转换

paddle2onnx --model_dir ./output/export --model_filename model.pdmodel --params_filename model.pdiparams --save_file model.onnx --enable_dev_version True --enable_onnx_checker True --opset_version 11

3.3 模型转换存在的问题

如果在3.1节中修改输入图片的分辨率,将其修改为动态维度,可以正常导出部署模。但是之后使用Paddle2ONNX将具有动态维度的部署模型导出为Onnx模型时,会出现错误

(PaddleSeg) PS F:\GitHubRepositories\PaddleSeg\Matting> paddle2onnx --model_dir ./output/export --model_filename model.pdmodel --params_filename model.pdiparams --save_file model.onnx --enable_dev_version True --enable_onnx_checker True --opset_version 11
[Paddle2ONNX] Start to parse PaddlePaddle model...
[Paddle2ONNX] Model file path: ./output/export\model.pdmodel
[Paddle2ONNX] Paramters file path: ./output/export\model.pdiparams
[Paddle2ONNX] Start to parsing Paddle model...
[ERROR][Paddle2ONNX] [pool2d: pool2d_7.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_8.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_9.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_10.tmp_0] While Attribute(ksize)'s type is Tensor, it's not supported.
[Paddle2ONNX] Due to the operator: pool2d, this model cannot be exported to ONNX.
[ERROR][Paddle2ONNX] [pool2d: pool2d_11.tmp_0] While Attribute(ksize)'s type is Tensor, it's not supported.
[Paddle2ONNX] Due to the operator: pool2d, this model cannot be exported to ONNX.
[ERROR] Model exporting failed, you can report this problem to https://github.com/PaddlePaddle/Paddle2ONNX.git.

从出现的错误上看,Adaptive only support static input shape.Paddle2ONNX只支持静态输入维度,而不支持动态维度。