Windows11环境下VS2019调用Pytorch语义分割模型(C++版)
语义分割模型在训练时往往采用python脚本进行网络搭建和训练,并获得训练好的模型。为了提高效率方便整个工程项目部署,实际工程应用中通常希望使用C++编程语言调用训练好的网络模型。查询大量网络资料并踩过无数坑后,经实际测试实现了在window11环境下调用pytorch语义分割模型,具体实现步骤记录如下。
一、系统环境参数
电脑系统:window11
VS版本:2019
pytorch版本:2.1
CUDA版本:cuda11
python版本:3.9.17
二、pytorch模型转换
在C++环境下调用pytorch网络模型,首先需要将其转换为能够识别和调用的网络模型(.pt格式)。新建python脚本实现模型转换。实现代码如下:
import torch
import torchvisiondevice = torch.device('cuda') if torch.cuda.is_available() else torch.device('cpu')filenameCheckpoint = '../checkpoints/checkpoint_end.pth.tar'checkpoint = torch.load(filenameCheckpoint)model = checkpoint['arg']model.load_state_dict(checkpoint['state_dict'])
model.cuda(device)input_img_rand = torch.rand(1, 3, 608, 608).cuda()
traced_script_module = torch.jit.trace(model, input_img_rand)
traced_script_module.save('forign_detect_model-gpu.pt')model.cpu()
input_img_rand_cpu = torch.rand(1, 3, 608, 608)
traced_script_module = torch.jit.trace(model, input_img_rand_cpu)
traced_script_module.save("forign_detect_model-cpu.pt")
三、libtorch库下载
这个库是实现模型调用的关键,进入pytorch官网即可下载,下载时参数选择如下图,本文下载的是release版本,下载链接如下:libtorch。下载完成后解压到固定目录即可。

