当前位置:   article > 正文

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

salsanext

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

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

  1. cmake_minimum_required(VERSION 3.15)
  2. project(test LANGUAGES CXX)
  3. find_package(pybind11 CONFIG REQUIRED)
  4. add_executable(convert main.cpp)
  5. 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代码了。

  1. #include <pybind11/embed.h>
  2. #include <pybind11/pybind11.h>
  3. #include <pybind11/functional.h>
  4. #include <pybind11/stl.h>
  5. #include <iostream>
  6. namespace py = pybind11;
  7. int main()
  8. {
  9. py::scoped_interpreter guard{};//python解释器的初始化
  10. // py::print("Hello, World!");
  11. py::module sys = py::module::import("sys");
  12. sys.attr("path").attr("append")("D:\\workSpace2022\\project_vs\\dynamic_removeTest\\build\\Release\\DLLs");
  13. sys.attr("path").attr("append")("D:\\workSpace2022\\project_vs\\dynamic_removeTest\\build\\Release\\Lib");
  14. sys.attr("path").attr("append")("D:\\workSpace2022\\project_vs\\dynamic_removeTest\\build\\Release\\Lib\\site-packages");
  15. sys.attr("path").attr("append")("D:\\workSpace2022\\project_vs\\dynamic_removeTest\\build\\Release\\LiDAR-MOS\\utils\\");
  16. //sys.attr("path").attr("append")("D:\\workSpace2022\\project_vs\\dynamic_removeTest\\build\\Release\\LiDAR-MOS\\utils\\auxiliary");
  17. sys.attr("path").attr("append")("D:\\workSpace2022\\project_vs\\dynamic_removeTest\\build\\Release\\LiDAR-MOS\\mos_SalsaNext");
  18. sys.attr("path").attr("append")("D:\\workSpace2022\\project_vs\\dynamic_removeTest\\build\\Release\\LiDAR-MOS\\mos_SalsaNext\\train");
  19. sys.attr("path").attr("append")("D:\\workSpace2022\\project_vs\\dynamic_removeTest\\build\\Release\\LiDAR-MOS\\mos_SalsaNext\\train\\tasks\\semantic");
  20. sys.attr("path").attr("append")("D:\\workSpace2022\\project_vs\\dynamic_removeTest\\build\\Release\\LiDAR-MOS\\mos_SalsaNext\\train\\tasks\\semantic\\dataset\\kitti");
  21. //py::print(sys.attr("path"));
  22. py::module os = py::module::import("os");
  23. //py::print(os.attr("getcwd")());
  24. py::module yaml = py::module::import("yaml");
  25. /*try {
  26. py::module matplotlib = py::module::import("matplotlib");
  27. }
  28. catch (py::error_already_set& e) {
  29. py::print(e.type());
  30. py::print(e.what());
  31. }*/
  32. try {
  33. py::module torch = py::module::import("PIL");
  34. }
  35. catch (py::error_already_set& e) {
  36. py::print(e.type());
  37. py::print(e.what());
  38. }
  39. py::object chdir = os.attr("chdir");
  40. //chdir("D:\\workSpace2022\\project_vs\\dynamic_removeTest\\build\\Release\\LiDAR-MOS\\mos_SalsaNext\\train\\tasks\\semantic");
  41. chdir("D:\\workSpace2022\\project_vs\\dynamic_removeTest\\build\\Release\\LiDAR-MOS");
  42. //py::print(os.attr("getcwd")());
  43. /*auto module = py::module::import("calc22");
  44. int n = module.attr("add")(1, 2).cast<int>();*/
  45. /*auto module = py::module::import("gen_residual_images");
  46. module.attr("gen_resiImages")();*/
  47. /*auto moduleInfer = py::module::import("infer");
  48. moduleInfer.attr("doSomethingInfer")("../../../../data", "../../../../data/predictions_salsanext_residual_1_new"
  49. , "../../../../data/model_salsanext_residual_1",false, 30,"valid");*/
  50. /*auto moduleEva = py::module::import("evaluate_mos");
  51. moduleEva.attr("doEvaluate_mos")();*/
  52. auto moduleVisualize = py::module::import("visualize_mos");
  53. moduleVisualize.attr("visualizeMos")("data", "data/predictions_salsanext_residual_1_valid", 8);
  54. return 0;
  55. }

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模型进行训练数据

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/喵喵爱编程/article/detail/1010786
推荐阅读
相关标签
  

闽ICP备14008679号