当前位置: 首页 > news >正文

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脚本进行网络搭建和训练&#xff0c;并获得训练好的模型。为了提高效率方便整个工程项目部署&#xff0c;实际工程应用中通常希望使用C编程语言调用训练好的网络模型。查询大量网络资料并踩过无数坑后&#xff0c;经实际测试实现了在window1…...

Milkv Duo 以太网使用与配置

网络配置 使能网卡 使用ip link查看是否存在eth0网卡&#xff0c;若无使用如下命令使能网卡&#xff1a; ip link set eth0 up两次使用ip link确认网卡eth0已经使能。 配置IP、gws 本人设备连接到华为路由器下&#xff0c;故增加如下路由信息&#xff1a; ip route add d…...

bash: make: command not found

make之后报错信息如下&#xff1a;cd 对应的文件路径后 make 发现报错&#xff1a;bash: make: command not found 这个原因可能是没有安装make工具,也可能是安装了make之后,没有将make的文件路径添加到系统环境变量中 有没有安装make,可以使用Search Everything搜索是否有make…...

热点如何用于期刊写作——以chatGPT为例

交叉领域A&#xff0c;B 以自己为例子&#xff0c;A是教育 B是技术&#xff0c;我是教育技术学专业。 经验来源 知网关于GPT的140余篇专业论文的观察 截止至2023年8月14日15:35:45 学习每出现一个热点&#xff0c;如何应用于学术。 实践阅读发现 套路一&#xff1a;谈理论…...

IGV.js 的完全本地化运行探索

问题及解决方法 IGV.js 完全本地化是为了合规&#xff0c;不使用外网的情况下查看基因组。不联网需要下载 genomes.json 文件及其中的内容之外&#xff0c;还需要修改 igv.js本身&#xff0c;防止5s超时后才显示网页内容。修改的关键词是: genomes.json&#xff0c;改为本地的…...

网络安全渗透测试之靶场训练

NWES: 7月26号武汉地震检测中心遭受境外具有政府背景的黑客组织和不法分子的网络攻击。 目前网络攻击主要来自以下几种方式: DDOS&#xff1a;分布式拒绝服务攻击。通过制造大量无用的请求向目标服务器发起访问&#xff0c;使其因短时间内无法处理大量请求而陷入瘫痪。主要针对…...

Java课题笔记~ Spring 的事务管理

一、Spring 的事务管理 事务原本是数据库中的概念&#xff0c;在 Dao 层。但一般情况下&#xff0c;需要将事务提升到业务层&#xff0c;即 Service 层。这样做是为了能够使用事务的特性来管理具体的业务。 在 Spring 中通常可以通过以下两种方式来实现对事务的管理&#xff…...

仿到位|独立版家政上门预约服务小程序家政保洁师傅上门服务小程序上门服务在线派单源码

上门预约服务派单小程序家政 小程序 同城预约 开源代码 独立版. 程序完整,经过安装检测,可放心下载安装。 适合本地的一款上门预约服务小程序,功能丰富,适用多种场景。 程序功能:城市管理/小程序DIY/服务订单/师傅管理/会员卡功能/营销功能/文章功能等等...

Observability:识别生成式 AI 搜索体验中的慢速查询

作者&#xff1a;Philipp Kahr Elasticsearch Service 用户的重要注意事项&#xff1a;目前&#xff0c;本文中描述的 Kibana 设置更改仅限于 Cloud 控制台&#xff0c;如果没有我们支持团队的手动干预&#xff0c;则无法进行配置。 我们的工程团队正在努力消除对这些设置的限制…...

接口测试及接口抓包常用的测试工具

接口 接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及系统间的相互逻辑依赖关系等。 接口测试的重要性 是节省时间前后端不…...

CH342/CH343/CH344/CH347/CH9101/CH9102/CH9103/CH9104 Linux串口驱动使用教程

