32位QT调用Python运行基于keras+theano的神经网络

这篇博客详细记录了如何在32位Python环境中配置QT,以便调用Python运行Keras和Theano神经网络。配置过程包括下载安装QT、创建32位Python环境、安装Keras和Theano、修改环境文件和QT项目设置,以及解决可能出现的错误。通过这些步骤,最终实现了QT成功调用Python并执行Keras代码。
摘要由CSDN通过智能技术生成

背景故事

第一次做软件项目,软件里需要调用多个软件,所以选用了兼容性较好的32位的QT环境,希望能够通过QT调用python跑神经网络(之前用python写过keras+tensorflow),由于tensorflow仅支持64位,所以需要用keras+theano来配合32位python。

配置环境的顺序为:

  1. QT+MSVC2017-32bit(QT5.12.9)
  2. Python创建环境、切换到32位、下载32位python(python3.6)、安装keras+theano
  3. QT调用python

——下载安装QT——

下挺久了,忘记步骤了,所以不说了嗷

——32位Python——

切换到32位

打开Anaconda Prompt,此时通常显示

(base) C:\Users\(你的用户名)>

输入

set CONDA_FORCE_32BIT=1

就可以把anaconda暂时变成32位平台,这样下载下来的文件都是32位的(下一次打开Anaconda Prompt要记得再输一次该代码)。想要验证的话,可以输入

conda info

就可以得到如下图所示的结果,这么多32应该很容易看到
这么多32

创建环境+下载32位python+安装theano

(base) 是你的主环境,一般来说都2020年了应该都是64位的了,为了下载32位python,需要开辟一个新环境。这里提供一个一步到位的方法

conda install m2w64-toolchain
conda create -n newenv python=3.5 m2w64-toolchain theano

第一句我的网速还行,下载挺快,但网上说下载可能比较慢,当然解决方法也一搜一大把

第二句的newenv可以换成你喜欢的名字,这就是为32位准备的环境了,路径一般在···\Anaconda\envs\newenv

进入新环境

输入

conda activate newenv

conda activate后可以是环境名,也可以是环境的绝对路径

安装keras及其他第三方库

安装之前最好先检查一下是不是32位的平台,下载安装keras及其他第三方库主要使用conda install或者pip install,其中,keras版本太高可能会下不下来,可能需要指定版本,输入

pip install keras==2.1.2
pip install numpy==1.19.5

keras换backend

keras一般默认用tensorflow作为后端,要更换后端的话,需要去C:\Users\(你的用户名)\ .keras下的keras.json进行改写,用记事本打开该文件

{
“floatx”: “float32”,
“epsilon”: 1e-07,
“backend”: “tensorflow”,
“image_dim_ordering”: “th”
}

将第三行的tensorflow改为theano

{
“floatx”: “float32”,
“epsilon”: 1e-07,
“backend”: “theano”,
“image_dim_ordering”: “th”
}

完成后,可以进入python,输入import keras,会显示Using Theano backend.,这就是后端换成功了

创建 .theanorc.txt

如果有报错,可能需要创建.theanorc.txt,在C:\Users\(你的用户名) 下新建txt文件,命名为.theanorc(注意最前面那个点),在txt里写入

[blas]
ldflags=

对于.theanorc.txt里的内容,网上有很多种,如果这种不行就换一种。另外,该文件修改后需要重启电脑才能生效。

当然可能还会有各种各样的报错,就需要自己捏着报错去网上搜索了哦。

——QT调用python——

import keras后没有报错就可以着手进行QT调用了。
主要参考帖子
QT中启动python脚本(环境配置+demo)

修改object.h文件

object.h文件在···\Anaconda\envs\newenv\include下,需要将443行的

typedef struct{
    const char* name;
    int basicsize;
    int itemsize;
    unsigned int flags;
    PyType_Slot *slots; /* terminated by slot==0. */
} PyType_Spec;

换成

#undef slots
typedef struct{
    const char* name;
    int basicsize;
    int itemsize;
    unsigned int flags;
    PyType_Slot *slots; /* terminated by slot==0. */
} PyType_Spec;
#define slots Q_SLOTS

添加 python36_d.lib

将···\Anaconda\envs\newenv\libs里的python36.lib复制一份儿在该目录下,命名为python36_d.lib
在这里插入图片描述

修改QT project

复制dll文件

从Anaconda文件夹下找到以下几个dll文件,并将其复制到QT工程的debug文件夹下
在这里插入图片描述

修改pro文件

在pro文件中写入以下语句,当然要使用你自己的路径

INCLUDEPATH +=D:\Anaconda\envs\newenv\include   ############# python enviroment
LIBS += -LD:\Anaconda\envs\newenv\libs\
-l_tkinter\
-lpython3\
-lpython36
添加环境变量

然后在项目里的环境变量中加入PYTHONHOMEPYTHONPATH,路径分别为···\Anaconda\envs\newenv 和 ···\Anaconda\envs\newenv\Lib 。
在这里插入图片描述

修改cpp文件

用main.cpp写一个示例。首先创建一个py文件,写入一个简单的函数,要求输出字段succeed

import keras
def writetest():
    print('succeed')
    return

再把新创建的main.cpp写成

#include "widget.h"

#include <QApplication>
#include <QDebug>
#include <Python.h>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    Py_Initialize();
        if ( !Py_IsInitialized() )
        {
        return -1;
        }
        PyObject* pModule = PyImport_ImportModule("testforqt");  // 这里的testforqt就是创建的python文件
        if (!pModule) {
                qDebug()<< "Cant open python file!\n" << endl;
                return -1;
            }
       PyObject* pFunhello= PyObject_GetAttrString(pModule,"writetest");  // 这里的writetest就是python文件定义的函数

        if(!pFunhello){
            qDebug()<<"Get function hello failed"<<endl;
            return -1;
        }
        PyObject_CallFunction(pFunhello,NULL);
        Py_Finalize();

    return a.exec();
}

点击debug,就可以发现输出succeed,就成功啦

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值