win7 vs2017 程序报错_windows + VS2017 配置libpytorch

83a342055e6927fb61a3b007ed598d9f.png

因为项目对实时性的要求,尝试一波c++直接调用libpytorch。实现的同时,整理了网上的相关资料,希望对效率追求的同学提供一份帮助。

0.下载准备

下载安装VS2017 和 cmake (3.0版本以上)

记得把bin目录添加到环境变量path中。这里解释一下,目前还不能直接使用VS直接配置成功libpytorch(如果读者成功了可以@我,这篇文档也就完成了使命就删了),而是先借助cmake先编译,达到曲线救国。

0a0b85401d58a45e68f67c4e6037f8db.png

下载安装opencv

可以参考博客:https://blog.csdn.net/qq_41175905/article/details/80560429,该博客中写的很详细。推荐opencv4.1.0

下载libtorch

下载地址:https://pytorch.org/get-started/locally/,这个根据自己情况选择下载,因为我自己的是cuda10,并且我选择使用release版本,所以我的选择如下:

1bc21c6f6633f9f8df249365c32481d5.png

1. 准备文件

接下来使用cmake来进行配置吧,我们首先自己创建一个文件夹,存放我们的主程序main.cpp还有CMakeLists.txt,然后我们再创建一个build的空文件夹,之后我们编译好的文件都存放在build文件夹里头。

目录结构大概就是这样,假设这个文件夹存放在D盘:

example:

  • build (文件夹)
  • torchscript.py
  • model.pt(由 python torchscript.py 生成)
  • main.cpp
  • CMakeLists.txt

touchscript.py

import torch
import torchvision# An instance of your model.
model = torchvision.models.resnet18()# An example input you would normally provide to your model's forward() method.
example = torch.rand(1, 3, 224, 224)# Use torch.jit.trace to generate a torch.jit.ScriptModule via tracing.
traced_script_module = torch.jit.trace(model, example)
traced_script_module.save("model.pt")

通过python touchscript.py ,则会生成我们上面main.cpp 需要的model.pt文件。

main.cpp

#include <torch/script.h> // One-stop header.
#include <iostream>
#include <memory>int main() {// Deserialize the ScriptModule from a file using torch::jit::load().torch::jit::script::Module module  = torch::jit::load("F:/LabSources/PytorchCmake/model.pt");assert(module != nullptr);std::cout << "okn";// Create a vector of inputs.std::vector<torch::jit::IValue> inputs;inputs.push_back(torch::ones({ 1, 3, 224, 224 }));// Execute the model and turn its output into a tensor.torch::Tensor output = module.forward(inputs).toTensor();std::cout << output.slice(/*dim=*/1, /*start=*/0, /*end=*/5) << 'n';while (1);
}

这是目前比较新的代码,旧的代码因为是测试版会出现语法错误,见 https://blog.csdn.net/qq_33507306/article/details/104427134

CMakeLists.txt

cmake_minimum_required(VERSION 3.12 FATAL_ERROR)
project(example-app)set(CMAKE_PREFIX_PATH "D:Space.DeveloplibtorchsharecmakeTorch")
find_package(Torch REQUIRED)
find_package(OpenCV REQUIRED)if(NOT Torch_FOUND)message(FATAL_ERROR "Pytorch Not Found!")
endif(NOT Torch_FOUND)message(STATUS "Pytorch status:")
message(STATUS "    libraries: ${TORCH_LIBRARIES}")message(STATUS "OpenCV library status:")
message(STATUS "    version: ${OpenCV_VERSION}")
message(STATUS "    libraries: ${OpenCV_LIBS}")
message(STATUS "    include path: ${OpenCV_INCLUDE_DIRS}")add_executable(example-app example-app.cpp)
target_link_libraries(example-app ${TORCH_LIBRARIES} ${OpenCV_LIBS})
set_property(TARGET example-app PROPERTY CXX_STANDARD 11)

其中,如果没有set(CMAKE_PREFIX_PATH "D:Space.Develop libtorchsharecmakeTorch"),可能有的同学会报错找不到Torch的错误。

2. Cmake编译

Cmake有GUI编译和命令行编译,本文主要操作GUI为主,命令行编译请见https://zhuanlan.zhihu.com/p/55292836。

首先我们打开cmake软件,然后打开我们创建的目录,我的目录是F:/LabSource/Pytorch Cmake, 填好两个目录(创建目录和其中的bin目录)。

a50c6c20ff44f080c5401bfa37b8df2d.png

选择generator,选择64位,因为CUDA不支持32位运算

a378ded8e89fb0b3083b242614f83a46.png

点击Configure,没问题的话再点击Configure,然后再点击Generate就成功了。

