精华内容
下载资源
问答
  • libtorchpytorch版本对应
    千次阅读
    2020-06-15 14:54:52

    使用libtorch调用c++接口,要保证下载的libtorch的版本和pytorch的版本对应

    至少使用低版本的pytorch和高版本的libtorch是没法成功的。反过来是可以的:即高版本的pytorch和低版本的libtorch。

    官网上目前最新的是1.5版本

    各个版本的libtorch下载参考https://blog.csdn.net/qq_37569355/article/details/104246813

    更多相关内容
  • [UPDATE 2020/04/15] :使用OpenCV4.3 / PyTorch1.4 / LibTorch1.4重新测试本教程,为初学者更新自述文件。 [UPDATE 2020/04/25] :更新CMakeLists.txt以适合C ++ 14,并使用CUDA10.0 / PyTorch1.5 / LibTorch1.5...
  • Golang的LibTorchPyTorch)绑定。 库的首要目的是针对从Python版本的PyTorch导出的序列化模型进行推理。 库也可以用于直接从Go编译TorchScript应用程序。 正在安装 $ go get github.com/orktes/go-torch 用法 go-...
  • 文章目录环境Libtorch下载Pytorch将.pth转为.pt文件python环境下的预测输出结果:rose新建pt模型生成文件输出结果:roseC++调用pytorch模型新建空项目pt_alex项目属性配置修改配置管理器属性>VC++目录>包含...

    参考:C++调用PyTorch模型:LibTorch

    环境

    Windows10
    VS2017
    CPU
    
    OpenCV3.0.0
    
    Pytorch1.10.2  torchvision0.11.3
    Libtorch1.10.2
    

    Libtorch下载

    Pytorch官网

    在这里插入图片描述
    解压后:注意红框文件夹路径,之后需要添加到项目属性配置中。
    在这里插入图片描述

    Pytorch将.pth转为.pt文件

    所使用的模型为基于AlexNet的分类模型:AlexNet:论文阅读及pytorch网络搭建

    python环境下的预测

    输出结果:rose

    在这里插入图片描述
    在这里插入图片描述

    新建pt模型生成文件

    # tmp.py
    
    import os
    import torch
    from PIL import Image
    from torchvision import transforms
    from model import AlexNet
    
    def main():
        device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
        print("using {} device.".format(device))
    
        # create model
        model = AlexNet(num_classes=5).to(device)
    
        image = Image.open("rose2.jpg").convert('RGB')
        data_transform = transforms.Compose(
            [transforms.Resize((224, 224)),
             transforms.ToTensor(),
             transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])
        img = data_transform(image)
        img = img.unsqueeze(dim=0)
        print(img.shape)
    
        # load model weights
        weights_path = "AlexNet.pth"
        assert os.path.exists(weights_path), "file: '{}' dose not exist.".format(weights_path)
    
        testsize = 224
    
        if torch.cuda.is_available():
            modelState = torch.load(weights_path, map_location='cuda')
            model.load_state_dict(modelState, strict=False)
            model = model.cuda()
            model = model.eval()
            # An example input you would normally provide to your model's forward() method.
            example = torch.rand(1, 3, testsize, testsize)
            example = example.cuda()
            traced_script_module = torch.jit.trace(model, example)
    
            output = traced_script_module(img.cuda())
            print(output.shape)
            pred = torch.argmax(output, dim=1)
            print(pred)
    
            traced_script_module.save('model_cuda.pt')
        else:
            modelState = torch.load(weights_path, map_location='cpu')
            model.load_state_dict(modelState, strict=False)
            example = torch.rand(1, 3, testsize, testsize)
            example = example.cpu()
            traced_script_module = torch.jit.trace(model, example)
    
            output = traced_script_module(img.cpu())
            print(output.shape)
            pred = torch.argmax(output, dim=1)
            print(pred)
    
            traced_script_module.save('model.pt')
    
    if __name__ == '__main__':
        main()
    

    输出结果:rose

    在这里插入图片描述

    在这里插入图片描述

    C++调用pytorch模型

    新建空项目pt_alex

    在这里插入图片描述

    项目属性配置

    修改配置管理器

    Release/x64
    在这里插入图片描述

    属性>VC++目录>包含目录

    添加:(libtorch解压位置)
    在这里插入图片描述

    注意还应有opencv目录:(继承值修改可参考
    在这里插入图片描述

    属性>VC++目录>库目录

    添加:
    在这里插入图片描述

    属性>链接器>输入>附加依赖项

    添加:
    在这里插入图片描述

    注意:
    如果后续出现error:找不到c10.dll,
    直接把该目录下的相应dll复制到项目pt_alex/x64/Release文件夹下。
    

    注意还应有opencv目录:(Debug下为lib*d.lib)
    在这里插入图片描述

    注意CUDA下的情况

    链接器>命令行,添加:

    /INCLUDE:?warp_size@cuda@at@@YAHXZ
    

    属性>C/C++

    常规>SDL检查:选择否
    语言>符合模式:选择否

    项目下新建test.cpp

    c++调用后分类结果不准确的参考:
    Ptorch 与libTorch 使用过程中问题记录
    注意python和c++中的图像预处理过程需要完全一致。

    // test.cpp
    
    #include <torch/script.h> // One-stop header.
    #include "torch/torch.h"
    #include <opencv2/opencv.hpp>
    #include "opencv2/core.hpp"
    #include "opencv2/imgproc.hpp"
    #include "opencv2/highgui.hpp"
    #include "opencv2/imgcodecs.hpp"
    #include <vector>
    #include <chrono>
    #include <string>
    #include <vector>
    #include <iostream>
    #include <memory>
    
    // class_list
    /*
    	"0": "daisy",
    	"1": "dandelion",
    	"2": "roses",
    	"3": "sunflowers",
    	"4": "tulips"
    */
    
    std::string classList[5] = { "daisy", "dandelion", "rose", "sunflower", "tulip" };
    
    std::string image_path = "rose2.jpg";
    
    int main(int argc, const char* argv[]) {
    
    	// Deserialize the ScriptModule from a file using torch::jit::load().
    	//std::shared_ptr<torch::jit::script::Module> module = torch::jit::load("../../model_resnet_jit.pt");
    	using torch::jit::script::Module;
    	Module module = torch::jit::load("model.pt");
    
    	std::cout << "测试图片:" << image_path << std::endl;
    
    	std::cout << "cuda support:" << (torch::cuda::is_available() ? "ture" : "false") << std::endl;
    	std::cout << "CUDNN:  " << torch::cuda::cudnn_is_available() << std::endl;
    	std::cout << "GPU(s): " << torch::cuda::device_count() << std::endl;
    
    	// module.to(at::kCUDA); //cpu下会在(auto image = cv::imread(image_path, cv::IMREAD_COLOR))行引起c10:error,未经处理的异常
    	module.eval();
    	module.to(at::kCPU);
    
    	//assert(module != nullptr);
    	//std::cout << "ok\n";
    
    	//输入图像
    	auto image = cv::imread(image_path, cv::IMREAD_COLOR);
    	cv::cvtColor(image, image, cv::COLOR_BGR2RGB);
    	cv::Mat image_transfomed = cv::Mat(cv::Size(224, 224), image.type());
    	cv::resize(image, image_transfomed, cv::Size(224, 224));
    
    	//cv::cvtColor(image_transfomed, image_transfomed, cv::COLOR_BGR2RGB);
    
    	// 转换为Tensor
    	torch::Tensor tensor_image = torch::from_blob(image_transfomed.data,
    		{ image_transfomed.rows, image_transfomed.cols,3 }, torch::kByte);
    	tensor_image = tensor_image.permute({ 2,0,1 });
    	tensor_image = tensor_image.toType(torch::kFloat);
    	auto tensor_image_Tmp = torch::autograd::make_variable(tensor_image, false);
    	tensor_image = tensor_image.div(255);
    	tensor_image = tensor_image.unsqueeze(0);
    	// tensor_image = tensor_image.to(at::kCUDA);
    	tensor_image = tensor_image.to(at::kCPU);
    
    	// 网络前向计算
    	at::Tensor output = module.forward({ tensor_image }).toTensor();
    	std::cout << "output:" << output << std::endl;
    
    	auto prediction = output.argmax(1);
    	std::cout << "prediction:" << prediction << std::endl;
    
    	int maxk = 5;
    	auto top3 = std::get<1>(output.topk(maxk, 1, true, true));
    
    	std::cout << "top3: " << top3 << '\n';
    
    	std::vector<int> res;
    	for (auto i = 0; i < maxk; i++) {
    		res.push_back(top3[0][i].item().toInt());
    	}
    	// for (auto i : res) {
    	// 	std::cout << i << " ";
    	// }
    	// std::cout << "\n";
    
    	int pre = torch::Tensor(prediction).item<int>();
    	std::string result = classList[pre];
    	std::cout << "This is:" << result << std::endl;
    
    	cvWaitKey();
    
    	return 0;
    	// system("pause");
    }
    
    

    出现以下报错不影响项目生成:
    在这里插入图片描述

    输出结果:rose

    在这里插入图片描述

    C# Demo

    新建C++空项目,封装DLL

    • 传入图像路径
    • 传出类别序号
    • // class_list
      /*
      “0”: “daisy”,
      “1”: “dandelion”,
      “2”: “roses”,
      “3”: “sunflowers”,
      “4”: “tulips”
      */

    源码

    // test.cpp
    
    #include <torch/script.h> // One-stop header.
    #include "torch/torch.h"
    #include <opencv2/opencv.hpp>
    #include "opencv2/core.hpp"
    #include "opencv2/imgproc.hpp"
    #include "opencv2/highgui.hpp"
    #include "opencv2/imgcodecs.hpp"
    #include <vector>
    #include <chrono>
    #include <string>
    #include <vector>
    #include <iostream>
    #include <memory>
    
    #include "test.h"
    
    std::string classList[5] = { "daisy", "dandelion", "rose", "sunflower", "tulip" };
    
    int TestAlex(char* img)
    {
    	// Deserialize the ScriptModule from a file using torch::jit::load().
    	//std::shared_ptr<torch::jit::script::Module> module = torch::jit::load("../../model_resnet_jit.pt");
    	using torch::jit::script::Module;
    	Module module = torch::jit::load("D:/model.pt");
    
    	// ...... 略
    
    	int pre = torch::Tensor(prediction).item<int>();
    	std::string result = classList[pre];
    	//std::cout << "This is:" << result << std::endl;
    
    	return pre;
    	// system("pause");
    }
    
    //test.h
    
    #pragma once
    
    #include <windows.h>
    #include <opencv2/opencv.hpp>
    
    extern "C" __declspec(dllexport) int TestAlex(char* img);
    

    项目属性

    • 输出目录改为C#项目路径
      在这里插入图片描述

    点击生成解决方案,生成DLL

    新建C#窗体应用

    DLLFun.cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Runtime.InteropServices;
    
    namespace AlexDemo
    {
        class DllFun
        {
            public string img;
    
            [DllImport("AlexDLL.dll", CallingConvention = CallingConvention.Cdecl)]
            public extern static int TestAlex(string img); // 注意 C++ char* 对应 C# string
        }
    }
    
    

    窗体Form2.cs核心代码

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    using System.IO;
    using AlexDemo;
    
    namespace Demo
    {
        public partial class Form2 : Form
        {
            public Form2()
            {
                InitializeComponent();
                this.Load += new EventHandler(Form2_Load); //窗体启动后自动执行事件
            }
    
            private void Form2_Load(object sender, EventArgs e)
            {
                string[] classList = { "daisy", "dandelion", "rose", "sunflower", "tulip" };
                string fname = "path.txt";
                //StreamReader sr = new StreamReader(fname, Encoding.Default);
                StreamReader sr = new StreamReader(fname, Encoding.GetEncoding("gb2312"));
                string line = sr.ReadLine();
                //读取txt文件
                if (line != null)
                {
                    this.pictureBox1.Image = Image.FromFile(line);
                    if (line.Contains("\\"))
                    {
                        line = line.Replace("\\", "/");
                    }
                }
                int result;
                result = DllFun.TestAlex(line);
                //string r = result.ToString();
                label2.Text = classList[result];
    
                //StringBuilder img;
                //img = new StringBuilder(1024);
                //img.Append(line);
                //int r = DllFun.TestAlex(img);
                //label2.Text = "123";
            }
    
            private void label1_Click(object sender, EventArgs e)
            {
    
            }
    
        }
    }
    
    

    结果

    在这里插入图片描述

    展开全文
  • pytorch常用AIP笔记,rand(),dot(),mul(),slice(),view(),unsqueeze(),squeeze(),purmmute(),ExpandingArray ......持续更新

    当作一个笔记,发现新的会更新

    at::Tensor.size()/at::Tensor.size(int num)

    返回张量各个维度的尺度

    at::Tensor.sizes() :返回张量所有维度的尺度
    at::Tensor.size(int num) :返回第num维度的尺度(从下标0开始)

    at::Tensor a = torch::ones({2, 2, 3}); //a维度{2, 2, 3)
    //a.size() = {2, 2, 3};
    //a.size(0) = 2;
    //a.size(1) = 2;
    //a.size(2) = 3'
    

    torch.rand()

    取随机数

    //4张照片,每张3个通道,每个通道28行28列的像素
    at::Tensor a = torch.rand(4,3,28,28);
    //torch.size([4, 3, 28, 28])
    

    torch的截取

    //在第一个维度上取0和1,在第二个维度上取1,2,
    //等同于取第一、第二张图片中的第二个通道与第三个通道
    print(a[:2, -2:, :, :].shape)  //[前两个,后两个,,]左开右闭
    //torch.Size([2, 2, 28, 28])
    

    tensor.slice()

    切片

    tensor.select(input, dim, index, out=None)

    参数input(Tensor):表示被选择的tensor
    参数dim(int):表示是在哪个维度做选择。为1表示,在列上做选择。为0表示在行上做选择。
    参数index(LongTensor):表示需要选择出的行或者列。 它是一个数组为Long形的tensor。(举一个列子,如果被选择的tensor是一个二维的。index是一维的[1,4,8],dim=0,那么就是选出第2行,第5行,第9行,下标从0开始。当然输入的tensor可能是多维的)
    参数out(Tensor, optional):表示的输出到到哪个tensor上去,该参数可选。

    at::tensor torch.dot(input, tensor)/at::tensor tensor.dot(input)

    两个张量点乘运算,即对应位置相乘再相加

    //1.
    torch.dot(torch::tensor({2, 3}), torch::tensor({2, 1}));
    //tensor(7)
    
    //2.
    at::tensor a = torch::tensor({2, 3});
    a.dot(torch.tensor({2, 1});
    

    at::tensor torch.mul(input, tensor)/at::tensor tensor.mul(input)

    两个张量点乘运算,例子和dot()差不多。

    at::tensor torch.mm(input, tensor)/at::tensor tensor.mm(input)

    两个二维矩阵做矩阵乘法运算,例子和dot()差不多。

    at::tensor torch.matmul(input, tensor)/at::tensor tensor.matmul(input)

    两个高维矩阵做矩阵乘法运算,与mm区别是mm()只能是二维,matmul()可以是二维及以上维度做矩阵乘法运算
    高维tensor相乘要求
    · 2维以上"的尺寸必须完全对应相等;
    · 2维"具有实际意义的单位,只要满足矩阵相乘的尺寸规律即可。
    1.相同维度的张量
    at::Tensor A.shape =(b,m,n), B.shape = (b,n,k);
    torch::matmul(A,B).shape = (b,m,k)
    2.不同维数的张量
    at::Tensor A.shape =(m,n), B.shape = (b,n,k), C.shape=(k,l);
    torch::matmul(A, B).shape = (b, m, k)
    torch::matmul(B, C).shape = (b, n, l)

    at::tensor view()

    将张量重排维度,相当于resize_()功能。把原先tensor中的数据按照行优先的顺序排成一个一维的数据(这里应该是因为要求地址是连续存储的),然后按照参数组合成其他维度的tensor。

    //初始化一个a
    at::tensor a = torch::arange(0, 6);
    //a : tensor([0, 1, 2, 3, 4, 5])
    a.view(2, 3);
    //a : tensor([[0, 1, 2], 
    //			  [3, 4, 5]])
    

    at::tensor torch.unsqueeze(int num)/at::tensor torch.squeeze(int num)

    解压缩/压缩,或者说增加维度/减少维度

    unsqueeze():增加维度

    at::tensor a = torch::tensor({{0, 1, 2}, {3, 4, 5}});
    //当前维度(2, 3)
    //a : tensor([[0, 1, 2],  
    //			  [3, 4, 5]])
    //在第一维增加一个维度
    a.unsqueeze(1) //增加第一维度,注意:第1维(下标从0开始)增加“1”,倒数第二个就是unsqueeze(-2)
    //当前维度(2, 1, 3)
    //a : tensor([[[0, 1, 2]], 
    //             [[3, 4, 5]]])
    

    squeeze():减少维度
    squeeze()与unsqueeze()操作相反,继续上面的例子

    //当前维度(2, 1, 3)
    //a : tensor([[[0, 1, 2]], 
    //             [[3, 4, 5]]])
    a.squeeze(1) //降低第一维度,index和unsqueeze()相同规则
    //当前维度(2, 3)
    //a : tensor([[0, 1, 2],  
    //			  [3, 4, 5]])
    

    at::tensor tensor.permute()

    将张量tensor的维度换位

    //一个维度为(3, 28, 28)的照片
    at::Tensor a = torch::ones({3, 28, 28}); 
    a.purmute(1, 2, 0); //根据原维度的维度下标(从0开始)指定新维度
    //维度变为(28, 28, 3)
    

    template <size_t D, typename T = int64_t>

    class ExpandingArray

    一个实用程序类,它接受一个包含多个值的容器,或者一个在内部重复“D”次的值。这对于表示多维参数很有用,但通常在所有维度上大小相同。例如,二维卷积的核大小有x和y长度,但x和y通常相等。在这种情况下,只需将’3’传递给一个’ExpandingArray<2>',它就会“扩展”到`{3,3}。(API注释)

    其实质就是一个大小为D的std::array<int64_t> value的数组,增加了一些构造方法,如std::initializer_list list,std::vector<int64_t> vec,at::ArrayRef values等。其类名expanding array也就是扩展数组,意思就是他构造函数里面其中一个是传入一个int_64 single_size,即可将它本身的array数组全部填为这个single_size,这就是所谓的“扩展”了。

    需要注意的一点是使用容器初始化时,传入的容器如vector等的大小须与ExpandingArray的大小D相同,否则会报错。

    template <size_t D>

    struct ConvOptions

    用于卷积类初始化时的卷积模块

    ConvOptions(
          int64_t in_channels,  //输入通道数
          int64_t out_channels, //输出通道数
          ExpandingArray<D> kernel_size) :
                    in_channels_(in_channels),
                    out_channels_(out_channels),
                    kernel_size_(std::move(kernel_size)) {}
    

    TORCH_MODULE(Name)

    使用宏创建一个类
    源码:

    #define TORCH_MODULE_IMPL(Name, ImplType)                              \
      class Name : public torch::nn::ModuleHolder<ImplType> { /* NOLINT */ \
       public:                                                             \
        using torch::nn::ModuleHolder<ImplType>::ModuleHolder;             \
        using Impl = ImplType;                                             \
      }
    
    /// Like `TORCH_MODULE_IMPL`, but defaults the `ImplType` name to `<Name>Impl`.
    #define TORCH_MODULE(Name) TORCH_MODULE_IMPL(Name, Name##Impl)
    

    torch::Device

    表示张量所在的计算设备。一个设备由一个类型和一个设备索引或序号来唯一标识,该类型指定了它所属的机器类型(例如CPU或CUDA GPU),该设备索引或序号在有多个特定类型时标识特定的计算设备。设备索引是可选的,在默认状态下(抽象地)表示“当前设备”。此外,如果显式存储了设备索引的值,则有两个约束:
    1.负指数代表当前设备,非负指数代表具体设备,
    2.当设备类型为CPU时,设备索引必须为零。

    torch::Device devive(torch::kCPU):
    
    展开全文
  • PyTorch模型 LibTorch 一、配置LibTorch 1.1 下载 下载地址:https://pytorch.org/ 下图分别是GPU和CPU的下载地址,GPU版本需要根据CUDA的版本确定。箭头指向为Release版,下方是Debug版。 下载完成后,...

    笔者的PyTorch模型为*.pth格式,将其转换为*.pt格式,并通过LibTorch调用。

    一、配置LibTorch

    1.1 下载

    下载地址:https://pytorch.org/ 

    下图分别是GPU和CPU的下载地址,GPU版本需要根据CUDA的版本确定。箭头指向为Release版,下方是Debug版。

    下载完成后,…\libtorchCPU\lib 添加至环境变量

       

    1.2 配置方法1:VS直接配置

    注意:LibTorch的头文件要放在前/上面,否则报错

    1.3 配置方法2:CMakeLists配置

    分享给有需要的人,代码质量勿喷。

    1.3.1 CmakeLists.txt与测试代码

    (1)CmakeLists.txt

    cmake_minimum_required(VERSION 3.0 FATAL_ERROR)
    project(xjTestLibTorch)
    
    find_package(Torch REQUIRED)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${TORCH_CXX_FLAGS}")
    
    add_executable(xjTestLibTorch xjTestLibTorch.cpp)
    target_link_libraries(xjTestLibTorch "${TORCH_LIBRARIES}")
    set_property(TARGET xjTestLibTorch PROPERTY CXX_STANDARD 14)
    
    if (MSVC)
      file(GLOB TORCH_DLLS "${TORCH_INSTALL_PREFIX}/lib/*.dll")
      add_custom_command(TARGET xjTestLibTorch
                         POST_BUILD
                         COMMAND ${CMAKE_COMMAND} -E copy_if_different
                         ${TORCH_DLLS}
                         $<TARGET_FILE_DIR:xjTestLibTorch>)
    endif (MSVC)

    (2)xjTestLibTorch.cpp

    #include <torch/torch.h>
    #include <iostream>
    
    int main() {
      torch::Tensor tensor = torch::rand({2, 3});
      std::cout << tensor << std::endl;
    }

    1.3.2 编译生成

    (1)使用CMake设置源码与编译路径;选择VS版本与设置x64。单击Configure后会报错。

    (2)设置Torch_DIR(.../libtorchCPU /share/cmake/Torch)后单击Configure即可。Configure done。

    (3)单击Generate。Generate done。

       

    (4)VS2017编译

    生成一个2*3的张量即为成功。

    二、模型转换

    这篇文章写的挺好:https://pytorch.apachecn.org/docs/1.0/cpp_export.html

    import torch
    import torchvision.models as models
    from PIL import Image
    import numpy as np
    
    device = torch.device('cpu')
    model = torch.load("test.pth", map_location=device)
    
    model.eval()
    # print(model)
    
    example = torch.rand(1, 1, 224, 224)
    
    traced_script_module = torch.jit.trace(model, example)
    
    output = traced_script_module(torch.ones(1, 1, 224, 224))
    print(output)
    
    # ----------------------------------
    traced_script_module.save("test.pt")
    

    三、模型应用

    此案例为路面图像中灌缝的语义分割,生成灌缝二值图。

    3.1 CmakeLists.txt与模型调用代码

    (1)CMakeLists.txt添加了OpenCV

    cmake_minimum_required(VERSION 3.0.0 FATAL_ERROR)
    project(SS_pouring)
    
    find_package(Torch REQUIRED)
    find_package (OpenCV 4 REQUIRED)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${TORCH_CXX_FLAGS}")
    
    message(STATUS "Pytorch status:")
    message(STATUS "    libraries: ${TORCH_LIBRARIES}")
    
    add_executable(SS_pouring SS_pouring.cpp)
    target_link_libraries(SS_pouring "${TORCH_LIBRARIES}")
    target_link_libraries(SS_pouring ${OpenCV_LIBS})
    set_property(TARGET SS_pouring PROPERTY CXX_STANDARD 14)
    
    include_directories (${OpenCV_INCLUDE_DIRS})
    link_directories    (${OpenCV_LIBRARY_DIRS})
    
    if (MSVC)
      file(GLOB TORCH_DLLS "${TORCH_INSTALL_PREFIX}/lib/*.dll")
      add_custom_command(TARGET SS_pouring
                         POST_BUILD
                         COMMAND ${CMAKE_COMMAND} -E copy_if_different
                         ${TORCH_DLLS}
                         $<TARGET_FILE_DIR:SS_pouring>)
    endif (MSVC)

    (2)模型调用代码 SS_pouring.cpp

    核心点包括:模型调用、图像转Tensor、网络前向计算等。

    //LibTorch库放在最上面
    #include "torch/script.h"
    #include "torch/csrc/api/include/torch/torch.h"
    
    #include <iostream>
    #include <memory>
    
    
    #include "opencv2/opencv.hpp"
    
    using namespace std;
    
    
    int main(int argc, const char* argv[])
    {
    	//1 core 加载模型
    	torch::jit::script::Module xjModule = torch::jit::load("F:/SS_pouring/sourceCode/test.pt");
    	//xjModule.to(at::kCUDA);//XXX-GPU版本添加
    	std::cout << "1 load pt\n";
    
    	//2 图像预处理
    	auto imageO = cv::imread("F:/testImage.jpg", cv::ImreadModes::IMREAD_COLOR);
    	int cols = imageO.cols;
    	int rows = imageO.rows;
    	cv::Mat imageT;
    	cv::resize(imageO, imageT, cv::Size(1024, 512));
    	std::cout << "2 image\n";
    
    	//3 core 图像转换为Tensor
    	torch::Tensor tensorImage = torch::from_blob(imageT.data, { imageT.rows, imageT.cols,1 }, torch::kByte);
    	tensorImage = tensorImage.permute({ 2,0,1 });
    	tensorImage = tensorImage.toType(torch::kFloat);
    	tensor_image = tensor_image.unsqueeze(0).to(at::kCUDA);//XXX-GPU 使用 .to(at::kCUDA)
    	std::cout << "3 tensor\n" << std::endl;
    
    	//4 core 网络前向计算
    	at::Tensor output0 = xjModule.forward({ tensorImage }).toTensor();
    	std::cout << "4 forward\n";
    
    	//5 处理
    	torch::Tensor tensorRes = output0.squeeze();
    	tensorRes = tensorRes.to(torch::kCPU).detach();
    	tensorRes = tensorRes.mul(255).clamp(0, 255).to(torch::kU8);
    	std::cout << "5 process\n";
    
    	//6 保存
    	cv::Mat resultImg = cv::Mat(512, 1024, 0);
    	//将ten_wrp数据存为resultImage格式
    	std::memcpy((void *)resultImg.data, tensorRes.data_ptr(), sizeof(torch::kU8) * tensorRes.numel());
    	cv::Mat resultImage = cv::Mat(rows, cols, 0);
    	cv::resize(resultImg, resultImage, cv::Size(cols, rows));
    	//保存为result.jpg
    	cv::imwrite("F:/testResult.png", resultImage);
    	std::cout << "test OK\n";
    }

    3.2 CM编译-VS运行-结果

    原图

       

    二值图
    原图与二值图叠加显示

    展开全文
  • 利用LibTorch部署PyTorch模型

    千次阅读 2021-10-21 14:38:44
    PyTorch如今发布到1.1稳定版本,新增的功能让模型部署...虽然说安装,其实就是下载官方的LibTorch包而已,从官方网站PyTorch中选择PyTorch(1.1),libtorch,以及cuda的版本,其中会出现下载链接,这里为cuda9.0的链接 ...
  • pytorchlibtorch,全网最全资料

    千次阅读 2020-10-29 15:20:47
    使用libtorchpytorch 部署到移动端去 使用resnet50举例 使用代码将pytorch模型转为libtorch import torch import torchvision.models as models from PIL import Image import numpy as np #加载测试图片调整大小 ...
  • 最近接到了一个需求,需要把一个用python基于pytorch...①如何安装python和pytorch请自行百度; ②进入pytorch官网,下载合适版本的libtorch https://pytorch.org/,因为我的需求是移植到Arm平台上,没有GPU以及CUDA
  • pytorch libtorch

    2019-03-19 08:18:28
    https://www.cnblogs.com/yeshengCqupt/p/10448476.html
  • 08 PyTorch vs LibTorch:程序链接的共享库 通过使用ldd命令,Gemfield观察到了PyTorch所链接的共享库和LibTorch所链接的共享库的区别: intel mkl:pytorch为conda安装的动态库,LibTorch(libdeepvac版)为静态库...
  • pytorchlibtorch(c++)注意事项

    千次阅读 2019-07-20 12:47:46
    如果是自己写的模型,需要按照改成torch scirpt形式,才能用torch.jit.trace()转成libtorch可用模型。 举个栗子: 这里面有个判断语句,那么我们需要转换成一个torch.jit.ScriptModule,并添加装饰器@torch.jit....
  • pytorchpytorch模型转libtorch模型

    千次阅读 2019-11-06 20:44:21
    https://blog.csdn.net/seasermy/article/details/99677789
  • 一、下载libtorch 二、在任意位置新建1个文件夹,并在文件夹新建2个文件 example-app.cpp #include <torch/torch.h> #include <iostream> int main() { torch::Tensor tensor = torch::rand({...
  • 一个基于libtorchpytorch c ++)的c ++可训练语义分割库。 骨干网:ResNet,ResNext。 架构:到目前为止,FPN,U-Net,PAN,LinkNet,PSPNet,DeepLab-V3,DeepLab-V3 +。 英文| 基于LibTorch的带有神经网络的C ++...
  • 在windows10下安装libtorchpytorch1.0)

    万次阅读 2018-12-14 15:00:13
    安装pytorch1.0 去 https://pytorch.org/get-started/locally/ 寻找自己需要得版本 在我环境下得命令是: ...顺带安装以下libtorch 命令是 Download here: https://download.pytorch.org/l...
  • 利用LibTorch调用PyTorch训练好的模型

    千次阅读 2019-07-08 22:41:05
    PyTorch如今发布到1.1稳定版本,新增的功能让...虽然说安装,其实就是下载官方的LibTorch包而已,从官方网站中选择PyTorch(1.1),libtorch,以及cuda的版本,其中会出现下载链接,这里为cuda9.0的链接 https://d...
  • 顾名思义,PyTorch的主要接口是Python编程语言。尽管Python是合适于许多需要动态性和易于迭代的场景,并且是首选的语言,但同样的,在许多情况下,Python的这些属性恰恰是不利的。后者通常适用的一种环境是要求生产-...
  • 编译libtorch/pytorch

    2019-11-07 15:59:48
    git clone --recursive https://github.com/pytorch/pytorch.git Anaconda命令行 set USE_CUDA=ON set BUILD_TEST=FALSE set MAX_JOBS=2 不设置MAX_JOBS,内存会爆 scripts目录下 build_windows.bat ...
  • windows 也就是基于libtorch库,一个基于深度学习的C++库 1.按照以下操作将已经训练好的模型转换成pt格式保存 ...(注意事项:安装libtorch的版本最好跟安装Pytorch版本一致;) 比如,我本机上的Pytorch的版
  • libtorch 调用pytorch模型

    千次阅读 2019-06-27 16:42:07
    我测试的速度没有提升 int main(int argc, const char* argv[]) { //size_t len = url.length();//获取字符串长度 ... char sBuf[1024];... if (GetModuleFileNameA(NULL, sBuf, sizeof(sBuf))) ...
  • 安装libtorch pytorch的c++接口,PyTorch C ++ API - 也称为LibTorch,能够将pytorch训练的模型在C++环境下进行部署。它可以直接从官网下载得到Start Locally | PyTorch 我的电脑没有GPU,因此计算模式选择CPU,...
  • 1、pytorch保存模型 1.1、在pytorch训练出可用的模型 后续以torch内置的resnet18为例 1.2、使用torch.jit保存模型 # 加载预训练模型 。。。。
  • Ubuntu18.04安装Pytorch

    2022-03-30 15:18:22
    参考:https://www.cnblogs.com/moon3/p/12199588.html
  • pytorchlibtorch安装 PyTorch 是Torch7 团队开发的,从它的名字就可以看出,其与Torch 的不同之处在于PyTorch 使用了Python 作为开发语言。所谓“Python first”,同样说明它是一个以Python 优先的深度学习框架,...
  • Gotch为Pytorch C ++ API(Libtorch)创建了一个薄包装器,以利用其已优化的C ++张量API(约1400多种)和带有CUDA支持的动态图计算,并提供惯用的Go API以在Go中开发和实现深度学习。 一些功能是 全面的Pytorch...
  • 注意里面只有代码,因为本人已转移动端xr方向,所以没来得及写详细的注释,对应博文:ssd pytorchlibtorch c++实现,谨慎下载,只是因为要的博友有点多,一个个发送实在麻烦,所以放在这里,不能下载可以发邮箱
  • pytorch 下载对应版本的libtorch

    千次阅读 2021-01-13 14:01:10
    1.查看pytorch版本 终端输入 import torch print(torch.__version__) 2.查看cuda版本 方法1: cat /usr/local/cuda/version.txt 方法2: nvcc -V 3.点击这里选择合适的libtorch版本 请注意,在Linux上提供了两种...
  • 一般,打开网页搜索libtorch主要都是用原方法安装git的时候出现了报错,才来这里搜索安装教程的。这里就不得不吐槽一下git,多种原因,可能导致失败的情况发生,其中一个可能git是外网,有可能被强了。这就需要你,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,205
精华内容 882
关键字:

libtorch pytorch 安装