CH343 Linux串口驱动 ch343ser_linux 支持USB转串口芯片 ch342/ch343/ch344/ch347/ch9101/ch9102/ch9103/ch9104等 &#xff0c;同时该驱动配合ch343_lib库还提供了芯片GPIO接口的读写功能&#xff0c;内部EEPROM的信息配置和读取功能等。 芯片型号串口数量GPIO数量CH342F/K2C…...

反射和工厂设计模式---工厂设计模式

一、工厂设计模式概述 ■什么是工厂设计模式 工厂模式(Factory Pattern)是开发中比较常用的设计模式之一。 它属于创建型模式(单例模式就是创建型模式的一种)&#xff0c;这种模式让我们在创建对象时不会直接暴露创建逻辑&#xff0c;而是通过使用一个共同的接口来完成对象的…...

【算法——双指针】LeetCode 283 移动零

题目描述&#xff1a; 思路&#xff1a; (双指针) O(n)O(n)O(n) 给定一个数组 nums&#xff0c;要求我们将所有的 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 如图所示&#xff0c;数组nums [0,1,0,3,12]&#xff0c;移动完成后变成nums [1,3,12,0,0] &am…...

腾讯云轻量服务器和云服务器的CPU处理器有差别吗?

腾讯云轻量应用服务器和CVM云服务器的CPU处理器性能有差别吗&#xff1f;创建轻量应用服务器时不支持指定底层物理服务器的CPU型号&#xff0c;腾讯云将随机分配满足套餐规格的物理CPU型号&#xff0c;通常优先选择较新代次的CPU型号。而云服务器CVM的CPU处理器型号、主频都是有…...

Redis_亿级访问量数据处理

11. 亿级访问量数据处理 11.1 场景表述 手机APP用户登录信息&#xff0c;一天用户登录ID或设备ID电商或者美团平台&#xff0c;一个商品对应的评论文章对应的评论APP上有打卡信息网站上访问量统计统计新增用户第二天还留存商品评论的排序月活统计统计独立访客(Unique Vistito…...

Java-类型和变量(基于C语言的补充)

一个简单的Java程序 args){ System.out.println("Hello,world"); } }通过上述代码&#xff0c;我们可以看到一个完整的Java程序的结构&#xff0c;Java程序的结构由如下三个部分组成&#xff1a; 1.源文件&#xff08;扩展名为*.java)&#xff1a;源文件带有类的定义…...

机器学习笔记:李宏毅diffusion model

1 概念原理 首先sample 一个都是噪声的vector然后经过denoise network 过滤一些杂质接着继续不断denoise&#xff0c;直到最后出来一张清晰图片 【类似于做雕塑&#xff0c;一开始只是一块石头&#xff08;噪声很杂的雕塑&#xff09;&#xff0c;慢慢雕刻出想要的花纹】 同一个…...

STM32--TIM定时器(2)

文章目录 输出比较PWM输出比较通道参数计算舵机简介直流电机简介TB6612 PWM基本结构PWM驱动呼吸灯PWM驱动舵机PWM控制电机 输出比较 输出比较&#xff0c;简称OC&#xff08;Output Compare&#xff09;。 输出比较的原理是&#xff0c;当定时器计数值与比较值相等或者满足某种…...

git Authentication failed

情况是这样的&#xff0c;之前看代码只是clone了一份&#xff0c;但随着分支越来越多&#xff0c;有时候切换分支时必须先把修改的代码 stash 一下&#xff0c;觉得很麻烦&#xff0c;于是又clone了一份代码。然后pull代码是正常的&#xff0c;当push 代码的时候&#xff0c;去…...

【软考】2023系统架构设计师考试

目录 1 软考资格设置 2 考试报名 3 考试准备 4 参加考试 5 考试感受 6 其他 1 软考资格设置 2 考试报名 报名网址&#xff1a;https://www.ruankao.org.cn/ 3 考试准备 4 参加考试 2023年下半年系统架构设计师考试时间为11月4、5日。 5 考试感受 6 其他 最近好像有地区…...

构建具备批判性思维的AI Agent

