这几天学习C++部署深度模型,看到libtorch是现在人人都可以用普遍方法

文章目录

  • 1 安装opencv版本一定要3.4.12,否则与libtorch共同编译产生错误
  • 2 安装libtorch
    • C++代码
    • cmakelists
    • python导出模型程序

https://www.bilibili.com/video/BV1sV41117ky?spm_id_from=333.999.0.0 看评论聊天还行讲的听不清
pytorch 官方c++代码例子
https://github.com/pytorch/examples/tree/master/cpp

1 安装opencv版本一定要3.4.12,否则与libtorch共同编译产生错误

linux上安装库或者程序,一个是编译安装、一个是apt安装,这里选择固定版本用编译安装
https://github.com/opencv/opencv/tags?after=4.5.0
https://cmake.org/download/

  • 1 先下载个cmake,我用clion要求cmake20一下才行,直接调用bin下的cmake到clion就行
  • 2下载opencv3.4.12源码
  • 3 mkdir build,先安装一些依赖项,网上有,但是有两个库安装冲突,可以试试apitude install
  • 4 cmake-gui 配置一下,再配置一下,再generate
  • 5 make -j16 #我是8核心,一开始用j32直接死机
  • 6 sudo make install # 这里将build好的文件安装到/usr/local/include share之类的,但是调用链接还得加到cmakelist
  • 7 卸载进入build文件夹,make uninstall

2 安装libtorch

  • 1 我按pytorch官方示例的wget的cpu版本,加压就行,因为是直接编译好的库文件
    https://pytorch.org/cppdocs/installing.html

  • 2 用的代码是之前看到知乎上的分类推理resnet18.pt
    https://link.zhihu.com/?target=https%3A//github.com/BIGBALLON/PyTorch-CPP
    https://blog.csdn.net/weixin_44523062/article/details/120132110

将下面代码在clion中打开,配置cmakelist 和调试参数 restnet18.pt label.txt
生成可执行程序加入参数运行 就 ok 啦

C++代码

// One-stop header.
#include <torch/script.h>#include <cmath>
#include <iostream>
#include <memory>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/opencv.hpp>
#include <string>
#include <vector>#define kIMAGE_SIZE 224
#define kCHANNELS 3
#define kTOP_K 3bool LoadImage(std::string file_name, cv::Mat &image) {image = cv::imread(file_name);  // CV_8UC3if (image.empty() || !image.data) {return false;}cv::namedWindow("d");cv::imshow("d",image);cv::waitKey();cv::destroyAllWindows();cv::cvtColor(image, image, cv::COLOR_BGR2RGB);std::cout << "== image size: " << image.size() << " ==" << std::endl;// scale image to fitcv::Size scale(kIMAGE_SIZE, kIMAGE_SIZE);cv::resize(image, image, scale);std::cout << "== simply resize: " << image.size() << " ==" << std::endl;// convert [unsigned int] to [float]image.convertTo(image, CV_32FC3, 1.0f / 255.0f);return true;
}bool LoadImageNetLabel(std::string file_name,std::vector<std::string> &labels) {std::ifstream ifs(file_name);if (!ifs) {return false;}std::string line;while (std::getline(ifs, line)) {labels.push_back(line);}return true;
}int main(int argc, const char *argv[]) {if (argc != 3) {std::cerr << "Usage: classifier <path-to-exported-script-module> ""<path-to-lable-file>"<< std::endl;return -1;}torch::jit::script::Module module = torch::jit::load(argv[1]);std::cout << "== Switch to GPU mode" << std::endl;// to GPU
//    module.to(at::kCUDA);module.to(at::kCPU);std::cout << "== Model [" << argv[1] << "] loaded!\n";std::vector<std::string> labels;if (LoadImageNetLabel(argv[2], labels)) {std::cout << "== Label loaded! Let's try it\n";} else {std::cerr << "Please check your label file path." << std::endl;return -1;}std::string file_name = "";cv::Mat image;while (true) {std::cout << "== Input image path: [enter Q to exit]" << std::endl;std::cin >> file_name;if (file_name == "Q") {break;}if (LoadImage(file_name, image)) {auto input_tensor = torch::from_blob(image.data, {1, kIMAGE_SIZE, kIMAGE_SIZE, kCHANNELS});input_tensor = input_tensor.permute({0, 3, 1, 2});input_tensor[0][0] = input_tensor[0][0].sub_(0.485).div_(0.229);input_tensor[0][1] = input_tensor[0][1].sub_(0.456).div_(0.224);input_tensor[0][2] = input_tensor[0][2].sub_(0.406).div_(0.225);// to GPU
//      input_tensor = input_tensor.to(at::kCUDA);input_tensor = input_tensor.to(at::kCPU);torch::Tensor out_tensor = module.forward({input_tensor}).toTensor();auto results = out_tensor.sort(-1, true);auto softmaxs = std::get<0>(results)[0].softmax(0);auto indexs = std::get<1>(results)[0];for (int i = 0; i < kTOP_K; ++i) {auto idx = indexs[i].item<int>();std::cout << "    ============= Top-" << i + 1<< " =============" << std::endl;std::cout << "    Label:  " << labels[idx] << std::endl;std::cout << "    With Probability:  "<< softmaxs[i].item<float>() * 100.0f << "%" << std::endl;}} else {std::cout << "Can't load the image, please check your path." << std::endl;}}return 0;
}

cmakelists

