您现在的位置是:首页 > 正文

windows10系统下基于pybind11库进行c++代码调用python(pytorch)代码

2024-01-30 20:36:36阅读 0

最近在学习基于lidar-mos进行slam激光点云动态物体剔除的相关内容,经过调研准备基于pybind11库在实际项目(c++)中调用salsaNext代码(python)。

  1. 使用cmake在测试项目中引入pybind11库,CMakeLists.txt文件内容为:

cmake_minimum_required(VERSION 3.15)

project(test LANGUAGES CXX)

find_package(pybind11 CONFIG REQUIRED)

add_executable(convert main.cpp)

target_link_libraries(convert PRIVATE pybind11::embed pybind11::module)

pybind11库有多种安装方式,我是在vcpkg里安装管理的。

  1. 在程序运行目录下,拷贝python相关文件和文件夹:

其中DLLS、Lib和python39.dll为对应python环境的依赖项,LiDAR-MOS为准备调用的python代码。libiomp5md.dll和uv.dll后面会提到为啥需要。

  1. pybind11是一个头文件库,包含必要的头文件后就可以进行python解释器的初始化,然后就可以在c++中调用lidar-mos的python代码了。

#include <pybind11/embed.h>
#include <pybind11/pybind11.h>
#include <pybind11/functional.h>
#include <pybind11/stl.h>
#include <iostream>

namespace py = pybind11;

int main()
{
    py::scoped_interpreter guard{};//python解释器的初始化
    // py::print("Hello, World!");

    py::module sys = py::module::import("sys");
    sys.attr("path").attr("append")("D:\\workSpace2022\\project_vs\\dynamic_removeTest\\build\\Release\\DLLs");
    sys.attr("path").attr("append")("D:\\workSpace2022\\project_vs\\dynamic_removeTest\\build\\Release\\Lib");
    sys.attr("path").attr("append")("D:\\workSpace2022\\project_vs\\dynamic_removeTest\\build\\Release\\Lib\\site-packages");
    sys.attr("path").attr("append")("D:\\workSpace2022\\project_vs\\dynamic_removeTest\\build\\Release\\LiDAR-MOS\\utils\\");
    //sys.attr("path").attr("append")("D:\\workSpace2022\\project_vs\\dynamic_removeTest\\build\\Release\\LiDAR-MOS\\utils\\auxiliary");
    sys.attr("path").attr("append")("D:\\workSpace2022\\project_vs\\dynamic_removeTest\\build\\Release\\LiDAR-MOS\\mos_SalsaNext");
    sys.attr("path").attr("append")("D:\\workSpace2022\\project_vs\\dynamic_removeTest\\build\\Release\\LiDAR-MOS\\mos_SalsaNext\\train");
    sys.attr("path").attr("append")("D:\\workSpace2022\\project_vs\\dynamic_removeTest\\build\\Release\\LiDAR-MOS\\mos_SalsaNext\\train\\tasks\\semantic");
    sys.attr("path").attr("append")("D:\\workSpace2022\\project_vs\\dynamic_removeTest\\build\\Release\\LiDAR-MOS\\mos_SalsaNext\\train\\tasks\\semantic\\dataset\\kitti");

    //py::print(sys.attr("path"));

    py::module os = py::module::import("os");
    //py::print(os.attr("getcwd")());

    py::module yaml = py::module::import("yaml");
    
    /*try {
        py::module matplotlib = py::module::import("matplotlib");
    }
    catch (py::error_already_set& e) {
        py::print(e.type());
        py::print(e.what());

    }*/

    try {
        py::module torch = py::module::import("PIL");
    }
    catch (py::error_already_set& e) {
        py::print(e.type());
        py::print(e.what());

    }
    
    py::object chdir = os.attr("chdir");
    //chdir("D:\\workSpace2022\\project_vs\\dynamic_removeTest\\build\\Release\\LiDAR-MOS\\mos_SalsaNext\\train\\tasks\\semantic");
    chdir("D:\\workSpace2022\\project_vs\\dynamic_removeTest\\build\\Release\\LiDAR-MOS");
    //py::print(os.attr("getcwd")());


    /*auto module = py::module::import("calc22");
    int n = module.attr("add")(1, 2).cast<int>();*/

    /*auto module = py::module::import("gen_residual_images");
    module.attr("gen_resiImages")();*/

    
    /*auto moduleInfer = py::module::import("infer");
    moduleInfer.attr("doSomethingInfer")("../../../../data", "../../../../data/predictions_salsanext_residual_1_new"
        , "../../../../data/model_salsanext_residual_1",false, 30,"valid");*/

    /*auto moduleEva = py::module::import("evaluate_mos");
    moduleEva.attr("doEvaluate_mos")();*/

    auto moduleVisualize = py::module::import("visualize_mos");
    moduleVisualize.attr("visualizeMos")("data", "data/predictions_salsanext_residual_1_valid", 8);

    return 0;
}

