• 机器视觉系列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

     

  • 相关阅读:
    PDF Expert for mac(专业pdf编辑器)苹果电脑
    把数组排成最小的数_数组中的逆序对(归并统计法)_数字在升序数组中出现的次数_丑数(剑指offer)
    Simulink 自动代码生成电机控制:基于Keil软件集成
    安全基础~通用漏洞5
    设计模式-Factory
    IMBG120R220M1HXTMA1 采用D2PAK-7L封装,N型 MOSFET
    【SemiDrive源码分析】系列文章链接汇总(全)
    MobileViT——论文简述
    Spring依赖注入之@autowire注解详解
    基于tensorflow的咖啡豆识别
  • 原文地址:https://blog.csdn.net/weixin_42748604/article/details/122811491