四、VS2019环境配置
打开vs2019,创建空项目,新建main.cpp。注意切换选择为x64模式。打开项目属性页进行环境配置。属性页中C/C++->常规->附件包含目录。添加头文件路径(根据libtorch实际的路径修改),如下图所示。后期会使用到opencv,需要进行 opencv环境配置
然后配置 链接器->常规->附加库目录,配置如下图:
继续配置依赖项:链接器->输入->附加依赖项。如下图所示:
为方便输入,依赖项如下:
asmjit.lib
c10.lib
c10_cuda.lib
caffe2_nvrtc.lib
clog.lib
cpuinfo.lib
dnnl.lib
fbgemm.lib
fbjni.lib
kineto.lib
libprotobuf.lib
libprotobuf-lite.lib
libprotoc.lib
nvfuser_codegen.lib
pthreadpool.lib
pytorch_jni.lib
torch.lib
torch_cpu.lib
torch_cuda.lib
XNNPACK.lib
opencv_world346.lib(根据OpenCV版本进行修改)
最后是调试的环境配置,如下图所示:
配置如下:PATH=D:\CODES\forign_detectC++\libtorch\lib;E:\opencv\build\x64\vc15\bin(需要根据实际库的安装路径修改)。
值得注意的是由于我的pytorch版本较高为2.1,需要使用c++17才能编译成功。因此需要配置C++17,如下图所示。
至此,环境配置环境,接下来开始模型调用实现。
五、pytorch模型调用
main.cpp中完整调用代码如下:输入一张测试图,调用语义分割模型,最后获得语义分割图像。
#include <torch/script.h>
#include <opencv2/opencv.hpp>
#include <iostream>
#include <torch/torch.h>int main()
{torch::DeviceType device_type;if (torch::cuda::is_available()) {std::cout << "CUDA available! Predicting on GPU." << std::endl;device_type = torch::kCUDA;}else {std::cout << "Predicting on CPU." << std::endl;device_type = torch::kCPU;}torch::Device device(device_type);//模型加载std::string model_pb = "D:\\CODES\\forign_detectC++\\testPro\\forign_detect_model-gpu.pt";auto module = torch::jit::load(model_pb);module.to(at::kCUDA);
//测试图像加载auto image = cv::imread("testimg.png", cv::ImreadModes::IMREAD_COLOR);cv::Mat image_transfomed;cv::resize(image, image_transfomed, cv::Size(image.rows, image.cols));cv::cvtColor(image_transfomed, image_transfomed, cv::COLOR_BGR2RGB);//转为适合训练的张量维度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);tensor_image = tensor_image.div(255);tensor_image = tensor_image.unsqueeze(0);tensor_image = tensor_image.to(at::kCUDA);torch::Tensor output = module.forward({ tensor_image }).toTensor();
//获取预测结果torch::Tensor pred_out = output[0];//std::tuple<torch::Tensor, torch::Tensor> img_reverse_one_hot = torch::max(pred_out, 0);//类别的最大值torch::Tensor img_max_value = std::get<0>(img_reverse_one_hot);
//类别最大值索引torch::Tensor img_max_index = std::get<1>(img_reverse_one_hot);img_max_index = img_max_index.to(torch::kU8);img_max_index = img_max_index.to(torch::kCPU);//tensor 转cv::Matcv::Mat img_max_index_mat(image_transfomed.rows, image_transfomed.cols, CV_8U);std::memcpy((void*)img_max_index_mat.data, img_max_index.data_ptr(), sizeof(torch::kU8) * img_max_index.numel());//给预测结果赋值颜色cv::Mat coloredImg(image_transfomed.rows, image_transfomed.cols, CV_8UC3);const cv::Vec3b colorMap[] ={cv::Vec3b(0,0,0),cv::Vec3b(255,0,0)};for (int x = 0; x < coloredImg.rows; x++){for (int y = 0; y < coloredImg.cols; y++){int label = img_max_index_mat.at<uchar>(x, y);coloredImg.at<cv::Vec3b>(x, y) = colorMap[label];}}
//转BGRcv::cvtColor(coloredImg, coloredImg, cv::COLOR_RGB2BGR);
//与原图合并cv::bitwise_or(image, coloredImg, coloredImg);cv::imwrite("output.png", coloredImg);return 0;
}
六、调试过程中遇到的坑
1.vs版本问题,之前使用vs2017,编译一直有问题,即便主函数什么都没有,仅包含头文件也会报错,折腾好几天,换成vs2019就没问题。
2.libtorch的版本问题,由于我当时下载的是release版本,但vs里面却设置了debug版本,导致程序一运行就会出现debug error abort has been called。因此,需要注意libtorch的版本和vs运行时的模式保持一致。同样注意vs里设置x64模式。
3.c++17问题:pytorh2.1必须使用c++17才能顺利编译,否则会报C++无法编译pytorch的问题,因此需要在vs中的“语言”模块中配置c++17。
相关文章:
Windows11环境下VS2019调用Pytorch语义分割模型(C++版)
语义分割模型在训练时往往采用python脚本进行网络搭建和训练,并获得训练好的模型。为了提高效率方便整个工程项目部署,实际工程应用中通常希望使用C编程语言调用训练好的网络模型。查询大量网络资料并踩过无数坑后,经实际测试实现了在window1…...
Milkv Duo 以太网使用与配置
网络配置 使能网卡 使用ip link查看是否存在eth0网卡,若无使用如下命令使能网卡: ip link set eth0 up两次使用ip link确认网卡eth0已经使能。 配置IP、gws 本人设备连接到华为路由器下,故增加如下路由信息: ip route add d…...
bash: make: command not found
make之后报错信息如下:cd 对应的文件路径后 make 发现报错:bash: make: command not found 这个原因可能是没有安装make工具,也可能是安装了make之后,没有将make的文件路径添加到系统环境变量中 有没有安装make,可以使用Search Everything搜索是否有make…...
热点如何用于期刊写作——以chatGPT为例
交叉领域A,B 以自己为例子,A是教育 B是技术,我是教育技术学专业。 经验来源 知网关于GPT的140余篇专业论文的观察 截止至2023年8月14日15:35:45 学习每出现一个热点,如何应用于学术。 实践阅读发现 套路一:谈理论…...
IGV.js 的完全本地化运行探索
问题及解决方法 IGV.js 完全本地化是为了合规,不使用外网的情况下查看基因组。不联网需要下载 genomes.json 文件及其中的内容之外,还需要修改 igv.js本身,防止5s超时后才显示网页内容。修改的关键词是: genomes.json,改为本地的…...
网络安全渗透测试之靶场训练
NWES: 7月26号武汉地震检测中心遭受境外具有政府背景的黑客组织和不法分子的网络攻击。 目前网络攻击主要来自以下几种方式: DDOS:分布式拒绝服务攻击。通过制造大量无用的请求向目标服务器发起访问,使其因短时间内无法处理大量请求而陷入瘫痪。主要针对…...
Java课题笔记~ Spring 的事务管理
一、Spring 的事务管理 事务原本是数据库中的概念,在 Dao 层。但一般情况下,需要将事务提升到业务层,即 Service 层。这样做是为了能够使用事务的特性来管理具体的业务。 在 Spring 中通常可以通过以下两种方式来实现对事务的管理ÿ…...
仿到位|独立版家政上门预约服务小程序家政保洁师傅上门服务小程序上门服务在线派单源码
上门预约服务派单小程序家政 小程序 同城预约 开源代码 独立版. 程序完整,经过安装检测,可放心下载安装。 适合本地的一款上门预约服务小程序,功能丰富,适用多种场景。 程序功能:城市管理/小程序DIY/服务订单/师傅管理/会员卡功能/营销功能/文章功能等等...
Observability:识别生成式 AI 搜索体验中的慢速查询
作者:Philipp Kahr Elasticsearch Service 用户的重要注意事项:目前,本文中描述的 Kibana 设置更改仅限于 Cloud 控制台,如果没有我们支持团队的手动干预,则无法进行配置。 我们的工程团队正在努力消除对这些设置的限制…...
接口测试及接口抓包常用的测试工具
接口 接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换,传递和控制管理过程,以及系统间的相互逻辑依赖关系等。 接口测试的重要性 是节省时间前后端不…...
CH342/CH343/CH344/CH347/CH9101/CH9102/CH9103/CH9104 Linux串口驱动使用教程
CH343 Linux串口驱动 ch343ser_linux 支持USB转串口芯片 ch342/ch343/ch344/ch347/ch9101/ch9102/ch9103/ch9104等 ,同时该驱动配合ch343_lib库还提供了芯片GPIO接口的读写功能,内部EEPROM的信息配置和读取功能等。 芯片型号串口数量GPIO数量CH342F/K2C…...
反射和工厂设计模式---工厂设计模式
一、工厂设计模式概述 ■什么是工厂设计模式 工厂模式(Factory Pattern)是开发中比较常用的设计模式之一。 它属于创建型模式(单例模式就是创建型模式的一种),这种模式让我们在创建对象时不会直接暴露创建逻辑,而是通过使用一个共同的接口来完成对象的…...
【算法——双指针】LeetCode 283 移动零
题目描述: 思路: (双指针) O(n)O(n)O(n) 给定一个数组 nums,要求我们将所有的 0 移动到数组的末尾,同时保持非零元素的相对顺序。 如图所示,数组nums [0,1,0,3,12],移动完成后变成nums [1,3,12,0,0] &am…...
腾讯云轻量服务器和云服务器的CPU处理器有差别吗?
腾讯云轻量应用服务器和CVM云服务器的CPU处理器性能有差别吗?创建轻量应用服务器时不支持指定底层物理服务器的CPU型号,腾讯云将随机分配满足套餐规格的物理CPU型号,通常优先选择较新代次的CPU型号。而云服务器CVM的CPU处理器型号、主频都是有…...
Redis_亿级访问量数据处理
11. 亿级访问量数据处理 11.1 场景表述 手机APP用户登录信息,一天用户登录ID或设备ID电商或者美团平台,一个商品对应的评论文章对应的评论APP上有打卡信息网站上访问量统计统计新增用户第二天还留存商品评论的排序月活统计统计独立访客(Unique Vistito…...
Java-类型和变量(基于C语言的补充)
一个简单的Java程序 args){ System.out.println("Hello,world"); } }通过上述代码,我们可以看到一个完整的Java程序的结构,Java程序的结构由如下三个部分组成: 1.源文件(扩展名为*.java):源文件带有类的定义…...
机器学习笔记:李宏毅diffusion model
1 概念原理 首先sample 一个都是噪声的vector然后经过denoise network 过滤一些杂质接着继续不断denoise,直到最后出来一张清晰图片 【类似于做雕塑,一开始只是一块石头(噪声很杂的雕塑),慢慢雕刻出想要的花纹】 同一个…...
STM32--TIM定时器(2)
文章目录 输出比较PWM输出比较通道参数计算舵机简介直流电机简介TB6612 PWM基本结构PWM驱动呼吸灯PWM驱动舵机PWM控制电机 输出比较 输出比较,简称OC(Output Compare)。 输出比较的原理是,当定时器计数值与比较值相等或者满足某种…...
git Authentication failed
情况是这样的,之前看代码只是clone了一份,但随着分支越来越多,有时候切换分支时必须先把修改的代码 stash 一下,觉得很麻烦,于是又clone了一份代码。然后pull代码是正常的,当push 代码的时候,去…...
【软考】2023系统架构设计师考试
目录 1 软考资格设置 2 考试报名 3 考试准备 4 参加考试 5 考试感受 6 其他 1 软考资格设置 2 考试报名 报名网址:https://www.ruankao.org.cn/ 3 考试准备 4 参加考试 2023年下半年系统架构设计师考试时间为11月4、5日。 5 考试感受 6 其他 最近好像有地区…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...
【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...
MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
