paddle1.0版本 检测与识别模型同理使用。
首先,将使用的后缀为.pdopt/.pdparams/.states的三个训练文件以及训练时的yml文件,放到相应的文件夹下,随后修改tools/program.py文件中的参数,将-c中对应的default设为yml文件的相对路径或绝对路径。
其次,打开yml文件,将文件中的Global:checkpoints设置为三个训练文件保存的位置(注意,此处位置应当是保存文件夹+去后缀的文件名,例如:./output/yanzhou_ID_detect/best_accuracy);修改save_inference_dir,即推理模型的保存位置。
最后,运行tools/export_model.py文件,生成推理模型。
首先,需要安装相应的第三方依赖:
1.paddlepaddle-gpu
2.paddle2onnx
3.onnx
4.onnxruntime-gpu
5.cuda
6.cudnn
其次,修改以下命令中model_dir model_filename以及params_filename、save_file,并在控制台运行命令:
paddle2onnx --model_dir ./inference/yanzhou_ID_detect/ --model_filename inference.pdmodel --params_filename inference.pdiparams --save_file ./inference/yanzhou_ID_detect/detID_mv3.onnx --opset_version 11 --enable_onnx_checker True
即可生成.onnx文件。测试onnx情况,修改程序onnx_text.py的file路径,运行程序:
import onnx,time
import numpy as np
import onnxruntime
onnx_file = './inference/yanzhou_ID_detect/detID_mv3.onnx' # './inference/yanzhou_ID_detect/detID_res50.onnx'
onnx_model = onnx.load(onnx_file)
onnx.checker.check_model(onnx_model)
print('The model is checked!')
x = np.random.random((1,3,640,640)).astype('float32') # 此处也可用cv读取某张图片作为输入
print("x:",x)
ort_sess = onnxruntime.InferenceSession(onnx_file)
ort_inputs = {ort_sess.get_inputs()[0].name: x}
start = time.time()
ort_outs = ort_sess.run(None, ort_inputs)
end = time.time()
print("Runtime:{}".format(end-start))
由此,我们可以验证onnx是否转出成功,并测试onnx的部分性能。
模型的输入输出尺寸也需要特别关注,下附修改代码:
import onnx
model = onnx.load(r'det_server.onnx')
model.graph.input[0].type.tensor_type.shape.dim[2].dim_param = '?'
model.graph.input[0].type.tensor_type.shape.dim[3].dim_param = '?'
model.graph.output[0].type.tensor_type.shape.dim[2].dim_param = '?'
model.graph.output[0].type.tensor_type.shape.dim[3].dim_param = '?'
# print(model.graph.input[0].type.tensor_type.shape)
onnx.save(model, 'det.onnx')
该步骤需要在盒子上进行,尝试过网上所有直接装包,用python程序去转的方法,无一例外都报了如下的错:
AttributeError: 'NoneType' object has no attribute 'serialize'。
在查找了很多信息后,还是选择使用编译生成的方式进行。
首先,找到盒子上是否装有tensorrt,如果没有,则自行安装符合cuda版本的tensorrt,安装好后将其写入环境变量。
然后,到https://github.com/onnx/onnx-tensorrt.git,下载onnx-tensorrt
(参考https://jinfagang.github.io/2019/07/16/2019_07_16_20_onnx%E6%A8%A1%E5%9E%8Btensorrt%E6%8E%A8%E7%90%86%E5%AE%9E%E8%B7%B5/ )
,
但是,按他的步骤会出现错误:
/home/nvidia/onnx-tensorrt-master/third_party/onnx does not contain a CMakeLists.txt file.
因为在该步骤前,应当先将onnx放到此目录下,否则cmake是根本找不到响应文件。所以,接下来,去到https://github.com/onnx/onnx/releases下载onnx对应版本,将其解压到onnx-tensorrt-master/third_party/onnx下,在onnx-tensorrt-master目录下,执行命令:
mkdir build
cd build
cmake ..
make -j8
sudo make install
编译完成后,如果出现下面的log,预示着构建了onnx和tensorrt的桥梁,并且它会生成可执行文件。
-- The CXX compiler identification is GNU 7.5.0
-- The C compiler identification is GNU 7.5.0
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Build type not set - defaulting to Release
-- Found PythonInterp: /usr/bin/python (found version "3.6.9")
-- Found PythonLibs: /usr/lib/aarch64-linux-gnu/libpython3.6m.so (found version "3.6.9")
Generated: /home/nvidia/onnx-tensorrt-master/third_party/onnx/onnx/onnx_onnx2trt_onnx-ml.proto
Generated: /home/nvidia/onnx-tensorrt-master/third_party/onnx/onnx/onnx-operators_onnx2trt_onnx-ml.proto
Generated: /home/nvidia/onnx-tensorrt-master/third_party/onnx/onnx/onnx-data_onnx2trt_onnx.proto
--
-- ******** Summary ********
-- CMake version : 3.20.2
-- CMake command : /usr/local/lib/python3.6/dist-packages/cmake/data/bin/cmake
-- System : Linux
-- C++ compiler : /usr/bin/c++
-- C++ compiler version : 7.5.0
-- CXX flags : -Wall -Wno-deprecated-declarations -Wno-unused-function -Wnon-virtual-dtor
-- Build type : Release
-- Compile definitions : ONNX_NAMESPACE=onnx2trt_onnx
-- CMAKE_PREFIX_PATH :
-- CMAKE_INSTALL_PREFIX : /usr/local
-- CMAKE_MODULE_PATH :
--
-- ONNX version : 1.10.1
-- ONNX NAMESPACE : onnx2trt_onnx
-- ONNX_USE_LITE_PROTO : OFF
-- USE_PROTOBUF_SHARED_LIBS : OFF
-- Protobuf_USE_STATIC_LIBS : ON
-- ONNX_DISABLE_EXCEPTIONS : OFF
-- ONNX_WERROR : OFF
-- ONNX_BUILD_TESTS : OFF
-- ONNX_BUILD_BENCHMARKS : OFF
-- ONNXIFI_DUMMY_BACKEND : OFF
-- ONNXIFI_ENABLE_EXT : OFF
--
-- Protobuf compiler : /usr/bin/protoc
-- Protobuf includes : /usr/include
-- Protobuf libraries : /usr/lib/aarch64-linux-gnu/libprotobuf.so;-lpthread
-- BUILD_ONNX_PYTHON : OFF
-- Found TensorRT headers at /usr/include/aarch64-linux-gnu
-- Find TensorRT libs at /usr/lib/aarch64-linux-gnu/libnvinfer.so;/usr/lib/aarch64-linux-gnu/libnvinfer_plugin.so
-- Configuring done
-- Generating done
-- Build files have been written to: /home/nvidia/onnx-tensorrt-master
之后,就是激动人心的onnx转trt步骤了,幸运的话,基本一次性就可以成功了。
onnx2trt ***.onnx -o ***.trt
下一篇着重介绍,paddle2.0版本如何转换onnx与trt。