PaddleX 在windows10使用paddle_inference部署C#打包dll全教程

目录

  • 一. 基本环境配置
    • 1.1 Visual Studio2019安装
    • 1.2 CUDA10.2安装
    • 1.3 安装Cudnn
    • 1.4 下载PaddleX-develop
    • 1.5 下载paddleinference
    • 1.6 下载opencv3.4.6
    • 1.6 下载TensorRT 7.0.0.11
    • 1.7 安装cmake3.18.5
  • 二. 代码编译
    • 2.1 报错:配置不充分
    • 2.1 报错:include文件的路径不对
    • 2.3 报错:发现错误:"setlocal"XX
    • 2.4 报错:无法打开文件XXX
  • 三. C#移植部署演示
    • 3.1 启动C#工程项目
    • 3.2 移入dll文件
    • 3.3 启动项目加载模型测试
      • 3.3.1 PaddleX模型导出
      • 3.3.2 载入模型推理
    • 3.4 自定义推理UI界面

一. 基本环境配置

项目使用环境说明:

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

1.1 Visual Studio2019安装

选择Community版本即可,插件选择使用c++桌面程序,其他插件如果没选择,打开vs创建项目时会提示再安装,由于我已经安装了所以没放图:
PaddleX 在windows10使用paddle_inference部署C#打包dll全教程_第1张图片

1.2 CUDA10.2安装

在命令行输入:

nvcc --version

查看CUDA版本,发现是10.0,需要替换为10.2:
PaddleX 在windows10使用paddle_inference部署C#打包dll全教程_第2张图片
再输入nvidia-smi查看显卡信息,发现支持CUDA10.2:
PaddleX 在windows10使用paddle_inference部署C#打包dll全教程_第3张图片
到官网下载CUDA10.2,选择下载到本地后安装(local):
PaddleX 在windows10使用paddle_inference部署C#打包dll全教程_第4张图片
本地安装:
PaddleX 在windows10使用paddle_inference部署C#打包dll全教程_第5张图片
提取完毕后在D:/CUDA10.2下,注意不要把提取出的文件和最终的安装目录放一起,因为安装过后会删除原来提取文件的文件夹!
PaddleX 在windows10使用paddle_inference部署C#打包dll全教程_第6张图片
选择自定义安装,接下来不要选Visual Studio Integration,即使选了也不能成功安装:

如果本机的驱动版本(当前版本)小于cuda对应的版本(新版本),则选择,否则不选。如果当前版本小于新版本,并且不覆盖安装,之后电脑会频繁蓝屏或死机,我这里电脑的驱动版本大于最新版本:
PaddleX 在windows10使用paddle_inference部署C#打包dll全教程_第7张图片
安装在另一个不同于提取文件的文件夹,这里会有一个warning,提醒需要配置环境变量:
PaddleX 在windows10使用paddle_inference部署C#打包dll全教程_第8张图片
成功安装后的目标文件目录:
PaddleX 在windows10使用paddle_inference部署C#打包dll全教程_第9张图片
修改环境变量时如果出现以下错误:
PaddleX 在windows10使用paddle_inference部署C#打包dll全教程_第10张图片
原因是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

PaddleX 在windows10使用paddle_inference部署C#打包dll全教程_第11张图片
在cmd输入nvcc -V,可以看到,CUDA10.2配置成功:
PaddleX 在windows10使用paddle_inference部署C#打包dll全教程_第12张图片

1.3 安装Cudnn

安装cuDNNv7.6.5 for CUDA10.2:
PaddleX 在windows10使用paddle_inference部署C#打包dll全教程_第13张图片
下载后解压:
PaddleX 在windows10使用paddle_inference部署C#打包dll全教程_第14张图片
将该目录下的三个文件夹的文件分别复制到CUDA-10.2的对应文件夹下:
到D:\DevelopmentSoft\CUDA-10.2\include下打开cudnn.h查看cudnn版本:
PaddleX 在windows10使用paddle_inference部署C#打包dll全教程_第15张图片
cudnn安装后不用再添加环境变量了,因为之前已经对CDUA-10.2这个目录下面配置过了。

1.4 下载PaddleX-develop

注意,不要下载release版本的,一定要是默认的develop版本的源码,release版本里面没有csharp_deploy文件夹!
PaddleX 在windows10使用paddle_inference部署C#打包dll全教程_第16张图片

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版本不一样!!不要下载错了!
PaddleX 在windows10使用paddle_inference部署C#打包dll全教程_第17张图片
然后把解压出来的thirdparty放在j解压出来的paddle的子目录下:
PaddleX 在windows10使用paddle_inference部署C#打包dll全教程_第18张图片

