Qt使用libtorch(2023.1)

部署运行你感兴趣的模型镜像

最近想用qt使用由pytorch生成训练好的神经网络,所以需要先在qt上配置一下libtorch。也是看了各种的教程或者经验贴,但还是捣鼓了半天,最后终于用msvc2017编译器+cmake成功了。本来一开始我是尝试用qmake,在.pro里面直接添加库、路径之类,但这个最后编译会报错,差不多如这篇帖子所说的https://www.cnblogs.com/allentbky/p/14315040.html,但我最后发现不仅有IValue这类文件的错误,还有Operator.h等文件上的错误(估计是因为我的libtorch版本更新的原因),都是一些语法错误,很烦,我也不想去注释源码(感觉也不一定能解决),所以最后还是投奔了cmake,没想到很快啊,就编译跑通了(果然还是官网推荐的方法好用)。下面给还刚接触的朋友梳理一下配置过程。

首先说一下我的各个工具和软件的版本,

Qt的版本是5.12.2,creator的版本是5.0.2,官网的下载地址是https://www.qt.io/offline-installers(自己找有点难),这是官网能免费提供且有exe安装程序的最好版本。安装时候把msvc2017点上,其他的自己看着点(建议把mingw也点上)

安装好后如果你之前没装过visual studio,那么qt的编译器里是不会出现msvc的,kits里面的msvc前面也会有黄色感叹号,我就是这种情况,所以需要再装一下vs2017(最小化安装即可,如下图所示,或按照这篇帖子https://blog.youkuaiyun.com/weixin_43712556/article/details/125906511?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-5-125906511-blog-127731223.pc_relevant_3mothn_strategy_and_data_recovery&spm=1001.2101.3001.4242.4&utm_relevant_index=8

然后就是装一下win10 sdk,只需要安装debug tools(具体也可以看上面那篇帖子)。安装好这两项后,qt应该就能自己检测出msvc的编译器和win10 kits中的debugger了,如下图所示

最后再装一下cmake,qt也会自动检测到

当然,还有最重要的libtorch,官网就有编译好的,我下的是cpu的版本

到这里所有需要下载配置的工具都齐了,可以创个demo看看能否成功运行。我是参照这篇文章进行cmakelist的改写https://blog.youkuaiyun.com/qq_49466306/article/details/110241031,如果你创建的是qt widget程序,注意调整一下几条语句的位置和顺序,我的cmakelist如下

cmake_minimum_required(VERSION 3.5)

project(test2 VERSION 0.1 LANGUAGES CXX)

set(CMAKE_INCLUDE_CURRENT_DIR ON)

set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)

set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

find_package(QT NAMES Qt6 Qt5 COMPONENTS Widgets REQUIRED)
find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Widgets REQUIRED)

#改成你自己的libtorch地址
set(Torch_DIR E:/libtorch/share/cmake/Torch)
find_package(Torch REQUIRED)

FILE(GLOB SC_FILES "*.cpp" "*.h")
#add_executable(${PROJECT_NAME} ${SC_FILES})

set(PROJECT_SOURCES
        main.cpp
        mainwindow.cpp
        mainwindow.h
        mainwindow.ui
)

if(${QT_VERSION_MAJOR} GREATER_EQUAL 6)
    qt_add_executable(test2
        MANUAL_FINALIZATION
        ${PROJECT_SOURCES}
    )
# Define target properties for Android with Qt 6 as:
#    set_property(TARGET test2 APPEND PROPERTY QT_ANDROID_PACKAGE_SOURCE_DIR
#                 ${CMAKE_CURRENT_SOURCE_DIR}/android)
# For more information, see https://doc.qt.io/qt-6/qt-add-executable.html#target-creation
else()
    if(ANDROID)
        add_library(test2 SHARED
            ${PROJECT_SOURCES}
        )
# Define properties for Android with Qt 5 after find_package() calls as:
#    set(ANDROID_PACKAGE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/android")
    else()
        add_executable(test2
            ${PROJECT_SOURCES}
        )
    endif()
endif()

