前言
填一个之前的坑啊,本篇的姊妹篇——利用Pytorch的C++前端(libtorch)读取预训练权重并进行预测 这篇文章中已经说明了如何在Ubuntu系统中使用libtorch做预测,当初也有朋友问我如何在Windows之下尝试使用libtorch,当时因为时间关系没有去看,后来就给忘了…现在有时间了当然要尝试一下~
当然先说结论哈,其实在Windows环境下的配置也是很简单的,因为官方已经替我们编译好的Windows版本的libtorch,这下就节省了我们编译Pytorch的时间,直接可以拿来使用,只要稍微配置一下就可以在Windows跑起libtorch了,没有想象中那么多的步骤,大可放心。
下文中使用的代码和之前在Ubuntu中使用的完全相同,我们不需要进行修改。
同样,首先,我们在官网下载适合于Windows的libtorch
,因为稳定版出来了,所以我们可以直接拿来使用。有CPU版本的和GPU版本的,这里我都进行了测试,都是可以的直接使用的,大家按照自己的需求进行下载即可。
个人环境:
- win10
- cuda9.0 + cudnn7.0.5
- 1060-6G
正式开始
与之前实现的任务相同,我这里将libtorch和OpenCV一起编译,使用OpenCV的读取摄像头然后识别当前的手势,模型是我自己训练好的,对于大家来说可以自己随便挑一个模型来使用。
下图为在Visual Studio中使用libtorch和OpenCV来实现判断剪刀石头布手势,运行的平台是cpu端。当然GPU端也是可以运行的,之后也会进行详解。
不得不说下,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
大概流程就是我们使用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去打开这个文件,也就是之前编译使用的工具和之后打开工程的版本应该一致
打开后大概是这样子的:
这里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一致)进行编译。
点击后开始编译,可能会输出一堆警告,这里不用理会:
如果顺利的话,直接开始运行:
在VS中可以运行后,我们可以找到其单独的.exe文件,然后将必要的.dll文件(CPU和GPU的all不同)和模型与simnet.exe
放到一个文件夹中,这时,我们点击simnet.exe
就可以直接运行了:
后记
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
博主你好,我在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模型。谢谢~
对呀,对于动态模型中一些不确定的变量(Tensor)或者if条件判断语句,trace如果不支持就会报错的,和onnx一样,目前不支持的操作通常都是比较复杂或者不常用的op,不过之后肯定会慢慢添加
好的 谢谢博主。
博主,我在std::shared_ptr module = torch::jit::load(argv[1]);这一句出现了问题,说无法从“torch::jit::script::Module”转换为“std::shared_ptr”,请问这个问题要怎么解决,谢谢
这个是版本的问题,在1.2及以上script::Module是引用而不是指针了,把shared_ptr去了就可以。
谢谢博主,问题已经解决。还想请问下这些信息,资料,哪里可以看到啊,一直百度找解决方案感觉太难找到了
资料很少啊,需要自己探索,有问题在google上直接搜,对应github和Pytorch的官方论坛。
好的,谢谢博主
楼主,能分享一下window 的libtorch 1.0.0的包么? 现在只能下载1.2的
博主您好,我想问一下 复杂模型如maskrcnn如何将pth模型转化为pt模型啊
首先得Pytorch官方支持导出,支持该模型的所有算子,我记得MaskRcnn一直是复杂度特别高的模型,很多推断库都不支持,如果想要使用估计需要自个儿去写了。
maskrcnn就是pytorch官方版的,就是不知道在模型导出的时候model如何定义
导出.pt和导出.onnx类似呀,只要定义了模型结构,model = MaskRcnn() 后参照官方的教程或者这里文章中的教程导出即可
我找到定义maskrcnn网络结构的.py文件了,感谢楼主
请问如何导出gpu的模型 我通过文档导出的模型 在gpu的libtorch都加载不成功
请博主发布一下完整的cmakelist 里面应该有found cuda 我该怎么设置cuda呢 我用torch::cuda::is_available()返回的是0 我用的是libtorch的gpu版本
找到问题了 竟然用的不是gpu的包 被自己蠢哭了
#if __has_cpp_attribute(clang::warn_unused_result)
严重性 代码 说明 项目 文件 行 禁止显示状态错误(活动) E2512 功能测试宏的参数必须是简单标符
using IntList C10_DEPRECATED_USING = ArrayRef;
严重性 代码 说明 项目 文件 行 禁止显示状态错误(活动) E1866 特性不适用于任何实体
楼主遇到这两个报错吗
这个问题你解决了没?我是使用vs直接配置工程,没用cmake,也遇到这个问题,不知道该怎么解决。
up主,怎么百度云的模型过期了呀~
您好,我用您的方法去加载灰度图片,发现python端和c++端的模型输出不一样(二者差别比较大),但是标签一致。但同样输入torch::ones(1,1,224,224)张量,发现c++端和python端的输出是一致的。现在我在c++加载图片的方式为cv::imread("path\\to\\image.png",0),然后处理跟您的一致;在python端加载图片的方式为PIL.Image加载后用torchvision.transform.ToTensor()处理。请问博主有碰过这个问题吗?这个问题有处理方案吗?
你只要保证从OpenCV中读入的图像正确转化为Tensor就好,需要注意维度的变化以及数据类型的变化
您好。这个问题先不管了。
现在我这边用Libtorch推断比Pytorch要慢了8-10倍。这边配置是2080Ti+Cuda10.1+cudnn7.5.1+vs2017,用的是ResNet18......Libtorch 推断一个(1,1,224,224)用了1.9s,pytorch只需要0.21s。您这边目前推断速度如何?
这么慢,和python端使用的后端一致吗?用C++的速度比python是肯定快的,我这边也是,不快的原因可能是没有编译完全,一些库没有编译进去。
您好 我也遇到了这个问题 想问一下您是怎么解决的
LINK : fatal error LNK1181: 无法打开输入文件“C:\Program Files\NVIDIA Corporation\NvToolsExt\lib\x64\nvToolsExt64_1.lib”
您好,我已经添加nvToolsExt64_1.dll为什么还是没有编译成果,需要加什么吗?
是不是文件没有放对位置?
1>E:\BaiduNetdiskDownload\cpp-pytorch\main.cpp(1): fatal error C1083: 无法打开包括文件: “opencv2/opencv.hpp”: No such file or directory
为什么include的路径都对,里面也有这个文件,怎么就无法打开了,求帮助
vs2015运行程序时出bug:
c10::Error,位于内存位置 0x0000009698F7FC40 处
c10:Error问题我也遇到了,我是纯cpu,请问你怎么解决的?
请问您怎么解决的,我也是这个问题
vs 2017 里面 Release x64 模式生成的时候,跳过了 ALL_BUILD,还报错 “无法启动程序 '.....\Release\ALL_BUILD' 系统找不到指定的文件”。之前的步骤都是正常的,
请大佬指点
我记得不用ALL_BUILD,在编译选项中选单个文件进行编译就行
只编译一个源文件的话,双击运行生成的 exe 文件的时候会报错,找不到 torch.dll, caffe2.dll, c10.dll
找不到没关系,缺什么你就将这些dll文件移动至你项目文件夹正确位置就可以
你好,我用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建立?
我是用的LibTorch是直接预编译好的CUDA-10.0的版本
我在用jit生成模型的时候,弹出警告:Tracemodules dont support parameter sharing between modules,在github有人说TorchScript cannot handle nn.Module parts in the forward function.请问你遇到过这种问题吗?
没遇过啊,看提示的内容应该是当前的版本还不支持你要的功能,尝试尝试最新的?
那博主有没有用第二种方法,继承torch.jit.ScriptModule来生成模型呢,我试了几次均不成功 https://pytorch.org/docs/master/jit.html
一般模型是可以的,多输入多输出模型的话,有些op还是有bug的,一些功能不支持。
楼主,你好,在导出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)
device是你要运行的平台,如果你使用GPU的话,需要定义一个:device = torch.device("cuda")
嗯,谢谢楼主,这个解决了,出现了另一个问题:NameError("name 'model' is not defined",)
还没查到解决方案,请教楼主大神
问题出现在这句:model.load_state_dict(state['model'], strict=True)
你如果使用自己的模型,那就把state['model']替换为state就行,那是因为我之前训练的模型和参数保存在不同的dic中
楼主,按你的方法把state['model']替换为state还是不行,你在“读入之前训练好的.pth模型”之前有没有定义model啊?还有除了import torch外还有没有import其他的啊?
嗯..肯定要定义的,另外不需要额外import什么,这是比较基本的操作,可以看这篇 https://oldpan.me/archives/pytorch-load-static-data
好的,谢谢
楼主大神,再请教一下,我看的例子都是用torchvision自带的models定义的model,比如model = torchvision.models.resnet18(pretrained=True),该如何定义自己的网络训练的model来加载.pth模型啊(ps:本人小白,不懂 )
这个你最好看看Pytorch的官方文档吧,一两句说不清的
博主,导出pt模型那里能详细一点吗,急用,谢谢
导出模型windows其实和linux下的一样,看官方的导出步骤即可,文中都有提到的~
就是我用的模型不是torch自带的,model.load_state_dict中的model应该是我自己的模型结构吗?
嗯嗯,对的,是你自己训练的模型
你好,请问你导出自己的模型了吗?那里的model是如何定义的啊
定义model的函数文中没有写,你自己设定一个就行或者使用torchvision中自带的也可以
但是我得需要用我自己写的网络来定义,该如何设定啊,我是这样写的:model=PointNet_Plus(opt),现在一直报错:TypeError("forward() missing 1 required positional argument: 'y'",),请问你遇到过吗?你是怎么设定的啊?希望告知,谢谢
缺少参数了,你有个函数的参数没有填完整
谢谢楼主的帮助,traced_script_module = torch.jit.trace(model.cuda(), (example1,example2))这样定义完美解决问题。在问楼主一个问题,在c++里如何将“深度图”转化为Tensor,随后导入模型进行预测呢?楼主这篇文章里做的是RGB图。
深度图?多了一个深度维度吗?类似于RGB图,首先看数据格式是什么样的,按内存顺序转化就行。
是的,我试试吧,楼主,有没有下面代码的详解文章啊:
// 下方的代码即将图像转化为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();
我当时写的时候官方还没有文档,不知道现在怎么样了
你好,楼主,请问有没有训练new-mobilenetv2-128_S.pth模型的源码(最好有数据集链接),我现在需要new-mobilenetv2-128_S.pt模型,可以上传一下吗?谢谢!!!
不好意思哈,数据集是自己采集的,暂时没有必要公开,代码的话之后会想办法开源。不过我在文章末尾上传了你需要文件的链接,希望能帮到你~
好的,谢谢,很期待
你是怎么把.pth文件转化成.pt的?能否发下源码,我看得到模型的时候你调用的vgg()这个函数你是怎么写的?能发下源码吗
Pytorch官方都有相关教程的,就在使用Libtorch那一章
你是自己定义的pytorch模型吗,自己定义的模型怎么转换成.pt
博主的文章写得很不错的。