![136eb2d43b45622a129dae4be72959dc.png](https://i-blog.csdnimg.cn/blog_migrate/62a4c1d1c95e4c64d73fc2b45d3b9160.jpeg)
因为项目对实时性的要求,尝试一波c++直接调用libpytorch。实现的同时,整理了网上的相关资料,希望对效率追求的同学提供一份帮助。
0.下载准备
下载安装VS2017 和 cmake (3.0版本以上)
记得把bin目录添加到环境变量path中。这里解释一下,目前还不能直接使用VS直接配置成功libpytorch(如果读者成功了可以@我,这篇文档也就完成了使命就删了),而是先借助cmake先编译,达到曲线救国。
![b4d2aa6251d74a1a86b28e8381e73e04.png](https://i-blog.csdnimg.cn/blog_migrate/ea773954c6a7d1f058beafccc16702fe.png)
下载安装opencv
可以参考博客:https://blog.csdn.net/qq_41175905/article/details/80560429,该博客中写的很详细。推荐opencv4.1.0
下载libtorch
下载地址:https://pytorch.org/get-started/locally/,这个根据自己情况选择下载,因为我自己的是cuda10,并且我选择使用release版本,所以我的选择如下:
![7336803986632616924d08191d3d914a.png](https://i-blog.csdnimg.cn/blog_migrate/90e63823b042d7f4f89a71560af7681f.jpeg)
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
这是目前比较新的代码,旧的代码因为是测试版会出现语法错误,见 https://blog.csdn.net/qq_33507306/article/details/104427134
CMakeLists.txt
cmake_minimum_required(VERSION
其中,如果没有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目录)。
![1d5bef4828f47d5debaa8df4ca7b4a0a.png](https://i-blog.csdnimg.cn/blog_migrate/7122cfc28cb50d90c9d125c5d211235a.png)
选择generator,选择64位,因为CUDA不支持32位运算。
![0066a1d06431eef608cd479fa341c3f5.png](https://i-blog.csdnimg.cn/blog_migrate/ac7e6d45fbbf49526fda484478fd25cb.png)
点击Configure,没问题的话再点击Configure,然后再点击Generate就成功了。
如果遇到以下错误:
![7996a494a9b146e84fdf2a89f3c5095e.png](https://i-blog.csdnimg.cn/blog_migrate/489cadb671e382d174ec6fff00abf744.jpeg)
则我们根据错误,遇到下载缺少的资源,配在红色区域。(红色区域并不是都是错误,引起错误的是报错信息里日志里提示的缺少资源的NotFound)。
解决办法: 上图所示问题需要我们下载对应版本的CUDNN,并将资源配置(include、lib等)在对应的变量里。如下:
![09a5f9fad8f0efa83e9afb6d514282be.png](https://i-blog.csdnimg.cn/blog_migrate/5fb712666f44687301985d2ee6e48d4d.jpeg)
最后,如果日志出现warning,虽然也是红色警报,但是也可以继续Generate。进入下一步。
3. VS2017启动
然后打开build文件夹中的vcxporj文件,设置项目为启动项目,并更改为release的x64模式,生成解决方案。
![f756bafd05da136d1a0d7463d228b281.png](https://i-blog.csdnimg.cn/blog_migrate/8dd53e4f1abd34a7d79d1faa6b2df0fc.png)
最后,还可能遇到两中情况:
1.如果提示缺少dll,可以把LibTorch的lib文件夹加入环境变量,
可以把lib文件夹的dll全拷到cpp目录下。
2.无法定位程序输入点到xxx.dll,
解决办法: 则到pytorchlib下面找到放到C:WindowsSystem32和C:WindowsSysWOW64下即可。
4.输出
已经配置好啦,希望大家都配置成功。
![5dc5e48cb25ded5c5fd66ab1de0f9411.png](https://i-blog.csdnimg.cn/blog_migrate/5ebdff5c5f74c08e42caf6ef4be84378.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