PaddleX 在windows10使用paddle_inference部署C#打包dll全教程,亲测有效

一. 基本环境配置

项目使用环境说明:

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

如果您的计算机有NVIDIA® GPU:

CUDA 工具包10.1/10.2 配合 cuDNN v7.6.5

CUDA 工具包 11.1 配合 cuDNN v8.1.1

CUDA 工具包 11.2 配合 cuDNN v8.2.1

CUDA 工具包 11.6 配合 cuDNN v8.4.0

GPU运算能力超过3.5的硬件设备**

CUDA和CUDNN的安装流程和配置方法,请见CUDA,cuDNN

指导视频:https://www.bilibili.com/video/BV1vS4y1R7wT?p=2`

官方文档:https://github.com/PaddlePaddle/PaddleX/tree/develop/deploy/cpp/docs/csharp_deploy

1.1 Visual Studio2019安装

选择Community版本即可,插件选择使用c++桌面程序,其他插件如果没选择,打开vs创建项目时会提示再安装,由于我已经安装了所以没放图:

1.2 CUDA10.2安装

在命令行输入:

nvcc --version
1

查看CUDA版本,发现是10.0,需要替换为10.2:

再输入nvidia-smi查看显卡信息,发现支持CUDA10.2:

官网下载地址:CUDA Toolkit Archive | NVIDIA Developer

到官网下载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配置成功:

1.3 安装Cudnn

官网下载地址:cuDNN Archive | NVIDIA Developer

安装cuDNNv7.6.5 for CUDA10.2:

下载后解压:

将该目录下的三个文件夹的文件分别复制到CUDA-10.2的对应文件夹下:

到D:\DevelopmentSoft\CUDA-10.2\include下打开cudnn.h查看cudnn版本:

cudnn安装后不用再添加环境变量了,因为之前已经对CDUA-10.2这个目录下面配置过了。

1.4 下载PaddleX-develop

注意,不要下载release版本的,一定要是默认的develop版本的源码,release版本里面没有csharp_deploy文件夹!

1.5 下载paddleinference

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的子目录下:

1.6 下载opencv3.4.6

OpenCV下载地址: https://opencv.org/releases/

注意是使用exe安装,不要到github下载成opencv的源码了:

编辑环境变量:

1.6 下载TensorRT 7.0.0.11

TensorRT 7.0.0.11下载地址:https://developer.nvidia.com/nvidia-tensorrt-7x-download

1.7 安装cmake3.18.5

到官网下载cmake3.18.5.msi

下载后点击安装,安装时选择Add Path to the current User,添加环境变量。

二. 代码编译

使用Cmake进行编译,我们主要对PaddleX/deploy/cpp中代码进行编译,并创建out文件夹用来承接编译生成的内容:

第一个目录是待编译代码,第二个目录是编译后的代码,编译过程是从Cpp到gcc编译生成的二进制文件,注意,两个目录都不要有任何中文或特殊符号如"——“、”/"、“#”等, 否则会失败!

2.1 报错:配置不充分

这是它报错说配置不充分,发生错误是正常的,因为还没有配置:

下面开始配置,用户在这里补充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,点击重新生成:

2.2 报错:include文件的路径不对

如图,发现以下报错:

"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文件都把对应路径补全:

2.3 报错:发现错误:"setlocal"XX

发现错误:"setlocal"XX:

解决办法:在属性页"生成后事件“选择”在生成中使用“改为”否“:

2.4 报错:无法打开文件XXX

如图:

解决方法:在项目中搜索该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

三. C#移植部署演示

3.1 启动C#工程项目

到C#目录下启动这个工程项目:

3.2 移入dll文件

先把前面生成的Release目录下的model_infer.dll复制过来:

一次性复制所有dll:

把复制的dll放在C#工程的子目录下:

3.3 启动项目加载模型测试

3.3.1 PaddleX模型导出

使用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差异很大:

3.3.2 载入模型推理

选择模型初始化,但是发生报错:

选择了"paddlex",初始化时还是报错:

在部署群里问别的工程师,发现是少了一个opencv3456.dll:

把D:\Csharp_deploy\opencv\build\x64\vc15\bin的opencv3456.dll复制到C#的工程子目录文件夹下:

复制到该文件夹下:

重新运行:

推理成功!

3.4 自定义推理UI界面

打开项目中的.cs文件,可以对其进行修改:

也可以根据实际业务需求,自定义模型加载代码:

————————————————

版权声明:本文为CSDN博主「Geek L」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/m0_46339652/article/details/122972504

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值