FastDeploy部署paddlecls分类模型(windows)

目录

         写在前面

总体步骤

C++ SDK编译库

方式1:编译安装

方式2:下载预编译库

准备模型、文件、代码和数据

模型文件类型

samples代码

待预测图像

使用 FastDeploy C++ SDK

将cpp源码编译为exe

编写cpp代码

cpp代码编译exe

运行可执行程序exe

将cpp源码编译为dll

调用动态库dll文件

两个关键接口


写在前面

为何要自己进行编译呢?因为如果我们直接使用如下链接中预编译好的zip,你会发现,不能用,会报错【具体为啥报错,目前不太清楚】,因此,还是得我们亲自走一遍【编译】。

参考github链接:GitHub - PaddlePaddle/FastDeploy

总体步骤

1. C++ SDK编译库(以GPU部署环境为例)
2. 准备模型、文件、代码和数据
3. 使用 FastDeploy C++ SDK

C++ SDK编译库

方式1:编译安装

○ 环境要求

Windows 10/11 x64
cuda >= 11.2
cudnn >= 8.2
cmake >= 3.12
Visual Studio 16 2019
注意:安装CUDA时,需要勾选Visual Studio Integration, 或者手动将C:\Program Files \NVIDIA GPU Computing Toolkit \ CUDA \v11.7 \extras \ visual_studio_integration \MSBuildExtensions\文件夹下的4个文件,复制到C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\BuildCustomizations\文件夹。


查看电脑cuda版本,如图所示为117.1:


下载cuda对应的版本,网址:CUDA Toolkit Archive | NVIDIA Developer
下载cudnn对应的版本,网址:https://developer.nvidia.com/rdp/cudnn-download
否则,执行cmake命令时,可能会遇到No CUDA toolset found报错。

○ CMake GUI编译

参考链接:FastDeploy/build_on_win_with_gui.md

提示:如果自行编译SDK,理论上支持Windows 10/11,VS 2019/2022,CUDA 11.x 以及 TensorRT 8.x等配置,但建议使用默认配置,即:Windows 10, VS 2019, CUDA 11.2 和 TensorRT 8.4.x版本。

另外,如果编译过程中遇到中文字符的编码问题(如UIE example必须传入中文字符进行预测),可参考Visual Studio的官方文档,设置源字符集为/utf-8解决(/utf-8(将源字符集和执行字符集设置为 UTF-8) | Microsoft Learn)。

配置如下参数,然后点击 Configure。

Configure之后,会生成如下文件。

然后进行Generate,Generate后,会自动填充如下内容,可以看到:所有编译需要的include路径和lib路径已经被设置好了。


并且,会在指定目录下,出现如下内容,可以看到已经生成fastdeploy.sln解决方案文件。


接下来,我们使用Visual Studio 2019打开这个解决方案文件。


在Visual Studio 2019点击"ALL BUILD"->右键点击"生成"开始编译。(注意,该步骤比较耗时,在4090上大约消耗30分钟。)


成功后,输出如下提示:


编译完成后,在Visual Studio 2019点击"INSTALL"->右键点击"生成",将编译好的SDK安装到先前指定的目录。


如下提示,说明SDK安装成功!

同时,在指定的CMAKE_ INSTALL PREFIX目录中,也会出现如下文件。

进入到examples/vision/classification/paddlecls/cpp目录中,就会看到paddlecls的预测源码http://infer.cc文件。



方式2:下载预编译库

经过测试了1.0.7版本,不太行!

Release版 下载链接:https://bj.bcebos.com/fastdeploy/release/cpp/fastdeploy-win-x64-gpu-1.0.3.zip

准备模型、文件、代码和数据

模型文件类型

①.pdmodel、.pdiparams;

注意:原始模型文件(.pdparams、.pdopt、.pdstates)经过paddle inference模型转换工具,即可得到。

②inference_cls.yaml

FastDeploy会从yaml文件中获取模型在推理时需要的预处理信息。

samples代码

