Libtorch学习之Libtorch-VS2019-图像分割程序

news2024/11/29 0:51:16

文章目录

  • 环境说明
  • Pytorch 序列化
  • Libtorch 下载
  • VS配置
  • 主程序
  • 可能遇到的问题
  • 参考

环境说明

win10
VS2019
OPENCV4.7.0
Litorch1.13
Pytorch 1.12.1

Pytorch 序列化

import torch
from torchvision.models import resnet50
net = resnet50(pretrained=True)
net = net.cuda()
net.eval()

# trace
x = torch.ones(1, 3, 224, 224)
x = x.cuda()
traced_module = torch.jit.trace(net, x)
traced_module.save("resnet50_trace.pt")

Libtorch 下载

[libtorch-win-shared-with-deps-1.13.0+cu117.zip ]
通过网盘分享的文件:libtorch-win-shared-with-deps-1.13.0+cu117.zip
链接: https://pan.baidu.com/s/1NY25r9HnHXhy4kzIn-jlnQ 提取码: v5sq

解压后添加到环境变量里

D:\envPath\libtorch_11.3\libtorch\lib

VS配置

项目右键,选择属性

配置选择Release, 平台选择x64

VC++目录:

D:\envPath\libtorch_11.3\libtorch\include
D:\envPath\libtorch_11.3\libtorch\include\torch\csrc\api\include
C:\opencv\build\include\opencv2
C:\opencv\build\include\

库目录

C:\opencv\build\x64\vc16\lib
D:\envPath\libtorch_11.3\libtorch\lib

链接器-输入-附加依赖项

asmjit.lib
c10.lib
c10_cuda.lib
caffe2_detectron_ops_gpu.lib
caffe2_module_test_dynamic.lib
caffe2_nvrtc.lib
clog.lib
cpuinfo.lib
dnnl.lib
fbgemm.lib
libprotobuf.lib
libprotobuf-lite.lib
libprotoc.lib
mkldnn.lib
torch.lib
torch_cpu.lib
torch_cuda.lib
opencv_world470.lib

链接器-输入-命令行
其他选项添加

/INCLUDE:?ignore_this_library_placeholder@@YAHXZ
 

如图:
在这里插入图片描述

主程序

