libtorch安装和测试

libtorch安装和测试

  1. 说明

Libtorch是pytorch开发C++的API接口,可以实现pytorch训练的模型在C++部署和使用;目前下载了基于本电脑的情况下载对应的版本:

本电脑环境:

Pytorch安装版本GPU1.0;

CUDA安装版本10.0;

下载Libtorch版本:

< libtorch-win-shared-with-deps-1.5.0.zip>

< libtorch-win-shared-with-deps-1.2.0.zip>

< libtorch-win-shared-with-deps-1.0.0.zip>

下载地址:

https://download.pytorch.org/libtorch/cu100/libtorch-win-shared-with-deps-1.5.0.zip

https://download.pytorch.org/libtorch/cu100/libtorch-win-shared-with-deps-1.2.0.zip

https://download.pytorch.org/libtorch/cu100/libtorch-win-shared-with-deps-1.0.0.zip

  1. 安装过程

  2. 解压安装包,将安装包中的一下文件拷贝在工程中:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mb6MiJwc-1588736860246)(media/4c2df90bbaa2427298ba7c2ece636dd7.png)]

  1. 配置:bin、include、lib文件;

  2. Pytorch生成libtorch模型文件.pt;

traced_script_module = torch.jit.trace(model, img)
traced_script_module.save(“alexNet_car_dog_GPU.pt”)

  1. 在C++工程中实现相关的功能:
#include “stdafx.h” #pragma warning(disable:4244) #pragma warning(disable:4800) #pragma warning(disable:4996) #pragma warning(disable:4018) #pragma warning(disable:4267) #pragma warning(disable:4251) #pragma warning(disable:4275) #pragma warning(disable:4522) #pragma warning(disable:4273) #undef UNICODE #include <torch/script.h> #include <iostream> #include <memory> using namespace torch; #pragma comment(lib,“c10.lib”) //#pragma comment(lib,“c10_cuda.lib”) #pragma comment(lib,“torch.lib”) //#pragma comment(lib,“libprotobufd.lib”) #pragma comment(lib, “libprotobuf.lib”) #pragma comment(lib,“caffe2_detectron_ops_gpu.lib”) #include <opencv\cv.h> #include <opencv2\opencv.hpp> using namespace cv; #ifndef _DEBUG #pragma comment(lib,“opencv_core331.lib”) #pragma comment(lib,“opencv_imgcodecs331.lib”) #pragma comment(lib,“opencv_imgproc331.lib”) #pragma comment(lib,“opencv_videoio331.lib”) #pragma comment(lib,“opencv_highgui331.lib”) #else #pragma comment(lib,“opencv_core331d.lib”) #pragma comment(lib,“opencv_imgcodecs331d.lib”) #pragma comment(lib,“opencv_imgproc331d.lib”) #pragma comment(lib,“opencv_videoio331d.lib”) #pragma comment(lib,“opencv_highgui331d.lib”) #endif #include <torch\\csrc\\api\\include\\torch\\cuda.h> #include<time.h> int main() { bool bhr = torch::cuda::is_available(); torch::jit::script::Module module; try { module = torch::jit::load(“C:\\PycharmProject\\test\\alexNet_car_dog_CPU.pt”); } catch (const c10::Error& e) { std::cerr << “无法加载model.pt模型\n”; return -1; } torch::DeviceType device_type; //设置Device类型 device_type = torch::kCUDA; //torch::kCUDA and torch::kCPU torch::Device device(device_type, 0); module.to(device); cv::Mat img; img = imread(“C:\\Users\\sg\\Desktop\\DeepLearningData\\Test\\dog_1.jpg”);//读取灰 //调整大小 cv::resize(img, img, { 224,224 }); //cv::resize(img, img, { 28,28 }); cv::cvtColor(img, img, cv::COLOR_BGR2RGB); //浮点 img.convertTo(img, CV_32F, 1.0 / 255.0); torch::TensorOptions option(torch::kFloat32); auto img_tensor = torch::from_blob(img.data, { 1,img.rows,img.cols,img.channels() }, option); // 调整 opencv 矩阵的维度使其和 torch 维度一致 img_tensor = img_tensor.permute({ 0,3,1,2 }); //设备中 img_tensor = img_tensor.to(device); //均值归一化 //img_tensor[0][0] = img_tensor[0][0].sub_(0.485).div_(0.229); //img_tensor[0][1] = img_tensor[0][1].sub_(0.456).div_(0.224); //img_tensor[0][2] = img_tensor[0][2].sub_(0.406).div_(0.225); //获取系统时间 clock_t start = clock(); std::cout << start << std::endl; torch::Tensor result = module.forward({ img_tensor }).toTensor();//推理 //获取系统时间 clock_t endtime = clock(); std::cout << endtime << std::endl; std::cout << endtime - start << std::endl; auto max_result = result.max(1, true); auto max_index = std::get<1>(max_result).item<float>(); std::cout << “检测结果为:”; if (max_index == 0) std::cout << “cat” << max_index<< std::endl; else if (max_index == 1) std::cout << “dog” << max_index << std::endl; cv::imshow(“src”, img); cv::waitKey(-1); getchar(); return 0; }
  1. 测试结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jl8TM5IZ-1588736860247)(media/a7ca67816fb39a5c43ce13bda4d93830.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3OFZGN9X-1588736860248)(media/b4e7b9a161da4a3f817f7be0c96e007a.png)]

测试结果如上,正确的识别猫和狗;

  1. 遇见的问题

  2. Libtorch模型.PT加载失败;

在DEBUG模型下,只能加载CPU模型下的模型,因此在Pytorch生成CPU模型的.PT模型,问题解决;

  1. 识别结果错误;

识别结果错误,主要用于识别Tensor数据不正确,对比的Libtorch和Pytorch下Tensor数据不一样;主要因为CMat在填充Tensor时候错误;正确方式应该:

// opencv H x W x C torch C x H x W

auto img_tensor = torch::from_blob(img.data, {
1,img.rows,img.cols,img.channels() }, option);

// 调整 opencv 矩阵的维度使其和 torch 维度一致

img_tensor = img_tensor.permute({ 0,3,1,2 });

  1. Libtorch加载GPU模型失败;

测试用release模型下Libtorch库,可以正确加载模型,但是在测试过程中,识别图片错误,主要为转到GPU不正确导致,正确转换如下:

img_tensor = img_tensor.to(device);

备注:

使用工具:VS2015

Libtorch库:1.2
ensor = img_tensor.to(device);

备注:

使用工具:VS2015

Libtorch库:1.2

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值