将Python机器学习模型集成到C++ Qt客户端应用程序中|Qt调用python详解

0、前言

有几个不同的选项可以将你的Python机器学习模型集成到你的C++ Qt客户端应用程序中。以下是一些可能的解决方案:

  1. 创建API: 将你的机器学习模型部署为一个API服务。你可以使用像Flask这样的轻量级Web框架来创建一个简单的HTTP服务。这样,你的Qt应用程序可以通过HTTP请求来与这个服务交互,并获取模型的预测结果。部署完成后,你需要在Qt中使用QNetworkAccessManager或其他HTTP客户端来呼叫远端API。
  2. 使用Python和Qt的集成: 如果你希望避免网络请求,可以考虑在你的应用程序中直接使用Python。这可以通过使用像PyQt5或PyOtherSide这样的库实现。
  3. C++机器学习库: 如果模型不是特别复杂,你可以考虑使用C++机器学习库(例如Shark、dlib或mlpack)重新实现你的模型。这样可以避免使用Python,但可能需要重新训练模型并调整算法。
  4. 使用嵌入式Python解释器: 在你的Qt应用程序中嵌入or指定一个Python解释器。这允许你直接从C++代码中调用Python代码,并使用你的模型。
    	Py_SetPythonHome(L"D:\\Anaconda\\envs\\cp39_torch1_13_1_vision_0_14_cu117");Py_Initialize();
    

     通过嵌入式Python部署方法,目标机器(用户的机器)无需单独安装Python。这是因为所有必要的Python组件都应该被包含在你的应用程序中,作为该应用程序的一部分进行分发。这意味着Python解释器和所有必要的库、模块及其他依赖都被静态链接到应用程序或以其他形式捆绑在一起,用户不需要执行额外的安装步骤。

     但是,这种方法也意味着你的Qt应用程序的部署包会更大,因为它可能需要包括Python解释器和额外的Python库。

  5. 将模型转换为ONNX: 如果你的机器学习模型支持导出为ONNX(Open Neural Network Exchange)格式,你可以将其转换为ONNX,然后在C++应用程序中使用支持ONNX的机器学习库(例如ONNX Runtime)来加载和运行模型。
  6. 使用远程服务器处理: 如果客户端应用程序的性能和网络延迟不是问题,你可以在远程服务器上托管你的Python模型,并通过网络请求进行交互。
    每个选项都有其优缺点,你应该根据你的具体需求来决定使用哪一种。比如,第一个选项可能是最简单的开始方式,而第三个和第五个选项可能提供了最好的性能。最后选择哪种方法,取决于你的应用需求、性能考虑以及你对于不同技术的熟悉程度。

最近和之前在做的项目都是在Qt中用c++编码项目的开发,其中的功能涉及到机器学习的算法,之前有尝试过直接调用python,但是一直不成功, 再加上想到直接打包python程序也会更大,遂放弃。前面几篇博客讲到把Yolov8的目标检测和分割模型部署成c++的,是因为当时采用了上述的第五类方法,直接将算法由python转换为c++嵌入到程序中了,但是实际中这样虽然性能最好,但是很麻烦。这次的项目涉及到多种检测算法,且算法需要随着实验进行实时迭代,不可能说将python转换成c++了(这样十分麻烦,涉及到重新编写…配置环境…),于是这次打算再次采用第四种方法,在Qt项目中直接使用c++来调用python。为什么不适用创建API的方法呢?主要还是因为数据涉及到不能通过网络传输。总之,让我们快速进入正题,如何使用Qt调用python把!

一、Qt调用python

如果是vs2019,可以看看前面讲解在vs2019下部署yolov8中的配置依赖环境,都是一样的,这里因为换成你了Qtcreator,那就以qtcreator来讲:

注意,看一下自己的项目环境是否是64位,否则后面会报错:
在这里插入图片描述

1.1:pro文件增加python目录

INCLUDEPATH += -I D:\software\anaconda3\envs\yolov8\include
LIBS += -LD:\software\anaconda3\envs\yolov8\libs -lpython39

在这里插入图片描述

1.2:将Python集成到Qt中

工具->选项->环境->外部工具,添加->添加目录 (双击可任意更改名称这里更改为RunPy)->添加工具(双击可任意更改名称这里更改为Python3)。点击Python3,配置执行档、参数等配置:

  • 执行档: python的安装目录,我这里(D:\software\anaconda3\envs\yolov8\python.exe),你自己找到自己安装的python.exe目录
  • 参数:%{CurrentDocument:FilePath}
  • 工作目录:%{CurrentDocument:Path}
    在这里插入图片描述