如果遇到以下错误:

4e3e90971f5ef88b9fa169bd241ad8ee.png

则我们根据错误,遇到下载缺少的资源,配在红色区域。(红色区域并不是都是错误,引起错误的是报错信息里日志里提示的缺少资源的NotFound)。

解决办法: 上图所示问题需要我们下载对应版本的CUDNN,并将资源配置(include、lib等)在对应的变量里。如下:

52037dcf358a61ae033e3b9902843afc.png

最后,如果日志出现warning,虽然也是红色警报,但是也可以继续Generate。进入下一步。

3. VS2017启动

然后打开build文件夹中的vcxporj文件,设置项目为启动项目,并更改为release的x64模式,生成解决方案。

e032652f6d84a3f6e17912b30d47b048.png

最后,还可能遇到两中情况:

1.如果提示缺少dll,可以把LibTorch的lib文件夹加入环境变量,

可以把lib文件夹的dll全拷到cpp目录下。

2.无法定位程序输入点到xxx.dll,

解决办法: 则到pytorchlib下面找到放到C:WindowsSystem32和C:WindowsSysWOW64下即可。

4.输出

已经配置好啦,希望大家都配置成功。

9197b1c8c5f2574866322fe4be142ef9.png

好的教程链接,本文基于以下教程更新:

https://blog.csdn.net/gulingfengze/article/details/92013360

https://zhuanlan.zhihu.com/p/68901339

https://zhuanlan.zhihu.com/p/55292836

问题解决链接:

https://www.cnblogs.com/yeshengCqupt/p/10448476.html

https://www.lizenghai.com/archives/29637.html

https://blog.csdn.net/qq_33507306/article/details/104427134

https://www.cnblogs.com/xym4869/p/11255598.html

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

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

相关文章

jdbc mysql api_JDBC Api详解

一.什么是JDBCJDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API&#xff0c;可以为多种关系数据库提供统一访问&#xff0c;它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准&#xff0c;据此可以构建更高级的工具和接口&#xff0…

mysql业务数据库回退_理解MySQL数据库事务-隔离性

Transaction事务是指一个逻辑单元&#xff0c;执行一系列操作的SQL语句。事务中一组的SQL语句&#xff0c;要么全部执行&#xff0c;要么全部回退。在Oracle数据库中有个名字&#xff0c;叫做transaction ID在关系型数据库中&#xff0c;事务必须ACID的特性。原子性&#xff0c…

java socket 阻塞模式_Java中Socket Read阻塞问题

本人来说并不熟悉JAVA语言&#xff0c;只是近期在分析某个简单的java agent程序时&#xff0c;根据对应的代码写了一个对接的程序&#xff0c;两者之间是典型的C/S socket编程。客户端在向服务端发送相应的指令后&#xff0c;服务端(装agent的主机)执行后会返回执行的数据给客户…

java 窗体 源码_Java制作MDI窗体源代码

由于实际需要做一个MDI窗体&#xff0c;百度里面找到一个不错的源代码给大家分享一下。import javax.swing.*;import java.awt.event.*;import java.awt.*;class JInternalFrame1 extends JFrame implements ActionListener{JDesktopPane desktopPane;int count 1;public JInt…

idl文件生成java_IDL和生成代码分析

IDL:接口描述语言这里使用thrift-0.8.0-xsb这个版本来介绍IDL的定义以及简单实例分析。1. namespace 定义包名2.struct 结构体&#xff0c;定义服务接口的参数和返回值用到的类结构。基本类型不需要使用struct.3.service 定义接口&#xff1a;demo.thrift1 namespace java com.…

java从控制台读取数据_Java不同版本从控制台读取数据方法及优缺点分析

从JDK 5.0版本开始&#xff0c;能从控制台中输入数据的方法每增加一个版本号&#xff0c;就有一种新增的方法&#xff0c;这也增加了选择的种类&#xff0c;可以依据不同的要求来进行选择。下面和绿茶小编一起来了解一下各个版本从控制台中读取数据的方法以及各自的优缺点。1、…

python的pygame库使用方法_[宜配屋]听图阁

使用python pygame库实现一个双人弹球小游戏&#xff0c;两人分别控制一个左右移动的挡板用来拦截小球&#xff0c;小球会在两板间不停弹跳&#xff0c;拦截失败的一方输掉游戏&#xff0c;规则类似于简化版的乒乓球。因为是第一次用pygame写python小游戏并且只用了两三个小时&…

C++ 三种继承方式

C继承的一般语法为&#xff1a; class 派生类名:&#xff3b;继承方式&#xff3d; 基类名{派生类新增加的成员 };继承方式限定了基类成员在派生类中的访问权限&#xff0c;包括 public&#xff08;公有的&#xff09;、private&#xff08;私有的&#xff09;和 protected&am…

