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問題はすべて以前のもので、最新のチュートリアルはやはりこのように使います.
この文章は