点击小眼睛开启蜘蛛网特效

Pytorch的C++端(libtorch)在Windows中的使用

《Pytorch的C++端(libtorch)在Windows中的使用》

前言

填一个之前的坑啊,本篇的姊妹篇——利用Pytorch的C++前端(libtorch)读取预训练权重并进行预测 这篇文章中已经说明了如何在Ubuntu系统中使用libtorch做预测,当初也有朋友问我如何在Windows之下尝试使用libtorch,当时因为时间关系没有去看,后来就给忘了…现在有时间了当然要尝试一下~

当然先说结论哈,其实在Windows环境下的配置也是很简单的,因为官方已经替我们编译好的Windows版本的libtorch,这下就节省了我们编译Pytorch的时间,直接可以拿来使用,只要稍微配置一下就可以在Windows跑起libtorch了,没有想象中那么多的步骤,大可放心。

《Pytorch的C++端(libtorch)在Windows中的使用》

下文中使用的代码和之前在Ubuntu中使用的完全相同,我们不需要进行修改。

同样,首先,我们在官网下载适合于Windows的libtorch,因为稳定版出来了,所以我们可以直接拿来使用。有CPU版本的和GPU版本的,这里我都进行了测试,都是可以的直接使用的,大家按照自己的需求进行下载即可。

个人环境:

  • win10
  • cuda9.0 + cudnn7.0.5
  • 1060-6G

《Pytorch的C++端(libtorch)在Windows中的使用》

正式开始

与之前实现的任务相同,我这里将libtorch和OpenCV一起编译,使用OpenCV的读取摄像头然后识别当前的手势,模型是我自己训练好的,对于大家来说可以自己随便挑一个模型来使用。

下图为在Visual Studio中使用libtorch和OpenCV来实现判断剪刀石头布手势,运行的平台是cpu端。当然GPU端也是可以运行的,之后也会进行详解。

《Pytorch的C++端(libtorch)在Windows中的使用》

不得不说下,Pytorch的部署端真的很好用啊,虽然说目前仅仅适合一些小型的任务,但是潜力还是很大地,libtorch端配套Pytorch真的是太方便了!

获取libtorch

之前在Ubuntu跑libtorch的时候,因为OpenCV的一些原因,如果需要libtorch和OpenCV一起编译的话,最好自己编译一边libtorch从而保证libtorch和OpenCV混合编译时不会发生冲突。但是在win10端,OpenCV可以直接从官网下载已经编译好的,既然OpenCV从官方直接下载了,那么libtorch当然也从官方直接下载了。

正如前言所说,打开官网点击下载即可,CPU和GPU按照自己来进行选择。

测试GPU端的libtorch

在Windows端,因为我们从官方下载的OpenCV预编译版本是利用MSVS编译的,也就是我们常说的Visual Studio编译工具,所以我们接下来使用的编译器就是Visual Studio自带的编译器,为此我们需要安装:

  • Visual Studio 2015或者2017(两个都测试过,都是可以的!),之后简称VS
  • windows端的CMake

《Pytorch的C++端(libtorch)在Windows中的使用》

大概流程就是我们使用cmake构建好libtorch工程,然后使用VS打开根据cmake配置好的信息进行编译,所以在进行之后的步骤前一定要提前安装好上述的两样东西。

好了,那么首先我们要配置CmakeList:

cmake_minimum_required(VERSION 3.12 FATAL_ERROR)
project(simnet)

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(simnet main.cpp)
target_link_libraries(simnet ${TORCH_LIBRARIES} ${OpenCV_LIBS})
set_property(TARGET simnet PROPERTY CXX_STANDARD 11)

和之前的没有什么区别,主要我们需要找到libtorch和opencv库。

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

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

  • example
    — build
    — main.cpp
    — CMakeLists.txt

好了,我们打开Window的命令行界面,进入该目录,再进入build文件夹,然后我们设置我们的Cmake参数:

-DCMAKE_PREFIX_PATH=path\to\opencv\build\x64\vc14\lib;path\to\libtorch -DCMAKE_BUILD_TYPE=Release -G"Visual Studio 14 Win64" 

这里需要注意下OpenCV的路径,将上面的位置改成自己的安装位置修改即可,我们需要同时告诉cmake编译工具OpenCV和libtorch的位置信息,然后这里我选择-G"Visual Studio 14 Win64"执行编译器是VS2015的编译工具,如果是2017的话就是-G"Visual Studio 15 Win64这里根据自己的需要进行调整(如果使用VS2017别忘了修改OpenCV中的vc14为vc15)。