pybind11的语法是比较简单,容易上手的。py::module::import导入模块(python文件),module.attr("method")调用方法和属性。

在这之前,先使用sys.path.append加上对应python文件的路径,否则会导入模块失败。

  1. 遇到的问题,重点记录。

4.1 matplotlib模块导入错误,在python环境下没问题

脱离python环境下,c++代码调用就出如下错误

但是明明有matplotlib文件夹,就很奇怪。解决办法:还好这模块并没有实际使用,先注释了事。

4.2 导入torch模块时,提示shm.dll错误

这种一般是缺少对应的dll或者依赖dll,借助Dependencies工具,查看shm.dll缺少哪些依赖项。

一查都不缺,当时头都大了,后来发现是torch_cpu.dll缺少依赖。如下图中红色的两个。

解决办法:在对应的完整python环境下搜索对应的dll,复制到Release下,解决。

c++应用程序convert.exe成功调用pytroch模型进行训练数据

网站文章

  • 以字节流形式读取文件和写入数据

    1.InputStream和OutStream都是字节流。 2.以字节流形式写入文件。 package file; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; public class TestFile { public static void main(Strin...

    2024-01-30 20:36:29
  • 工业镜头的分类

    工业镜头的分类

    1 以视场分类(1)标准镜头:指视角30°左右,焦距长度接近相机画幅对角线长度的镜头。在2/3英寸CCD摄像机中,标准镜头焦距定为16mm在1/2英寸CCD摄像机中,标准镜头焦距定为12mm在1/3英寸CCD摄像机中,标准镜头焦距定为8mm。(2)广角与超广角镜头:视角55°以上,广角与超广角镜头的焦距短于、视角大于标准镜头。对135相机来说,焦距在30mm左右、视

    2024-01-30 20:36:23
  • umi应用首屏加载速度提高3倍+(通用性能优化)

    根据以往的博客,目前我就司的公司前端框架umi[1], ali出品以路由为基础的,同时支持配置式路由和约定式路由,保证路由的功能完备,并以此进行功能扩展的前端应用框架。问题所在一直以来我们...

    2024-01-30 20:35:53
  • 面试了个阿里P7大佬,他让我见识到什么才是“精通高并发与调优”

    面试了个阿里P7大佬,他让我见识到什么才是“精通高并发与调优”

    按照公司项目招聘的要求,我通常都会问一些高并发需要掌握的知识和实战路程,主要考察一下有没有做过高并发项目,有没有做过性能调优,清不清楚其中的细节,每个方案可能带来的副作用;这次面试了个阿里P7的大佬,...

    2024-01-30 20:35:45
  • 《漫画算法2》源码整理-7 第K大的数字

    第K大的数字public class KthLargestNumber { /** * 寻找第k大的元素 * @param array 待调整的堆 * @param k...

    2024-01-30 20:35:38
  • js 代码覆盖率istanbul+项目git信息采集

    说起js的代码覆盖率,大家肯定想到的是ScriptCover、JSCover、Istanbul。 ScriptCover:是一款chrome的扩展插件 JSCover:要在浏览器中执行测试用例 Ist...

    2024-01-30 20:35:10
  • JQuery 的 Ajax 提交方式与 Springboot 后台取值方式的对应写法示例

    前端:POST + JSON ; 后端取参:@RequestParam(value = "pageSize") Integer pageSize .... /** * 初始化表格数据 */ function initTable(){ var jsonObject = {"pageNumber":1,"pageSize":5,"s...

    2024-01-30 20:35:03
  • 淘宝评论API接口,item_review-获得淘宝商品评论API接口接入说明

    一、item_review-获得淘宝商品评论API接口接入说明:点击注册获取key和secret测试账号二、建议使用场景1、获取淘宝天猫评论接口2、获取商品详情页数据信息3、商城系统建设4、代购系统商...

    2024-01-30 20:34:56
  • android 自定义 返回键监听,react-native监听android物理返回键

    android 自定义 返回键监听,react-native监听android物理返回键

    1.使用BackAndroid组件来完成对android物理返回键的监听如下图,我们再Home组件中注册,一旦App进入主程序,就接管物理返回键的监听,我们仔在Home组件的渲染完成后来监听,在Hom...

    2024-01-30 20:34:49
  • 补充上一篇:jQuery实现全选,反选,取消操作

    这篇文章是对上一篇文章的修改 上一篇文章:点击跳转至上一篇文章 在上一篇文章中我提到过没有理解取消操作的作用 以下是我的修改: 代码展示 Title

    2024-01-30 20:34:20