1.3:将相关的文件拷贝到项目的可执行目录

  • 所需拷贝文件:python相关的Dll文件、以及对应的你想要调用的py文件

在这里插入图片描述

🌸在Qt中创建一个Python脚本测试一下:

  • 创建python脚本(或者前面已经将Python脚本移动到可执行目录下,这个时候在Other Files中也能看到)
    在这里插入图片描述

这里我新建一个测试脚本test.py:

import matplotlib.pyplot as pltdef temperImg():plt.plot([1, 2, 1, 2])plt.show()temperImg()
  • 选中文件->点击 工具->外部->RunPy->Python3,运行脚本
    在这里插入图片描述
    OK可以看到可以成功调用python:
    在这里插入图片描述

1.4:添加环境变量

在这里插入图片描述

1.5:修改include文件夹中的object.h文件

修改include文件夹中的object.h文件,因为Python中slots是关键字,Qt中slots也是关键字,会冲突。
编译报错error: expected unqualified-id before ‘;’ token,这是与qt的slots关键字冲突,解决办法是将python中的slot取消宏定义,然后再恢复,如下图
在这里插入图片描述

#undef slotsPyType_Slot *slots; /* terminated by slot==0. */#define slots Q_SLOTS

1.6:C++程序调用

具体流程大概包括以下几个步骤:

  1. 设置Python环境:
    使用 Py_SetPythonHome() 指定Python环境路径。这个路径通常指向你希望使用的Python解释器的环境。

  2. 调用 Py_Initialize() 来初始化Python解释器。
    检查Python解释器是否初始化成功:

  3. 使用 Py_IsInitialized() 验证Python解释器是否已经成功初始化,如果没有,则输出相应的错误日志。

  4. 修改Python搜索路径:
    通过 sys.path.append(‘./’) 来修改Python模块搜索路径。这样做通常是为了确保Python能够找到你的脚本所在的目录。

  5. 导入Python模块:
    使用 PyImport_ImportModule(“testTunnel”) 来导入名为testTunnel的Python模块。

  6. 获取模块中函数的指针:
    获得模块中名为judge_image的函数指针,以便能够调用该函数。

  7. 准备函数参数:
    创建一个Python元组(PyTuple_New(1)),用以传递参数给Python函数。
    将C++字符串(在这里是一个文件夹路径)转换为Python字符串,并通过 PyTuple_SetItem() 设置到参数元组中。

  8. 调用Python函数:
    使用 PyEval_CallObject(pTest_1,pPara) 来调用Python函数,并传递参数元组pPara。这将执行Python脚本中的judge_image函数。

  9. 处理Python函数的返回值:
    PyEval_CallObject() 返回的PyObject* pyValue是Python函数的返回值。需要根据实际情况处理这个返回值。
    错误处理:
    如果在任何步骤中遇到错误,使用 PyErr_Print() 打印Python错误信息,并进行适当的错误处理。

  10. 清理资源:
    不要忘记在使用完Python对象后释放资源,比如使用 Py_DECREF() 减少引用计数,以及在最后使用 Py_Finalize() 终止Python解释器。

  // 获取选中项的文本,这里假设是文件夹的完整路径QString folderPath = item->text();QList<QFileInfo> noTargetList;Py_SetPythonHome(L"D:/software/anaconda3/envs/yolov8");Py_Initialize();if( !Py_IsInitialized() )qDebug()<<"图片加载模块的Python初始化失败";PyRun_SimpleString("import sys");PyRun_SimpleString("sys.path.append('./')");//这一步很重要,修改Python路径//创建模块指针PyObject* pModule = PyImport_ImportModule("testTunnel");if (!pModule)qDebug()<<"图片加载模块的Python获取模块指针失败";else {qDebug()<<"successfuly obtained Module!";}const char* filename = PyModule_GetFilename(pModule);if (filename == NULL) {PyErr_Print();Py_DECREF(pModule);Py_Finalize();}//创建函数指针PyObject* pTest_1 = PyObject_GetAttrString(pModule, "judge_image");if (!pTest_1) {// Failed to get function pointerPyErr_Print(); // Print Python error indicator if availableqDebug() << "获取函数指针失败";} else {qDebug() << "Successfully obtained function pointer";}PyObject* pPara = PyTuple_New(1);if (pPara == NULL) {// 元组创建失败,进行错误处理PyErr_Print();// 继续下一个迭代}qDebug() << "fPath:"<<folderPath;const char* cstr = folderPath.toUtf8().constData();  // 将 QString 转换为 C 字符串PyTuple_SetItem(pPara, 0, Py_BuildValue("s",cstr));  //参数1为String型 "Hello"PyObject* pyValue = PyEval_CallObject(pTest_1,pPara);PyErr_Print();qDebug() << "pyValue"<<pyValue;...// 在使用完 pModule 后减少其引用计数Py_DECREF(pModule);// 在使用完列表后,减少其引用计数Py_DECREF(pyValue);// 在使用完参数元组后,减少其引用计数Py_DECREF(pPara);//    Py_Finalize();

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JAVA高阶私房菜:JVM虚拟机核心概念及参数微调实验