编译类型(-DCMAKE_BUILD_TYPE=Release)也要加上,要不然会报错:

Unknown cmake build type:
Call Stack (most recent call first):
  D:/libtorch-gpu/share/cmake/Caffe2/Caffe2Config.cmake:88 (include)
  D:/libtorch-gpu/share/cmake/Torch/TorchConfig.cmake:39 (find_package)
  CMakeLists.txt:4 (find_package)

-- Configuring incomplete, errors occurred!
See also "E:/simnet-gpu/build/CMakeFiles/CMakeOutput.log".
See also "E:/simnet-gpu/build/CMakeFiles/CMakeError.log".

好了,上述具体步骤如下:

C:\Users\dell>D:
D:\>cd example
D:\example>cd build

D:\example\build>cmake -DCMAKE_PREFIX_PATH=D:\opencv4\opencv\build\x64\vc15\lib;D:\libtorch-gpu -DCMAKE_BUILD_TYPE=Release -G "Visual Studio 14 Win64" ..

如果顺利的话应该是Cmake会输出:

-- The C compiler identification is MSVC 19.0.24215.1
-- The CXX compiler identification is MSVC 19.0.24215.1
-- Check for working C compiler: C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/bin/x86_amd64/cl.exe
-- Check for working C compiler: C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/bin/x86_amd64/cl.exe -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/bin/x86_amd64/cl.exe
-- Check for working CXX compiler: C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/bin/x86_amd64/cl.exe -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Looking for pthread.h
-- Looking for pthread.h - not found
-- Found Threads: TRUE
-- Found CUDA: C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v9.0 (found suitable version "9.0", minimum required is "7.0")
-- Caffe2: CUDA detected: 9.0
-- Caffe2: CUDA nvcc is: C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v9.0/bin/nvcc.exe
-- Caffe2: CUDA toolkit directory: C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v9.0
-- Caffe2: Header version is: 9.0
-- Found cuDNN: v7.0.4  (include: C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v9.0/include, library: C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v9.0/lib/x64/cudnn.lib)
-- Autodetected CUDA architecture(s): 6.1
-- Added CUDA NVCC flags for: -gencode;arch=compute_61,code=sm_61
-- Found torch: D:/libtorch-gpu/lib/torch.lib
-- Pytorch status:
--     libraries: torch;caffe2_library;caffe2_gpu_library;C:/Program Files/NVIDIA Corporation/NvToolsExt/lib/x64/nvToolsExt64_1.lib;C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v9.0/lib/x64/cudart_static.lib
-- Found OpenCV: D:/opencv4/opencv/build (found version "4.0.0")
-- OpenCV library status:
--     version: 4.0.0
--     libraries: opencv_calib3d;opencv_core;opencv_dnn;opencv_features2d;opencv_flann;opencv_gapi;opencv_highgui;opencv_imgcodecs;opencv_imgproc;opencv_ml;opencv_objdetect;opencv_photo;opencv_stitching;opencv_video;opencv_videoio;opencv_world
--     include path: D:/opencv4/opencv/build/include
-- Configuring done
-- Generating done
-- Build files have been written to: E:/simnet-gpu/build

这时Cmake会在build文件夹中生成一些列项目信息,可以使用VS打开(打开下面箭头标注的文件)。

如果你的电脑装有两个版本以上的Visual Studio,那么这里要注意如果我们之前使用VS15编译的话那么就要使用VS15去打开这个文件,也就是之前编译使用的工具和之后打开工程的版本应该一致

《Pytorch的C++端(libtorch)在Windows中的使用》

打开后大概是这样子的:

《Pytorch的C++端(libtorch)在Windows中的使用》

这里simnet是我的项目名字,我们将该项目设为启动项(可以看到simnet字体比较粗)从而方便调试。

上述的代码在之前的那篇文章中已经提到过,这里简单展示下main函数部分,在这段代码中,我们利用OpenCV读取摄像头数据转化为Tensor,然后投入模型中进行判断:

...

cv::VideoCapture stream(0);
cv::namedWindow("Gesture Detect", cv::WINDOW_AUTOSIZE);

