Qt配置Libtorch并简单测试

这篇具有很好参考价值的文章主要介绍了Qt配置Libtorch并简单测试。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

纯小白初次学习深度学习,根据目前所学、所查资料总结该配置文章,如有更好的方法将深度学习模型通过C++部署到实际工程中,希望学习交流。

软件版本

  • Python3.10.9
  • Pytorch2.0.0
  • Qt Creator 5.0.1 (Community)
  • Qt 1.15.2(MSVC 2019, 64bit)

一、下载Libtorch

  • 下载位置(可以按照参考的方法来下载):Pytorch

二、配置Qt Creator

  • Qt Creator配置:
    • 创建.pri文件;
    • 内部写入如下内容:
INCLUDEPATH += C:\soft_install\libtorch-win-shared-with-deps-2.0.0+cpu\libtorch\include
INCLUDEPATH += C:\soft_install\libtorch-win-shared-with-deps-2.0.0+cpu\libtorch\include\torch\csrc\api\include


LIBS += -LC:\soft_install\libtorch-win-shared-with-deps-2.0.0+cpu\libtorch\lib\
        -lasmjit\
        -lc10\
        -lclog\
        -lcpuinfo\
        -ldnnl\
        -lfbgemm\
        -lfbjni\
        -lkineto\
        -llibprotobuf\
        -llibprotobuf-lite\
        -llibprotoc\
        -lpthreadpool\
        -lpytorch_jni\
        -ltorch\
        -ltorch_cpu\
        -lXNNPACK

三、测试项目

  • 模型来源
    • B站:我是土堆;课程:PyTorch深度学习快速入门教程(绝对通俗易懂!)【小土堆】
  • 创建项目
    • .pro文件中引入Libtorch和Opencv的.pri
DISTFILES += \
    pri/opencv.pri \
    pri/libtorch.pri

include(./pri/opencv.pri)
include(./pri/libtorch.pri)
  • c++调用Libtorch接口时头文件

    Libtorch的头文件应该放在cpp或.h中最头的位置(忘记在哪里看到的了);否则需要添加

#undef slots
#include <torch/script.h>
#include <ATen/ATen.h>
#include <torch/torch.h>
#define slots Q_SLOTS
  • .pth 转 .pt
import torch
import torchvision.transforms
from PIL import Image
from torch import nn


test = TestSeq()
model = torch.load("../StuPytorch/testSeq_9.pth", map_location=torch.device("cpu"))

# 设置一个示例输入
example = torch.rand(1, 3, 32, 32)
# 使用 torch.jit.trace 生成 torch.jit.ScriptModule
model.eval()
traced_script_module = torch.jit.trace(model, example)
# 保存转换后的模型
traced_script_module.save("../StuPytorch/testSeq_9.pt")
  • 简单实现代码(见参考)
    • Pytorch实现
import torch
import torchvision.transforms
from PIL import Image
from torch import nn
from model import *

img_path = "../imgs/dog.jpg"
img = Image.open(img_path)
img = img.convert("RGB")
print(img)
transform = torchvision.transforms.Compose([torchvision.transforms.Resize((32, 32)),
                                            torchvision.transforms.ToTensor()])
image = transform(img)
print(image.shape)

model = torch.load("../StuPytorch/testSeq_29.pth", map_location=torch.device("cpu"))
print(model)

image = torch.reshape(image, (1, 3, 32, 32))
print(image)
model.eval()
with torch.no_grad():
    output = model(image)

class_id = {0: 'airplane', 1: 'automobile', 2: 'bird', 3: 'cat', 4: 'deer',
            5: 'dog', 6: 'frog', 7: 'horse', 8: 'ship', 9: 'truck'}
print(output)
print(output.argmax(1))
print(class_id[output.argmax(1).item()])


