码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 机器视觉系列4:C++部署pytorch模型


    系列文章目录

    第一章:Visual Studio 2019 动态链接库DLL建立

    第二章:VS动态链接库DLL调试

    第三章:VS2019 OpenCV环境配置 

    第四章:C++部署pytorch模型


    系列文章目录

    前言

    一、C++部署pytorch?

    二、Libtorch配置

    1.下载Libtorch

    2.VS2019配置Libtorch

    2.1配置VC++目录

     2.2配置链接器

     2.3Libtorch环境变量配置

    三、pytorch模型转换为Libtorch使用的pt

    四、C++中Libtorch的使用

    参考文献


    前言

    环境:visual studio 2019;OpenCV4.5.5;pytorch1.8;libtorch10.2;

    一、C++部署pytorch?

    pytorch模型在C++部署我知道的一般有两种方式,一种是讲pytorch模型转为onnx,使用opencv的DNN模块部署。一种是使用pytorch对应版本的Libtorch部署。onnx试验发现,转换模型过程之后,语义分割精度相差太大,最终选择Libtorch部署。

    二、Libtorch配置

    注意事项:1,Libtorch版本与pytorch版本要对应

                      2,Libtorch与pytorch的CPU/GPU要对应

    1.下载Libtorch

    Pytorch官网下载,有Release版本和Debug版本

     

    2.VS2019配置Libtorch

    2.1配置VC++目录

    首先配置包含目录和库目录,对应opencv一样的方法。

     2.2配置链接器

    依赖项添加所有lib,cmd中进入lib目录,使用dir /b *.lib>1.txt命令可生成目录,复制使用。

     2.3Libtorch环境变量配置

    可以在系统环境变量中添加,或直接把所有DLL复制进Release或者Debug目录就不用配置环境了。

    三、pytorch模型转换为Libtorch使用的pt

    1. # -*- coding:utf-8 -*-
    2. import torch
    3. model = torch.load("red_model.pth", map_location='cpu')
    4. model.eval()
    5. # 向模型中输入数据以得到模型参数
    6. example = torch.rand(1, 3, 512, 512) # N*C*H*W
    7. traced_script_module = torch.jit.trace(model, example)
    8. # 保存模型
    9. traced_script_module.save("red_models_trace.pt")

    四、C++中Libtorch的使用

    1. /****************************************
    2. @brief : 分割
    3. @input : 图像
    4. @output : 掩膜
    5. *****************************************/
    6. void SegmentAI(Mat& imgSrc, int width, int height)
    7. {
    8. cv::Mat transImg;
    9. cv::resize(imgSrc, transImg, cv::Size(512, 512));
    10. //Deserialize the ScriptModule
    11. torch::jit::script::Module Module = torch::jit::load("models_trace.pt");
    12. //Module.to(at::kCUDA);//XXX-GPU版本添加
    13. //processing
    14. //cv::cvtColor(image_transfomed, image_transfomed, cv::COLOR_BGR2RGB); //转RGB
    15. //Mat to tensor
    16. torch::Tensor tensorImg = torch::from_blob(transImg.data, { transImg.rows, transImg.cols,3 }, torch::kByte);
    17. tensorImg = tensorImg.permute({ 2,0,1 });
    18. tensorImg = tensorImg.toType(torch::kFloat);
    19. tensorImg = tensorImg.div(255);
    20. tensorImg = tensorImg.unsqueeze(0);
    21. //excute the model
    22. torch::Tensor output = Module.forward({ tensorImg }).toTensor();
    23. //tensor to Mat
    24. torch::Tensor output_max = output.argmax(1);
    25. output_max = output_max.squeeze();
    26. output_max = output_max == 1;
    27. output_max = output_max.mul(255).to(torch::kU8);
    28. output_max = output_max.to(torch::kCPU);
    29. Mat conjMask(Size(512, 512), CV_8UC1);
    30. memcpy((void*)conjMask.data, output_max.data_ptr(), sizeof(torch::kU8) * output_max.numel());
    31. //最大连通域
    32. vector<vector<Point>> contours;
    33. vector<Vec4i> hierarchy;
    34. double largest_area = 0;
    35. int largest_contour_index = 0;
    36. findContours(conjMask, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
    37. for (size_t i = 0; i < contours.size(); i++) // iterate through each contour.
    38. {
    39. double area = contourArea(contours[i]); // Find the area of contour
    40. if (area > largest_area)
    41. {
    42. largest_area = area;
    43. largest_contour_index = i;
    44. }
    45. }
    46. Mat conjMaskMax = Mat(512, 512, CV_8UC1, cv::Scalar::all(0));
    47. if (contours.size() != 0)
    48. {
    49. fillPoly(conjMaskMax, contours[largest_contour_index], Scalar(255, 255, 255), 8, 0);
    50. }
    51. resize(conjMaskMax, conjMaskMax, cv::Size(width, height));
    52. conjMaskMax.convertTo(imgSrc, CV_8UC1, 255, 0);
    53. }

     


    参考文献

    PyTorchicon-default.png?t=M5H6https://pytorch.org/


    windows+VS2019+PyTorchLib配置使用攻略 - 简书 (jianshu.com)icon-default.png?t=M5H6https://www.jianshu.com/p/2371ee8b45f0

     

  • 相关阅读:
    Learn Prompt-Prompt 高级技巧:思维链 Chain of Thought Prompting
    Unsupervised Learning of Monocular Depth Estimation and Visual Odometry 论文阅读
    el-row一行放置3个el-col,有时出现空行现象
    面试官:在原生input上面使用v-model和组件上面使用有什么区别?
    fdbus之CBaseMessage
    Taurus.MVC 微服务框架 入门开发教程:项目集成:4、默认安全认证与自定义安全认证。
    【云原生 | 从零开始学Kubernetes】十九、Kubernetes核心技术Service实战 下
    中国象棋棋盘识别
    华为云云耀云服务器L实例评测 |云服务器选购
    MySQL数据库管理
  • 原文地址:https://blog.csdn.net/weixin_42748604/article/details/122811491
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号