构建具备批判性思维的AI Agent&#xff1a;从理论到生产级RAG反思循环系统 副标题&#xff1a;拆解GPT-4o、Claude Opus的「逻辑过滤」核心&#xff0c;用LangChain AutoGen Python落地高准确率Agent第一部分&#xff1a;引言与基础 1. 引人注目的标题 &#xff08;本文已单独…...

如何用QtScrcpy实现Android设备实时投屏:终极免费解决方案

如何用QtScrcpy实现Android设备实时投屏&#xff1a;终极免费解决方案 【免费下载链接】QtScrcpy Android实时投屏软件&#xff0c;此应用程序提供USB(或通过TCP/IP)连接的Android设备的显示和控制。它不需要任何root访问权限 项目地址: https://gitcode.com/barry-ran/QtScr…...

如何免费创建防关联浏览器:VirtualBrowser终极指南

如何免费创建防关联浏览器&#xff1a;VirtualBrowser终极指南 【免费下载链接】VirtualBrowser Free anti fingerprint browser, 指纹浏览器, 隐私浏览器, 防识别浏览器, 反识别浏览器, 防关联浏览器, 免费的web3空投专用指纹浏览器 https://virtualbrowser.cc/?srcgithub …...

2279 上市公司跨国供应链【存续力】(Sustainability) 指标(2004.07-2026.02)

数据简介测度微观合作黏性与“沉没成本”的度量衡 存续力&#xff08;Sustainability&#xff09;衡量了一段供需关系在走向彻底“死亡”之前&#xff0c;曾经拥有过的生命长度。在国际贸易网络中&#xff0c;存续时间的长短反映了中外企业间的合作黏性、技术锁定效应和信任深度…...

FreakStudio碌

环境安装 pip install keystone-engine capstone unicorn 这3个工具用法极其简单&#xff0c;下面通过示例来演示其用法。 Keystone 示例 from keystone import * CODE b"INC ECX; ADD EDX, ECX" try:ks Ks(KS_ARCH_X86, KS_MODE_64)encoding, count ks.asm(CODE)…...

安卓TV浏览器大屏适配终极方案:用Firefox+JS代码搞定全屏显示(附兼容性测试)

安卓TV浏览器大屏适配终极方案&#xff1a;用FirefoxJS代码搞定全屏显示&#xff08;附兼容性测试&#xff09; 在数字标牌、会议室展示等大屏应用场景中&#xff0c;安卓TV浏览器的适配问题一直是开发者的痛点。市面上常见的浏览器要么稳定性堪忧&#xff0c;要么缺乏对大屏显…...

保姆级教程:用VESTA软件5分钟搞定纳米颗粒Wulff Construction模型

5分钟玩转VESTA&#xff1a;科研小白的纳米颗粒建模可视化指南 在材料科学和计算化学领域&#xff0c;纳米颗粒的形貌预测一直是研究热点。想象一下&#xff0c;你刚完成一系列表面能计算&#xff0c;手握着宝贵的数据&#xff0c;却苦于无法直观展示这些抽象数字背后的三维结构…...

猫抓Cat-Catch:革命性网页资源智能捕获工具

猫抓Cat-Catch&#xff1a;革命性网页资源智能捕获工具 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 你是否曾在浏览网页时&#xff0c;看到心仪…...

GenomicSEM实战指南:从GWAS摘要数据到复杂遗传模型的完整解析

GenomicSEM实战指南&#xff1a;从GWAS摘要数据到复杂遗传模型的完整解析 【免费下载链接】GenomicSEM R-package for structural equation modeling based on GWAS summary data 项目地址: https://gitcode.com/gh_mirrors/ge/GenomicSEM 在基因组学研究中&#xff0c;…...

OpenClaw 微信部署避坑实操:多模式部署+常见故障速解(附部署包)

前言 在微信私域运营与自动化客服场景中&#xff0c;OpenClaw 可打通微信客户端与后端服务的通信链路&#xff0c;降低接入门槛&#xff0c;支持本地、云端等多环境部署&#xff0c;兼顾数据安全与连接稳定。本文聚焦部署细节与故障排查逻辑&#xff0c;适配中小企业业务落地&…...