java项目 异常如何解决_Java项目中常见的异常处理

发生异常的情况有很多&#xff0c;其中包括以下几大类&#xff1a;1. 空指针异常&#xff1b;2. 用户输入异常&#xff1b;3. 多层异常捕获&#xff1b;想要知道Java是如何处理异常的&#xff0c;就需要掌握以下这三种异常的处理&#xff1a;1.检查性异常&#xff1a;最具代表的…

java i/o 流详解_java I/O流详解

概况I/O流主要分为二大类别&#xff1a;字符流和字节流。字节流(基本流)1、字节输入流 类名&#xff1a;FileInputStream 特点&#xff1a;读(对文件进行读取操作) 父类&#xff1a;InputStream2、字节输出流 类名&#xff1a;FileOutputStream 特点&#xff1a;写…

C++ 向上转型

在 C 中经常会发生数据类型的转换&#xff0c;例如将 int 类型的数据赋值给 float 类型的变量时&#xff0c;编译器会先把 int 类型的数据转换为 float 类型再赋值&#xff1b;反过来&#xff0c;float 类型的数据在经过类型转换后也可以赋值给 int 类型的变量。 数据类型转换…

C++ 获取类型信息

typeid 运算符用来获取一个表达式的类型信息。类型信息对于编程语言非常重要&#xff0c;它描述了数据的各种属性&#xff1a; 对于基本类型&#xff08;int、float 等C内置类型&#xff09;的数据&#xff0c;类型信息所包含的内容比较简单&#xff0c;主要是指数据的类型。对…

C 数字排列组合

编辑程序让任意四个数字排列组合并且每一个排列组合的数字都不相同。 结果展示 完整代码 #include <stdio.h> //定义头文件 int main() {int i,j,k;printf("\n");for(i1;i<5;i){ //三重循环 for(j1;j<5;j){for(k1;k<5;k){ //确保 i j k 位置不同 i…

java 汇总_java基础汇总

1.关于Http和Hibernatet里面Session的区别HttpSessionHttpSession&#xff1a;是一个抽象接口&#xff0c;J2EE的Web程序在运行的时候&#xff0c;会给每一个新的访问者建立一个HttpSession&#xff0c;这个Session是用户身份的唯一标示&#xff0c;WEB 会话跟踪用的。【注:是容…

C 天数的计算

根据程序提示输入某年某月某日&#xff0c;判断这一天是这一年的第几天&#xff0c;并进行输出显示。 效果演示 完整代码 #include <stdio.h> int main() {int day,month,year,sum,leap;printf("\n请输入年、月、日&#xff0c;格式为&#xff1a;年,月,日&#…

java+filter加密_Javaweb之Filter案例练习-自动登录问题和MD5加密

自动登录问题和MD5加密前面已经完成了Filter的自动登录&#xff0c;但是有问题&#xff0c;我们在web.xml中Filter的url-mapping中配置的规则是/*, 也就是这个网站的所有请求都拦截。这肯定不合适。我们本来访问/login.jsp&#xff0c;本来就是去登录&#xff0c;结果也进行了拦…

C 从小到大排序

将数字按从小到大的的顺序进行排序输出&#xff0c;根据提示输入相应的数字个数&#xff0c;每输入一个数字要进行换行然后输入下一个数字&#xff0c;当三个数字完全输入之后点击回车&#xff0c;程序会根据从大到小的顺序进行数字的排序输出。 效果演示 完整代码 #include…

java class文件常量池_JAVA程序员谈谈class文件结构中的常量池-class文件

常量的类型有12种CONSTANT_Utf8_info1字面量UTF-8编码的字符串CONSTANT_Integer_info3字面量整型字面量CONSTANT_Float_info4字面量浮点型字面量CONSTANT_Long_info5字面量长整型字面量CONSTANT_Double_info6字面量双精度浮点型字面量CONSTANT_Class_info7符号引用类或接口的符…

C 输出图案

在C语言中使用 * 号输出各种图案。 用 * 输出字母C 效果 完整代码 #include <stdio.h>int main() {printf("用 * 号输出字母 C\n");printf(" ****\n");printf("*\n");printf("*\n");printf(" ****\n");} 用 * 输出…

C 多数排序

使用C语言编写程序对多个数字进行排序输出的操作。 根据提示输入十个数字并按照从小到大的顺序进行输出显示。 效果 完整代码 #include<stdio.h> #define N 10 int main() {int i,j,a[N],temp;printf("请输入 10 个数字&#xff1a;\n");for(i0;i<N;i)s…