ubuntu16.04_libtorch1.8.1_opencv4.5.3
1.libtorch+opencv示例
#include <iostream>
#include "torch/script.h"
#include "torch/torch.h"
#include "opencv2/core.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/imgcodecs.hpp"
#include <opencv2/imgproc/types_c.h>
#include <vector>
int main()
{
/* 配置参数 */
std::vector <float> mean_ = {0.485, 0.456, 0.406};
std::vector <float> std_ = {0.229, 0.224, 0.225};
char path[] = "1.jpg";
// 读取图片
cv::Mat image = cv::imread(path);
if (image.empty())
fprintf(stderr, "Can not load image\n");
// 转换通道,
cv::cvtColor(image, image, CV_BGR2RGB);
cv::Mat img_float;
image.convertTo(img_float, CV_32F, 1.0 / 255);
// resize, 测试一个点数据
cv::resize(img_float, img_float, cv::Size(256, 128));
//std::cout << img_float.at<cv::Vec3f>(256, 128)[1] << std::endl;
// 转换成tensor
auto img_tensor = torch::from_blob(img_float.data, {1, 3, 256, 128}, torch::kFloat32);
//img_tensor = img_tensor.permute({0,3,1,2});
// tensor标准化
for (int i = 0; i < 3; i++) {
img_tensor[0][0] = img_tensor[0][0].sub_(mean_[i]).div_(std_[i]);
}
// // 构造input
// //auto img_var = torch::autograd::make_variable(img_tensor, false); //tensor->variable会报错
// std::vector<torch::jit::IValue> inputs;
// inputs.emplace_back(img_tensor); //向容器中加入新的元素, 右值引用
// //加载pytorch模型
// //std::shared_ptr<torch::jit::script::Module> module = torch::jit::load("../model/model_int.pt");
// torch::jit::script::Module module = torch::jit::load("../xxx.pt");
// assert(module != nullptr);
// //前向
// //at::Tensor output_image = module->forward(inputs).toTensor();
// at::Tensor output_image = forward(inputs).toTensor();
// std::cout << output_image;
//std::cout << img_tensor;
return 0;
}
cv::Mat convertTo3Channels(cv::Mat binImg)
{
cv::Mat three_channel = cv::Mat::zeros(binImg.rows, binImg.cols, CV_8UC3);
std::vector<cv::Mat> channels;
for (int i=0;i<3;i++)
{
channels.push_back(binImg);
}
merge(channels, three_channel);
return three_channel;
}
2.对应CMakelist.txt文件:
cmake_minimum_required(VERSION 3.0)
# Define project name
project(opencv_example_project)
find_package(Torch REQUIRED)
find_package(OpenCV REQUIRED)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${TORCH_CXX_FLAGS}")
# 包含头文件include
include_directories(${OpenCV_INCLUDE_DIRS} ${TORCH_INCLUDE_DIRS})
# 生成的目标文件(可执行文件)
add_executable(main main.cpp)
# 置需要的库文件lib
# set(OpenCV_LIBS opencv_core opencv_highgui opencv_imgcodecs opencv_imgproc)
target_link_libraries(main ${OpenCV_LIBS} ${TORCH_LIBRARIES}) #
set_property(TARGET main PROPERTY CXX_STANDARD 14)
3.使用cmake编译
在项目文件夹新建build文件。
执行cmake命令编译:
#cmake -DCMAKE_PREFIX_PATH=/absolute/path/to/libtorch ..
$ cmake -DCMAKE_PREFIX_PATH=/XXXX/libtorch ..
注意:此处需要改成自己相应的libtorch的路径
编译完成后,执行:
make
命令。
好的,完成。
注意:
问题1、
如果出现以下错误的情况,进行如下修改:
error: conversion from ‘torch::jit::Module’ to non-scalar type ‘std::shared_ptrtorch::jit::Module’ requested
std::shared_ptrtorch::jit::script::Module module = torch::jit::load("…/model/model_int.pt");
std::shared_ptr<torch::jit::script::Module> module = torch::jit::load("../xxx.pt");`
std::shared_ptr这个是libtorch测试版本使用的变量类型,现在已经变更,将以上代码修改为:
torch::jit::script::Module module = torch::jit::load("../xxx.pt");
把下面代码
at::Tensor output_image = module->forward(inputs).toTensor();
修改为
torch::Tensor output = module.forward(std::move(inputs)).toTensor();
问题2、
如果不在.cpp文件下加入:
#include <opencv2/imgproc/types_c.h>
头文件,会出现以下错误:
error: ‘CV_BGR2RGB’ was not declared in this scope
问题3、
在CMakelist.txt文件末尾必须有该句话:
set_property(TARGET main PROPERTY CXX_STANDARD 14)
否则出现的错误如下:
error: no matching function for call to ‘at::Tensor::to(const c10::Device&) const’
参考链接:
https://www.cnblogs.com/geoffreyone/p/10827010.html
https://blog.csdn.net/Qin1999/article/details/89578589
https://blog.csdn.net/u010654302/article/details/105516456/