http://infer.cc、CMakeLists.txt,SDK编译成功后,就会出现在example文件夹中。

待预测图像

暂不展示。

使用 FastDeploy C++ SDK

将cpp源码编译为exe

创建空项目
打开Visual Studio 2019,点击"创建新项目"->点击"控制台程序",从而创建新的sln工程项目。参考文档:FastDeploy/use_sdk_on_windows.md

编写cpp代码

将http://infer.cc文件的推理代码粘贴过来,也可以进行二次开发。

然后,点击创建,便创建了一个空的sln工程。我们直接从examples里面拷贝http://infer.cc的代码这里(直接替换默认的初始代码即可)。代码路径为:E:\xxxxxx\FastDeploy\build\fastdeploy-win-x64-gpu\examples\vision\classification\paddleclas\cpp


cpp代码编译exe

将工程配置设置成"Release x64"配置


配置头文件include路径:鼠标选择项目,单击右键,即可弹出下来菜单,在其中单击“属性”。


在弹出来的属性页中选择:C/C++ —> 常规 —> 附加包含目录,然后在添加 fastdeploy 和 opencv 的头文件路径。如:
fastdeploy路径为:E:\xxxxxx\FastDeploy\build\fastdeploy-win-x64-gpu\include
opencv路径为:E:\xxxxxx\FastDeploy\build\fastdeploy-win-x64-gpu\third_libs\install\opencv\build\include
注意:由于测试时,出现“ “cuda_runtime_api.h”: No such file or directory”失败的提示,因此,又将cuda的头文件路径添加进去了!
cuda路径为:C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.6\include

然后,配置lib路径和添加库文件。属性页中,选择:链接器—>常规—> 附加库目录,然后在添加 fastdeploy 和 opencv 的lib路径。如:
fastdeploy路径为:E:\xxxxxx\FastDeploy\build\fastdeploy-win-x64-gpu\lib
opencv路径为:E:\xxxxxx\FastDeploy\build\fastdeploy-win-x64-gpu\third_libs\install\opencv\build\x64\vc15\lib


添加库文件。在链接器—>输入—> 附加依赖项中,只需要填写:fastdeploy.lib 和 opencv_world3416.lib。

编译工程并运行获取结果。点击菜单栏“生成”->“生成解决方案”。


编译成功后,出现结果如下(包含exe的保存路径):
保存路径:E:\xxxxxxx\fastdeploy-use-test\infer_ppcls\x64\Release\infer_ppcls.exe


运行可执行程序exe

执行可执行文件,获得推理结果。

首先,需要拷贝所有的dll到exe所在的目录下。特别说明,exe运行时所需要的依赖库配置方法。FastDeploy提供了工具,可以帮助我们快速将所有依赖库,拷贝至可执行程序所在目录。通过如下命令,将所有依赖的dll文件拷贝至可执行程序所在的目录。

cd  E:\xxxxxx\FastDeploy\build\fastdeploy-win-x64-gpu

fastdploy_init.bat install %cd% E:\xxxxx\fastdeploy-use-test2\infer_ppcls2\x64\Release

将dll依赖的其他dll全部复制到当前目录!


注意一下:

  • 在此步骤中,使用到的fastdeploy_init.bat提供更多其它功能,帮忙开发者使用,包括
    ✓ 查看SDK中所有dll, lib和include的路径
    ✓ 安装SDK中所有dll至指定目录
    ✓ 配置SDK环境变量
  • fastdeploy_init.bat工具,具体可参考如下文档:FastDeploy/usage_of_fastdeploy_init_bat.md
  • 同时,也需要把ppcls的模型文件(不要忘记inference_cls.ymal)和测试图片,拷贝到exe所在的目录。

cmd命令行中运行exe程序,共输入4个参数:
第1个参数:infer_ppcls.exe
第2个参数:模型文件名
第3个参数:图片文件名
第4个参数:推理程序代号


例如,当传入第4个参数为1时,表示进行gpu推理。
命令行代码为:1.png 1


