Windows11-YOLOX-TensorRT部署
环境:Windows11-CUDA11.1-cudnn8.9.7-PyTorch1.9.1+cu111-TensorRT8.5.2.2-Python3.8
1、YOLOX训练
- 下载源码
git clone https://github.com/Megvii-BaseDetection/YOLOX - 配置相关环境训练
- cd /xxx/xxx/YOLOX-main
- pip install -r requirements.txt
- python setup.py develop
- 安装apex
git clone https://github.com/NVIDIA/apex cd apex pip install -v --no-cache-dir --global-option="--pyprof" --global-option="--cpp_ext" --global-option="--cuda_ext" ./
- 运行/xxx/xxx/YOLOX-main/tools/train.py,根据运行报错安装相应包。
- 训练完成后,得到.pth文件。
2、生成engine文件
(方式二比较方便)
-
方式一: 使用trtexec工具转engine。(TensorRT-8.5.2.2/bin/trtexec.exe)
- 首先,将pth文件转onnx文件。
pip install onnxruntime cd /xxx/xxx/YOLOX-main # 标准模型可采用 python tools/export_onnx.py --output-name your_name.onnx -n your_name -c your_name.pth # 自定义模型采用 python tools/export_onnx.py --output-name yolox_s.onnx -f exps/default/yolox_s.py -c yolox_s.pth
- 然后,将onnx文件转engine文件。
#生成静态batchsize的engine ./trtexec.exe --onnx=<onnx_file> \ #指定onnx模型文件() --explicitBatch \ #在构建引擎时使用显式批大小(默认=隐式)显示批处理 --saveEngine=<tensorRT_engine_file> \ #输出engine --workspace=<size_in_megabytes> \ #设置工作空间大小单位是MB(默认为16MB) --fp16 #除了fp32之外,还启用fp16精度(默认=禁用) #生成动态batchsize的engine ./trtexec.exe --onnx=<onnx_file> \ #指定onnx模型文件 --minShapes=input:<shape_of_min_batch> \ #最小的batchsize x 通道数 x 输入尺寸x x 输入尺寸y --optShapes=input:<shape_of_opt_batch> \ #最佳输入维度,跟maxShapes一样就好 --maxShapes=input:<shape_of_max_batch> \ #最大输入维度 --workspace=<size_in_megabytes> \ #设置工作空间大小单位是MB(默认为16MB) --saveEngine=<engine_file> \ #输出engine --fp16 #除了fp32之外,还启用fp16精度(默认=禁用)
举例:
#将ONNX模型转换为静态batchsize的TensorRT模型,启动所有精度以达到最佳性能,工作区大小设置为1024M ./trtexec.exe --onnx=yolox_s_voc.onnx --explicitBatch --saveEngine=yolox_s_voc.engine --workspace=1024 --best #将ONNX模型转换为动态batchsize的TensorRT模型,启动所有精度以达到最佳性能,工作区大小设置为1024M ./trtexec.exe --onnx=mnist.onnx --minShapes=input:<1x3x640x640> --optShapes=input:<8x3x640x640> --maxShapes=input:<8x3x640x640> --saveEngine=mnist.engine --best --workspace=1024 --best
- 首先,将pth文件转onnx文件。
-
方式二: 使用TensorRT-Python转engine。
cd /xxx/xxx/TensorRT-8.5.2.2/python pip install tensorrt-8.5.2.2-cp38-none-win_amd64.whl # 标准模型可采用 python tools/trt.py -n yolox-s -c your_ckpt.pth # 自定义模型采用 python tools/trt.py -f <YOLOX_EXP_FILE> -c <YOLOX_CHECKPOINT>
3、使用engine文件推理(Visual Studio 2022)
- 打开Visual Studio 2022,创建空项目。
- 将/xxx/xxx/YOLOX-main/demo/TensorRT/cpp路径下的logging.h和yolox.cpp复制到工程文件内。
- 添加包含目录,项目——属性——VC++目录——包含目录:
- 添加库目录,项目——属性——VC++目录——库目录:
- 添加附加依赖项,项目——属性——链接器——输入:
opencv_world4100d.lib nvinfer.lib nvinfer_plugin.lib nvonnxparser.lib nvparsers.lib cudart.lib cuda.lib
- 编译代码并运行。
- 运行报错解决:
- 缺少dirent.h
解决方法:从Github上下载dirent.h加入工程文件内。 - C2589: “(”: “::”右边的非法标记
解决方法:这是由于函数模板max与Visual C++中的全局的宏max冲突。需将yolox.cpp中的std::max和std::min加上括号,即 (std::max)和 (std::min)。 - C4996 ‘localtime‘: This function or variable may be unsafe.
解决方法:
项目——属性——C/C++——预处理器——预处理器定义——右侧下拉框中“编辑”——在第一个编辑框中添加_CRT_SECURE_NO_WARNINGS
- 缺少dirent.h