1. 开发环境
- Win11
- VS 2022 Community
- RTX4060
- pytorch 2.4.0+cu121(事先安装好)
- libtorch 2.4.0+cu121 release版
- opencv 4.10.0
2.软件下载
2.1 VS
直接去官网下载即可,最好是2017版本之后,需要选择C++的桌面开发。
2.1 opencv
下载链接
直接去官网下载即可,版本最好是4.5之后的。安装目录不能包含英文。
2.2 libtorch
libtorch使用所需要的环境和训练最好保持一致,其中cuda,显卡驱动以及libtorch版本配置一般不应低于训练环境。尤其是libtorch版本要求更为严格,否则部分pytorch的api无法在libtorch中使用。最好pytorch与libtorch的版本是一样的。
下载链接
本文中以libtorch2.4为例介绍,读者最新版2.4.0使用,亲测可用。下载时以release版本为佳,避免一些不必要的错误。
下载会得到一个压缩包,然后解压
3. VS项目环境配置
新建一个控制台项目
编译环境
使用 Release 与 x64。
注意这步要先做,否则后面配置项目环境时可能会配置了Debug的,导致白费功夫。
配置项目环境
include
① 右键点击项目,打开属性
② 选择VC++目录,编辑包含目录,增加以下语句:
您的libtorch地址\libtorch\include\torch\csrc\api\include
您的libtorch地址\libtorch\include
你的opencv地址\opencv\build\include
lib
选择VC++目录,编辑库目录,添加以下语句:
你的libtorch位置\libtorch\lib
你的opencv位置\build\x64\vc16\lib
其中VS2022对应着vc16,而其他版本的对应关系查看链接
link
点击链接器->输入->附加依赖项,添加 (你的libtorch位置\libtorch\lib) 这个地址下的所有lib文件名。
此外还需添加opencv的.lib文件,地址:你的opencv位置\build\x64\vc16\lib
将各个文件名都添加。
dll
有两种方法:
① 拷贝opencv和libtorch中的dll文件到项目的执行目录中,在项目编译后执行时报错缺啥拷贝啥。
② 将opencv和libtorch中的dll路径配置到VS项目中:
地址:
你的libtorch位置\libtorch\lib
你的opencv位置\build\x64\vc16\lib
方法:配置方法
4. 测试
4.1 使用pytorch生成分类模型。
以ResNet34分类模型为例尝试部署分类模型。准备一张图片用以判断是否部署成功,本文用例图如下
接下来先和官网类似生成torchscript模型,亦即本文中的pt文件。本文使用代码如下:
from torchvision.models import resnet34
import torch.nn.functional as F
import torch.nn as nn
import torch
import cv2
#读取一张图片,并转换成[1,3,224,224]的float张量并归一化
image = cv2.imread("flower.jpg")# 可以改为自己的地址
image = cv2.resize(image,(224,224))
input_tensor = torch.tensor(image).permute(2,0,1).unsqueeze(0).float()/225.0
#定义并加载resnet34模型在imagenet预训练的权重
model = resnet34(pretrained=True)
model.eval()
#查看模型预测该付图的结果
output = model(input_tensor)
output = F.softmax(output,1)
print("模型预测结果为第{}类,置信度为{}".format(torch.argmax(output),output.max()))
#生成pt模型,按照官网来即可
model=model.to(torch.device("cpu"))
model.eval()
var=torch.ones((1,3,224,224))
traced_script_module = torch.jit.trace(model, var)
traced_script_module.save("resnet34.pt")
输出结果为:
模型预测结果为第723类,置信度为0.5916505455970764
代码运行结束即可生成.pt文件。
4.2 VS
#include<opencv2/opencv.hpp>
#include <torch/torch.h>
#include <torch/script.h>
int main()
{
//定义使用cuda
auto device = torch::Device(torch::kCUDA,0);
//读取图片
auto image = cv::imread("你的地址\\flower.jpg");
//缩放至指定大小
cv::resize(image, image, cv::Size(224, 224));
//转成张量
auto input_tensor = torch::from_blob(image.data, { image.rows, image.cols, 3 }, torch::kByte).permute({ 2, 0, 1 }).unsqueeze(0).to(torch::kFloat32) / 225.0;
//加载模型
auto model = torch::jit::load("你的地址\\resnet34.pt");
model.to(device);
model.eval();
//前向传播
auto output = model.forward({input_tensor.to(device)}).toTensor();
output = torch::softmax(output, 1);
std::cout << "模型预测结果为第" << torch::argmax(output) << "类,置信度为" << output.max() << std::endl;
return 0;
}
编译执行,代码的输出结果为:
模型预测结果为第723
[ CUDALongType{} ]类,置信度为0.591652
[ CUDAFloatType{} ]
5 报错处理
错误1:无法使用GPU、model.eval()无法执行
处理方法
错误2:需要编译器标志"/std:c++17"
打开属性页,设置C++语音标准为C++ 17