int main(int argc, char** argv)
{
	//Pro_info();
	if (argc < 1) return -1;
	std::string image_path = argv[1];
	//std::string model_path = argv[2];

	// 定义设备类型
	torch::DeviceType* deviceType = new torch::DeviceType();
	if (torch::cuda::is_available())
	{
		*deviceType = torch::kCUDA;
		std::cout << "The cuda is available" << std::endl;
	}
	else
	{
		*deviceType = torch::kCPU;
		std::cout << "The cuda isn't available" << std::endl;
	}

	torch::Device device(*deviceType);
	std::cout << *deviceType << std::endl;

	//加载模型
	using torch::jit::script::Module;
	Module module;
	try
	{
		
		module = torch::jit::load("D:/traced_resnet_model.pt");
		printf("The model load success!\n");


	}
	catch (std::exception& e)
	{
		std::cout << e.what() << std::endl;
		std::cerr << "error loading the model\n";
	}

	
	module.to(device);
	double total_time = 0;
	for (int i = 0; i < 100; i++)
	{
		auto start = std::chrono::system_clock::now();
		cv::Mat img = cv::imread(image_path);

		if (img.empty())
		{
			std::cerr << "The image can't open!\n";
			return -1;
		}

		//图像预处理
		cv::Mat input;
		cv::resize(img, img, cv::Size(input_shape, input_shape));//图片resize成512*512*3
		cv::cvtColor(img, input, cv::COLOR_BGR2RGB);
		//from_blob Mat转Tensor {batchsize,w,h,channles}
		torch::Tensor tensor_image = torch::from_blob(input.data, { 1,input.rows, input.cols,3 }, torch::kByte);
		//shape->(batchsize,channles,w,h)
		tensor_image = tensor_image.permute({ 0,3,1,2 });
		tensor_image = tensor_image.toType(torch::kFloat);
		//image/255.0图像的归一化处理
		tensor_image = tensor_image.div(255);
		tensor_image[0][0] = tensor_image[0][0].sub(0.485).div(0.229);
		tensor_image[0][1] = tensor_image[0][1].sub(0.456).div(0.224);
		tensor_image[0][2] = tensor_image[0][2].sub(0.406).div(0.225);
		auto img_var = torch::autograd::make_variable(tensor_image, false);
		std::vector<torch::jit::IValue> inputs;
		inputs.push_back(img_var.to(device));

		// 网络前向计算
		torch::NoGradGuard no_grad;
		auto output = module.forward({ inputs }).toTensor();
		output = torch::squeeze(torch::argmax(torch::softmax(output, 1), 1), 0);
		//std::cout << output.sizes() << std::endl;
		output = output.to(torch::kU8).to(torch::kCPU);
		//将tensor转为cv::Mat格式,进行展示
		cv::Mat Img(output.sizes()[0], output.sizes()[1], CV_8U, output.data_ptr());
		Img = Img * 255;
		cv::imshow("result", Img);
		cv::waitKey(0);
		return 0;
		auto end = std::chrono::system_clock::now();
		double spend_time = std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();
		std::cout << spend_time << "ms" << std::endl;
		total_time = total_time + spend_time;

	}

可能遇到的问题

  1. pytorch序列化过程要保证不出现警告,否则会导致后续libtorch调用模型出错
  2. 环境方面要求libtorch版本要高于pytorch,否则会出现c10 error
  3. 不同图像分割方法的预处理和后处理可能不同,需要重新使用C++实现。
  4. 运行时如果无法定位程序输入点于动态链接库,可以将libtorch下的dll文件复制到exe对应目录下
  5. 显卡没有调用的话,在链接器-命令行添加/INCLUDE:?ignore_this_library_placeholder@@YAHXZ,但不同版本添加的语句不一样,具体参考Terod的总结
  6. 'torch/torch.h’头文件提示不存在的话,环境配置中确认“\libtorch\include\torch\csrc\api\include”是否添加
  7. 出现其他问题,可以添加以下代码,打印出错误原因
    try
    {
       // your code goes here...
    }
    catch (std::exception &e)
    {
        std::cout << e.what() << std::endl;
    }

参考

  1. 经典图像分割网络:Unet 支持libtorch部署推理【附代码】

  2. Windows下将PyTorch模型转成Libtorch并使用C++进行读取

  3. Windows下PyTorch(LibTorch)配置cuda加速

如有其他问题,欢迎交流!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2192133.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

提升开机速度:有效管理Windows电脑自启动项,打开、关闭自启动项教程分享

日常使用Windows电脑时&#xff0c;总会需要下载各种各样的办公软件。部分软件会默认开机自启功能&#xff0c;开机启动项是指那些在电脑启动时自动运行的程序和服务。电脑开机自启太多的情况下会导致电脑卡顿&#xff0c;开机慢&#xff0c;运行不流畅的情况出现&#xff0c;而…

如何从计算机的硬盘中恢复照片 - 成功

如何从计算机硬盘恢复图片&#xff1f; 与所有电子和机械设备一样&#xff0c;硬盘驱动器也可能由于任何原因而死机。如果您的系统硬盘驱动器已停止工作或在启动系统时听到振动声&#xff0c;则它有可能已死机。如果是这样的话&#xff0c;上面的数据呢&#xff1f; 不要惊慌…

十二、血条UI

一、制作血条UI 注&#xff1a;一般不用Slider制作血条&#xff1b;而是用两个Image制作&#xff0c;选择为填充 使用Slider滑动条制作UI 人物血条&#xff1a;背景深绿色&#xff1b;滑条浅绿色 在场景中的画布选择为OverLay 敌人血条&#xff1a; 在预制体里面制作&#x…

自动驾驶系列—自动驾驶背后的数据通道:通信总线技术详解与应用场景分析

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

最具有世界影响力的人颜廷利:全球著名哲学家思想家起名大师

颜廷利教授&#xff0c;这位源自济南唐王镇的杰出人物&#xff0c;不仅是中国当代最杰出的国学大师之一&#xff0c;更是将传统文化与现代科技巧妙结合的先锋。他积极推崇以人工智能技术为辅助的国学研究方法&#xff0c;为这一古老领域注入了新的活力和时代表达。 除了在学术…

【LeetCode】每日一题 2024_10_6 加油站(贪心)

前言 每天和你一起刷 LeetCode 每日一题~ 大家国庆节快乐呀~ LeetCode 启动&#xff01; 国庆第 6 天&#xff0c;在加油站 . . . 题目&#xff1a;加油站 代码与解题思路 今天这道题目是力扣上的经典贪心&#xff08;第 134 题&#xff09; func canCompleteCircuit(gas…

springboot中配置优先级

先来看在idea当中运行程序时&#xff0c;如何来指定Java系统属性和命令行参数。 系统属性 1、右键启动类&#xff0c;点击Edit Configuration 点击Modify options 选择Add VM options&#xff0c;就是系统属性 选择Program arguements&#xff0c;就是命令行参数 总结&#…

排查和解决JVM OOM实战

JVM OOM介绍 Java内存区域布局 下面的分析中都是基于JDK 8开始的。关于JMM不过多介绍每个区域的作用。OOM不单只会发生在堆内存&#xff0c;也可能是因为元空间或直接内存泄漏导致OOM&#xff0c;此时在OOM的详细信息中会有不同体现。 Java OOM的类别 java.lang.OutOfMemory…

CSS 布局——清除浮动 (二)

目录 1. 清除浮动 2. 清除浮动本质 3. 清除浮动 4. 清除浮动方法 4.1 额外标签法 4.1.1 总结 4.2 父级添加 overflow 4.3 after 伪元素法 4.4 双伪元素清除浮动 5 总结 1. 清除浮动 这是上面的源代码&#xff1a; <!DOCTYPE html> <html lang"en"&…

飞书消息转发

飞书是字节跳动开发的一个款即时通讯软件 不同与微信和钉钉&#xff0c;飞书是基于Electron的跨平台桌面客户端&#xff08;主要开发语言是JavaScript&#xff09;&#xff0c;程序运行在chrom内核中&#xff0c;所以HOOK方案不好使 针对Electron 框架&#xff0c;打包后的应用…

京东e卡滑块 分析

声明 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 有相关问题请第一时间头像私信联系我删…

AI2.0时代,普通小白如何通过AI月入30万

最近这2年AI真的太火了&#xff0c;很多人都在讨论怎么用AI赚钱、提高效率。其实&#xff0c;我觉得AI并没有那么复杂&#xff0c;尤其是如果你不做AI底层研究&#xff0c;只是利用它来帮你省事、提效、赚钱&#xff0c;那就像当初学用电脑、用手机一样简单。你不需要懂AI的技术…

《数据结构》--栈【概念应用、图文并茂】

本节讲完栈下次再讲一下队列&#xff0c;最后补充一个串&#xff0c;我们的线性结构基本就完事了。下图中黄色框框圈中的是我们今日份内容(分为两篇博客)&#xff1a; 知识体系图 栈(Stack-LIFO)结构 栈的基础概念 栈(Stack)是一个后进先出(Last-In-First-Out)的一个特殊数据…

【Linux的那些事】shell命名及Linux权限的理解

目录 一、shell命令以及运行原理 二、Linux权限的概念 三、Linux权限管理 3.1.文件访问者的分类&#xff08;人&#xff09; 3.2.文件类型和访问权限&#xff08;事物属性&#xff09; 3.3.文件权限值的表示方法 3.4.文件访问权限的相关设置方法 a)chmod b)chown c)…

MSF捆绑文件

msf捆绑文件 msf快速打开不启动banner msfconsole -q msf捆绑文件 msfvenom -p windows/meterpreter/reverse_tcp LHOST127.0.0.1 LPORT8888 -f exe -x 1.exe -o msf.exe

在线教育的未来:SpringBoot技术实现

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理微服务在线教育系统的相关信息成为必然。开…

二进制的神奇操作——拆位法和贡献思想

拆位的引入 我们来思考这么一个问题&#xff0c;如果给你一个数组&#xff0c;让你去求一个数组里面所有连续子串的异或和的和&#xff0c;问你该怎么求&#xff1f; 我们该如何去处理&#xff0c;首先肯定是会想到暴力的思路&#xff0c;第一层循环遍历左端点&#xff0c;第…

算法闭关修炼百题计划(三)

减轻复习压力&#xff0c;一篇只有十题左右 1.反转链表II2.LRU缓存3.合并区间4.快速排序5.数字中的第k个最大元素6.归并排序7.每种字符至少取k个8.螺旋矩阵II9.旋转图像10.删除数组中重复的元素II 1.反转链表II 给你单链表的头指针 head 和两个整数 left 和 right &#xff0c…

洗车行软件系统有哪些 佳易王洗车店会员管理系统操作教程#洗车店会员软件试用版下载

一、前言 【试用版软件下载可点击本文章最下方官网卡片】 洗车行软件系统有哪些 佳易王洗车店会员管理系统操作教程#洗车店会员软件试用版下载 洗车管理软件应用是洗车业务的得力助手&#xff0c;实现会员管理及数据统计一体化&#xff0c;助力店铺高效、有序运营。 洗车项…

年薪96w!这才是运营人未来5年最好的就业方向!

运营人&#xff0c;终于被逼疯了&#xff01; 一个人一个部门&#xff01;文案、策划、拍摄、剪辑、运营、销售什么都做。企业利润为王&#xff0c;阅读量、粉丝量要是不能转化为业绩&#xff0c;注定拿不到高薪…… **活干了一大堆&#xff0c;一看工资8000块&#xff0c;**…