例如,预测结果如下:标签和得分。
原始图像为:


类别为3,3表示小狗,预测正确!

由于实际上在预测时,需要在代码中传入图像路径,模型文件路径,因此,修改了源码。

将cpp源码编译为dll

创建空项目
选择“Windows桌面向导”模板并选择“DLL”作为应用程序类型。


在“解决方案资源管理器”中,右键单击项目,然后选择“添加”->“新建项”。


在“添加新项”对话框中,选择“C++文件(.cpp)”类型,命名文件并单击“添加”。


○ 编写cpp代码编写
将源代码复制到cpp文件中,修改程序,然后保存文件。


○ cpp代码编译dll
将debug模式调整为release模式(x64),在“解决方案资源管理器”中,右键单击项目,并选择“属性”选项。在“属性页”中,选择“配置属性”->“常规”,确保“配置类型”设置为“动态库(.dll)”。


在弹出来的属性页中选择:C/C++ —> 常规 —> 附加包含目录,然后在添加 fastdeploy 和 opencv 的头文件路径。如:
fastdeploy路径为:E:\xxxxxx\FastDeploy\build\fastdeploy-win-x64-gpu\include
opencv路径为:E:\xxxxxx\FastDeploy\build\fastdeploy-win-x64-gpu\third_libs\install\opencv\build\include


注意:由于测试时,出现“ “cuda_runtime_api.h”: No such file or directory”失败的提示,因此,又将cuda的头文件路径添加进去了!
cuda路径为:C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.7\include


在“属性页”中,选择“配置属性”->“链接器”->“常规”,然后将“附加库目录”设置为库文件所在的目录。
fastdeploy路径为:E:\xxxxxxx\FastDeploy\build\fastdeploy-win-x64-gpu\lib
opencv路径为:E:\xxxxxxx\FastDeploy\build\fastdeploy-win-x64-gpu\third_libs\install\opencv\build\x64\vc15\lib


在“属性页”中,选择“配置属性”->“链接器”->“输入”,然后在“附加依赖项”字段中添加需要链接的库文件。
只需要填写:fastdeploy.lib 和 opencv_world3416.lib。
单击“应用”并单击“确定”。

单击“生成”->“生成解决方案”以构建DLL文件。


出现如下提示,说明构建成功。

DLL文件将位于项目输出目录下的“Release”文件夹中。

FastDeploy提供了工具,可以帮助我们快速将所有依赖库,拷贝至可执行程序所在目录。通过如下命令,将所有依赖的dll文件拷贝至可执行程序所在的目录。
cd E:\xxxxxxxx\FastDeploy\build\fastdeploy-win-x64-gpu
fastdeploy_init.bat install %cd% E:\xxxxxxxx\fastdeploy-use-test2\infer_ppcls2\x64\Release

将dll依赖的其他dll全部复制到当前目录!


注意一下:


调用动态库dll文件

到这一步就简单了,我们可以编写代码调用dll。

两个关键接口

● PaddleClas C++接口
○ PaddleClas类

fastdeploy::vision::classification::PaddleClasModel(
        const string& model_file,
        const string& params_file,
        const string& config_file,
        const RuntimeOption& runtime_option = RuntimeOption(),
        const ModelFormat& model_format = ModelFormat::PADDLE)

PaddleClas模型加载和初始化,其中model_file, params_file为训练模型导出的Paddle inference文件。
参数
➢ model_file(str): 模型文件路径
➢ params_file(str): 参数文件路径
➢ config_file(str): 推理部署配置文件
➢ runtime_option(RuntimeOption): 后端推理配置,默认为None,即采用默认配置
➢ model_format(ModelFormat): 模型格式,默认为Paddle格式

○ Predict函数
PaddleClasModel::Predict(cv::Mat* im, ClassifyResult* result, int topk = 1)
模型预测接口,输入图像直接输出检测结果。
参数
● im: 输入图像,注意需为HWC,BGR格式
● result: 分类结果,包括label_id,以及相应的置信度, ClassifyResult说明参考FastDeploy/docs/api/vision_results
● topk(int):返回预测概率最高的topk个分类结果,默认为1。