---输出
TestSeq(
  (model1): Sequential(
    (0): Conv2d(3, 32, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))
    (1): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
    (2): Conv2d(32, 32, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))
    (3): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
    (4): Conv2d(32, 64, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))
    (5): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
    (6): Flatten(start_dim=1, end_dim=-1)
    (7): Linear(in_features=1024, out_features=64, bias=True)
    (8): Linear(in_features=64, out_features=10, bias=True)
  )
)
tensor([[-1.0712, -2.4485,  1.6878,  0.9057,  1.1824,  1.8202,  0.0850,  0.5854,
         -2.2806, -2.1651]])
tensor([5])
dog
- C++实现
cv::Mat img = cv::imread("D:\\projects\\PyTorchStud\\imgs\\dog.png");
cv::cvtColor(img, img, cv::COLOR_BGR2RGB);
cv::Mat resizedImg;
cv::resize(img, resizedImg, cv::Size(32, 32));

//#停止autograd模块的工作,以起到加速和节省显存的作用
torch::NoGradGuard no_grad;
torch::jit::script::Module module;
module = torch::jit::load("D:\\projects\\PyTorchStud\\StuPytorch\\testSeq_29.pt");
std::cout << "Succeed in loading model" << std::endl;

//标签名
std::vector<std::string> labels;
labels.push_back("airplane");
labels.push_back("automobile");
labels.push_back("bird");
labels.push_back("cat");
labels.push_back("deer");
labels.push_back("dog");
labels.push_back("frog");
labels.push_back("horse");
labels.push_back("ship");
labels.push_back("truck");

torch::Tensor inputTensor = torch::from_blob(resizedImg.data, {1, 32, 32, 3}, torch::kByte);
//将张量的参数顺序转化为torch输入的格式[B,C,H,W]
inputTensor = inputTensor.permute({0, 3, 1, 2});
inputTensor = inputTensor.toType(torch::kFloat);
clock_t start_time = clock();

module.eval();
torch::Tensor outTensor = module.forward({inputTensor}).toTensor();
auto prediction = outTensor.argmax(1);
std::cout << "prediction:" << prediction << std::endl;

auto results = outTensor.sort(-1, true);
auto softmaxs = std::get<0>(results)[0].softmax(0);
auto indexs = std::get<1>(results)[0];

//输出运行时间
clock_t end_time = clock();
std::cout << "Running time is: "
          << static_cast<double>(end_time - start_time) / CLOCKS_PER_SEC * 1000 << "ms"
          << std::endl;

for (int i = 0; i < 1; ++i) {
    auto idx = indexs[i].item<int>();
    std::cout << "    ============= Top-" << i + 1 << " =============" << std::endl;
    std::cout << "    idx:  " << idx << std::endl;
    std::cout << "    Label:  " << labels[idx] << std::endl;
    std::cout << "    With Probability:  " << softmaxs[i].item<float>() * 100.0f << "%"
              << std::endl;
}
  

---输出结果
Succeed in loading model
prediction: 5
[ CPULongType{1} ]
Running time is: 118ms
    ============= Top-1 =============
    idx:  5
    Label:  dog
    With Probability:  100%
  • 结果说明
    • 由于训练的模型问题,有的图片分类错误。

参考:

Libtorch:pytorch分类和语义分割模型在C++工程上的应用文章来源地址https://www.toymoban.com/news/detail-411921.html

