PP-Matting-512 动态输入转 onnx 报错 Adaptive only support static input shape. (CPU版本)(问题未解决 试错版) 说明也可能是下面这个报错 上面的报错是导出命令执行时 加上 --enable_verbose 参数 然后保存日志 筛选 ERROR得到-------------------------------------- C Traceback (most recent call last): -------------------------------------- 0 paddle2onnx::Export(char const*, char const*, char**, int*, int, bool, bool, bool, bool, bool, paddle2onnx::CustomOp*, int, char const*, char**, int*, char const*, bool*, bool, char**, int) ---------------------- Error Message Summary: ---------------------- FatalError: Process abort signal is detected by the operating system. [TimeInfo: *** Aborted at 1792077560 (unix time) try date -d 1792077560 if you are using GNU date ***] [SignalInfo: *** SIGABRT (0x40bd) received by PID 16573 (TID 0x7ffbec6ad480) from PID 16573 ***]背景静态输入模型onnx格式效果经过实际比对 和官方的效果存在差异 官方的更好用的官方测试图片对比发现的也用官方的权重 paddle未转换成onnx格式跑了 确实可以官方效果见 PP-Matting_专业领域大模型_图像分割_Apache License 2.0-飞桨AI Studio星河社区定位发现输入预处理不一致-发现并非直接resize可以接受短边最大尺寸流程是长宽等比放缩 然后短边最大512还需要满足32的倍数 学到了其实就是动态输入的问题可以理解为什么效果好等比放缩和直接resize肯定有差异。下一步就是考虑如何实现动态输入onnx格式导出的问题 之前我对使用过其他onnx知道是存在动态输入onnx的固定输入PP-Matting-512的onnx是可以导出的我参考 PaddlePaddle – 抠图模型PP-MattingV2环境配置与Onnx模型导出-StubbornHuang Blogai得到转化脚本脚本可能无法直接用 但是可以参考大致的转换命令和环境 可能还会遇到什么版本问题 但是转换固定输入简单些 解决了就行 脚本见最后过程经过多种尝试调整版本 PaddleOCR问题汇总_fatalerror: illegal instruction is detected by t-CSDN博客其他人使用的方法 PaddleDetection模型导出ONNX格式时的Shape问题解析 - AtomGit | GitCode博客在这个上面看到其他人是用什么转化的 暂未实测 因为发现可能是算子本身的问题结论参考PaddleSeg导出ONNX模型时如何解决动态输入形状问题_编程语言-CSDN问答量化模型转换算子不支持 · Issue #1617 · PaddlePaddle/Paddle2ONNX这个issue可能和这里不太匹配 但是其他相关issue又有的可能带点轻微的负面情绪就不贴了 问ai发现可能确实是 自适应池化算子onnx不支持的原因 未明确是paddle本身的算子问题还是onnx的算子问题 可能修改底层的一些东西可以适配下但是水平有限 加上很久没有做这块了 加上没有太多精力 所以就暂不深究了弄了两天没搞定下一步尝试可能是使用FastDeploy试下 但是不一定搞看情况吧 更新fastdeploy 好像不支持cpu pass其他发现同一个onnx在linux上面用python代码跑 和在windows上面用rustort跑得到的效果也有差异linux上面的在头发上的细节上更好windows的在阴影上的处理更好而官方的就是两者加一起还好 太奇怪了 也没有去深究了 其实对比的始终是只有那一张测试图片hh更新可能是我在linux和windows上面归一化方法不一致的问题 记不太清了 不好意思 刚刚改了windows上面改了下归一化方法 ai说改下 然后效果差了不少固定输入转换脚本ai生成#!/bin/bash # # PP-Matting (HRNet_W18, 512) ONNX 导出脚本纯 CPU / Linux # # 模型: ppmatting-hrnet_w18-human_512 # 配置文件: configs/ppmatting/ppmatting-hrnet_w18-human_512.yml # # 用法: bash export_ppmatting_w18.sh # set -e # ---------- 可配置项 ---------- WORK_DIR$HOME/ppmatting-export CONDA_ENVPaddleSeg PADDLE_VER2.4.2 PADDLE_SEG_VERrelease/2.8 OPSET_VERSION11 # ------------------------------ GREEN\033[0;32m CYAN\033[0;36m YELLOW\033[1;33m RED\033[0;31m NC\033[0m step() { echo -e \n${CYAN}${NC}; echo -e ${CYAN} $1${NC}; echo -e ${CYAN}${NC}; } ok() { echo -e ${GREEN}[OK]${NC} $1; } warn() { echo -e ${YELLOW}[警告]${NC} $1; } fail() { echo -e ${RED}[错误]${NC} $1; exit 1; } # step 步骤 0: 环境检查 # command -v conda /dev/null 21 || fail 未找到 conda请先安装 Miniconda/Anaconda ok conda 已安装 command -v git /dev/null 21 || fail 未找到 git ok git 已安装 if grep -q avx /proc/cpuinfo; then ok CPU 支持 AVX else warn CPU 不支持 AVXPaddlePaddle 可能无法运行 fi # step 步骤 1: 创建工作目录 # mkdir -p $WORK_DIR cd $WORK_DIR ok 工作目录: $WORK_DIR # step 步骤 2: 创建并激活 Conda 环境 # if conda env list | grep -q ^${CONDA_ENV} ; then ok 环境已存在: $CONDA_ENV else echo [执行] 创建 conda 环境: $CONDA_ENV (Python 3.9) conda create -n $CONDA_ENV python3.9 -y ok 环境创建完成 fi eval $(conda shell.bash hook) conda activate $CONDA_ENV ok 已激活环境: $CONDA_ENV # step 步骤 2: 安装 PaddlePaddle (CPU 版, 官方 whl 直链) # echo [执行] 从官方 whl 直链安装 paddlepaddle2.4.2 (CPU) # 注意这里的 python 版本需要与你的环境匹配 # 例如 Python 3.9 对应 cp39Python 3.10 对应 cp310 PY_TAGcp39 # 请根据 python3 --version 的输出修改 pip3 install --break-system-packages \ https://paddle-wheel.bj.bcebos.com/2.4.2/linux/linux-cpu-mkl-avx/paddlepaddle-2.4.2-${PY_TAG}-${PY_TAG}-linux_x86_64.whl python3 -c import paddle; print(PaddlePaddle version:, paddle.__version__) ok PaddlePaddle 安装完成 # step 步骤 4: 克隆 PaddleSeg 仓库 # SEG_DIR$WORK_DIR/PaddleSeg if [ -d $SEG_DIR ]; then ok 仓库已存在: $SEG_DIR else echo [执行] 克隆 PaddleSeg $PADDLE_SEG_VER git clone -b $PADDLE_SEG_VER --depth 1 \ https://github.com/PaddlePaddle/PaddleSeg.git ok 仓库克隆完成 fi MATTING_DIR$SEG_DIR/Matting cd $MATTING_DIR # step 步骤 5: 安装 Matting 依赖 # echo [执行] pip install -r requirements.txt pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple echo [执行] 安装 paddle2onnx 及 ONNX 工具 pip install paddle2onnx onnx onnxruntime -i https://pypi.tuna.tsinghua.edu.cn/simple ok 依赖安装完成 # step 步骤 6: 下载预训练模型 # PRETRAINED_DIR$MATTING_DIR/pretrained_models mkdir -p $PRETRAINED_DIR MODEL_FILEppmatting-hrnet_w18-human_512.pdparams MODEL_PATH$PRETRAINED_DIR/$MODEL_FILE if [ -f $MODEL_PATH ]; then ok 模型已存在: $MODEL_FILE else echo [执行] 下载: $MODEL_FILE wget -q --show-progress -O $MODEL_PATH \ https://paddleseg.bj.bcebos.com/matting/models/$MODEL_FILE if [ -f $MODEL_PATH ]; then SIZE$(du -h $MODEL_PATH | cut -f1) ok 下载完成: $MODEL_FILE ($SIZE) else fail 下载失败: $MODEL_FILE fi fi # step 步骤 7: 测试推理验证环境 # TEST_IMG$MATTING_DIR/demo/human.jpg CONFIG_FILEconfigs/ppmatting/ppmatting-hrnet_w18-human_512.yml # if [ ! -f $CONFIG_FILE ]; then # fail 配置文件不存在: $CONFIG_FILE # echo 请检查 PaddleSeg 版本或配置文件路径 # fi # if [ -f $TEST_IMG ]; then # echo [执行] 测试推理... # python tools/predict.py \ # --config $CONFIG_FILE \ # --model_path pretrained_models/$MODEL_FILE \ # --image_path demo/human.jpg \ # --save_dir ./output/test_w18 \ # --fg_estimate True # ok 测试推理完成结果在: ./output/test_w18 # else # warn 未找到测试图片 demo/human.jpg跳过测试 # fi # step 步骤 8: 导出部署模型Paddle Inference # EXPORT_DIRoutput/export_w18 echo [执行] 导出部署模型输入 1x3x512x512 python tools/export.py \ --config $CONFIG_FILE \ --model_path pretrained_models/$MODEL_FILE \ --save_dir $EXPORT_DIR \ --input_shape 1 3 512 512 if [ -f $EXPORT_DIR/model.pdmodel ]; then ok 部署模型导出完成: $EXPORT_DIR else fail 部署模型导出失败 fi # step 步骤 9: 转换为 ONNX # ONNX_FILEppmatting-hrnet-w18.onnx echo [执行] Paddle2ONNX 转换 (opset $OPSET_VERSION) paddle2onnx \ --model_dir ./$EXPORT_DIR \ --model_filename model.pdmodel \ --params_filename model.pdiparams \ --save_file $ONNX_FILE \ --opset_version $OPSET_VERSION if [ -f $ONNX_FILE ]; then SIZE$(du -h $ONNX_FILE | cut -f1) ok ONNX 导出成功: $ONNX_FILE ($SIZE) else fail ONNX 导出失败 fi # step 步骤 10: 验证 ONNX 模型 # echo echo --- 验证: $ONNX_FILE --- python - PYEOF import onnx m onnx.load($ONNX_FILE) onnx.checker.check_model(m) print( IR version:, m.ir_version) print( Opset:, [(o.domain or ai.onnx, o.version) for o in m.opset_import]) print( Inputs:, [(i.name, [d.dim_value for d in i.type.tensor_type.shape.dim]) for i in m.graph.input]) print( Outputs:, [(o.name, [d.dim_value for d in o.type.tensor_type.shape.dim]) for o in m.graph.output]) PYEOF # step 完成 #