cmake_minimum_required(VERSION 3.20)
project(testlibtorch)set(CMAKE_CXX_STANDARD 14)
set(Torch_DIR /home2/libtorch_apk/libtorch/share/cmake/Torch)# 寻找OpenCV库
find_package( OpenCV 3 REQUIRED )
# 添加头文件
include_directories( ${OpenCV_INCLUDE_DIRS} )find_package(Torch REQUIRED)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${TORCH_CXX_FLAGS}")add_executable(testlibtorchprediction.cpp)
target_link_libraries(testlibtorch "${TORCH_LIBRARIES}")
target_link_libraries( testlibtorch ${OpenCV_LIBS} )set_property(TARGET testlibtorch PROPERTY CXX_STANDARD 14)

python导出模型程序

import torch
import torchvisionmodel = torchvision.models.resnet18(pretrained=True)# Don't forget change model to eval mode
model.eval()
example = torch.rand(1, 3, 224, 224)
traced_script_module = torch.jit.trace(model, example)
traced_script_module.save("resnet18.pt")

2021-09-07libtorch在linux下使用相关推荐

  1. 测试linux下磁盘的读写速率

    1) 通过df -h命令查看磁盘情况 Filesystem            Size  Used Avail Use% Mounted on /dev/sda4             289G ...

  2. linux 8051 编译,[编译] 3、在Linux下搭建51单片机的开发烧写环境(makefile版)

    星期二, 10. 七月 2018 01:01上午 - beautifulzzzz 一.SDCC(Small Device C Compiler)编译环境搭建 SDCC是一个小型设备的C语言编译器,该编 ...

  3. linux获取随机数脚本,Linux下对拍脚本与随机数生成器

    对拍脚本 新建一个文档 check.sh 作为对拍脚本. #!/bin/bash while(true)do #死循环 ./data > .in #运行数据生成器,将数据输出到1.in ./st ...

  4. linux ant 编译,【Jenkins】linux下Jenkins集成ant进行编译并发送结果

    三个文章吧: 1 如何使用ant编译执行jmeter测试用例,并生成html报告 2 如何在Linux下搭建jenkins环境. 3 如何在Linux下搭建的jenkins中执行ant构建运行,并发送 ...

  5. linux env 变量,Linux下 输入 env 而得到的环境变量解读

    HOSTNAME=Master.Hadoop MAHOUT_HOME=/usr/hadoop/mahout-distribution-0.8 TERM=linux SHELL=/bin/bash HA ...

  6. linux 磁盘最大读写速度,测试linux下磁盘的读写速率

    1) 通过df -h命令查看磁盘情况 Filesystem            Size  Used Avail Use% Mounted on /dev/sda4             289G ...

  7. [2021]Linux下C语言qrencode二维码生成库的基本使用和ARM开发板移植

    文章目录 一.前言 二.准备所用到的环境以及版本信息 1.Ubuntu和内核版本 2.gcc和g++版本 3.交叉编译gcc和g++版本 4.开发板信息 三.开发环境编译&安装qrencode ...

  8. Linux下的tar归档及解压缩功能详解

    Linux下的tar归档及解压缩功能详解 一.Linux下解压缩工具 二.gzip工具的使用方法 三.其他解压缩工具 一.Linux下解压缩工具 二.gzip工具的使用方法 三.其他解压缩工具 一.L ...

  9. Linux下NTP时间同步服务器搭建

    NTP介绍 NTP 服务器是用于局域网服务器时间同步使用的,可以保证局域网所有的服 务器与时间服务器的时间保持一致,某些应用对时间实时性要求高的必须统一时 间. 互联网的时间服务器也有很多,例如 nt ...

  10. Linux下:文件与路径、用户管理、常用命令、vim

    文章目录 第一章: Linux文件与路径 1.1 文件结构 1.2 基本概念 1.3 基本命令信息 1.3.1 查看linux 系统信息(修改主机名) 1.3.2 ls 1.3.3 cd/pwd 1. ...

最新文章

  1. iOS-Swift中的递增(++)和递减(--)被取消的原因-官方答复
  2. 吃自助餐怎么样一个顺序吃法才合算?
  3. 溢出科普:heap overflow溢出保护和绕过
  4. kafka 的安装部署
  5. linux hive的作用,Hive的基本应用 - Hadoop和Hive的实践应用_服务器应用_Linux公社-Linux系统门户网站...
  6. OpenSSL新手自学:如何生成RSA私钥并用于数字签名
  7. Tapestry 教程(七)在Tapestry中一起使用Hibernate
  8. [译] Bulma: 2018年你应该关注的CSS框架
  9. js 判断是否是 整数
  10. Unity for Windows: III–Publishing your unity game to Windows Phone Store
  11. 调试时遇到 调试源程序时Loaderlock 的解决办法
  12. 开源:OpenJDK8 AARCH64(ARM)
  13. oracle weblogic 补丁,Oralce weblogic 补丁下载方法
  14. 2021美赛C题M奖思路
  15. MISRA C指导指南解读系列1(MISRA C是什么)
  16. 二十多年了,安全套市场还只有杜蕾斯、冈本、杰士邦
  17. 用jQuery做一个简单的用户注册页面
  18. Android: SQLite + ListView 实现 新闻 App
  19. 今天给自己分享下我的心得体会
  20. 最优化程序设计——最优化模型的建立

热门文章

  1. 出现段错误的常见原因与解决方案(一步解决)
  2. Pandas数据分析17——pandas数据清洗(缺失值、重复值处理)
  3. gitblit操作笔记
  4. 华为P8 电信青春版手机实现ssh登陆的方法
  5. popstate android4.3,IOS微信浏览器返回事件popstate监听 会立即执行一次
  6. 猫和老鼠c语言程序,语言猫和老鼠教案
  7. 端午节包粽子,在我们这一代可能“失传”了
  8. rabbitMQ是什么,为什么这么快
  9. 学习总结:springboot 的启动类Starters的理解
  10. linux基础方面的资料,「LINUX资料」基础命令概览(一)