#注意这里把原来有的private删掉了
target_link_libraries(test2 Qt${QT_VERSION_MAJOR}::Widgets)

set_target_properties(test2 PROPERTIES
    MACOSX_BUNDLE_GUI_IDENTIFIER my.example.com
    MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
    MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
)
target_link_libraries(${PROJECT_NAME} "${TORCH_LIBRARIES}")

set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD 14)

if(QT_VERSION_MAJOR EQUAL 6)
    qt_finalize_executable(test2)
endif()

有个坑就是由于前后调用了两次target_link_libraries,所以要么都得是private,要么都不是,不然会报错

还有就是编译器要记得选成msvc,如下图所示

mainwindow.cpp的代码如下

#include <torch/torch.h>
#include "mainwindow.h"
#include "./ui_mainwindow.h"

using namespace std;

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    torch::Tensor tensor = torch::eye(3);
        cout << tensor << endl;
}

MainWindow::~MainWindow()
{
    delete ui;
}

如果成功编译运行并打印出如下结果就说明没什么问题了

完整的项目代码可见https://github.com/myccmj/qt-libtorch-cmake

您可能感兴趣的与本文相关的镜像

PyTorch 2.5

PyTorch 2.5

PyTorch
Cuda

PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

<think> 我们正在查找在QT使用libtorch的方法和教程。根据提供的引用,我们可以总结出以下步骤和注意事项: ### 主要步骤: 1. **安装必要的软件**: - QT Creator(建议使用较新版本,如5.0.1或更高) - OpenCV(如果需要图像处理) - Libtorch(需要与PyTorch版本匹配,注意选择CPU或GPU版本) 2. **下载Libtorch**: - 从PyTorch官网下载对应版本的Libtorch(注意操作系统和编译器,如Windows下MSVC2019 64位)。 3. **配置QT Creator**: - 创建一个.pri文件(例如`libtorch.pri`),在其中添加包含路径和库路径。 - 示例内容(Windows路径): ```makefile INCLUDEPATH += C:\soft_install\libtorch-win-shared-with-deps-2.0.0+cpu\libtorch\include INCLUDEPATH += C:\soft_install\libtorch-win-shared-with-deps-2.0.0+cpu\libtorch\include\torch\csrc\api\include LIBS += -LC:\soft_install\libtorch-win-shared-with-deps-2.0.0+cpu\libtorch\lib\ -lasmjit -lc10 -lclog -lcpuinfo -ldnnl -lfbgemm -lfbjni -lkineto -llibprotobuf -llibprotobuf-lite -llibprotoc -lpthreadpool -lpytorch_jni -ltorch -ltorch_cpu -lXNNPACK ``` 4. **在项目中集成**: - 在项目的.pro文件中引入上述.pri文件。 - 示例: ```makefile include(./pri/libtorch.pri) ``` - 如果需要同时使用OpenCV,则类似地创建并引入`opencv.pri`。 5. **解决命名冲突**: - **QT信号槽与Libtorch的冲突**:在包含torch头文件之前取消`slots`的宏定义,之后重新定义。 ```cpp #undef slots #include <torch/torch.h> #include <torch/script.h> #define slots Q_SLOTS ``` - **OpenCV与Libtorch的冲突**:根据报错信息,在冲突的文件中显式指定命名空间(例如,在OpenCV或Libtorch的包含语句之前或之后调整命名空间)。 6. **测试与验证**: - 创建一个简单的测试项目,加载TorchScript模型并进行推理(确保模型路径正确)。 - 示例代码片段: ```cpp torch::jit::script::Module module; try { module = torch::jit::load("model.pt"); } catch (const c10::Error& e) { qDebug() << "Error loading the model\n"; return; } // 创建输入张量 std::vector<torch::jit::IValue> inputs; inputs.push_back(torch::ones({1, 3, 224, 224})); // 推理 at::Tensor output = module.forward(inputs).toTensor(); ``` ### 注意事项: - **版本匹配**:确保LibtorchPyTorch(训练模型的版本)、编译器(如MSVC)和QT版本兼容。 - **路径设置**:在.pri文件中正确设置Libtorch的路径(根据实际安装路径调整)。 - **冲突解决**:命名冲突是常见问题,需按上述方法解决。 - **部署平台**:在Ubuntu(如Jetson nano)上配置时,步骤类似,但库文件和路径有所不同。 ### 参考资料: - 引用[1][^1]:提供了QT Creator+Opencv+Libtorch的配置教程。 - 引用[2][^2]:详细说明了Qt配置Libtorch的步骤(包括.pri文件内容)。 - 引用[3][^3]:解决了Ubuntu下QTLibtorch的冲突问题。 - 引用[5][^5]:提供了解决slots冲突的方法。 以上步骤综合了多个引用源,旨在提供一个清晰的配置指南。 §§相关问题§§ 1. 如何解决在QT Creator中使用Libtorch时出现的命名冲突? 2. 如何在Ubuntu系统下配置QT Creator和Libtorch? 3. 如何验证QT项目中Libtorch的配置是否成功? </think> ### QT使用Libtorch的配置指南 根据引用内容,配置QT Creator使用Libtorch需遵循以下步骤: #### 1. **环境准备** - **软件版本匹配**(引用[2]): - QT Creator ≥ 5.0.1 (Community) - Libtorch版本需与PyTorch训练环境一致(如Libtorch1.7/2.0.0) - OpenCV 4.x(如需图像处理) - 编译器:MSVC 2019(Windows)或GCC(Ubuntu) #### 2. **配置步骤** (以Windows为例,Ubuntu类似) **a. 创建.pri配置文件**(引用[2][^2]) 新建`libtorch.pri`文件,写入: ```makefile # 包含路径 INCLUDEPATH += C:\libtorch\include INCLUDEPATH += C:\libtorch\include\torch\csrc\api\include # 库文件路径(根据实际安装路径修改) LIBS += -LC:\libtorch\lib\ \ -ltorch \ -ltorch_cpu \ -lc10 \ -lasmjit ``` **b..pro项目文件中引用**(引用[2]) ```makefile # 引入libtorch.pri include(./pri/libtorch.pri) # 若需OpenCV include(./pri/opencv.pri) ``` #### 3. **解决关键冲突** - **QT信号槽冲突**(引用[3][^5][^3]): 在包含Torch头文件前添加: ```cpp #undef slots // 取消QT的slots宏定义 #include <torch/torch.h> #include <torch/script.h> #define slots Q_SLOTS // 恢复QT宏定义 ``` - **OpenCV命名空间冲突**(引用[3][^3]): 在冲突文件中显式指定命名空间: ```cpp using namespace c10::具体冲突名; // 根据报错信息替换 ``` #### 4. **测试代码示例** (引用[2][5]) ```cpp #include <torch/script.h> torch::jit::script::Module load_model(std::string model_path) { try { return torch::jit::load(model_path); // 加载TorchScript模型 } catch (const c10::Error& e) { qDebug() << "模型加载失败: " << e.what(); } return nullptr; } // 使用示例 auto module = load_model("model.pt"); std::vector<torch::jit::IValue> inputs = {torch::ones({1, 3, 224, 224})}; at::Tensor output = module.forward(inputs).toTensor(); ``` #### 5. **重要注意事项** 1. **版本兼容性**:Libtorch需与PyTorch训练版本严格匹配(引用[2][^2]) 2. **依赖库**:Windows需复制Libtorch的`lib`目录下所有DLL到可执行文件目录 3. **Ubuntu配置**(引用[3][^3]): - 使用`ldconfig`注册Libtorch库路径 - Jetson Nano需编译ARM兼容版本 #### 参考资料 - Libtorch官方部署指南:[Loading a TorchScript Model in C++](https://pytorch.org/tutorials/advanced/cpp_export.html)[^4] - 冲突解决方案:[Qtcreator部署libtorch+Qt6.6.3](https://zhuanlan.zhihu.com/p/XXX)[^5] - OpenCV集成:[QT Creator + Opencv4.x配置](https://example.com/opencv-qt)[^1] ---
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值