到了这里,关于Qt配置Libtorch并简单测试的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 最简单Anaconda+PyTorch深度学习环境配置教程

    深度学习小白从零开始学习配置环境,记录一下踩过的雷坑,做个学习笔记。 配置了好几次之后总结出来的最简单,试错成本最小的方案,分享给大家~ 安装顺序:Anaconda+CUDA+ CuDnn+Pytorch  Anaconda ,中文 大蟒蛇 ,是一个开源的Python发行版本,其包含了conda、Python等180多个科学

    2024年02月02日
    浏览(66)
  • 消息中间件Kafuka学习——初次配置使用

    MQ本质 : 例如 ActiveMQ、RabbitMQ、RocketMQ 等中间件。采用这种模型,本质就是将要推送的数据,不在存放在当前应用程序的内存中,而是将数据存放到另一个专门负责数据处理的应用程序中,从而实现服务解耦。 kafuka模型 : 如果你看不懂这些概念没关系,我会带着大家一起梳理

    2023年04月10日
    浏览(36)
  • HarmonyOS学习--初次下载安装和配置环境(windows)

    运行环境要求: 为保证DevEco Studio正常运行,建议电脑配置满足如下要求: 操作系统:Windows10 64位、Windows11 64位 内存:8GB及以上 硬盘:100GB及以上 分辨率:1280*800像素及以上 下载和安装DevEco Studio: 进入HUAWEI DevEco Studio产品页,单击下载列表右侧的下载按钮,下载DevEco Studi

    2024年01月24日
    浏览(54)
  • 小白的初次更新------Perl教程(上)

    大家好啊,我来更新第二篇博客了,这篇博客给大家分享一下Perl的教程 分为了上中下三篇哦~~~ ✌✌✌✌✌✌✌✌✌✌✌✌✌✌✌✌✌✌✌✌✌✌✌✌✌✌✌✌✌ 我滴主页 : ❤ ❤ ❤ 小石榴与兄棣伙的结合体(*^▽^*)_-CSDN博客  希望大家三连+关注!!! Perl 是 Practical Extrac

    2024年02月08日
    浏览(52)
  • 在conda虚拟环境中配置cuda+cudnn+pytorch深度学习环境(新手必看!简单可行!)

    本人最近接触深度学习,想在服务器上配置深度学习的环境,看了很多资料后总结出来了对于新手比较友好的配置流程,创建了一个关于深度学习环境配置的专栏,包括从anaconda到cuda到pytorch的一系列操作,专栏中的另外两篇文章如下,如果有不对的地方欢迎大家批评指正!

    2023年04月15日
    浏览(65)
  • QT+ Libtorch Microsoft C++ 异常: std::length_error

            visual studio编译qt+libtorch,载入模型时报错。 出错信息:         使用visual studio 编译QT+libtorch报错 未加载kernelbase.pdb,kernelbase.pdb 包含查找模块 KernelBase.dll 的源文件所需的调试信息。 0x00处(位于 view64.exe 中)有未经处理的异常: Microsoft C++ 异常: std::length_error,位

    2024年02月12日
    浏览(37)
  • Mac Apple Silicon M1/M2 homebrew miniforge conda pytorch yolov5深度学习环境搭建并简单测试MPS GPU加速

    笔者使用的是一台M2版本的Macbook Air,虽然苹果作为深度学习的训练机不太合适,但是由于macbook作为打字机实在是无可挑剔,所以使用macbook调试一下pytorch的代码再放到集群上训练或者直接在mac上调试运行代码都是不错的体验,本文以在mac上直接调试yolov5为目标,大概记录一下

    2024年02月02日
    浏览(52)
  • 小白的学习记录——Redis的简单使用

    Redis是什么? 不同于MySql,MySql是基于二维表存储数据, 而Redis是一个基于内存的key-value键值对结构数据库 我们为什么要用Redis? 基于内存存储,读写性很高 适合存储热点数据,(热点商品,资讯,新闻) 企业应用广泛 Redis是对MySql的补充,与其共存,大部分数据放在MySql中。

    2024年03月09日
    浏览(31)
  • 新手小白如何租用GPU云服务器跑深度学习

    最近刚学深度学习,自己电脑的cpu版本的pytorch最多跑个LexNet,AlexNet直接就跑不动了,但是作业不能不写,实验不能不做。无奈之下,上网发现还可以租服务器这种操作,我租的服务器每小时0.78人民币,简直是发现新大陆,又省下一大笔钱,太开心了吧(啪,什么乱七八糟的

    2023年04月15日
    浏览(50)
  • 快来看看萌新小白学习动态规划、深度优先搜索、贪心

    由于比赛临近,老师给我们布置了一些LeetCode算法题目,但是我在学完Hello算法的数据结构部分之后,就跑去学习算法第四版了。被一些安全比赛耽误,算法的学习进度比较慢,通过这篇文章就可以体现出我的技术还是比较菜的,还望谅解,哈哈。 LeetCode题目#206 反转链表 这是

    2024年04月14日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包