方法一:https://pytorch.org/
1、进入以下页面,点击install
2、找到以下页面,选择cuda版本,语言选c++,package选libtorch等。复制以下网址链接可以下载
(貌似官网下载libtorch,某一阶段好像只有几个特定版本,我没找到其他的,如果有人知道,望不吝赐教)
方法二:
https://blog.csdn.net/qq_35275007/article/details/116592120
或者点击
https://blog.csdn.net/guzhao9901/article/details/125051108
或者点击
https://blog.csdn.net/weixin_43742643/article/details/115218126
注意:libtorch和pytorch版本最后对应,如果想要安装linux,请选择最后一种
1、找到刚才下载的压缩包并解压缩
2、添加环境变量
找到解压缩文件下的lib和bin文件
把bin和lib的文件路径添加到环境变量中
需要把lib里面的dll复制到bin文件中
(注意:此时如果这次设置,之后测试是否可用是为出行C10.dll等dll库找不到,此问题我的解决方法是吧lib中所有dll复制到c盘的Windows下的system32中)(暂时没有好的方案,如果有请赐教)
此电脑(右击)->属性->高级系统设置->环境变量->path->添加bin和lib路径
这里为了不和其他属性混淆,我都是每个环境单独新建一个属性页
(我这里以release为例)
打开VS019,如果在你的界面左侧或者右侧找不到属性管理器
在界面中找到视图,点击其他窗口,找到属性管理器。(如果有这一步请忽略)
找到release|x64,右击,点击添加新项目属性表
出现以下界面,重命名,并且选择保存路径,最后添加
右击刚刚添加的属性页->点击属性
首先配置包含目录和库目录
点击VC++目录,包含目录,找到编辑
出现以下界面,在你的解压缩文件夹中找到libtorch\include\torch\csrc\api\include和libtorch\include路径
一般为以下
解压缩后文件夹路径\libtorch\torch\csrc\api\include
解压缩后文件夹路径\libtorch
点击确定
点击VC++目录,库目录,找到编辑
出现以下界面,在你的解压缩文件夹中找到libtorch\lib
一般为以下
解压缩后文件夹路径\libtorch\lib
点击确定
其次配置附加库目录和附加依赖项
点击链接器,常规,附加库目录,点击编辑
出现以下界面,在你的解压缩文件夹中找到libtorch\lib
一般为以下
解压缩后文件夹路径\libtorch\lib
点击确定
点击链接器,输入,附加依赖项,点击编辑
出现以下界面,
需要把lib下的所有.lib名称都添加进去
也可以和如下一样
在你的解压缩文件夹中找到libtorch\lib*.lib
一般为以下
解压缩后文件夹路径\libtorch\lib*.lib
点击确定
然后修改以下选项
主要是SDL检查和符合模式
C/C++ ->常规->SDL检查->否(/sdl-)
C/C++ ->语言->符合模式->否(/pemissive)
通过模型训练,可以得到pth(pytorch)
这里以分类模型为例
import os
import torch
from PIL import Image
from torchvision import transforms
from model_v2 import MobileNetV2
def main():
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
print("using {} device.".format(device))
# create model
model = MobileNetV2(num_classes=5).to(device)
image = Image.open("Rose2.jpg").convert('RGB')
data_transform = transforms.Compose(
[transforms.Resize((224, 224)),
transforms.ToTensor(),
transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])
img = data_transform(image)
img = img.unsqueeze(dim=0)
print(img.shape)
# load model weights
weights_path = "MobileNetV2.pth"
assert os.path.exists(weights_path), "file: '{}' dose not exist.".format(weights_path)
testsize = 224
if torch.cuda.is_available():
modelState = torch.load(weights_path, map_location='cuda')
model.load_state_dict(modelState, strict=False)
model = model.cuda()
model = model.eval()
# An example input you would normally provide to your model's forward() method.
example = torch.rand(1, 3, testsize, testsize)
example = example.cuda()
traced_script_module = torch.jit.trace(model, example)
output = traced_script_module(img.cuda())
print(output.shape)
pred = torch.argmax(output, dim=1)
print(pred)
traced_script_module.save('model_cuda.pt')
else:
modelState = torch.load(weights_path, map_location='cpu')
model.load_state_dict(modelState, strict=False)
example = torch.rand(1, 3, testsize, testsize)
example = example.cpu()
traced_script_module = torch.jit.trace(model, example)
output = traced_script_module(img.cpu())
print(output.shape)
pred = torch.argmax(output, dim=1)
print(pred)
traced_script_module.save('model.pt')
if __name__ == '__main__':
main()
如果此时你的属性管理器中没有你配置的属性页,需要重新添加你的刚刚配置的属性页(如果有就忽略)
在你刚刚保存的路径中找到你的属性页
此时需要在这里选择release和X64,因为我们配置的就是这个
使用代码测试环境
#include // One-stop header.
#include "torch/torch.h"
#include
#include "opencv2/core.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/imgcodecs.hpp"
#include
#include
#include
#include
#include
#include
// class_list
/*
"0": "daisy",
"1": "dandelion",
"2": "roses",
"3": "sunflowers",
"4": "tulips"
*/
std::string classList[5] = { "daisy", "dandelion", "rose", "sunflower", "tulip" };
std::string image_path = "Rose2.jpg";
int main(int argc, const char* argv[]) {
// Deserialize the ScriptModule from a file using torch::jit::load().
//std::shared_ptr module = torch::jit::load("../../model_resnet_jit.pt");
using torch::jit::script::Module;
Module module = torch::jit::load("D:\\C++\\1\\Project1\\model_cuda.pt");
std::cout << "测试图片:" << image_path << std::endl;
std::cout << "cuda support:" << (torch::cuda::is_available() ? "ture" : "false") << std::endl;
std::cout << "CUDNN: " << torch::cuda::cudnn_is_available() << std::endl;
std::cout << "GPU(s): " << torch::cuda::device_count() << std::endl;
// module.to(at::kCUDA); //cpu下会在(auto image = cv::imread(image_path, cv::IMREAD_COLOR))行引起c10:error,未经处理的异常
module.eval();
//module.to(at::kCPU);
module.to(at::kCUDA);
//assert(module != nullptr);
//std::cout << "ok\n";
//输入图像
auto image = cv::imread(image_path, cv::IMREAD_COLOR);
cv::cvtColor(image, image, cv::COLOR_BGR2RGB);
cv::Mat image_transfomed = cv::Mat(cv::Size(224, 224), image.type());
cv::resize(image, image_transfomed, cv::Size(224, 224));
//cv::cvtColor(image_transfomed, image_transfomed, cv::COLOR_BGR2RGB);
// 转换为Tensor
torch::Tensor tensor_image = torch::from_blob(image_transfomed.data,
{ image_transfomed.rows, image_transfomed.cols,3 }, torch::kByte);
tensor_image = tensor_image.permute({ 2,0,1 });
tensor_image = tensor_image.toType(torch::kFloat);
auto tensor_image_Tmp = torch::autograd::make_variable(tensor_image, false);
tensor_image = tensor_image.div(255);
tensor_image = tensor_image.unsqueeze(0);
tensor_image = tensor_image.to(at::kCUDA);
//tensor_image = tensor_image.to(at::kCPU);
// 网络前向计算
at::Tensor output = module.forward({ tensor_image }).toTensor();
std::cout << "output:" << output << std::endl;
auto prediction = output.argmax(1);
std::cout << "prediction:" << prediction << std::endl;
int maxk = 5;
auto top3 = std::get<1>(output.topk(maxk, 1, true, true));
std::cout << "top3: " << top3 << '\n';
std::vector<int> res;
for (auto i = 0; i < maxk; i++) {
res.push_back(top3[0][i].item().toInt());
}
// for (auto i : res) {
// std::cout << i << " ";
// }
// std::cout << "\n";
int pre = torch::Tensor(prediction).item<int>();
std::string result = classList[pre];
std::cout << "This is:" << result << std::endl;
cvWaitKey();
return 0;
// system("pause");
}
注意此时一般有两个问题:
1、测试时,找不到dll库,我的解决方案是吧lib中的所有dll库复制到C:\Windows\System32中
2、报0x00007FFDC1DF4ED9 处(位于 pytorch-semantic3070.exe 中)有未经处理的异常: Microsoft C++ 异常: c10::NotImplementedError,位于内存位置 0x000000558F3CE790 处。cpu能正常调用,GPU报上面的错。
此时解决方案为:
右击刚刚配置的属性页->链接器->命令行->参数为以下:
/INCLUDE:?searchsorted_cuda@native@at@@YA?AVTensor@2@AEBV32@0_N1@Z
水平有限,如有错误,请指正,如有好的方案,热忱欢迎广大朋友赐教
注:debug版本有问题还没解决,无法提供解决方法。