// 下面的 new-mobilenetv2-128_S-win.pt 是我在Window上利用Pytorch导出的trace后的模型
string model_path = "new-mobilenetv2-128_S-win.pt";
std::shared_ptr<torch::jit::script::Module> module = torch::jit::load(model_path);

...

关于模型

这里还有一点需要注意,使用libtorch导入的模型必须是和libtorch相匹配版本的Pytorch导出的模型,也就是说如果我拿我之前在linux端导出的模型(之前我在linux端导出的模型使用的Pytorch版本不是稳定版),在这里使用window下的libtorch读取是会发生错误的,所以我们需要利用正式版1.0版本的Pytorch去导出一个模型。

这里我直接在window下安装稳定版的Pytorch-1.0(官方已经有稳定版的win版的Pytorch了),然后利用以下代码导出traced后的模型。

# 读入之前训练好的.pth模型
state = torch.load('model/new-mobilenetv2-128_S.pth', map_location=device)
model.load_state_dict(state['model'], strict=True)

# example = torch.rand(1, 3, 128, 128).cuda()
# model.to(device)

# torch_out = torch.onnx.export(model,
#                               example,
#                               "new-mobilenetv2-128_S.onnx",
#                               verbose=True,
#                               export_params=True
#                               )

example = torch.ones(1, 3, 128, 128)

model = model.eval()

traced_script_module = torch.jit.trace(model, example)
output = traced_script_module(example)
print(traced_script_module)
# 导出trace后的模型
traced_script_module.save('new-mobilenetv2-128_S-win.pt')

开始编译

然后,我们直接点击VS中的调试器进行调试即可,这里我选择了Release(与之前cmake一致)进行编译。

《Pytorch的C++端(libtorch)在Windows中的使用》

点击后开始编译,可能会输出一堆警告,这里不用理会:

《Pytorch的C++端(libtorch)在Windows中的使用》

如果顺利的话,直接开始运行:

《Pytorch的C++端(libtorch)在Windows中的使用》

在VS中可以运行后,我们可以找到其单独的.exe文件,然后将必要的.dll文件(CPU和GPU的all不同)和模型与simnet.exe放到一个文件夹中,这时,我们点击simnet.exe就可以直接运行了:

《Pytorch的C++端(libtorch)在Windows中的使用》

后记

libtorch在WIndow端的使用也不是很复杂,我们根据运行环境不同下载不同版本的libtorch(CPU和GPU),然后使用cmake配置后,利用VS进行编译就可以直接使用,其中遇到的问题大部分时环境的问题,我们的代码并不需要修改,是可以跨平台的,我也在VS2015和VS2017中进行了测试,都是可以的。

可能会遇到的问题

我在其中遇到了两个小问题,稍微查下就解决了,现在贴出来,如果和我遇到同样的就不用去google了…

在Window下查看指定camke编译器的命令

在window中指定cmake的编译器构架:

cmake -G
CMake Error: No generator specified for -G

