tensorflow2.4训练保存得到.pb文件夹含有两个文件及一个脚本,通过以下语句得到.onnx模型

python -m tf2onnx.convert --saved-model **** --output  ***.onnx  --opset ***     //opset对应所保存模型的版本,很重要,直接决定后面.onnx模型转化.engine

然后通过以下命令行,进行模型简化,否则可能报错:

Your ONNX model has been generated with INT64 weights, while TensorRT does not natively support INT64. Attempting to cast down to INT32

Python  -m  onnxsim  ***.onnx    ***_sim.onnx

运行时如果报错:RuntimeError: The shape of input "input_1" has dynamic size "[0, 0, 0, 3]",

说明你的模型需要指定可变维度输入

python -m onnxsim **.onnx    **_sim.onnx --dynamic-input-shape --input-shape 1,416,416,3

其中416,416是自己模型训练时所要求的图片大小,

然后,就是困扰我三四天的转化.engine报错问题

我模型训练环境为  tensorflow2.4.0 

                              cuda    11.0 

                            cudnn     8.0.5.39

                            python    3.9

首先注意的是TensorRT安装是在base环境下,不用切换到tensorflow。相继测试安装了TensorRT-7.2.1.6,测试正常,--opset10下的onnx模型转化时报错:

报错:Your ONNX model has been generated with INT64 weights, while TensorRT does not natively support INT64. Attempting to cast down to INT32

明明自己对模型已经简化还是报该错误,造成加载失败。

之后将--opset=9简化的.onnx模型进行.engine转化时

没有再报Your ONNX model has been generated with INT64 weights,

而提示以下内容,导致模型加载失败

ERROR: builtin_op_importers.cpp:3569 In function importUpsample:

[8] Assertion failed: scales_input.is_weights()

[04/23/2023-17:20:34] [E] Failed to parse onnx file

该bug查询博客解决三天之久没有得到解决,之后开始了更换TensorRT版本尝试,包括TensorRT-7.2.2.3、TensorRT-7.2.3.4、TensorRT-8.0.1.6,均报同样为错误,导致模型加载失败。

之后在TensorRT-8.0.1.6版本时,改为--opset=10,报错不再是:

ERROR: builtin_op_importers.cpp:3569 In function importUpsample:

报错变成了

ModelImporter.cpp:726:ERROR: builtin_op_importers.cpp:3422 In function importResize:

[8] Assertion failed: scales.is_weights() && "Resize scales must be an initializer!"

再次更换TensorRT-8.2.1.8,测试正常,输入版本9模型转化时报错同上

参考网址

https://blog.csdn.net/baidu_33738335/article/details/111319349?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168247454816800222868666%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=168247454816800222868666&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-111319349-null-null.142^v86^insert_down38v5,239^v2^insert_chatgpt&utm_term=Assertion%20failed%3A%20%28scales_input.is_weights%28%29%29%20%26%26%20The%20scales%20input%20must%20be%20an%20initializer.&spm=1018.2226.3001.4187

提示到出现该报错的原因是使用比例因子时,生成的图形动态计算输出形状,同时在该博客参考的网址内提到onnx模型版本为—opset==11转化的效果,更换保存版本为—opset==11,从头在开始转化opset==11的onnx_sim模型,

trtexec --onnx=**_sim.onnx --saveEngine=***_sim.engine --workspace=1024 --minShapes=input_1:1x***x***x3 --optShapes=input_1:2x***x***x3 --maxShapes=input_1:4x***x****x3 --fp16

注意input_1是我的训练模型名称,要更换为自己的,转化过程中虽然仍报错含有INT64 ,但转化成功

         从.pb模型转onnx模型,再到engine模型转化。含泪奋斗一个月了,多少次想放弃,但不甘心,总感觉自己太笨了。学这些以后还不知道能不能用上,自己也不是这个专业的,但想想多学点也算充实下自己吧,黎明前很痛苦,每次debug都是能力的提升,奋斗吧,哥们

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