我已经训练了一个keras模型,并使用mmdnn进行了转换。然后我尝试在C++代码中使用它:
#include <iostream>#include <opencv2/core/core.hpp>#include <opencv2/highgui/highgui.hpp>#include <torch.h>int main(){ cv::Mat image; image= cv::imread("test_img.png", cv::IMREAD_GRAYSCALE); // 读取文件try{ torch::jit::script::Module module; module = torch::jit::load("my_model.pth"); torch::IntArrayRef input_dim = std::vector<int64_t>({ 1, 2, 256, 256}); cv::Mat input_img; image.convertTo(input_img, CV_32FC3, 1 / 255.0); torch::Tensor x = torch::from_blob(input_img.data, { 1, 2, 256, 256 }, torch::kFloat); torch::NoGradGuard no_grad; auto output = module.forward({ x }); float* data = static_cast<float*>(output.toTensor().data_ptr()); cv::Mat output_img = cv::Mat(256, 256, CV_32FC3, data); cv::imwrite("output_img.png", output_img);}catch (std::exception &ex){ std::cout << "exception! " << ex.what() << std::endl;} return 0;}
这段代码抛出了一个异常:
exception! isTensor() INTERNAL ASSERT FAILED at E:\20B\pytorch\pytorch\aten\src\ATen/core/ivalue_inl.h:112, please report a bug to PyTorch. Expected Tensor but got Tuple (toTensor at E:\20B\pytorch\pytorch\aten\src\ATen/core/ivalue_inl.h:112) (no backtrace available)
这个异常是在调用toTensor()
函数的这行float* data = static_cast<float*>(output.toTensor().data_ptr());
时抛出的。如果我用toTuple()
代替toTensor()
,结果就没有data_ptr()
函数了,但我需要这个函数来提取数据(并将其放入opencv图像中)。
如何从模型输出中提取图像?
回答:
在这种情况下,模型的回答是一个包含两张图像的元组。我们可以通过以下方式提取它们:
torch::Tensor t0 = output.toTuple()->elements()[0].toTensor();torch::Tensor t1 = output.toTuple()->elements()[1].toTensor();
变量t0
和t1
包含模型输出的张量。