Generators
  Visual Studio 15 2017 [arch] = Generates Visual Studio 2017 project files.
                                 Optional [arch] can be "Win64" or "ARM".
  Visual Studio 14 2015 [arch] = Generates Visual Studio 2015 project files.
                                 Optional [arch] can be "Win64" or "ARM".
  Visual Studio 12 2013 [arch] = Generates Visual Studio 2013 project files.
                                 Optional [arch] can be "Win64" or "ARM".
  Visual Studio 11 2012 [arch] = Generates Visual Studio 2012 project files.
                                 Optional [arch] can be "Win64" or "ARM".
  Visual Studio 10 2010 [arch] = Generates Visual Studio 2010 project files.
                                 Optional [arch] can be "Win64" or "IA64".
  Visual Studio 9 2008 [arch]  = Generates Visual Studio 2008 project files.
                                 Optional [arch] can be "Win64" or "IA64".
  Borland Makefiles            = Generates Borland makefiles.
  NMake Makefiles              = Generates NMake makefiles.
  NMake Makefiles JOM          = Generates JOM makefiles.
  Green Hills MULTI            = Generates Green Hills MULTI files
                                 (experimental, work-in-progress).
  MSYS Makefiles               = Generates MSYS makefiles.
  MinGW Makefiles              = Generates a make file for use with
                                 mingw32-make.
  Unix Makefiles               = Generates standard UNIX makefiles.
  Ninja                        = Generates build.ninja files.
  Watcom WMake                 = Generates Watcom WMake makefiles.
  CodeBlocks - MinGW Makefiles = Generates CodeBlocks project files.
  CodeBlocks - NMake Makefiles = Generates CodeBlocks project files.
  CodeBlocks - NMake Makefiles JOM
                               = Generates CodeBlocks project files.
  CodeBlocks - Ninja           = Generates CodeBlocks project files.
  CodeBlocks - Unix Makefiles  = Generates CodeBlocks project files.
  CodeLite - MinGW Makefiles   = Generates CodeLite project files.
  CodeLite - NMake Makefiles   = Generates CodeLite project files.
  CodeLite - Ninja             = Generates CodeLite project files.
  CodeLite - Unix Makefiles    = Generates CodeLite project files.
  Sublime Text 2 - MinGW Makefiles
                               = Generates Sublime Text 2 project files.
  Sublime Text 2 - NMake Makefiles
                               = Generates Sublime Text 2 project files.
  Sublime Text 2 - Ninja       = Generates Sublime Text 2 project files.
  Sublime Text 2 - Unix Makefiles
                               = Generates Sublime Text 2 project files.
  Kate - MinGW Makefiles       = Generates Kate project files.
  Kate - NMake Makefiles       = Generates Kate project files.
  Kate - Ninja                 = Generates Kate project files.
  Kate - Unix Makefiles        = Generates Kate project files.
  Eclipse CDT4 - NMake Makefiles
                               = Generates Eclipse CDT 4.0 project files.
  Eclipse CDT4 - MinGW Makefiles
                               = Generates Eclipse CDT 4.0 project files.
  Eclipse CDT4 - Ninja         = Generates Eclipse CDT 4.0 project files.
  Eclipse CDT4 - Unix Makefiles= Generates Eclipse CDT 4.0 project files.

缺失nvToolsExt64_1.dll

如果在使用GPU版本的libtorch的时候遇到缺少nvToolsExt64_1.dll,直接从网上下一个放到C:\Windows\System32目录下即可(win10)。

附带的资源文件:

下方资源文件为上文所述的 new-mobilenetv2-128_S-win.pt 

通过tortch.jit.trace导出,以便大家快速使用,在CPU端和GPU端都进行了测试可以正常工作。

链接:https://pan.baidu.com/s/1bSwzH7YNZnRk3bLq3LMF8Q
提取码:2jjd

  点赞
