开发环境
- Win11
- RTX4060
- CUDA12.1
- libtorch 2.4.0 ,CUDA12.1,release版
- VS2022
- opencv4.10版本
- Qt 6.6.3
软件下载
libtorch下载
直接去pytorch官网下载即可,根据需要下载realease与debug版。
而CUDA的版本则查看CUDA版本教程,来选择合适的。
debug版与release版在使用上的区别:
- release版构建与运行更快,但不能直接进行调试,需要进行配置。
- debug版构建与运行较慢,但可以进行调试。
opencv下载
直接去官网下载即可。
VS2022下载
直接去官网下载即可,安装是选择C++的桌面开发即可。
然后在单个组件部分,安装Window 10 SDK,以及msvc15/17/19备用。
Qt6安装
由于libtorch在2.1版本后,需要使用Qt6以及MSVC19,因此这里安装Qt6。
若是旧版本的,可以参考这个链接:旧版本libtorch配置
按照Qt6安装教程进行安装,亲测中国科学技术大学:http://mirrors.ustc.edu.cn/qtproject/ 的镜像可用。
选择组件时,将MSVC2019与MinGW选上,其余的看自己需要。
安装完成后,打开Qt Creator,打开构建套件,查看编译器,可以看到Qt自动识别到的编译器。
这要使用的是红框中的编译器。
打开构建套件,可以看到安装时选择的MSVC与MinGW。
查看MSVC的配置,可以看到所使用的编译器。
Qt项目配置
新建一个Qt的UI项目,配置pro文件,使得项目可以使用libtorch与opencv。
debug版与release版的pro文件设置基本一样,只是文件名可能需要修改。
我这里是release版的。
INCLUDEPATH += 你的opencv地址/opencv/build/include
INCLUDEPATH += 你的libtorch地址/libtorch/include
INCLUDEPATH += 你的libtorch地址/libtorch/include/torch/csrc/api/include
INCLUDEPATH += 你的libtorch地址/libtorch/include/torch/csrc/api/include/torch
DEPENDPATH += 你的libtorch地址/libtorch/include
DEPENDPATH += 你的libtorch地址/libtorch/include/torch/csrc/api/include
LIBS += -L你的opencv地址/opencv/build/x64/vc16/lib -lopencv_world4100
LIBS += -L你的libtorch地址/libtorch/lib \
-lasmjit \
-lc10 \
-lc10_cuda \
-lcaffe2_nvrtc \
-lcpuinfo \
-ldnnl \
-lfbgemm \
-lfbjni \
-lfmt \
-lkineto \
-llibprotobuf \
-llibprotobuf-lite \
-llibprotoc \
-lpthreadpool \
-lpytorch_jni \
-lsleef \
-ltorch \
-ltorch_cpu \
-ltorch_cuda \
-lXNNPACK
LIBS += -INCLUDE:"?ignore_this_library_placeholder@@YAHXZ"
测试
测试代码:
#include "mainwindow.h"
#include<opencv2/opencv.hpp>
#include <QApplication>
#include<iostream>
#undef slots
#include<torch/script.h>
#include<torch/torch.h>
#define slots Q_SLOTS
class ConvReluBnImpl : public torch::nn::Module {
public:
ConvReluBnImpl(int input_channel=3, int output_channel=64, int kernel_size = 3);
torch::Tensor forward(torch::Tensor x);
private:
// Declare layers
torch::nn::Conv2d conv{ nullptr };
torch::nn::BatchNorm2d bn{ nullptr };
};
TORCH_MODULE(ConvReluBn);
ConvReluBnImpl::ConvReluBnImpl(int input_channel, int output_channel, int kernel_size) {
conv = register_module("conv", torch::nn::Conv2d(torch::nn::Conv2dOptions(input_channel, output_channel, kernel_size).padding(1)));
bn = register_module("bn", torch::nn::BatchNorm2d(output_channel));
}
torch::Tensor ConvReluBnImpl::forward(torch::Tensor x) {
x = torch::relu(conv->forward(x));
x = bn(x);
return x;
}
int main(int argc, char *argv[])
{
//test torch
auto device = torch::Device(torch::kCUDA);
auto model = ConvReluBn(3,4,3);
model->to(device);
auto input = torch::zeros({1,3,12,12},torch::kFloat).to(device);
auto output = model->forward(input);
std::cout<<output.sizes()<<std::endl;
//test opencv
cv::Mat image = cv::imread("任意一张图片的地址");
cv::Mat M(200, 200, CV_8UC3, cv::Scalar(0, 0, 255));
if(!M.data)
return 0;
cv::imshow("fff",image);
cv::imshow("ddd",M);
cv::waitKey(0);
cv::destroyAllWindows();
//test qt
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
执行效果(注意要选择对应的方法执行,debug或release):
会出现两个界面:200x200的红色图片以及自己选择的一张图片。
参考文档
https://allentdan.github.io/2021/01/21/QT%20Creator%20+%20Opencv4.x%20+%20Libtorch1.7%E9%85%8D%E7%BD%AE/#more
https://www.yuque.com/lengyuezuixue/togedc/krb68k