结束啦!有任何不明白,请欢迎咨询!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/947064.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【第二部分--Python之基础】03 容器类型的数据

Python内置的数据类型如序列(列表、元组等)、集合和字典等可以容纳多项数据,我们称它们为容器类型的数据。 序列 序列(sequence)是一种可迭代的、元素有序的容器类型的数据。 序列包括列表(list&#xff…

linux shell脚本 【分支结构case...in 、循环结构、函数】内附练习

1.思维导图 2.练习 1.定义一个find函数&#xff0c;查找ubuntu和root的gid 2.定义一个数组&#xff0c;写一个函数完成对数组的冒泡排序 bubble() {n${#arr[*]}for((i0;i<n-1;i));dofor((j0;j<n-1-i;j));doif ((arr[j]>arr[j1]));thentemp${arr[j]}arr[j]${arr[j1]}a…

基于SpringBoot和OAuth2,实现通过Github授权登录应用

基于SpringBoot和OAuth2&#xff0c;实现通过Github授权登录应用 文章目录 基于SpringBoot和OAuth2&#xff0c;实现通过Github授权登录应用0. 引言1. 创建Github应用2. 创建SpringBoot测试项目2.1 初始化项目2.2 设置配置文件信息2.3 创建Controller层2.4 创建Html页面 3. 启动…

从单点 Redis 到 1 主 2 从 3 哨兵的架构演进之路

一、前言 我们有个项目中用的 MySQL、Redis、ES、微服务都是单节点部署的&#xff0c;没有做集群模式部署&#xff0c;为了提高整体的可用性&#xff0c;对项目的部署架构进行了升级&#xff0c;支持高可用。 二、部署拓扑图 我们项目的测试环境 12 台服务器已经部署好了&am…

SQL 中的 EXISTS

我们先从 SQL 中最基础的 WHERE 子句开始。 比如下面这条 SQL 语句&#xff1a; 很显然&#xff0c;在执行这条 SQL 语句的时候&#xff0c;DBMS 会扫描 Student 表中的每一条记录&#xff0c;然后把符合 Sdept IS 这个条件的所有记录筛选出来&#xff0c;并放到结果集里面去…

大型概念模型:在句子表示空间中的语言建模

《Large Concept Models: Language Modeling in a Sentence Representation Space》这篇论文介绍了一种新的语言模型方法&#xff0c;它在句子表示空间中进行建模。该方法旨在改进传统语言模型的局限性&#xff0c;通过捕捉更高级别的语义信息来提高自然语言处理任务的表现。 模…

活动预告 | Microsoft Power Platform 在线技术公开课:实现业务流程自动化

课程介绍 参加“Microsoft Power Platform 在线技术公开课&#xff1a;实现业务流程自动化”活动&#xff0c;了解如何更高效地开展业务。参加我们举办的本次免费培训活动&#xff0c;了解如何借助 Microsoft AI Builder 和 Power Automate 优化工作流。结合使用这些工具可以帮…

YK人工智能(三)——万字长文学会torch深度学习

2.1 张量 本节主要内容&#xff1a; 张量的简介PyTorch如何创建张量PyTorch中张量的操作PyTorch中张量的广播机制 2.1.1 简介 几何代数中定义的张量是基于向量和矩阵的推广&#xff0c;比如我们可以将标量视为零阶张量&#xff0c;矢量可以视为一阶张量&#xff0c;矩阵就是…

企业二要素如何用C#实现

一、什么是企业二要素&#xff1f; 企业二要素&#xff0c;通过输入统一社会信用代码、企业名称或统一社会信用代码、法人名称&#xff0c;验证两者是否匹配一致。 二、企业二要素适用哪些场景&#xff1f; 例如&#xff1a;信用与金融领域 1.信用评级&#xff1a;信用评级…

Visual Studio 2022安装教程

1、下载网址 Visual Studio 2022 IDE安装网址借助 Visual Studio 设计&#xff0c;具有自动完成、构建、调试、测试功能的代码将与 Git 管理和云部署融为一体。https://visualstudio.microsoft.com/zh-hans/vs/ 点击图片所示 双击运行 2、安装 点击C桌面开发&#xff08;右边…

TVS二极管选型【EMC】

TVS器件并联在电路中&#xff0c;当电路正常工作时&#xff0c;他处于截止状态&#xff08;高阻态&#xff09;&#xff0c;不影响线路正常工作&#xff0c;当线路处于异常过压并达到其击穿电压时&#xff0c;他迅速由高阻态变为低阻态&#xff0c;给瞬间电流提供一个低阻抗导通…

redis的集群模式与ELK基础

一、redis的集群模式 1.主从复制 &#xff08;1&#xff09;概述 主从模式&#xff1a;这是redis高可用的基础&#xff0c;哨兵和集群都是建立在此基础之上。 主从模式和数据库的主从模式是一样的&#xff0c;主负责写入&#xff0c;然后把写入的数据同步到从服务器&#xff…

Kubernetes第三天

1.pod容器的三种重启策略 查看容器的重启策略有哪些 kubectl explain po.spec. 发现有Always OnFailure Never Always,当容器退出时&#xff0c;始终重启容器 OnFailure,当容器正常退出时&#xff0c;不会自动重启容器&#xff0c;当容器异常退出时&#xff0c;重启容器 …

61.旋转链表 python

旋转链表 题目题目描述示例 1&#xff1a;示例 2&#xff1a;提示&#xff1a; 题解思路分析Python 实现代码代码解释提交结果 题目 题目描述 给你一个链表的头节点 head &#xff0c;旋转链表&#xff0c;将链表每个节点向右移动 k 个位置。 示例 1&#xff1a; 输入&#…

什么时候出现对象?芊芊测字,ai测字

芊芊测字地址&#xff1a;芊芊测字-ai免费测字

SpringMVC(1)——SpringMVC配置和基本原理

目录 ​编辑 第一章&#xff1a;Java web的发展历史 一.Model I和Model II 1.Model I开发模式&#xff08;已经淘汰&#xff09; 2.Model II开发模式 二. MVC模式 第二章&#xff1a;SpringMVC的入门案例 搭建SpringMVC的入门程序 ①&#xff1a;创建WEB工程&#xff…

Switch组件的用法

文章目录 1 概念介绍2 使用方法3 示例代码我们在上一章回中介绍了PageView这个Widget,本章回中将介绍Switch Widget.闲话休提,让我们一起Talk Flutter吧。 1 概念介绍 我们在这里介绍的Switch是指左右滑动的开关,常用来表示某项设置是打开还是关闭。Flutter中使用Switch类表…

电脑中缺失的nvrtc64_90.dll文件如何修复?

一、文件丢失问题 案例&#xff1a;nvrtc64_90.dll文件缺失 问题分析&#xff1a; nvrtc64_90.dll是NVIDIA CUDA Runtime Compilation库的一部分&#xff0c;通常与NVIDIA的CUDA Toolkit或相关驱动程序一起安装。如果该文件丢失&#xff0c;可能会导致基于CUDA的应用程序&…

Springboot使用RabbitMQ实现关闭超时订单的一个简单示例

1.maven中引入rabbitmq的依赖&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency> 2.application.yml中进行rabbitmq相关配置&#xff1a; # rabbit…

简易CPU设计入门:内存读写(二)

项目代码下载 请大家首先准备好本项目所用的源代码。如果已经下载了&#xff0c;那就不用重复下载了。如果还没有下载&#xff0c;那么&#xff0c;请大家点击下方链接&#xff0c;来了解下载本项目的CPU源代码的方法。 CSDN文章&#xff1a;下载本项目代码 上述链接为本项目…