本篇文章采用 署名-非商业性使用-禁止演绎 4.0 国际 进行许可
转载请务必注明来源: https://oldpan.me/archives/pytorch-windows-libtorch

   关注Oldpan博客微信公众号,你最需要的及时推送给你。


  1. 白闹说道:

    博主你好,我在trace yolov3 模型的时候出现了一些错误, TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. 和其他的一些信息, 我想问是不是LibTorch对于比较复杂的模型现在是支持的不完备,比如他自带的resnet50或者mobilev2 这种trace就可以成功的生成pt模型。谢谢~

    1. Oldpan说道:

      对呀,对于动态模型中一些不确定的变量(Tensor)或者if条件判断语句,trace如果不支持就会报错的,和onnx一样,目前不支持的操作通常都是比较复杂或者不常用的op,不过之后肯定会慢慢添加

      1. 白闹说道:

        好的 谢谢博主。

  2. richard说道:

    博主,我在std::shared_ptr module = torch::jit::load(argv[1]);这一句出现了问题,说无法从“torch::jit::script::Module”转换为“std::shared_ptr”,请问这个问题要怎么解决,谢谢

    1. Oldpan说道:

      这个是版本的问题,在1.2及以上script::Module是引用而不是指针了,把shared_ptr去了就可以。

      1. richard说道:

        谢谢博主,问题已经解决。还想请问下这些信息,资料,哪里可以看到啊,一直百度找解决方案感觉太难找到了

        1. Oldpan说道:

          资料很少啊,需要自己探索,有问题在google上直接搜,对应github和Pytorch的官方论坛。

          1. richard说道:

            好的,谢谢博主

  3. 宏沉一笑说道:

    楼主,能分享一下window 的libtorch 1.0.0的包么? 现在只能下载1.2的

  4. AI小白说道:

    博主您好,我想问一下 复杂模型如maskrcnn如何将pth模型转化为pt模型啊

    1. Oldpan说道:

      首先得Pytorch官方支持导出,支持该模型的所有算子,我记得MaskRcnn一直是复杂度特别高的模型,很多推断库都不支持,如果想要使用估计需要自个儿去写了。

      1. AI小白说道:

        maskrcnn就是pytorch官方版的,就是不知道在模型导出的时候model如何定义

        1. Oldpan说道:

          导出.pt和导出.onnx类似呀,只要定义了模型结构,model = MaskRcnn() 后参照官方的教程或者这里文章中的教程导出即可

          1. AI小白说道:

            我找到定义maskrcnn网络结构的.py文件了,感谢楼主

  5. hf说道:

    请问如何导出gpu的模型 我通过文档导出的模型 在gpu的libtorch都加载不成功

    1. hf说道:

      请博主发布一下完整的cmakelist 里面应该有found cuda 我该怎么设置cuda呢 我用torch::cuda::is_available()返回的是0 我用的是libtorch的gpu版本

      1. hf说道:

        找到问题了 竟然用的不是gpu的包 被自己蠢哭了 :exclaim:

  6. 我回玩影魔说道:

    #if __has_cpp_attribute(clang::warn_unused_result)
    严重性 代码 说明 项目 文件 行 禁止显示状态错误(活动) E2512 功能测试宏的参数必须是简单标符
    using IntList C10_DEPRECATED_USING = ArrayRef;
    严重性 代码 说明 项目 文件 行 禁止显示状态错误(活动) E1866 特性不适用于任何实体
    楼主遇到这两个报错吗

    1. huang说道:

      :razz: 这个问题你解决了没?我是使用vs直接配置工程,没用cmake,也遇到这个问题,不知道该怎么解决。

  7. 独钓寒江雪说道:

    up主,怎么百度云的模型过期了呀~

  8. 小刘说道:

    您好,我用您的方法去加载灰度图片,发现python端和c++端的模型输出不一样(二者差别比较大),但是标签一致。但同样输入torch::ones(1,1,224,224)张量,发现c++端和python端的输出是一致的。现在我在c++加载图片的方式为cv::imread("path\\to\\image.png",0),然后处理跟您的一致;在python端加载图片的方式为PIL.Image加载后用torchvision.transform.ToTensor()处理。请问博主有碰过这个问题吗?这个问题有处理方案吗?

    1. Oldpan说道:

      你只要保证从OpenCV中读入的图像正确转化为Tensor就好,需要注意维度的变化以及数据类型的变化

      1. 小刘说道:

        您好。这个问题先不管了。
        现在我这边用Libtorch推断比Pytorch要慢了8-10倍。这边配置是2080Ti+Cuda10.1+cudnn7.5.1+vs2017,用的是ResNet18......Libtorch 推断一个(1,1,224,224)用了1.9s,pytorch只需要0.21s。您这边目前推断速度如何?

        1. Oldpan说道:

          这么慢,和python端使用的后端一致吗?用C++的速度比python是肯定快的,我这边也是,不快的原因可能是没有编译完全,一些库没有编译进去。

        2. Yinan Zhang说道:

          您好 我也遇到了这个问题 想问一下您是怎么解决的

  9. QQ说道:

    LINK : fatal error LNK1181: 无法打开输入文件“C:\Program Files\NVIDIA Corporation\NvToolsExt\lib\x64\nvToolsExt64_1.lib”
    您好,我已经添加nvToolsExt64_1.dll为什么还是没有编译成果,需要加什么吗?

    1. Oldpan说道:

      是不是文件没有放对位置?

  10. 啊啊说道:

    1>E:\BaiduNetdiskDownload\cpp-pytorch\main.cpp(1): fatal error C1083: 无法打开包括文件: “opencv2/opencv.hpp”: No such file or directory
    为什么include的路径都对,里面也有这个文件,怎么就无法打开了,求帮助

  11. junjie说道:

    vs2015运行程序时出bug:
    c10::Error,位于内存位置 0x0000009698F7FC40 处

    1. 晚晚晚说道:

      c10:Error问题我也遇到了,我是纯cpu,请问你怎么解决的?

    2. chalson说道:

      请问您怎么解决的,我也是这个问题

  12. ObrienRazor说道:

    vs 2017 里面 Release x64 模式生成的时候,跳过了 ALL_BUILD,还报错 “无法启动程序 '.....\Release\ALL_BUILD' 系统找不到指定的文件”。之前的步骤都是正常的,

    请大佬指点 :exclaim:

    1. Oldpan说道:

      我记得不用ALL_BUILD,在编译选项中选单个文件进行编译就行

      1. Obrienrazor说道:

        只编译一个源文件的话,双击运行生成的 exe 文件的时候会报错,找不到 torch.dll, caffe2.dll, c10.dll

        1. Oldpan说道:

          找不到没关系,缺什么你就将这些dll文件移动至你项目文件夹正确位置就可以

  13. ItalianSC说道:

    你好,我用VC2017的"New Project"功能直接生成一"Windows Console App"工程,然后将libtorch的include/library目录都加入工程,然后我写了以下代码来测试LibTorch:

    #include "pch.h"
    #include
    #include
    #include
    int main()
    {
    std::shared_ptr model = torch::jit::load("new-mobilenetv2-128_S-win-cpu.pt");
    std::cout << "Hello World!\n";
    return 0;
    }

    但是编译器编译失败,报告以下错误:
    Severity Code Description Project File Line Suppression State
    Error C2872 'std': ambiguous symbol TestLibTorch1 g:\vc15\testlibtorch\libtorch\include\torch\csrc\api\include\torch\ordered_dict.h 461
    Error C2872 'std': ambiguous symbol TestLibTorch1 g:\vc15\testlibtorch\libtorch\include\torch\csrc\jit\custom_operator.h 15
    Error C2872 'std': ambiguous symbol TestLibTorch1 g:\vc15\testlibtorch\libtorch\include\torch\csrc\jit\custom_operator.h 21
    Error C2872 'std': ambiguous symbol TestLibTorch1 g:\vc15\testlibtorch\libtorch\include\torch\csrc\jit\custom_operator.h 28
    Error C2872 'std': ambiguous symbol TestLibTorch1 g:\vc15\testlibtorch\libtorch\include\torch\csrc\jit\custom_operator.h 35
    Error C2872 'std': ambiguous symbol TestLibTorch1 g:\vc15\testlibtorch\libtorch\include\torch\csrc\jit\custom_operator.h 42
    Error C2872 'std': ambiguous symbol TestLibTorch1 g:\vc15\testlibtorch\libtorch\include\torch\csrc\api\include\torch\ordered_dict.h 162
    Error C2872 'std': ambiguous symbol TestLibTorch1 g:\vc15\testlibtorch\libtorch\include\torch\csrc\api\include\torch\ordered_dict.h 166
    Error C2872 'std': ambiguous symbol TestLibTorch1 g:\vc15\testlibtorch\libtorch\include\torch\csrc\api\include\torch\ordered_dict.h 170
    Error C2872 'std': ambiguous symbol TestLibTorch1 g:\vc15\testlibtorch\libtorch\include\torch\csrc\api\include\torch\ordered_dict.h 174
    Error C2872 'std': ambiguous symbol TestLibTorch1 g:\vc15\testlibtorch\libtorch\include\torch\csrc\api\include\torch\ordered_dict.h 177

    博主麻烦你帮我看下这个问题如何解决? 难道使用LibTorch的C++工程必须从cmake建立?

    1. ItalianSC说道:

      我是用的LibTorch是直接预编译好的CUDA-10.0的版本

  14. maomao说道:

    我在用jit生成模型的时候,弹出警告:Tracemodules dont support parameter sharing between modules,在github有人说TorchScript cannot handle nn.Module parts in the forward function.请问你遇到过这种问题吗?

    1. Oldpan说道:

      没遇过啊,看提示的内容应该是当前的版本还不支持你要的功能,尝试尝试最新的?

      1. maomao说道:

        那博主有没有用第二种方法,继承torch.jit.ScriptModule来生成模型呢,我试了几次均不成功 https://pytorch.org/docs/master/jit.html

        1. Oldpan说道:

          一般模型是可以的,多输入多输出模型的话,有些op还是有bug的,一些功能不支持。

  15. 说道:

    楼主,你好,在导出pt模型时报错:NameError("name 'device' is not defined",),请问怎么解决?
    我的内容:state = torch.load('model/optimizer_59.pth', map_location=device)
    model.load_state_dict(state['model'], strict=True)

    1. Oldpan说道:

      device是你要运行的平台,如果你使用GPU的话,需要定义一个:device = torch.device("cuda")

      1. 说道:

        嗯,谢谢楼主,这个解决了,出现了另一个问题:NameError("name 'model' is not defined",)
        还没查到解决方案,请教楼主大神
        问题出现在这句:model.load_state_dict(state['model'], strict=True)

        1. Oldpan说道:

          你如果使用自己的模型,那就把state['model']替换为state就行,那是因为我之前训练的模型和参数保存在不同的dic中

      2. 说道:

        楼主,按你的方法把state['model']替换为state还是不行,你在“读入之前训练好的.pth模型”之前有没有定义model啊?还有除了import torch外还有没有import其他的啊?

        1. Oldpan说道:

          嗯..肯定要定义的,另外不需要额外import什么,这是比较基本的操作,可以看这篇 https://oldpan.me/archives/pytorch-load-static-data

          1. 说道:

            好的,谢谢

          2. 说道:

            楼主大神,再请教一下,我看的例子都是用torchvision自带的models定义的model,比如model = torchvision.models.resnet18(pretrained=True),该如何定义自己的网络训练的model来加载.pth模型啊(ps:本人小白,不懂 :cry:

        2. Oldpan说道:

          这个你最好看看Pytorch的官方文档吧,一两句说不清的

  16. maomao说道:

    博主,导出pt模型那里能详细一点吗,急用,谢谢

    1. Oldpan说道:

      导出模型windows其实和linux下的一样,看官方的导出步骤即可,文中都有提到的~

    2. maomao说道:

      就是我用的模型不是torch自带的,model.load_state_dict中的model应该是我自己的模型结构吗?

      1. Oldpan说道:

        嗯嗯,对的,是你自己训练的模型

      2. 说道:

        你好,请问你导出自己的模型了吗?那里的model是如何定义的啊

        1. Oldpan说道:

          定义model的函数文中没有写,你自己设定一个就行或者使用torchvision中自带的也可以

          1. 说道:

            但是我得需要用我自己写的网络来定义,该如何设定啊,我是这样写的:model=PointNet_Plus(opt),现在一直报错:TypeError("forward() missing 1 required positional argument: 'y'",),请问你遇到过吗?你是怎么设定的啊?希望告知,谢谢

        2. Oldpan说道:

          缺少参数了,你有个函数的参数没有填完整

          1. 说道:

            谢谢楼主的帮助,traced_script_module = torch.jit.trace(model.cuda(), (example1,example2))这样定义完美解决问题。在问楼主一个问题,在c++里如何将“深度图”转化为Tensor,随后导入模型进行预测呢?楼主这篇文章里做的是RGB图。

        3. Oldpan说道:

          深度图?多了一个深度维度吗?类似于RGB图,首先看数据格式是什么样的,按内存顺序转化就行。

          1. 说道:

            是的,我试试吧,楼主,有没有下面代码的详解文章啊:
            // 下方的代码即将图像转化为Tensor,随后导入模型进行预测
            torch::Tensor tensor_image = torch::from_blob(input.data, {1,input.rows, input.cols,3}, torch::kByte);
            tensor_image = tensor_image.permute({0,3,1,2});
            tensor_image = tensor_image.toType(torch::kFloat);
            tensor_image = tensor_image.div(255);
            tensor_image = tensor_image.to(torch::kCUDA);
            torch::Tensor result = module->forward({tensor_image}).toTensor();

        4. Oldpan说道:

          我当时写的时候官方还没有文档,不知道现在怎么样了

  17. 说道:

    你好,楼主,请问有没有训练new-mobilenetv2-128_S.pth模型的源码(最好有数据集链接),我现在需要new-mobilenetv2-128_S.pt模型,可以上传一下吗?谢谢!!! :smile:

    1. Oldpan说道:

      不好意思哈,数据集是自己采集的,暂时没有必要公开,代码的话之后会想办法开源。不过我在文章末尾上传了你需要文件的链接,希望能帮到你~ :idea:

      1. 说道:

        好的,谢谢,很期待 :rolleyes:

      2. 好帅啊说道:

        你是怎么把.pth文件转化成.pt的?能否发下源码,我看得到模型的时候你调用的vgg()这个函数你是怎么写的?能发下源码吗

        1. Oldpan说道:

          Pytorch官方都有相关教程的,就在使用Libtorch那一章

          1. 好帅啊说道:

            你是自己定义的pytorch模型吗,自己定义的模型怎么转换成.pt

  18. 华子春xys说道:

    博主的文章写得很不错的。

jiaopoint进行回复 取消回复

电子邮件地址不会被公开。 必填项已用*标注

评论审核已启用。您的评论可能需要一段时间后才能被显示。