环境配置------libtorch

文章目录

  • 环境配置------libtorch
    • 库下载
    • 环境配置
      • 环境路径配置
      • VS属性页配置
        • 1、包含目录
        • 2、库目录
        • 3、附加库目录
        • 4、附加依赖项
        • 5、SDL检查
        • 6、符合模式
    • 测试
      • 获取pth文件
      • 转换pt文件
      • 调用pt文件,测试环境
    • 后语

环境配置------libtorch

库下载

方法一:https://pytorch.org/

1、进入以下页面,点击install

环境配置------libtorch_第1张图片

2、找到以下页面,选择cuda版本,语言选c++,package选libtorch等。复制以下网址链接可以下载
(貌似官网下载libtorch,某一阶段好像只有几个特定版本,我没找到其他的,如果有人知道,望不吝赐教)

环境配置------libtorch_第2张图片

方法二:
https://blog.csdn.net/qq_35275007/article/details/116592120

环境配置------libtorch_第3张图片

或者点击
https://blog.csdn.net/guzhao9901/article/details/125051108

环境配置------libtorch_第4张图片

或者点击
https://blog.csdn.net/weixin_43742643/article/details/115218126

环境配置------libtorch_第5张图片

注意:libtorch和pytorch版本最后对应,如果想要安装linux,请选择最后一种

环境配置

环境路径配置

1、找到刚才下载的压缩包并解压缩
2、添加环境变量
找到解压缩文件下的lib和bin文件

环境配置------libtorch_第6张图片

把bin和lib的文件路径添加到环境变量中
需要把lib里面的dll复制到bin文件中
(注意:此时如果这次设置,之后测试是否可用是为出行C10.dll等dll库找不到,此问题我的解决方法是吧lib中所有dll复制到c盘的Windows下的system32中)(暂时没有好的方案,如果有请赐教)
此电脑(右击)->属性->高级系统设置->环境变量->path->添加bin和lib路径

1、
环境配置------libtorch_第7张图片

2、
环境配置------libtorch_第8张图片

3、
环境配置------libtorch_第9张图片

4、
环境配置------libtorch_第10张图片

VS属性页配置

这里为了不和其他属性混淆,我都是每个环境单独新建一个属性页
(我这里以release为例)
打开VS019,如果在你的界面左侧或者右侧找不到属性管理器

环境配置------libtorch_第11张图片

在界面中找到视图,点击其他窗口,找到属性管理器。(如果有这一步请忽略)

环境配置------libtorch_第12张图片

找到release|x64,右击,点击添加新项目属性表

环境配置------libtorch_第13张图片

出现以下界面,重命名,并且选择保存路径,最后添加

环境配置------libtorch_第14张图片

右击刚刚添加的属性页->点击属性

环境配置------libtorch_第15张图片

首先配置包含目录和库目录

1、包含目录

点击VC++目录,包含目录,找到编辑

环境配置------libtorch_第16张图片

出现以下界面,在你的解压缩文件夹中找到libtorch\include\torch\csrc\api\include和libtorch\include路径
一般为以下
解压缩后文件夹路径\libtorch\torch\csrc\api\include
解压缩后文件夹路径\libtorch
点击确定

环境配置------libtorch_第17张图片

2、库目录

点击VC++目录,库目录,找到编辑

环境配置------libtorch_第18张图片

出现以下界面,在你的解压缩文件夹中找到libtorch\lib
一般为以下
解压缩后文件夹路径\libtorch\lib
点击确定

环境配置------libtorch_第19张图片

其次配置附加库目录和附加依赖项

3、附加库目录

点击链接器,常规,附加库目录,点击编辑

环境配置------libtorch_第20张图片

出现以下界面,在你的解压缩文件夹中找到libtorch\lib
一般为以下
解压缩后文件夹路径\libtorch\lib
点击确定

环境配置------libtorch_第21张图片

4、附加依赖项

点击链接器,输入,附加依赖项,点击编辑

环境配置------libtorch_第22张图片

出现以下界面,
需要把lib下的所有.lib名称都添加进去
也可以和如下一样
在你的解压缩文件夹中找到libtorch\lib*.lib
一般为以下
解压缩后文件夹路径\libtorch\lib*.lib
点击确定

环境配置------libtorch_第23张图片

然后修改以下选项
主要是SDL检查和符合模式

5、SDL检查

C/C++ ->常规->SDL检查->否(/sdl-)

环境配置------libtorch_第24张图片

6、符合模式

C/C++ ->语言->符合模式->否(/pemissive)

环境配置------libtorch_第25张图片

测试

获取pth文件

通过模型训练,可以得到pth(pytorch)

转换pt文件

这里以分类模型为例

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()

调用pt文件,测试环境

如果此时你的属性管理器中没有你配置的属性页,需要重新添加你的刚刚配置的属性页(如果有就忽略)
在你刚刚保存的路径中找到你的属性页

环境配置------libtorch_第26张图片

此时需要在这里选择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报上面的错。

环境配置------libtorch_第27张图片

此时解决方案为:
右击刚刚配置的属性页->链接器->命令行->参数为以下:
/INCLUDE:?searchsorted_cuda@native@at@@YA?AVTensor@2@AEBV32@0_N1@Z

环境配置------libtorch_第28张图片
点击应用,确定即可。

后语

水平有限,如有错误,请指正,如有好的方案,热忱欢迎广大朋友赐教
注:debug版本有问题还没解决,无法提供解决方法。

你可能感兴趣的:(深度学习环境,深度学习,python,人工智能)