Ubuntu下Qt项目调用python执行神经网络推理

C++调用python

最近一个周在给深度学习项目做Demo,通过QtGUI调用python写的框架,巨多的坑,网上的资料又少,特以此文纪念一下我的辛苦工作

目录

  • C++调用python
    • 目录
    • 参考链接
    • 环境配置
    • 思路分析
    • Qt中python库的路径设置
    • 极简版实现
    • C API调用
    • 解决 import prediction.py时程序意外崩溃的问题
    • 然后就成功了

参考链接

本调用方案参考C的博客,星辰的博客,解决动态链接库的问题参考天马行空的博客,解决libpng16.so.16未找到的问题参考pk的博客,在此感谢各位作者,也希望能帮助到更多的人

环境配置

  • Anaconda3 python3.6
  • Qt Designer 5.9.0
  • Pycharm 2018
  • Tensorflow GPU1.5.0
  • Ubuntu 16.04

思路分析

先在python中写好函数,包括载入模型权重文件,执行推理,返回结果。
再通过Qt设计UI操作将推理需要的参数传给Pthon执行。

Qt中python库的路径设置


unix: INCLUDEPATH +=/home/user/anaconda3/include/python3.6m
unix: LIBS += -L/home/user/anaconda3/lib/ -lpython3.6m
win32: LIBS += -LC:/python36_32/libs/ -lpython36
win32: INCLUDEPATH += C:/python36_32/include
win32: DEPENDPATH += C:/python36_32/include

极简版实现

    Py_Initialize();    // 初始化
    string path="/home/wen/Qtpy";
    string imagepath="/home/wen/Qtpy/test";
    string pre_cmd1=string("from prediction import Prediction");
    string pre_cmd2=string("pre=Prediction()");
    string pre_cmd3=string("pre.predict(\"")+imagepath+"\")";
    string chdir_cmd=string("sys.path.append(\"")+path+"\")";
    const char* cstr_cmd=chdir_cmd.c_str();
    const char* cstrpre_cmd1=pre_cmd1.c_str();
    const char* cstrpre_cmd2=pre_cmd2.c_str();
    const char* cstrpre_cmd3=pre_cmd3.c_str();
    PyRun_SimpleString("import sys");
    PyRun_SimpleString(cstr_cmd);
    PyRun_SimpleString("import prediction");
    PyRun_SimpleString(cstrpre_cmd1);
    PyRun_SimpleString(cstrpre_cmd2);
    PyRun_SimpleString(cstrpre_cmd3);
    Py_Finalize();

C API调用

    Py_Initialize(); // 初始化
    string path="/home/wen/Desktop/Qtpy/py";
    string chdir_cmd=string("sys.path.append(\"")+path+"\")";
    const char* cstr_cmd=chdir_cmd.c_str();
    PyRun_SimpleString("import sys");
    PyRun_SimpleString(cstr_cmd);
    PyObject *pModule =PyImport_ImportModule("prediction");
    PyObject *pFunc1= PyObject_GetAttrString(pModule, "load_model"); 
    PyObject *pFunc2= PyObject_GetAttrString(pModule, "predict"); 
    PyObject *pArgs2 = PyTuple_New(1);
    PyTuple_SetItem(pArgs2, 0, Py_BuildValue("s", "/home/wen/Desktop/test"));
    PyObject *pArgs1 = PyTuple_New(1);
    PyTuple_SetItem(pArgs1, 0, Py_BuildValue("s", "/home/wen/Desktop/Qtpy/py/best_weight.hdf5"));
    PyObject *pReturn1 = PyEval_CallObject(pFunc1, pArgs1);//
    PyObject *pReturn2 = PyEval_CallObject(pFunc2, pArgs2);//
    cout<

解决 import prediction.py时程序意外崩溃的问题

这是一个奇葩的现象
当代码在命令行程序执行时可以正常跑完,当在QT 的UI中操作时总是意外崩溃 ,提示 highting file not define等等。经过不懈努力终于发现是opencv由问题,奉劝大家好好使用坑人的anaconda。

    conda uninstall opencv    
    pip uninstall opencv-python
    conda -c conda-forge opencv

然后就成功了

我是一个懒人,欢迎关注我的个人网站
[“QQ邮箱”][[email protected]]


你可能感兴趣的:(C++,PYthon)