libtorch教程(一)开发环境搭建:VS+libtorch和Qt+libtorch
<blockquote data-first-child="" data-pid="FjuhUjIa">前言 事实上,在前面的pytorch部署博客和libtorch的QT部署中笔者已经分享了自己搭建libtorch开发环境的记录。其余并无太多要赘述的。</blockquote><p data-pid="8CMJnHv9">本教程禁止转载。同时,本教程来自知识星球【CV技术指南】更多技术教程,可加入星球学习。</p>
<p data-pid="8rGRQGJO">欢迎关注公众号CV技术指南,专注于计算机视觉的技术总结、最新技术跟踪、经典论文解读、CV招聘信息。</p>
<p data-pid="fjS3fsgs">CV各大方向专栏与各个部署框架最全教程整理</p>
<p data-pid="3Mv_CoCI">【CV技术指南】CV全栈指导班、基础入门班、论文指导班 全面上线!!</p>
<h2>VS+libtorch</h2>
<h3>VS+libtorch引言</h3>
<p data-pid="mQxO6U1t">本文旨在介绍如何在Windows平台使用pytorch的c++ api部署pytorch的CNN模型,本文的部署的模型只有推理功能,这是由于torch::jit不支持部分层或者操作的反向传播。当然即使只是推理也足够许多项目运行了,部署使用的工具有visual studio,opencv,libtorch。</p>
<p data-pid="r5Dtv24c">环境</p>
<p data-pid="3VuYr4R1">本文环境如下:win10平台 cuda10.2+cudnn7.6.5 双显卡Gtx 1080Ti visual studio 2017 community version opencv 4.5.0 libtorch 1.1 事实上,除了libtorch是版本有强制要求不低于pytorch版本外(主要是可能存在的api问题,否则也不必)和visual studio的版本要求外,其他如opencv并无版本要求,甚至如果只部署cpu的话,显卡都不是必须。</p>
<h3>visual studio</h3>
<p data-pid="-U1G2b2X">visual studio版本最好在2015及以上,本文用2017版本。下载链接在链接1,具体安装过程可以参考链接2。打开链接1下载社区版本即可,安装时对于c++程序设计只需安装对应部分,勾选如下:</p>
<img width="1080" height="555" class="origin_image zh-lightbox-thumb lazy lazyload" data-caption="" data-size="normal" data-rawwidth="1080" data-rawheight="555" data-original-token="v2-2ca44cde65569ed8420d318a326cbfec" data-original="https://pic1.zhimg.com/v2-2ca44cde65569ed8420d318a326cbfec_r.jpg" data-actualsrc="https://pic1.zhimg.com/v2-2ca44cde65569ed8420d318a326cbfec_b.jpg" data-lazy-status="ok" data-src="https://pic1.zhimg.com/80/v2-2ca44cde65569ed8420d318a326cbfec_1440w.webp">
<p data-pid="jYeBCEi9">](<span class="invisible">https://<span class="visible">raw.githubusercontent.com<span class="invisible">/AllentDan/ImageBase/main/libtorch_deploy/vs.PNG</span></span></span>) visual studio的安装并无太多需要赘述,按照教程操作就好。</p>
<h3>opencv</h3>
<p data-pid="Ji3SXhL1">截止成文时,opencv版本已到4.5.0。去官网下载你想要的版本即可,当然限定平台为Windows平台。opencv的版本如若读者没有特别需要均无影响,本文也试过不同版本,不影响部署。opencv安装也容易,虽然是exe文件,但是实际就是个压缩包,解压到你想要的目录最好。值得注意的是,好的编程习惯很重要,所有程序涉及路径以英文路径为佳,避免出错。</p>
<h3>libtorch</h3>
<p data-pid="Ktrdes8o">libtorch使用所需要的环境和训练最好保持一致,其中cuda,显卡驱动以及libtorch版本配置一般不应低于训练环境。尤其是libtorch版本要求更为严格,否则部分pytorch的api无法在libtorch中使用。</p>
<p data-pid="bwLlAHBv">本文中以libtorch1.7为例介绍,读者最新版1.7.1使用,亲测可用。下载时以release版本为佳,避免一些不必要的错误。</p>
<img width="1035" height="486" class="origin_image zh-lightbox-thumb lazy lazyload" data-caption="" data-size="normal" data-rawwidth="1035" data-rawheight="486" data-original-token="v2-39f169c277e1a6ec22d80e4e062fe304" data-original="https://pic1.zhimg.com/v2-39f169c277e1a6ec22d80e4e062fe304_r.jpg" data-actualsrc="https://pic1.zhimg.com/v2-39f169c277e1a6ec22d80e4e062fe304_b.jpg" data-lazy-status="ok" data-src="https://pic1.zhimg.com/80/v2-39f169c277e1a6ec22d80e4e062fe304_1440w.webp">
<p data-pid="zpzHKtJG">(<span class="invisible">https://<span class="visible">raw.githubusercontent.com<span class="invisible">/AllentDan/ImageBase/main/libtorch_deploy/libtorch_download_scene.PNG</span></span></span>) 下载后同样解压到读者想要路径,可以更改好解压名称如下以方便版本管理。</p>
<img width="545" height="137" class="origin_image zh-lightbox-thumb lazy lazyload" data-caption="" data-size="normal" data-rawwidth="545" data-rawheight="137" data-original-token="v2-c5e44b9fdbaad08fc6e1820a88f992d7" data-original="https://pic4.zhimg.com/v2-c5e44b9fdbaad08fc6e1820a88f992d7_r.jpg" data-actualsrc="https://pic4.zhimg.com/v2-c5e44b9fdbaad08fc6e1820a88f992d7_b.jpg" data-lazy-status="ok" data-src="https://pic4.zhimg.com/80/v2-c5e44b9fdbaad08fc6e1820a88f992d7_1440w.webp">
<p data-pid="c40UrRFD">这样下来就已经准备好部署所需要的依赖项。</p>
<h3>例子</h3>
<h3>生成.pt文件</h3>
<p data-pid="3237Fbas">接下来以ResNet34分类模型为例尝试部署分类模型。准备一张图片用以判断是否部署成功,本文用例图如下:</p>
<img width="500" height="704" class="origin_image zh-lightbox-thumb lazy lazyload" data-caption="" data-size="normal" data-rawwidth="500" data-rawheight="704" data-original-token="v2-f6c3c02bd7eb0e561e48e092fe96b86d" data-original="https://pic2.zhimg.com/v2-f6c3c02bd7eb0e561e48e092fe96b86d_r.jpg" data-actualsrc="https://pic2.zhimg.com/v2-f6c3c02bd7eb0e561e48e092fe96b86d_b.jpg" data-lazy-status="ok" data-src="https://pic2.zhimg.com/80/v2-f6c3c02bd7eb0e561e48e092fe96b86d_1440w.webp">
<p data-pid="o8PXtLig">接下来先和官网类似生成torchscript模型,亦即本文中的pt文件。本文使用代码如下:</p>
<div class="highlight">
<pre><code class="language-text">from torchvision.models import resnet34
import torch.nn.functional as F
import torch.nn as nn
import torch
import cv2
#读取一张图片,并转换成的float张量并归一化
image = cv2.imread("flower.jpg")
image = cv2.resize(image,(224,224))
input_tensor = torch.tensor(image).permute(2,0,1).unsqueeze(0).float()/225.0
#定义并加载resnet34模型在imagenet预训练的权重
model = resnet34(pretrained=True)
model.eval()
#查看模型预测该付图的结果
output = model(input_tensor)
output = F.softmax(output,1)
print("模型预测结果为第{}类,置信度为{}".format(torch.argmax(output),output.max()))
#生成pt模型,按照官网来即可
model=model.to(torch.device("cpu"))
model.eval()
var=torch.ones((1,3,224,224))
traced_script_module = torch.jit.trace(model, var)
traced_script_module.save("resnet34.pt")
</code></pre>
</div>
<p data-pid="QCWCGs7C">输出结果为:</p>
<div class="highlight">
<pre><code class="language-text">模型预测结果为第723类,置信度为0.5916505455970764
</code></pre>
</div>
<p data-pid="RQ-bWroF">代码运行结束即可生成.pt文件。</p>
<h3>Visual Studio项目配置</h3>
<h3>新建Visual Studio工程项目</h3>
<p data-pid="KwFkcau4">打开Visual Studio 2017,点击文件->新建->项目,新建空白的c++项目如下:</p>
<img width="943" height="656" class="origin_image zh-lightbox-thumb lazy lazyload" data-caption="" data-size="normal" data-rawwidth="943" data-rawheight="656" data-original-token="v2-6a3c44a4e6f133bc1203df6cc2eb2f49" data-original="https://pic2.zhimg.com/v2-6a3c44a4e6f133bc1203df6cc2eb2f49_r.jpg" data-actualsrc="https://pic2.zhimg.com/v2-6a3c44a4e6f133bc1203df6cc2eb2f49_b.jpg" data-lazy-status="ok" data-src="https://pic2.zhimg.com/80/v2-6a3c44a4e6f133bc1203df6cc2eb2f49_1440w.webp">
<p data-pid="Kq3KwLGq">本文新建项目名称为deploy_test,新建空白项目后右键源文件,点击添加新建项,生成main.cpp。至此,Visual Studio项目的准备工作已做好,接下来时配置项目环境。</p>
<h3>编译环境配置</h3>
<p data-pid="hZIkopC9">在项目的管理器中设置项目的编译为Release,平台选择x64。如图:</p>
<img width="263" height="66" class="content_image lazy lazyload" data-caption="" data-size="normal" data-rawwidth="263" data-rawheight="66" data-original-token="v2-e35af1fe101c2bbbc1ad0c7d4adf853d" data-actualsrc="https://pic2.zhimg.com/v2-e35af1fe101c2bbbc1ad0c7d4adf853d_b.jpg" data-lazy-status="ok" data-src="https://pic2.zhimg.com/80/v2-e35af1fe101c2bbbc1ad0c7d4adf853d_1440w.webp">
<p class="ztext-empty-paragraph"> </p>
<h3>配置项目属性</h3>
<p data-pid="fdcXJy0M">include</p>
<p data-pid="7sYKjCgb">右键项目deploy_test,选择属性进入属性页的配置属性。选择VC++目录,需要添加包含目录和库目录。包含目录配置路径为</p>
<div class="highlight">
<pre><code class="language-text">your path to libtorch\include\torch\csrc\api\include
your path to libtorch\include
your path to opencv\build\include
</code></pre>
</div>
<p data-pid="lduC_aXe">本文的配置结果如下:</p>
<img width="549" height="760" class="origin_image zh-lightbox-thumb lazy lazyload" data-caption="" data-size="normal" data-rawwidth="549" data-rawheight="760" data-original-token="v2-65ccfeeaef595538a738fe7db888bd33" data-original="https://pic4.zhimg.com/v2-65ccfeeaef595538a738fe7db888bd33_r.jpg" data-actualsrc="https://pic4.zhimg.com/v2-65ccfeeaef595538a738fe7db888bd33_b.jpg" data-lazy-status="ok" data-src="https://pic4.zhimg.com/80/v2-65ccfeeaef595538a738fe7db888bd33_1440w.webp">
<p class="ztext-empty-paragraph"> </p>
<p data-pid="x2gd5jcV">lib</p>
<p data-pid="urmPY12l">库目录的配置路径为:</p>
<div class="highlight">
<pre><code class="language-text">your path to libtorch\lib
your path to opencv\build\x64\vc14\lib
</code></pre>
</div>
<p data-pid="ycVz59Xr">其中,vc版本与vs版本对应关系以及opencv与vc版本间的关系见链接。VS2017对应版本为vc15,opencv的\build\x64文件夹下同时有vc14和vc15,本文选择了vc14也是可用的(VS高版本向下兼容)。库目录具体配置如下图:</p>
<img width="549" height="756" class="origin_image zh-lightbox-thumb lazy lazyload" data-caption="" data-size="normal" data-rawwidth="549" data-rawheight="756" data-original-token="v2-a409921a41f48afb49f1c570a33232cd" data-original="https://pic2.zhimg.com/v2-a409921a41f48afb49f1c570a33232cd_r.jpg" data-actualsrc="https://pic2.zhimg.com/v2-a409921a41f48afb49f1c570a33232cd_b.jpg" data-lazy-status="ok" data-src="https://pic2.zhimg.com/80/v2-a409921a41f48afb49f1c570a33232cd_1440w.webp">
<p class="ztext-empty-paragraph"> </p>
<p data-pid="9bu2fUQi">link</p>
<p data-pid="XlJhMPJO">最后添加链接器,点击链接器->输入->附加依赖项,编辑添加库目录中libtorch库目录下所有的.lib文件名。此外,为使用opencv还需添加opencv的.lib文件。本文添加如下:</p>
<div class="highlight">
<pre><code class="language-text">opencv_world450.lib
asmjit.lib
c10.lib
c10d.lib
c10_cuda.lib
caffe2_detectron_ops_gpu.lib
caffe2_module_test_dynamic.lib
caffe2_nvrtc.lib
clog.lib
cpuinfo.lib
dnnl.lib
fbgemm.lib
gloo.lib
gloo_cuda.lib
libprotobuf-lite.lib
libprotobuf.lib
libprotoc.lib
mkldnn.lib
torch.lib
torch_cpu.lib
torch_cuda.lib
</code></pre>
</div>
<p data-pid="_RtGKOkO">dll</p>
<p data-pid="3Gk4CAOU">动态链接库需要放入指定位置,有三种做法:</p>
<ul>
<li data-pid="WRnoO3Bz">将opencv中的\build\x64\vc14\bin文件夹路径放入环境变量path中,libtorch中的lib文件夹同样如此;</li>
<li data-pid="Eyt653Eo">拷贝opencv和libtorch中的dll文件到项目的执行目录中;</li>
<li data-pid="Y3uc1w7y">将opencv和libtorch中的dll路径配置到VS项目中;</li>
</ul>
<p data-pid="vCYr9GW5">从省事角度和工程需要角度,一般都是直接拷贝dll到执行目录中。读者可以在项目编译后执行时报错缺啥拷贝啥。</p>
<p data-pid="5d04FwBO">至此,VS项目的配置内容已经完成,下面开始c++代码。</p>
<h3>cpp代码</h3>
<div class="highlight">
<pre><code class="language-text">#include<opencv2/opencv.hpp>
#include <torch/torch.h>
#include <torch/script.h>
int main()
{
//定义使用cuda
auto device = torch::Device(torch::kCUDA,0);
//读取图片
auto image = cv::imread("your path to\\flower.jpg");
//缩放至指定大小
cv::resize(image, image, cv::Size(224, 224));
//转成张量
auto input_tensor = torch::from_blob(image.data, { image.rows, image.cols, 3 }, torch::kByte).permute({ 2, 0, 1 }).unsqueeze(0).to(torch::kFloat32) / 225.0;
//加载模型
auto model = torch::jit::load("your path to\\resnet34.pt");
model.to(device);
model.eval();
//前向传播
auto output = model.forward({input_tensor.to(device)}).toTensor();
output = torch::softmax(output, 1);
std::cout << "模型预测结果为第" << torch::argmax(output) << "类,置信度为" << output.max() << std::endl;
return 0;
}
</code></pre>
</div>
<p data-pid="VQ7Wd9KV">编译执行,代码的输出结果为:</p>
<div class="highlight">
<pre><code class="language-text">模型预测结果为第723
[ CUDALongType{} ]类,置信度为0.591652
[ CUDAFloatType{} ]
</code></pre>
</div>
<p data-pid="wt0jOEUD">可以发现,torchscript文件推理的结果还是和python的略有不同,不过也已经时小数点后第6位了,一般不会影响最后结果判定。</p>
<h3>一些报错</h3>
<h3>错误1:无法使用GPU</h3>
<p data-pid="FDx4EL5N">目前最新的libtorch依据是1.7+cuda10.2,我也有使用,但是目前发布的版本编译的并不完美。如果官方仍然没有更新的话,以该版本运行的程序可以在CPU中正常使用,但是将模型移至GPU时会出错。相比于正常添加lib文件名,1.7版本的需要在链接器里多添加一句:</p>
<div class="highlight">
<pre><code class="language-text">/INCLUDE:?warp_size@cuda@at@@YAHXZ
</code></pre>
</div>
<p data-pid="4tKLZ0Gg">其他版本如有遇到类似问题可以同样方式解决,该错误似乎是windows平台导致,此解决方法参考了此链接。</p>
<h3>错误2:编译时报错“std”: 不明确的符号</h3>
<p data-pid="m4d3TkE8">调整属性页->属性配置->c/c++->语言->符合模式设置为否即可编译成功。</p>
<h3>错误3:缺少dll</h3>
<p data-pid="WxY-FYgw">如果编译成功,执行报错由于找不到xxxx.dll,无法继续执行代码。则解决方式有三:</p>
<ul>
<li data-pid="KNwfB_XB">添加对应dll的目录到系统环境变量的path中</li>
<li data-pid="9qRk1gqK">在VS项目中配置dll路径</li>
<li data-pid="4x2vdwc0">直接将该dll复制粘贴到项目的执行路径下。如果项目不多,建议直接复制粘贴。</li>
</ul>
<h2>Qt+libtorch</h2>
<h3>Qt+libtorch引言</h3>
<p data-pid="JxopzjG6">纯c++用户而言如果要自研产品,会一个图形界面编程工具还是有必要的。大多数c++用户,如果在Windows平台开发则多使用微软全家桶,如果是Linux平台则可能是其他工具再cmake。这篇博客将记录Windows平台,QT Creator中Opencv和Libtorch的配置。网上有较多关于使用Mingw编译Opencv源码以供QT Creator使用的,事实上,只是基于Opencv和Libtorch的api做开发的话,无需编译。正确的流程为:安装QT Creator时,勾选MSVC编译器,下载opencv的exe文件和libtorch的官方版压缩包,随后配置Release版本的项目即可。如要直接看正确步骤,前往本文“正确步骤”小节即可。各工具版本:</p>
<ul>
<li data-pid="b1rwDx9D">QT Creator 4.11.0 (Community)</li>
<li data-pid="hszI7-Cp">QT 5.14.1</li>
<li data-pid="m5T5pmTi">OpenCV 4.5.0(官网) 4.1.1 x64(MingW轮子库版)</li>
<li data-pid="UGshN_0R">Libtorch 1.7.0(官网)</li>
<li data-pid="5w6vgYgm">CUDA 10.2</li>
<li data-pid="AMrbjq03">CUDNN(适配CUDA10.2版本)</li>
</ul>
<h3>QT Creator安装不全,编译器选择错误,OpenCv使用困难</h3>
<p data-pid="NP6KO4nl">由于自己以前主力开发工具是微软全家桶,主要Visual Studio写c++,VS code写python这样,QT Creator大致了解后简单装了下,只有MingW x64编译器,这导致OpenCV不能像在Visual Studio一样直接官网下载.exe解压添加动态库即可。由于不了解QT Creator,配置时直接按照网上部分博客在.pro中修改,导致出错。</p>
<p data-pid="fZJ8pouQ">直接下载opencv官网.exe,使用MingW编译主要错误表现为:</p>
<ol>
<li data-pid="R4XNaPGe">控制台无法输出,即QT Creator最下方3 应用程序输出只有Debugging starts和Debugging has finished字样。</li>
<li data-pid="kQyWR10R">cv::Mat可以使用,但是imread和imshow均无法使用,右键项目重新构建时出现 undefined reference to `cv::imread(cv::String const....</li>
</ol>
<p data-pid="cYbXWqiZ">错误undefined reference to也就是“未定义的标识符”错误,这是因为没有正确关联.lib文件,工程只能找到函数声明,无法找到定义。然后一顿折腾,以为自己.pro文件中的INCLUDEPATH和LIBS配置不对,各种魔改都没有效果。最后看某个博客说因为OpenCV官网提供的是MSVC编译的,如果想基于MingW开发,需要前往这个GitHub上下载需要版本。OpenCV在2.4.10及之后版本不再提供MingW编译的Lib。如果要跨平台做基于OpenCV的开发,要么自己用MingW编译一次OpenCV源码,要么用网上已有的轮子。</p>
<p data-pid="M_EaIb2e">选用轮子库里的MinGW-OpenCV-4.1.1-x64,在.pro文件中配置好库文件如下:</p>
<div class="highlight">
<pre><code class="language-text">INCLUDEPATH += your path to\MinGW-OpenCV-4.1.1-x64\include
LIBS+=your path to\MinGW-OpenCV-4.1.1-x64\x64\mingw\lib\libopencv_*.a
</code></pre>
</div>
<p data-pid="OcT0Q6Po">*是正则表示任意字符串。QT Creator中的配置路径很有趣,同时接受/,//,\和\。在.pro文件改好后,选择构建build,执行qmake,然后再右键项目,选择重新构建,此时无论项目配置使用Release或者Debug编译均可通过。同时,也可以在Linux中做OpenCV开发。</p>
<h3>Libtorch只能用MSVC编译器直接调用</h3>
<p data-pid="PM03jImS">有了配置成功OpenCV的经验,就自然想继续用MingW配置Libtorch,找到pytorch官网提供的libtorch下载Debug或者Release版本。以Release版本为例配置.pro如下:</p>
<div class="highlight">
<pre><code class="language-text">INCLUDEPATH += your path to\MinGW-OpenCV-4.1.1-x64\include \
your path to\libtorch17release\include \
your path to\libtorch17release\include\torch\csrc\api\include
LIBS+=your path to\MinGW-OpenCV-4.1.1-x64\x64\mingw\lib\libopencv_*.a \
your path to\libtorch17release\lib\*.lib \
your path to\libtorch17release\lib\*.dll
</code></pre>
</div>
<p data-pid="55MW3F_J">qmake, 重新构建,产生159个warning,12个error。警告不用管,项目配置Debug或者Release编译,错误都有有:</p>
<ol>
<li data-pid="K3zh6xjo">include\c10\macros\Macros.h:287: error: '__assert_fail' was not declared in this scope __assert_fail</li>
<li data-pid="ZZtoigHq">include\ATen\core\ivalue_inl.h:719: error: expected unqualified-id before '(' token TORCH_CHECK(obj->slots().size() == 1,</li>
</ol>
<h3>重装QT Creator,配置MSVC编译器</h3>
<p data-pid="VYHBcq4O">可以在QT安装路径中使用QT manager补装,但是比较麻烦。直接在控制面版中卸载QT Creator,官网下载或者搜索其他网址下载,官网加载很慢可以搜索下载。</p>
<p data-pid="hSN1OXZL">参考QT Creator安装,重装时,在选择组件部分除了默认的Develper and Designer Tools中的MingW和CDB,还要勾选MSVC部分。</p>
<p data-pid="RRbd_T9a">安装好MSVC编译器,还要配置,配置时需要cdb.exe。选择工具->选项->构建套件(Kits)->MSVC 2017 x64->调式器,添加cdb.exe。如果没有,下载安装即可。装好后在添加cdb调试器。</p>
<h3>重新用MSVC 2017编译器,配置OpenCV和Libtorch</h3>
<p data-pid="K80Fec4Q">配置好MSVC编译器后,在.pro文件加入配置如下:</p>
<div class="highlight">
<pre><code class="language-text">INCLUDEPATH += your path to\opencv-4.5.0-vc14_vc15\opencv\build\include \
your path to\libtorch17debug\include \
your path to\libtorch17debug\include\torch\csrc\api\include
LIBS+=your path to\opencv-4.5.0-vc14_vc15\opencv\build\x64\vc15\lib\opencv_world450d.lib \
your path to\libtorch17debug\lib\*.lib
</code></pre>
</div>
<p data-pid="bLSS927M">执行qmake,重新构建。发现报错主要来自IValue.h和IValue_init.h文件,显示7个错误</p>
<ul>
<li data-pid="j_GdkcwO">语法错误: 标识符“IValue”</li>
<li data-pid="baVukT7j">意外的标记位于“;”之前</li>
<li data-pid="D8KB_B56">“c10::IValue”:非法的成员初始化</li>
<li data-pid="LGvb02kQ">“Tag”:不是类或命名空间名称</li>
<li data-pid="BW9VM_se">语法错误,缺少“;”等。</li>
</ul>
<p data-pid="QPL5TsTi">解决方法参考引用3,分两步</p>
<ol>
<li data-pid="dLR6kW8L">在引用 #include <torch/torch.h> 的地方,这样写</li>
</ol>
<div class="highlight">
<pre><code class="language-text">#undef slots
#include <torch/torch.h>
#define slots Q_SLOTS
</code></pre>
</div>
<ol>
<li data-pid="3VLx6gSx">在报错的D:\libtorch\include\ATen/core/ivalue.h头文件和IValue_init.h文件中 找出如下3行内容,注释掉。共有多处</li>
</ol>
<div class="highlight">
<pre><code class="language-text">/// \cond DOXYGEN_CANNOT_HANDLE_CONSTRUCTORS_WITH_MACROS_SO_EXCLUDE_THIS_LINE_FROM_DOXYGEN
C10_DEPRECATED_MESSAGE("IValues based on std::vector<T> are potentially slow and deprecated. Please use c10::List<T> instead.")
/// \endcond
</code></pre>
</div>
<p data-pid="z7BM1Zae">至此,重新构建不再出错。但是运行报错:cdb process terminated。排查错误来源,发现只使用OpenCV是没有问题的,但是加入libtorch则出错。没办法,只能将项目配置Debug转成Release。或者运行也不报错,但是当运行代码中有libtorch相关的模型操作,无论加载或者forward,均会终止运行。</p>
<h3>正确步骤</h3>
<p data-pid="HVUiuP_L">至此,坑已经全部踩完。CUDA和CUDNN的安装网上方法很多,就不赘述。安装好后,QT完整的深度学习配置步骤为:</p>
<ol>
<li data-pid="ixxyA2IB">下载安装QT Creator,配置好环境。官网下载或者搜索其他网址下载,官网加载很慢可以搜索下载。注意安装时勾选MSVC编译器组件。项目选用MSVC编译,在工具->选项->构建套件(Kits)->MSVC 2017 x64配置MSVC 2017 x64,选择c和c++编译器为amd64。</li>
<li data-pid="DcZOCOqC">如果电脑没有cdb.exe文件(Everything搜查),则下载安装,安装完毕后选择工具->选项->构建套件(Kits)->MSVC 2017 x64->Debugger(调式器),添加cdb.exe。</li>
<li data-pid="-kwrmqI8">下载OpenCV和libtorch。将正确路径配置到项目的.pro文件中,在.pro文件末尾添加</li>
</ol>
<div class="highlight">
<pre><code class="language-text">INCLUDEPATH += your path to\opencv-4.5.0-vc14_vc15\opencv\build\include \
your path to\libtorch17release\include \
your path to\libtorch17release\include\torch\csrc\api\include
LIBS += -Lyour path to\opencv-4.5.0-vc14_vc15\opencv\build\x64\vc15\lib -lopencv_world450 \
-Lyour path to\libtorch17release\lib -lc10 -ltorch -lc10_cuda -lcaffe2_detectron_ops_gpu -lc10d -ltorch_cpu \
-ltorch_cuda -lgloo -lcaffe2_module_test_dynamic -lasmjit -lcaffe2_nvrtc -lclog -lcpuinfo -ldnnl -lfbgemm -lgloo_cuda \
-lmkldnn -INCLUDE:?warp_size@cuda@at@@YAHXZ
</code></pre>
</div>
<p data-pid="JldS9hpx">将your path to替换为你本地路径。</p>
<ol>
<li data-pid="r8yQrNIt">项目配置为Release模式,运行qmake成功,右键项目重新构建。可能产生错误有:语法错误: 标识符“IValue”;意外的标记位于“;”之前;“c10::IValue”:非法的成员初始化;“Tag”:不是类或命名空间名称;语法错误,缺少“;”。解决方法参考引用3,在引用 #include <torch/torch.h> 的地方,这样写</li>
</ol>
<div class="highlight">
<pre><code class="language-text">#undef slots
#include <torch/torch.h>
#define slots Q_SLOTS
</code></pre>
</div>
<p data-pid="pRfkzROL">在报错的D:\libtorch\include\ATen/core/ivalue.h头文件和IValue_init.h文件中 找出如下3行内容,注释掉。共有多处</p>
<div class="highlight">
<pre><code class="language-text">/// \cond DOXYGEN_CANNOT_HANDLE_CONSTRUCTORS_WITH_MACROS_SO_EXCLUDE_THIS_LINE_FROM_DOXYGEN
C10_DEPRECATED_MESSAGE("IValues based on std::vector<T> are potentially slow and deprecated. Please use c10::List<T> instead.")
/// \endcond
</code></pre>
</div>
<p data-pid="26cQhLiq">至此,重新构建不再出错</p>
<ol>
<li data-pid="B9_e4NUA">成功运行,测试的main.cpp文件代码如下:</li>
</ol>
<div class="highlight">
<pre><code class="language-text">#include "mainwindow.h"
#include<opencv2/opencv.hpp>
#include <QApplication>
#include<iostream>
#undef slots
#include<torch/script.h>
#include<torch/torch.h>
#define slots Q_SLOTS
class ConvReluBnImpl : public torch::nn::Module {
public:
ConvReluBnImpl(int input_channel=3, int output_channel=64, int kernel_size = 3);
torch::Tensor forward(torch::Tensor x);
private:
// Declare layers
torch::nn::Conv2d conv{ nullptr };
torch::nn::BatchNorm2d bn{ nullptr };
};
TORCH_MODULE(ConvReluBn);
ConvReluBnImpl::ConvReluBnImpl(int input_channel, int output_channel, int kernel_size) {
conv = register_module("conv", torch::nn::Conv2d(torch::nn::Conv2dOptions(input_channel, output_channel, kernel_size).padding(1)));
bn = register_module("bn", torch::nn::BatchNorm2d(output_channel));
}
torch::Tensor ConvReluBnImpl::forward(torch::Tensor x) {
x = torch::relu(conv->forward(x));
x = bn(x);
return x;
}
int main(int argc, char *argv[])
{
//test torch
auto device = torch::Device(torch::kCUDA);
auto model = ConvReluBn(3,4,3);
model->to(device);
auto input = torch::zeros({1,3,12,12},torch::kFloat).to(device);
auto output = model->forward(input);
std::cout<<output.sizes()<<std::endl;
//test opencv
cv::Mat M(200, 200, CV_8UC3, cv::Scalar(0, 0, 255));
if(!M.data)
return 0;
cv::imshow("ddd",M);
cv::waitKey(0);
cv::destroyAllWindows();
//test qt
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
</code></pre>
</div>
<p data-pid="lfQNF5zp">运行成功,并且显示200*200的红色图案。</p>
<ol>
<li data-pid="wS_njbjU">然而,仍然存在两个问题,一个是cout无输出,一个是无法调试。解决办法为:第一个在.pro文件后添加一句</li>
</ol>
<div class="highlight">
<pre><code class="language-text">CONFIG += console
</code></pre>
</div>
<p data-pid="w_nV10lV">第二个则相对复杂,参考博客修改。如果需要查看变量,则用博客中方法修改QT安装路径下的msvc-desktop.conf,如果不需要查看变量,能断点就行,则直接在.pro文件添加:</p>
<div class="highlight">
<pre><code class="language-text">QMAKE_CXXFLAGS_RELEASE = $$QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO
QMAKE_CFLAGS_RELEASE = $$QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO
QMAKE_LFLAGS_RELEASE = $$QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO
</code></pre>
</div>
<p data-pid="qsk_0Byg">至此,配置完成。</p>
<p class="ztext-empty-paragraph"> </p>
<p data-pid="xPHuxxFK">欢迎关注公众号CV技术指南,专注于计算机视觉的技术总结、最新技术跟踪、经典论文解读、CV招聘信息。</p>
<p data-pid="CIrk-s9B">计算机视觉入门1v3辅导班</p>
<p data-pid="mn7oOi4d">【技术文档】《从零搭建pytorch模型教程》122页PDF下载</p>
<p data-pid="HPl_-IG7">QQ交流群:470899183。群内有大佬负责解答大家的日常学习、科研、代码问题。</p>
<p data-pid="sUd4Ffq_">其它文章</p>
<p data-pid="dlNcnl6y">CVPR'23|泛化到任意分割类别?FreeSeg:统一、通用的开放词汇图像分割新框架</p>
<p data-pid="hyxF3cXJ">全新YOLO模型YOLOCS来啦 | 面面俱到地改进YOLOv5的Backbone/Neck/Head</p>
<p data-pid="BOd5RS3y">通用AI大型模型Segment Anything在医学图像分割领域的最新成果!</p>
<p data-pid="TAbYr4wP">为何 CV 里没有出现类似 NLP 大模型的涌现现象?</p>
<p data-pid="Cwrm2k-I">可复现、自动化、低成本、高评估水平,首个自动化评估大模型的大模型PandaLM来了</p>
<p data-pid="NXAwberf">实例:手写 CUDA 算子,让 Pytorch 提速 20 倍</p>
<p data-pid="ZxaYhD5D">NeRF与三维重建专栏(一)领域背景、难点与数据集介绍</p>
<p data-pid="9YIhNfz7">异常检测专栏(三)传统的异常检测算法——上</p>
<p data-pid="8RARCNBd">异常检测专栏(二):评价指标及常用数据集</p>
<p data-pid="KsDFsZ4T">异常检测专栏(一)异常检测概述</p>
<p data-pid="UfmwSuZx">BEV专栏(二)从BEVFormer看BEV流程(下篇)</p>
<p data-pid="ZPY-ky-u">BEV专栏(一)从BEVFormer深入探究BEV流程(上篇)</p>
<p data-pid="2aB_QQd2">可见光遥感图像目标检测(三)文字场景检测之Arbitrary</p>
<p data-pid="D8SwJddQ">可见光遥感目标检测(二)主要难点与研究方法概述</p>
<p data-pid="WnooUqZI">可见光遥感目标检测(一)任务概要介绍</p>
<p data-pid="3G-OGtUg">TensorRT教程(三)TensorRT的安装教程</p>
<p data-pid="Q5n2xC41">TensorRT教程(二)TensorRT进阶介绍</p>
<p data-pid="7TIL7bTW">TensorRT教程(一)初次介绍TensorRT</p>
<p data-pid="eipdIGzQ">AI最全资料汇总 | 基础入门、技术前沿、工业应用、部署框架、实战教程学习</p>
<p data-pid="D7Z-MkKh">计算机视觉入门1v3辅导班</p>
<p data-pid="97LwYpBN">计算机视觉交流群</p>
<p data-pid="qAMU79Ul">聊聊计算机视觉入门</p><br><br>
来源:https://www.cnblogs.com/wxkang/p/17416005.html
頁:
[1]