目录 基础快速掌握 什么是JVM虚拟机 JVM的的实现 操作系统-虚拟机-JRE-JDK的关系 生产环境部署JDK还是JRE JVM内存组成部分和堆空间分布 内存组成 堆空间内存分布 内存分布 堆空间分配 JVM堆空间垃圾回收流程及JVM参数 垃圾回收流程 JVM参数分类 JVM参数格式分类 …

浅识数据结构之时间复杂度

P. S.&#xff1a;以下代码均在VS2019环境下测试&#xff0c;不代表所有编译器均可通过。 P. S.&#xff1a;测试代码均未展示头文件stdio.h的声明&#xff0c;使用时请自行添加。 文章目录 前言一. 时间复杂度1.1 时间复杂度的概念1.2 时间复杂度如何计算1.3 时间复杂度如何表…

XSS-跨站脚本攻击 漏洞详解

一、初识XSS 1、什么是XSS XSS全称跨站脚本(Cross Site Scripting)&#xff0c;为避免与层叠样式表(Cascading Style Sheets, CSS)的缩写混淆&#xff0c;故缩写为XSS。这是一种将任意 Javascript 代码插入到其他Web用户页面里执行以达到攻击目的的漏洞。攻击者利用浏览器的动…

【已解决简单好用】notepad++怎么设置中文

打开Notepad软件。点击软件界面顶部菜单栏中的“Settings”选项。在下拉菜单中选择“Preferences”进行语言设置。在打开的设置窗口中&#xff0c;找到“General”选项。在“General”选项中&#xff0c;找到“Localization”&#xff08;界面语言&#xff09;项。在下拉菜单中…

Modern CSV for Mac:强大的CSV文件编辑器

Modern CSV for Mac是一款功能强大的CSV文件编辑器&#xff0c;专为Mac用户设计&#xff0c;提供直观易用的界面和丰富的功能&#xff0c;使用户能够轻松编辑和管理CSV文件。 Modern CSV for Mac v2.0.6激活版下载 这款软件支持快速导入和导出CSV文件&#xff0c;方便用户与其他…

【Hadoop】- MapReduce YARN的部署[8]

目录 一、部署说明 二、集群规划 三、MapReduce配置文件 四、YARN配置文件 五、分发配置文件 六、集群启动命令 七、查看YARN的WEB UI 页面 一、部署说明 Hadoop HDFS分布式文件系统&#xff0c;我们会启动&#xff1a; NameNode进程作为管理节点DataNode进程作为工作节…

大数据Hive中的UDF:自定义数据处理的利器(上)

文章目录 1. 前言2. UDF与宏及静态表的对比3. 深入理解UDF4. 实现自定义UDF 1. 前言 在大数据技术栈中&#xff0c;Apache Hive 扮演着数据仓库的关键角色&#xff0c;它提供了丰富的数据操作功能&#xff0c;并通过类似于 SQL 的 HiveQL 语言简化了对 Hadoop 数据的处理。然而…

综合案例(前端代码练习):猜数字和表白墙

目录 一、猜数字 html代码&#xff1a; 点击 猜 按钮的js代码&#xff1a; 点击 重开游戏 按钮的js代码&#xff1a; 整体代码&#xff1a; 页面效果&#xff1a; 二、留言板 css代码&#xff1a; html代码&#xff1a; js代码&#xff08;主逻辑在这&#xff09;&am…

无损以太网的ROCE革命,队列的缓存空间优化分析

ROCE无损以太网&#xff0c;队列的缓存空间优化 多级缓存架构优化芯片性能&#xff1a;* 缓存空间细分为芯片级、端口级和队列级&#xff0c;实现精细管理。* 无损队列引入Headroom缓存空间&#xff0c;确保数据完整性。 在芯片层面&#xff1a; 静态缓存为端口提供保证的缓存空…

