商汤系列模型使用(二)MMDeploy使用方法(C++ 推理)mmdet、mmocr
参考链接:
MMDeploy安装、python API测试及C++推理_mmdeploy c++-CSDN博客
记录--MMDeploy安装、python API测试及C++推理_mmdeploy c++-CSDN博客
https://mmdeploy.readthedocs.io/zh-cn/stable/01-how-to-build/linux-x86_64.html
一、环境配置
1.基础环境配置
CUDA=11.8,
TensorRT=8.6.1
cmake = 3.25.0
GCC = 9
ubuntu = 20.04
python=3.8.20 :conda create -name mmdeploy2 python=3.8
pytorch: pip install torch==2.0.0 torchvision==0.15.1 torchaudio==2.0.1 --index-url https://download.pytorch.org/whl/cu118
2.MMdepoloy版本的选择,主要分为两个版本第一个版本为0.x和1.x,两个方式的git的方式不同
0.x:
git clone -b master https://github.com/open-mmlab/mmdeploy.git MMDeploy
1.x:
git clone -b main https://github.com/open-mmlab/mmdeploy.git MMDeploy
其中个各个版本存在一定的对应关系:https://github.com/open-mmlab/mmdeploy/blob/main/README_zh-CN.md
本文版本:
mmdeploy:1.3.1
mmcv:2.0.0rc4
mmengine:0.10.7
mmdet:3.1.0
mmocr:1.0.1
3.创建conda环境
conda create -n mmdeploy python=3.8.20
conda activate mmdeploy
pip install torch==2.0.0 torchvision==0.15.1 torchaudio==2.0.1 --index-url https://download.pytorch.org/whl/cu118
进入git下来的MMdeploy文件当中,输入:
pip install -e .
pip install mmcv==2.0.0rc4
pip install mmengine==0.10.7
pip install mmdet==3.1.0
pip install mmocr==1.0.1
4.安装系统基础支持包
(根据系统报错,缺什么安装什么)
sudo apt-get update
sudo apt-get install libspdlog-dev libopencv-dev
安装ppl.cv
git clone https://github.com/openppl-public/ppl.cv.git
cd ppl.cv
export PPLCV_DIR=$(pwd)
git checkout tags/v0.7.0 -b v0.7.0
./build.sh cuda
安装ONNXRuntime (必须为1.8.1) (加上-gpu都会报错)
安装ONNXRuntime的python包:
pip install onnxruntime==1.8.1
安装ONNXRuntime的预编译包:(cd xxxx # xxxx表示存放ONNXRuntime编译包的地址)
wget https://github.com/microsoft/onnxruntime/releases/download/v1.8.1/onnxruntime-linux-x64-1.8.1.tgz
tar -zxvf onnxruntime-linux-x64-1.8.1.tgz
二、推理测试
1.mmdet
1.1 mmdet-sdk建立
1.激活mmdeploy环境
2.设置环境变量的地址 根据实际安装地址设置
# 设置PATH和库目录 (在~/.bashrc中设置就不需要每次导入)
export ONNXRUNTIME_DIR=/root/onnxruntime-linux-x64-1.8.1
export LD_LIBRARY_PATH=$ONNXRUNTIME_DIR/lib:$LD_LIBRARY_PATH
export DTENSORRT_DIR=/root/Downloads/TensorRT-8.2.3.0
export LD_LIBRARY_PATH=$DTENSORRT_DIR/lib:$LD_LIBRARY_PATH
export PATH=/usr/local/cuda-11.1/bin:${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-11.1/lib64:${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
3.编译自定义算子 (报错的话缺什么补什么)
# 进入MMDeploy根目录下
cd ${MMDEPLOY_DIR}
# 新建并进入build文件夹
mkdir -p build && cd build
# 编译自定义算子
cmake \
-DMMDEPLOY_TARGET_BACKENDS="ort;trt" \
-DTENSORRT_DIR=/home/ljj/ljj/nvidia/TensorRT-8.6.1.6 \
-DCUDNN_DIR=${CUDNN_DIR} \
-DONNXRUNTIME_DIR=/home/ljj/ljj-project/Pycharm/mmlabel2/MMDeploy/onnxruntime-linux-x64-1.8.1 ..
make -j$(nproc)
4.编译SDK
# 编译MMDeploy SDK (cmake这步有时容易出bug,可能需要再执行一遍cmake操作,再执行make操作)
cmake .. \ -DMMDEPLOY_BUILD_SDK=ON \ -DCMAKE_CXX_COMPILER=g++-9 \
-DTENSORRT_DIR=/home/ljj/ljj/nvidia/TensorRT-8.6.1.6 \
-DMMDEPLOY_TARGET_BACKENDS="ort;trt" \
-DMMDEPLOY_CODEBASES=mmdet \ -DCUDNN_DIR=${CUDNN_DIR} \
-DMMDEPLOY_TARGET_DEVICES="cuda;cpu" \
-DONNXRUNTIME_DIR=/home/ljj/ljj-project/Pycharm/mmlabel/MMDeploy/onnxruntime-linux-x64-1.8.1 \
-Dpplcv_DIR=/home/ljj/ljj-project/Pycharm/mmlabel2/MMDeploy/ppl.cv/cuda-build/install/lib/cmake/ppl
make -j$(nproc)
make install
1.2.获取.engine文件
# 调用pythonAPI 转换模型: pytorch→onnx→engine
python tools/deploy.py \
configs/mmdet/detection/detection_tensorrt_dynamic-320x320-1344x1344.py \
/home/ljj/ljj-project/Pycharm/mmlabel2/mmdetection-3.3.0/configs/faster_rcnn/faster-rcnn_r50_fpn_1x_coco.py \
/home/ljj/ljj-project/Pycharm/mmlabel2/mmdetection-3.3.0/weight/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth \
/home/ljj/ljj-project/Pycharm/mmlabel2/mmdetection-3.3.0/demo/demo.jpg \
--work-dir work_dirs/faster_rcnn/ --device cuda --show --dump-info
1.3.使用C++程序进行推理
手动在github上面下载 mmdetection 3.3.0压缩包与模型权重文件
# 进入MMDeploy根目录
cd ${MMDEPLOY_DIR}
## 以后可以从这部分开始运行
# 进入example文件夹
cd build/install/example/cpp
# 编译object_detection.cpp
mkdir -p build && cd build
cmake -DMMDeploy_DIR=/home/ljj/ljj-project/Pycharm/mmlabel2/MMDeploy/build/install/lib/cmake/MMDeploy ..
make object_detection
2.mmocr
2.1 MMOCR-SDK建立
2.1.1.激活mmdeploy环境
2.1.2 设置环境变量的地址
# 根据实际安装地址设置
# 设置PATH和库目录 (在~/.bashrc中设置就不需要每次导入)
export ONNXRUNTIME_DIR=/root/onnxruntime-linux-x64-1.8.1
export LD_LIBRARY_PATH=$ONNXRUNTIME_DIR/lib:$LD_LIBRARY_PATH
export DTENSORRT_DIR=/root/Downloads/TensorRT-8.2.3.0
export LD_LIBRARY_PATH=$DTENSORRT_DIR/lib:$LD_LIBRARY_PATH
export PATH=/usr/local/cuda-11.1/bin:${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-11.1/lib64:${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
2.1.3.编译自定义算子 (报错的话缺什么补什么)
# 进入MMDeploy根目录下
cd ${MMDEPLOY_DIR}
# 新建并进入build文件夹
mkdir -p build && cd build
# 编译自定义算子
cmake \
-DMMDEPLOY_TARGET_BACKENDS="ort;trt" \
-DTENSORRT_DIR=/home/ljj/ljj/nvidia/TensorRT-8.6.1.6 \
-DCUDNN_DIR=${CUDNN_DIR} \
-DONNXRUNTIME_DIR=/home/ljj/ljj-project/Pycharm/mmlabel2/MMDeploy/onnxruntime-linux-x64-1.8.1 ..
make -j$(nproc)
2.1.4 MMDeploy SDK
# 编译MMDeploy SDK (cmake这步有时容易出bug,可能需要再执行一遍cmake操作,再执行make操作)
cmake .. \
-DMMDEPLOY_BUILD_SDK=ON \
-DCMAKE_CXX_COMPILER=g++-9 \
-DTENSORRT_DIR=/home/ljj/ljj/nvidia/TensorRT-8.6.1.6 \
-DMMDEPLOY_TARGET_BACKENDS="ort;trt" \
-DMMDEPLOY_CODEBASES=mmocr \
-DCUDNN_DIR=${CUDNN_DIR} \
-DMMDEPLOY_TARGET_DEVICES="cuda;cpu" \
-DONNXRUNTIME_DIR=/home/ljj/ljj-project/Pycharm/mmlabel/MMDeploy/onnxruntime-linux-x64-1.8.1 \
-Dpplcv_DIR=/home/ljj/ljj-project/Pycharm/mmlabel2/MMDeploy/ppl.cv/cuda-build/install/lib/cmake/ppl
make -j$(nproc)
make install
2.2 获取.engine文件
# 进入MMDeploy根目录
cd ${MMDEPLOY_DIR}
cd mmdeploy
# 下载模型权重与模型转换文件
pip install openmim
mim download mmocr --config dbnet_resnet18_fpnc_1200e_icdar2015 --dest .
# convert mmocr model to onnxruntime model with dynamic shape
python tools/deploy.py \
configs/mmocr/text-detection/text-detection_onnxruntime_dynamic.py \
/home/ljj/ljj-project/Pycharm/mmlabel2/mmocr-1.0.1/weight2/dbnet_resnet18_fpnc_1200e_icdar2015.py \
/home/ljj/ljj-project/Pycharm/mmlabel2/mmocr-1.0.1/weight2/dbnet_resnet18_fpnc_1200e_icdar2015_20220825_221614-7c0e94f2.pth \
demo/resources/text_det.jpg \
--work-dir mmdeploy_models/mmocr/dbnet/ort \
--device cpu \
--show \
--dump-info
cd mmdeploy
# download crnn model from mmocr model zoo
mim download mmocr --config crnn_mini-vgg_5e_mj --dest .
# convert mmocr model to onnxruntime model with dynamic shape
python tools/deploy.py \
configs/mmocr/text-recognition/text-recognition_onnxruntime_dynamic.py \
/home/ljj/ljj-project/Pycharm/mmlabel2/mmocr-1.0.1/weight2/crnn_mini-vgg_5e_mj.py \
/home/ljj/ljj-project/Pycharm/mmlabel2/mmocr-1.0.1/weight2/crnn_mini-vgg_5e_mj_20220826_224120-8afbedbb.pth \
demo/resources/text_recog.jpg \
--work-dir mmdeploy_models/mmocr/crnn/ort \
--device cpu \
--show \
--dump-info
2.3 使用C++程序进行推理
# 进入example文件夹
cd build/install/example/cpp
# 编译object_detection.cpp
mkdir -p build && cd build
cmake \
-DMMDeploy_DIR=/home/ljj/ljj-project/Pycharm/mmlabel2/MMDeploy/build/install/lib/cmake/MMDeploy \
-DTENSORRT_DIR=/home/ljj/ljj/nvidia/TensorRT-8.6.1.6 \
-DCUDNN_DIR=/usr/local/cuda \
-DCUDA_TOOLKIT_ROOT_DIR=/usr/local/cuda \
-DONNXRUNTIME_DIR=/home/ljj/ljj-project/Pycharm/mmlabel/MMDeploy/onnxruntime-linux-x64-1.8.1 \
-Dpplcv_DIR=/home/ljj/ljj-project/Pycharm/mmlabel2/MMDeploy/ppl.cv/cuda-build/install/lib/cmake/ppl \
..
make ocr
export LD_LIBRARY_PATH=/home/ljj/ljj-project/Pycharm/mmlabel2/MMDeploy/onnxruntime-linux-x64-1.8.1/lib:$LD_LIBRARY_PATH
./ocr cpu /home/ljj/ljj-project/Pycharm/mmlabel2/MMDeploy/mmdeploy_models/mmocr/dbnet/ort/ /home/ljj/ljj-project/Pycharm/mmlabel2/MMDeploy/mmdeploy_models/mmocr/crnn/ort/ /home/ljj/ljj-project/Pycharm/mmlabel2/mmocr-1.0.1/demo/demo_text_ocr.jpg
错误记录:
1. ONNXRUNTIME
(base) ljj@Legion:~/ljj-project/Pycharm/mmlabel/MMDeploy/build/install/example/cpp/build$ ./object_detection cuda /home/ljj/ljj-project/Pycharm/mmlabel/MMDeploy/work_dirs/faster_rcnn/ /home/ljj/ljj-project/Pycharm/mmlabel/MMDet/demo/demo.jpg
./object_detection: error while loading shared libraries: libonnxruntime.so.1.8.1: cannot open shared object file: No such file or directory
解决方法:
添加ONNXRUNTIME的安装路径:
export LD_LIBRARY_PATH=/home/ljj/ljj-project/Pycharm/mmlabel2/MMDeploy/onnxruntime-linux-x64-1.8.1/lib:$LD_LIBRARY_PATH
2. CMake
CMake Error at csrc/mmdeploy/core/CMakeLists.txt:15 (add_subdirectory):
The source directory
/home/ljj/ljj-project/Pycharm/mmlabel2/MMDeploy/third_party/spdlog
does not contain a CMakeLists.txt file.
CMake Error at csrc/mmdeploy/core/CMakeLists.txt:16 (set_target_properties):
set_target_properties Can not find target to add properties to: spdlog
CMake Error at csrc/mmdeploy/core/CMakeLists.txt:18 (target_compile_options):
Cannot specify compile options for target "spdlog" which is not built by
this project.
CMake Error at csrc/mmdeploy/core/CMakeLists.txt:72 (target_include_directories):
Cannot specify include directories for target "spdlog" which is not built
by this project.
解决方法:
sudo apt update
sudo apt install libspdlog-dev
3.CMake
CMake Error at csrc/mmdeploy/core/CMakeLists.txt:76 (target_link_libraries):
Target "mmdeploy_core" links to:
spdlog::spdlog
but the target was not found. Possible reasons include:
* There is a typo in the target name.
* A find_package call is missing for an IMPORTED target.
* An ALIAS target is missing.
解决方法:
git submodule update --init --recursive
4.在导出模型时报错
assert is_available(), (
AssertionError: TensorRT is not available, please install TensorRT and build TensorRT custom ops first.
07/28 13:26:10 - mmengine - ERROR - /home/ljj/ljj-project/Pycharm/mmlabel2/MMDeploy/mmdeploy/apis/core/pipeline_manager.py - pop_mp_output - 80 - `mmdeploy.apis.utils.utils.to_backend` with Call id: 1 failed. exit.
解决方案:
要安装python_tensort,直接找到安装好的TensorRT的安装包中找到对应python版本的TensorRT即可,
cd TensorRT-8.6.1.6/python
pip install tensorrt-8.6.1-cp38-none-linux_x86_64.whl
5.cmake
CMake Error at /home/ljj/ljj-project/Pycharm/mmlabel2/MMDeploy/build/install/lib/cmake/MMDeploy/modules/FindTENSORRT.cmake:7 (message):
Please set TENSORRT_DIR with cmake -D option.
Call Stack (most recent call first):
/home/ljj/ljj-project/Pycharm/mmlabel2/MMDeploy/build/install/lib/cmake/MMDeploy/MMDeployConfig.cmake:42 (find_package)
CMakeLists.txt:6 (find_package)
解决方案:
在指令处添加TensorRT路径
-DTENSORRT_DIR=/home/ljj/ljj/nvidia/TensorRT-8.6.1.6
6.cmake
CMake Error at /home/ljj/ljj-project/Pycharm/mmlabel2/MMDeploy/build/install/lib/cmake/MMDeploy/modules/FindCUDNN.cmake:18 (message):
Couldn't find cuDNN in CUDNN_DIR: , or in CUDA_TOOLKIT_ROOT_DIR: , please
check if the path is correct.
Call Stack (most recent call first):
/home/ljj/ljj-project/Pycharm/mmlabel2/MMDeploy/build/install/lib/cmake/MMDeploy/MMDeployConfig.cmake:43 (find_package)
CMakeLists.txt:6 (find_package)
解决方案:
添加CUDA路径
-DCUDNN_DIR=/usr/local/cuda
7.make错误
/usr/bin/ld: warning: libonnxruntime.so.1.8.1, needed by /home/ljj/ljj-project/Pycharm/mmlabel2/MMDeploy/build/install/lib/libmmdeploy.so.1.3.1, not found (try using -rpath or -rpath-link)
/usr/bin/ld: /home/ljj/ljj-project/Pycharm/mmlabel2/MMDeploy/build/install/lib/libmmdeploy.so.1.3.1: undefined reference to `OrtGetApiBase@VERS_1.8.1'
collect2: error: ld returned 1 exit status
make[3]: *** [CMakeFiles/object_detection.dir/build.make:152:object_detection] 错误 1
make[2]: *** [CMakeFiles/Makefile2:87:CMakeFiles/object_detection.dir/all] 错误 2
make[1]: *** [CMakeFiles/Makefile2:94:CMakeFiles/object_detection.dir/rule] 错误 2
make: *** [Makefile:169:object_detection] 错误 2
解决方案:
pip install onnxruntime==1.8.1
导入libonnxruntime.so.1.8.1所在的文件目录即可
export LD_LIBRARY_PATH=/home/ljj/ljj-project/Pycharm/mmlabel2/MMDeploy/onnxruntime-linux-x64-1.8.1/lib:$LD_LIBRARY_PATH
更多推荐



所有评论(0)