1.6 下载opencv3.4.6

OpenCV下载地址: https://opencv.org/releases/
PaddleX 在windows10使用paddle_inference部署C#打包dll全教程_第19张图片
注意是使用exe安装,不要到github下载成opencv的源码了:
PaddleX 在windows10使用paddle_inference部署C#打包dll全教程_第20张图片

编辑环境变量:
PaddleX 在windows10使用paddle_inference部署C#打包dll全教程_第21张图片

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
PaddleX 在windows10使用paddle_inference部署C#打包dll全教程_第22张图片

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

二. 代码编译

使用Cmake进行编译,我们主要对PaddleX/deploy/cpp中代码进行编译,并创建out文件夹用来承接编译生成的内容:
PaddleX 在windows10使用paddle_inference部署C#打包dll全教程_第23张图片

第一个目录是待编译代码,第二个目录是编译后的代码,编译过程是从Cpp到gcc编译生成的二进制文件,注意,两个目录都不要有任何中文或特殊符号如"——“、”/"、“#”等, 否则会失败!
PaddleX 在windows10使用paddle_inference部署C#打包dll全教程_第24张图片

PaddleX 在windows10使用paddle_inference部署C#打包dll全教程_第25张图片

2.1 报错:配置不充分

这是它报错说配置不充分,发生错误是正常的,因为还没有配置:
PaddleX 在windows10使用paddle_inference部署C#打包dll全教程_第26张图片

下面开始配置,用户在这里补充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的路径,因此图中是错误的,仅仅是为了说明需要填路径,实际路径根据自己的路径来)
PaddleX 在windows10使用paddle_inference部署C#打包dll全教程_第27张图片
然后重新生成,这次不再报错,则表明生成成功:(注意图中PADDLE_DIR的路径应为paddleinference的路径,而非Paddle-Develop的路径,因此图中是错误的,仅仅是为了说明需要填路径,实际路径根据自己的路径来)
PaddleX 在windows10使用paddle_inference部署C#打包dll全教程_第28张图片

最终在out文件夹中出现了.sln文件,则表示通过cmake生成成功了解决方案:
PaddleX 在windows10使用paddle_inference部署C#打包dll全教程_第29张图片

打开sln文件,会发现在PaddleDeploy目录下生成了7个项目,其中关键的是

batch_infer

model_infer

multi_gpu_model_infer

tensorrt_infer

这几个:
PaddleX 在windows10使用paddle_inference部署C#打包dll全教程_第30张图片
取PaddleX/deploy/cpp/demo/model_infer.cpp替换Source Files下面的model_infer.cpp文件:
PaddleX 在windows10使用paddle_inference部署C#打包dll全教程_第31张图片

修改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})

PaddleX 在windows10使用paddle_inference部署C#打包dll全教程_第32张图片
先把debug模式改为release模式,然后右击model_infer,点击重新生成:
PaddleX 在windows10使用paddle_inference部署C#打包dll全教程_第33张图片

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

如图,发现以下报错:

"paddle/include/paddle_inference_api.h”: No such file or directory“

PaddleX 在windows10使用paddle_inference部署C#打包dll全教程_第34张图片
原因:include文件的路径不对,改为paddle_inference的实际路径:

D:/Csharp_deploy/paddle/include/paddle_inference_api.h

发现警告消失了:
PaddleX 在windows10使用paddle_inference部署C#打包dll全教程_第35张图片
然后又陆续发现一些报错,找不到lib库,这时直接通过model_infer属性打开属性页的附加依赖项,在工程目录下搜索定位到对应的文件夹,将这些lib文件都把对应路径补全:
PaddleX 在windows10使用paddle_inference部署C#打包dll全教程_第36张图片

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

发现错误:"setlocal"XX:
解决办法:在属性页"生成后事件“选择”在生成中使用“改为”否“:
PaddleX 在windows10使用paddle_inference部署C#打包dll全教程_第37张图片

2.4 报错:无法打开文件XXX

如图:

PaddleX 在windows10使用paddle_inference部署C#打包dll全教程_第38张图片
解决方法:在项目中搜索该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模式下重新生成解决方案,这一次就显示成功啦:
PaddleX 在windows10使用paddle_inference部署C#打包dll全教程_第39张图片
生成成功后out目录的格局如下:
PaddleX 在windows10使用paddle_inference部署C#打包dll全教程_第40张图片
Realease目录下是生成的model_infer.dll
PaddleX 在windows10使用paddle_inference部署C#打包dll全教程_第41张图片

三. C#移植部署演示

3.1 启动C#工程项目

到C#目录下启动这个工程项目:
PaddleX 在windows10使用paddle_inference部署C#打包dll全教程_第42张图片

3.2 移入dll文件

先把前面生成的Release目录下的model_infer.dll复制过来:
PaddleX 在windows10使用paddle_inference部署C#打包dll全教程_第43张图片
PaddleX 在windows10使用paddle_inference部署C#打包dll全教程_第44张图片
一次性复制所有dll:
PaddleX 在windows10使用paddle_inference部署C#打包dll全教程_第45张图片
把复制的dll放在C#工程的子目录下:
PaddleX 在windows10使用paddle_inference部署C#打包dll全教程_第46张图片

3.3 启动项目加载模型测试

3.3.1 PaddleX模型导出

使用PaddleX训练出的模型需要先转换,原文件夹如下:
PaddleX 在windows10使用paddle_inference部署C#打包dll全教程_第47张图片
使用以下命令导出:

paddlex --export_inference --model_dir=./best_model/ --save_dir=./inference_model

发现报错如下:
PaddleX 在windows10使用paddle_inference部署C#打包dll全教程_第48张图片
查了一下发现原来是因为自己的PaddleX版本为1.3的,下面更新为2.0的:
PaddleX 在windows10使用paddle_inference部署C#打包dll全教程_第49张图片
装完paddleX2.0再次使用上面的命令导出模型,发现报错:
PaddleX 在windows10使用paddle_inference部署C#打包dll全教程_第50张图片
查了一下这个是因为shapely这个包版本不对,卸载掉原来的重新装一个就完了:
PaddleX 在windows10使用paddle_inference部署C#打包dll全教程_第51张图片
再次运行导出模型的命令,又报错:
PaddleX 在windows10使用paddle_inference部署C#打包dll全教程_第52张图片
这次仍然是paddleX版本不对,卸载掉paddleX2.0重新安装paddleX2.1.0:
PaddleX 在windows10使用paddle_inference部署C#打包dll全教程_第53张图片
win10要按照这样的方式安装,否则无法使用:
PaddleX 在windows10使用paddle_inference部署C#打包dll全教程_第54张图片
重新运行后接下来又报了关于numpy的错,因此升级一下numpy:
PaddleX 在windows10使用paddle_inference部署C#打包dll全教程_第55张图片
选择安装numpy-1.19.3:
PaddleX 在windows10使用paddle_inference部署C#打包dll全教程_第56张图片
再次运行导出模型的命令即可得到:
PaddleX 在windows10使用paddle_inference部署C#打包dll全教程_第57张图片
paddleX2.X导出的模型目录下有六个文件,和paddleX1.x差异很大:
PaddleX 在windows10使用paddle_inference部署C#打包dll全教程_第58张图片

3.3.2 载入模型推理

选择模型初始化,但是发生报错:
PaddleX 在windows10使用paddle_inference部署C#打包dll全教程_第59张图片
选择了"paddlex",初始化时还是报错:
PaddleX 在windows10使用paddle_inference部署C#打包dll全教程_第60张图片
在部署群里问别的工程师,发现是少了一个opencv3456.dll:
把D:\Csharp_deploy\opencv\build\x64\vc15\bin的opencv3456.dll复制到C#的工程子目录文件夹下:
PaddleX 在windows10使用paddle_inference部署C#打包dll全教程_第61张图片
复制到该文件夹下:
PaddleX 在windows10使用paddle_inference部署C#打包dll全教程_第62张图片
重新运行:
PaddleX 在windows10使用paddle_inference部署C#打包dll全教程_第63张图片
推理成功!
PaddleX 在windows10使用paddle_inference部署C#打包dll全教程_第64张图片

3.4 自定义推理UI界面

打开项目中的.cs文件,可以对其进行修改:
PaddleX 在windows10使用paddle_inference部署C#打包dll全教程_第65张图片
也可以根据实际业务需求,自定义模型加载代码:
PaddleX 在windows10使用paddle_inference部署C#打包dll全教程_第66张图片

你可能感兴趣的:(深度学习,windows,c#,visual,studio)