【深度学习实战(11)】搭建自己的dataset和dataloader

一、dataset和dataloader要点说明 在我们搭建自己的网络时&#xff0c;往往需要定义自己的dataset和dataloader&#xff0c;将图像和标签数据送入模型。 &#xff08;1&#xff09;在我们定义dataset时&#xff0c;需要继承torch.utils.data.dataset&#xff0c;再重写三个方法…

ModuleNotFoundError: No module named ‘scripts.animatediff_mm‘ 解决方案

本文收录于《AI绘画从入门到精通》专栏,专栏总目录:点这里,订阅后可阅读专栏内所有文章。 大家好,我是水滴~~ 本文主要介绍在使用 Stable Diffusion WebUI 安装 AnimateDiff 插件后出现的ModuleNotFoundError: No module named scripts.animatediff_mm异常的解决方案,希望…

第三方应用类---Phpmyadmin 后台 Getshell 操作

免责声明:本节仅做技术交流学习. 目录 什么是Phpmyadmin? getshell前提条件: 详细步骤: 1-搜集到开放phpmyadmin的web,然后访问进去 2-执行SQL命令查看是否开启了读写权限 3-开启了读写权限-->继续 没有开读写权限--->鸡鸡 4-有读写权限之后,执行SQL语句导出文件…

关于edge浏览器点击下载后没有反应的问题解决

不知道什么时候开始&#xff0c;edge浏览器点击下载后没有反应了。 根据网上教程&#xff0c;关闭smartscreen的方式试了没用 后来偶然发现&#xff0c;是因为在扩展里&#xff0c;有一个迅雷下载的扩展&#xff0c;关闭后&#xff0c;就可以正常下载了 具体如下&#xff1a…

扩散卷积模型 笔记

1 Title Diffusion Convolutional Neural Networks&#xff08;James Atwood and Don Towsley&#xff09;【NeurIPS 2016】 2 Conclusion This paper presents diffusion-convolutional neural networks (DCNNs), a new model for graph-structured data. Through the introd…

使用docker搭建GitLab个人开发项目私服

一、安装docker 1.更新系统 dnf update # 最后出现这个标识就说明更新系统成功 Complete!2.添加docker源 dnf config-manager --add-repohttps://download.docker.com/linux/centos/docker-ce.repo # 最后出现这个标识就说明添加成功 Adding repo from: https://download.…

【JavaEE初阶系列】——网络层IP协议(地址管理和路由选择)

目录 &#x1f6a9;网络层 &#x1f388;IP协议 &#x1f469;&#x1f3fb;‍&#x1f4bb;IP协议"拆包组包"功能 &#x1f388;地址管理 &#x1f469;&#x1f3fb;‍&#x1f4bb;IP地址的分类 &#x1f469;&#x1f3fb;‍&#x1f4bb;NAT机制如何工作的…

[阅读笔记20][BTX]Branch-Train-MiX: Mixing Expert LLMs into a Mixture-of-Experts LLM

这篇论文是meta在24年3月发表的&#xff0c;它提出的BTX结构融合了BTM和MoE的优点&#xff0c;既能保证各专家模型训练时的高度并行&#xff0c;又是一个统一的单个模型&#xff0c;可以进一步微调。 这篇论文研究了以高效方法训练LLM使其获得各领域专家的能力&#xff0c;例如…

VBA技术资料MF144:将PDF首页作为对象插入工作表

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套&#xff0c;分为初级、中级、高级三大部分&#xff0c;教程是对VBA的系统讲解&#…

【办公类-21-16】 20240410三级育婴师 344多选题(题目与答案合并word)

作品展示 背景需求&#xff1a; 前文将APP题库里的育婴师题目下载到EXCEL&#xff0c;并进行手动整理【办公类-21-14】 20240406三级育婴师 344道多选题 UIBOT下载整理-CSDN博客文章浏览阅读287次&#xff0c;点赞8次&#xff0c;收藏9次。【办公类-21-14】 20240406三级育婴师…

OpenHarmony鸿蒙南向开发案例:【智能猫眼(基于3518开发板)】

样例简介 本Demo是基于Hi3518开发板&#xff0c;使用开源OpenHarmony开发的RTSP协议流媒体应用。达到将Hi3518开发板中摄像头获取的数据通过RTSP协议传输到手机并显示 。 rtsp实现可参考文档&#xff1a;openharmony_1.0.1实现RTSPServer 运行效果 样例原理 如上图所示&…