项目使用环境说明:
CUDA10.2 Cudnn 7.6.5
opencv版本3.4.6
PaddleInference 10.2的预测库
TensorRT 7.0.0.11
Cmake 3.18.5
VS2019 社区版
开发环境:
paddlepaddle-gpu-2.1.0
paddleX-2.1.0
指导视频:https://www.bilibili.com/video/BV1vS4y1R7wT?p=2`
官方文档:https://github.com/PaddlePaddle/PaddleX/tree/develop/deploy/cpp/docs/csharp_deploy
选择Community版本即可,插件选择使用c++桌面程序,其他插件如果没选择,打开vs创建项目时会提示再安装,由于我已经安装了所以没放图:
在命令行输入:
nvcc --version
查看CUDA版本,发现是10.0,需要替换为10.2:
再输入nvidia-smi
查看显卡信息,发现支持CUDA10.2:
到官网下载CUDA10.2,选择下载到本地后安装(local):
本地安装:
提取完毕后在D:/CUDA10.2下,注意不要把提取出的文件和最终的安装目录放一起,因为安装过后会删除原来提取文件的文件夹!
选择自定义安装,接下来不要选Visual Studio Integration,即使选了也不能成功安装:
如果本机的驱动版本(当前版本)小于cuda对应的版本(新版本),则选择,否则不选。如果当前版本小于新版本,并且不覆盖安装,之后电脑会频繁蓝屏或死机,我这里电脑的驱动版本大于最新版本:
安装在另一个不同于提取文件的文件夹,这里会有一个warning,提醒需要配置环境变量:
成功安装后的目标文件目录:
修改环境变量时如果出现以下错误:
原因是Path变量下的环境变量配的太多了,解决方法是把Path中同一类型的变量放到一起单独在一个新变量下,如创立"CUDA-10.2"变量。
我这里直接在Path里面加入以下7个变量:
D:\DevelopmentSoft\CUDA-10.2\lib\x64
D:\DevelopmentSoft\CUDA-10.2\include
D:\DevelopmentSoft\CUDA-10.2\extras\CUPTI\lib64
D:\DevelopmentSoft\CUDA-10.2\bin\win64
D:\DevelopmentSoft\CUDA-10.2\common\lib\x64
D:\DevelopmentSoft\CUDA-10.2
在cmd输入nvcc -V
,可以看到,CUDA10.2配置成功:
安装cuDNNv7.6.5 for CUDA10.2:
下载后解压:
将该目录下的三个文件夹的文件分别复制到CUDA-10.2的对应文件夹下:
到D:\DevelopmentSoft\CUDA-10.2\include下打开cudnn.h查看cudnn版本:
cudnn安装后不用再添加环境变量了,因为之前已经对CDUA-10.2这个目录下面配置过了。
注意,不要下载release版本的,一定要是默认的develop版本的源码,release版本里面没有csharp_deploy文件夹!
https://github.com/PaddlePaddle/PaddleX/blob/release/2.0.0/deploy/cpp/docs/compile/paddle/windows.md
到一定要这里点击这一栏里的链接下载,到github上直接下载的paddle_inference是demo版本,和咱们使用的develop版本不一样!!不要下载错了!
然后把解压出来的thirdparty放在j解压出来的paddle的子目录下:
OpenCV下载地址: https://opencv.org/releases/
注意是使用exe安装,不要到github下载成opencv的源码了:
TensorRT 7.0.0.11下载地址:https://developer.nvidia.com/nvidia-tensorrt-7x-download
下载后点击安装,安装时选择Add Path to the current User,添加环境变量。
使用Cmake进行编译,我们主要对PaddleX/deploy/cpp中代码进行编译,并创建out文件夹用来承接编译生成的内容:
第一个目录是待编译代码,第二个目录是编译后的代码,编译过程是从Cpp到gcc编译生成的二进制文件,注意,两个目录都不要有任何中文或特殊符号如"——“、”/"、“#”等, 否则会失败!
下面开始配置,用户在这里补充opencv tensorrt paddle预测库,cuda的lib库的路径:
D:/Csharp_deploy/paddle
D:/DevelopmentSoft/CUDA-10.2/lib/x64
D:/Csharp_deploy/opencv
D:/Csharp_deploy/TensorRT-7.0.0.11
勾选WITH_GPU WITH_MKL WITH_PADDLE_TENSORRT 等四项:(注意图中PADDLE_DIR的路径应为paddleinference的路径,而非Paddle-Develop的路径,因此图中是错误的,仅仅是为了说明需要填路径,实际路径根据自己的路径来)
然后重新生成,这次不再报错,则表明生成成功:(注意图中PADDLE_DIR的路径应为paddleinference的路径,而非Paddle-Develop的路径,因此图中是错误的,仅仅是为了说明需要填路径,实际路径根据自己的路径来)
最终在out文件夹中出现了.sln文件,则表示通过cmake生成成功了解决方案:
打开sln文件,会发现在PaddleDeploy目录下生成了7个项目,其中关键的是
batch_infer
model_infer
multi_gpu_model_infer
tensorrt_infer
这几个:
取PaddleX/deploy/cpp/demo/model_infer.cpp替换Source Files下面的model_infer.cpp文件:
修改CMakeLists.txt:
把
add_executable(model_infer model_infer.cpp ${SRC} ${ENGINE_SRC} ${DETECTOR_SRC} ${ENCRYPTION_SRC})
改为:
add_library(model_infer SHARED model_infer.cpp ${SRC} ${ENGINE_SRC} ${DETECTOR_SRC} ${ENCRYPTION_SRC})
先把debug模式改为release模式,然后右击model_infer,点击重新生成:
如图,发现以下报错:
"paddle/include/paddle_inference_api.h”: No such file or directory“
原因:include文件的路径不对,改为paddle_inference的实际路径:
D:/Csharp_deploy/paddle/include/paddle_inference_api.h
发现警告消失了:
然后又陆续发现一些报错,找不到lib库,这时直接通过model_infer属性打开属性页的附加依赖项,在工程目录下搜索定位到对应的文件夹,将这些lib文件都把对应路径补全:
发现错误:"setlocal"XX:
解决办法:在属性页"生成后事件“选择”在生成中使用“改为”否“:
如图:
解决方法:在项目中搜索该paddle_inference.lib文件,定位后发现路径重了,多了一个"paddle",修改以下:
D:\Csharp_deploy\opencv\build\x64\vc15\lib\opencv_world346.lib
D:\Csharp_deploy\paddle\lib\paddle_inference.lib
glog.lib
gflags_static.lib
libprotobuf.lib
xxhash.lib
cryptopp-static.lib
libyaml-cppmt.lib
shlwapi.lib
D:\Csharp_deploy\paddle\third_party\install\mklml\lib\mklml.lib
D:\Csharp_deploy\paddle\third_party\install\mklml\lib\libiomp5md.lib
D:\DevelopmentSoft\CUDA-10.2\lib\x64\cudart.lib
D:\DevelopmentSoft\CUDA-10.2\lib\x64\cublas.lib
D:\DevelopmentSoft\CUDA-10.2\lib\x64\cudnn.lib
D:\Csharp_deploy\TensorRT-7.0.0.11\lib\nvinfer.lib
D:\Csharp_deploy\TensorRT-7.0.0.11\lib\nvinfer_plugin.lib
D:\Csharp_deploy\TensorRT-7.0.0.11\lib\myelin64_1.lib
kernel32.lib
user32.lib
gdi32.lib
winspool.lib
shell32.lib
ole32.lib
oleaut32.lib
uuid.lib
comdlg32.lib
advapi32.lib
为:
D:\Csharp_deploy\opencv\build\x64\vc15\lib\opencv_world346.lib
D:\Csharp_deploy\paddle\lib\paddle_inference.lib
D:\Csharp_deploy\third_party\install\glog\lib\glog.lib
D:\Csharp_deploy\third_party\install\gflags\lib\gflags_static.lib
D:\Csharp_deploy\third_party\install\protobuf\lib\libprotobuf.lib
D:\Csharp_deploy\third_party\install\xxhash\lib\xxhash.lib
D:\Csharp_deploy\third_party\install\cryptopp\lib\cryptopp-static.lib
D:\Csharp_deploy\PaddleX-develop\deploy\cpp\out\ext\yaml-cpp\lib\Release\libyaml-cppmt.lib
shlwapi.lib
D:\Csharp_deploy\paddle\third_party\install\mklml\lib\mklml.lib
D:\Csharp_deploy\paddle\third_party\install\mklml\lib\libiomp5md.lib
D:\DevelopmentSoft\CUDA-10.2\lib\x64\cudart.lib
D:\DevelopmentSoft\CUDA-10.2\lib\x64\cublas.lib
D:\DevelopmentSoft\CUDA-10.2\lib\x64\cudnn.lib
D:\Csharp_deploy\TensorRT-7.0.0.11\lib\nvinfer.lib
D:\Csharp_deploy\TensorRT-7.0.0.11\lib\nvinfer_plugin.lib
D:\Csharp_deploy\TensorRT-7.0.0.11\lib\myelin64_1.lib
kernel32.lib
user32.lib
gdi32.lib
winspool.lib
shell32.lib
ole32.lib
oleaut32.lib
uuid.lib
comdlg32.lib
advapi32.lib
然后在release x64模式下重新生成解决方案,这一次就显示成功啦:
生成成功后out目录的格局如下:
Realease目录下是生成的model_infer.dll
先把前面生成的Release目录下的model_infer.dll复制过来:
一次性复制所有dll:
把复制的dll放在C#工程的子目录下:
使用PaddleX训练出的模型需要先转换,原文件夹如下:
使用以下命令导出:
paddlex --export_inference --model_dir=./best_model/ --save_dir=./inference_model
发现报错如下:
查了一下发现原来是因为自己的PaddleX版本为1.3的,下面更新为2.0的:
装完paddleX2.0再次使用上面的命令导出模型,发现报错:
查了一下这个是因为shapely这个包版本不对,卸载掉原来的重新装一个就完了:
再次运行导出模型的命令,又报错:
这次仍然是paddleX版本不对,卸载掉paddleX2.0重新安装paddleX2.1.0:
win10要按照这样的方式安装,否则无法使用:
重新运行后接下来又报了关于numpy的错,因此升级一下numpy:
选择安装numpy-1.19.3:
再次运行导出模型的命令即可得到:
paddleX2.X导出的模型目录下有六个文件,和paddleX1.x差异很大:
选择模型初始化,但是发生报错:
选择了"paddlex",初始化时还是报错:
在部署群里问别的工程师,发现是少了一个opencv3456.dll:
把D:\Csharp_deploy\opencv\build\x64\vc15\bin的opencv3456.dll复制到C#的工程子目录文件夹下:
复制到该文件夹下:
重新运行:
推理成功!