libtorchデプロイメントプロセスopencvピクチャの読み取りとエラーの解決方法
12491 ワード
最新のコンパイルされたlibtorchをダウンロード
公式サイトから最新のlibtorchをダウンロード
CMakeList
cmake_minimum_required(VERSION 3.0 FATAL_ERROR)
project(custom_ops)
#include_directories(/home/weipenghui/Lib-dev/opencv_3.4.3_contrib/opencv-3.4.3/build/install_cv/include)
# set(CMAKE_PREFIX_PATH "/home/weipenghui/Lib-dev/opencv_3.4.3_contrib/opencv-3.4.3/build/install_cv")
find_package(OpenCV REQUIRED)
set(CMAKE_PREFIX_PATH
/home/user0/glq/trt/torch/libtorch
/usr/local/)
find_package(Torch REQUIRED)
add_executable(example-app test.cpp)
target_link_libraries(example-app ${TORCH_LIBRARIES} ${OpenCV_LIBS})
set_property(TARGET example-app PROPERTY CXX_STANDARD 11)
cppソース
#include // One-stop header.
#include
#include
#include
#include
//https://pytorch.org/tutorials/advanced/cpp_export.html
int main(int argc, const char* argv[]) {
// Deserialize the ScriptModule from a file using torch::jit::load().
torch::jit::script::Module module = torch::jit::load("/home/user0pse/detemodel.pt");
std::string image_path = "/home/user/torch/pse/04.jpg";
//assert(module != nullptr);
std::cout << "ok
";
//
auto image = cv::imread(image_path,cv::ImreadModes::IMREAD_COLOR);
cv::Mat image_transfomed;
cv::resize(image, image_transfomed, cv::Size(800, 384));
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);
tensor_image = tensor_image.div(255);
tensor_image = tensor_image.unsqueeze(0);
tensor_image = tensor_image.to(at::kCUDA);
std::cout<<tensor_image<<std::endl;
module.to(at::kCUDA);
//
// Execute the model and turn its output into a tensor.
at::Tensor output = module.forward({tensor_image}).toTensor();
std::cout<<output<<std::endl;
}
主な問題
CMake error: conversion from ‘torch::jit::script::Module’ to non-scalar type ‘std::shared_ptrtorch::jit::script::Module .
公式チュートリアルで与えられたこの文を
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");
no match for ‘operator!=’ (operand types are ‘torch::jit::script::Module’ and ‘std::nullptr_t’)
公式によると、現在のModuleはもはやポインタではなく、この断言は存在する必要はなく、削除すればよい.
assert(module != nullptr);
error: base operand of ‘->’ has non-pointer type ‘torch::jit::script::Module’
このエラーの原因はmoduleがポインタではなく、
torch::Tensor output = module->forward(std::move(inputs)).toTensor();
コードを次のように変更します.
torch::Tensor output = module.forward(std::move(inputs)).toTensor();
Input type(torch.FloatTensor)and weight type(torch.cuda.FloatTensor)should be the same(解決)
画像もモデルもcudaに表示する必要があります.
tensor_image = tensor_image.to(at::kCUDA)
ではなく
tensor_image.to(at::kCUDA)
Google Can't load the tensor image to the GPU devicesが間違って検索されました.公式のチュートリアルに突っ込んで、すべて1.4更新するべきなのはまだ更新していません.1,2問題はすべて以前のもので、最新のチュートリアルはやはりこのように使います.
この文章は