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

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

linux上安装库或者程序,一个是编译安装、一个是apt安装,这里选择固定版本用编译安装
Tags · opencv/opencv · GitHub
Download | CMake

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

https://download.pytorch.org/libtorch/cpu/libtorch-shared-with-deps-1.9.1%2Bcpu.zip

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下使用_AIchiNiurou的博客-CSDN博客_libtorch linux

Libtorch各类版本下载---持续更新_枫呱呱的博客-CSDN博客_libtorch下载

Libtorch:Linux系统中使用libtorch【下载、解压】【下载的libtorch是编译好的库文件,可直接使用】相关推荐

  1. Linux系统中top命令详解

    在Linux系统中top命令是常用的分析性能的工具,能够实时监控系统中各个进程资源占用的情况,这和windows中任务管理器有点类似. top参数详解 第一行,任务队列信息,同 uptime 命令的执 ...

  2. Linux系统中网络配置详解

    从linux诞生的那一天起,就注定了它的网络功能空前地强大.所以在linux系统中如何配置网络,使其高效,安全的工作就显得十分重要.下面我们就从网络设备的安装,网络服务的设置和网络安全性三个方面来介绍 ...

  3. Linux系统中网络配置详解(一)

       从linux诞生的那一天起,就注定了它的网络功能空前地强大.所以在linux系统中如何配置网络,使其高效,安全的工作就显得十分重要.下面我们就从网络设备的安装,网络服务的设置和网络安全性三个方面 ...

  4. Linux系统中的权限详解

    我们linux服务器上有严格的权限等级,如果权限过高导致误操作会增加服务器的风险.所以对于了解linux系统中的各种权限及要给用户,服务等分配合理的权限十分重要. 一.文件基本权限 首先看下linux ...

  5. Linux系统中wc命令详解

    Linux系统中的wc(Word Count)命令的功能为统计指定文件中的字节数.字数.行数,并将统计结果显示输出. 1.命令格式: wc [选项]文件... 2.命令功能: 统计指定文件中的字节数. ...

  6. linux给目录赋访问权限_【Linux】Linux系统中的权限详解

    我们linux服务器上有严格的权限等级,如果权限过高导致误操作会增加服务器的风险.所以对于了解linux系统中的各种权限及要给用户,服务等分配合理的权限十分重要. 一.文件基本权限 首先看下linux ...

  7. 在Linux系统中安装pycharm详解

    1. 在官网下载pycharm安装包 1.1进入官网:Download PyCharm: Python IDE for Professional Developers by JetBrains,选择P ...

  8. Linux系统常见的压缩与解压命令

    常见的压缩文件扩展名 1.*.Z compress程序压缩的文件 2.*.gz gzip程序压缩的文件 3..tar.gz tar程序打包的文件,其中经过gzip的压缩 4..tar tar程序打包的 ...

  9. linux系统下的rar压缩包解压简单流程(个人使用过的)

    1.rar压缩包 终端安装rar sudo apt install rar 解压命令使用 # cd + rar压缩包所在的位置 cd /home/host/nan_model_demo # 执行解压命 ...

  10. Linux系统中sysctl命令详解 sysctl -p、sysctl -a、sysctl -w

    sysctl命令用于运行时配置内核参数,这些参数位于/proc/sys目录下.sysctl配置与显示在/proc/sys目录中的内核参数.可以用sysctl来设置或重新设置联网功能,如IP转发.IP碎 ...

最新文章

  1. Java并发编程:AbstractQueuedSynchronizer的内部结构
  2. matlab对图像进行均值滤波_用K均值进行图像分割
  3. 图像内复制粘贴篡改取证matlab_[论文笔记] 篡改检测:RGB-N
  4. 像科学家一样思考python 第二版 epub_Kindle Python教程 – 像计算机科学家一样思考python(第2版) epub,mobi...
  5. .NET Core 3.1 编写混合 C++ 程序
  6. 前向验证对于模型的更新作用
  7. lnmp解析php,搭建LNMP,可以解析PHP文件-Go语言中文社区
  8. 翻车实录之Nature Medicine新冠单细胞文献|附全代码
  9. Apache 查看连接数
  10. nlp基础—11.条件随机场模型(CRF)模型补充
  11. 【HUD2072】单词数(字典树-统计一句话中不同单词的个数)
  12. 155.最小栈(力扣leetcode) 博主可答疑该问题
  13. office2020与2016版的不同_Office 2016 各版本之间不同(要使用Access 2016必须安装Office 2016专业版)...
  14. win7与internet时间同步出错_电脑时间同步出错怎么办 win7/xp电脑时间同步出错解决方法...
  15. 路由备份和路由聚合综合实验
  16. 拉格朗日插值的优缺点_如何直观地理解拉格朗日插值法?
  17. 射频斜波信号,Ramp 信号是怎么样的?
  18. 股票交易接口的开发工具?
  19. 专升本英语——语法知识——高频语法——第四节 定语从句(限制性定语从句-非限制性定语从句)【学习笔记】
  20. python (语音)信号拆分为数据块,计算短期能量和过零率

热门文章

  1. hadoop与spark的异同
  2. 编程要从娃娃抓起,北乔治亚大学教授的python编程指南在此
  3. 计算机专业:考研 VS 工作
  4. linux中文麻酱字_芝麻酱的瓶子上有这些文字,就直接扔吧,玉磨坊告诉你
  5. java程序员具体是做什么的?我来分享一天的工作内容
  6. 从获评毕马威中国领先地产科技50强 看贝壳的长期主义
  7. 逆向分析并修改Hello World程序《逆向工程核心原理》《软件逆向工程原理与实践》
  8. 使用计算机的快捷键有哪些,电脑操作的快捷键有哪些,都是什么作用?
  9. js中的事件委托或是事件代理详解
  10. TensorRT 4 基本介绍及TensorFlow模型转化Uff格式导入(二)